├── .gitignore ├── src ├── Diff.php ├── Diff │ ├── NullDiff.php │ ├── TypeMismatchDiff.php │ ├── StringDiff.php │ ├── AbstractDiff.php │ ├── ConstantDiff.php │ ├── GenericDiff.php │ ├── ParameterDiff.php │ ├── ClassDiff.php │ ├── Factory.php │ ├── MethodDiff.php │ ├── PropertyDiff.php │ └── CompositeDiff.php └── Status.php ├── .travis.yml ├── phpunit.xml.dist ├── composer.json ├── LICENSE ├── README.md ├── tests └── Diff │ └── FactoryTest.php └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /nbproject/ 2 | /vendor/ 3 | -------------------------------------------------------------------------------- /src/Diff.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | interface Diff 8 | { 9 | public function getStatus(); 10 | } 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | php: 3 | - 5.5 4 | - 5.6 5 | before_script: 6 | - composer self-update 7 | - composer install --no-interaction --prefer-dist 8 | script: 9 | - php vendor/bin/phpunit --coverage-clover build/logs/clover.xml 10 | after_script: 11 | - php vendor/bin/coveralls 12 | -------------------------------------------------------------------------------- /src/Diff/NullDiff.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class NullDiff implements Diff 11 | { 12 | public function getStatus() 13 | { 14 | return Status::NO_CHANGES; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Status.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | abstract class Status 8 | { 9 | const NO_CHANGES = 0; 10 | const API_ADDITIONS = 1; 11 | const INTERNAL_CHANGES = 2; 12 | const API_CHANGES = 3; 13 | const INCOMPATIBLE_API = 4; 14 | } 15 | -------------------------------------------------------------------------------- /src/Diff/TypeMismatchDiff.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class TypeMismatchDiff implements Diff 11 | { 12 | public function getStatus() 13 | { 14 | return Status::INTERNAL_CHANGES; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Diff/StringDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class StringDiff extends AbstractDiff 10 | { 11 | public function getStatus() 12 | { 13 | return ($this->head == $this->base ? Status::NO_CHANGES : Status::INTERNAL_CHANGES); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | ./tests/ 11 | 12 | 13 | 14 | 15 | 16 | 17 | ./src/ 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/Diff/AbstractDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | abstract class AbstractDiff implements Diff 10 | { 11 | protected $factory; 12 | protected $base; 13 | protected $head; 14 | 15 | public function __construct(Factory $factory, $base = null, $head = null) 16 | { 17 | if (!$base && !$head) { 18 | throw new \LogicException('At least one value must be provided'); 19 | } 20 | 21 | $this->factory = $factory; 22 | $this->base = $base; 23 | $this->head = $head; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "joshdifabio/semantic-diff", 3 | "description": "A library for performing semantic diffs of PHP code", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "Joshua Di Fabio", 8 | "email": "joshdifabio@gmail.com" 9 | } 10 | ], 11 | "require": { 12 | "php": ">=5.5", 13 | "nikic/php-parser": "~1.1" 14 | }, 15 | "require-dev": { 16 | "phpunit/phpunit": "~3.5", 17 | "satooshi/php-coveralls": "dev-master" 18 | }, 19 | "autoload": { 20 | "psr-4": { 21 | "SemanticDiff\\": "src" 22 | } 23 | }, 24 | "autoload-dev": { 25 | "psr-4": { 26 | "SemanticDiff\\": "tests" 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Diff/ConstantDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class ConstantDiff extends AbstractDiff 10 | { 11 | public function getStatus() 12 | { 13 | $base = $this->base; 14 | $head = $this->head; 15 | 16 | if (!$base) { 17 | return Status::API_ADDITIONS; 18 | } 19 | 20 | if (!$head || $base->name !== $head->name) { 21 | return Status::INCOMPATIBLE_API; 22 | } 23 | 24 | return $this->factory->createDiff($base->value, $head->value) 25 | ->getStatus() ? Status::API_CHANGES : Status::NO_CHANGES; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Joshua Di Fabio 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Semantic Diff for PHP 2 | ===================== 3 | 4 | [![Build Status](https://img.shields.io/travis/joshdifabio/semantic-diff.svg?style=flat)](https://travis-ci.org/joshdifabio/semantic-diff) [![Coveralls](https://img.shields.io/coveralls/joshdifabio/semantic-diff.svg?style=flat)](https://coveralls.io/r/joshdifabio/semantic-diff) [![Codacy Badge](https://img.shields.io/codacy/5e498265acf942d9b437b362247b0145.svg?style=flat)](https://www.codacy.com/public/joshdifabio/semantic-diff) 5 | 6 | API status 7 | ---------- 8 | 9 | Until the first tag is created, this package should be considered very unstable. 10 | 11 | Usage 12 | ----- 13 | 14 | ```php 15 | use PhpParser\Parser; 16 | use PhpParser\Lexer; 17 | use SemanticDiff\Diff\Factory; 18 | use SemanticDiff\Status; 19 | 20 | $phpParser = new Parser(new Lexer); 21 | 22 | $diff = (new Factory)->createDiff( 23 | $phpParser->parse($oldPhpCode), 24 | $phpParser->parse($newPhpCode) 25 | ); 26 | 27 | $status = $diff->getStatus(); 28 | 29 | /* 30 | * $status is now one of: 31 | * Status::NO_CHANGES 32 | * Status::API_ADDITIONS 33 | * Status::INTERNAL_CHANGES 34 | * Status::API_CHANGES 35 | * Status::INCOMPATIBLE_API 36 | */ 37 | ``` 38 | 39 | License 40 | ------- 41 | 42 | Semantic Diff is released under the [MIT](https://github.com/joshdifabio/semantic-diff/blob/master/LICENSE) license. 43 | -------------------------------------------------------------------------------- /src/Diff/GenericDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class GenericDiff extends AbstractDiff 10 | { 11 | private $status; 12 | 13 | public function getStatus() 14 | { 15 | if (is_null($this->status)) { 16 | $status = Status::NO_CHANGES; 17 | 18 | $anyNode = $this->base ?: $this->head; 19 | $subNodeNames = $anyNode->getSubNodeNames(); 20 | foreach ($subNodeNames as $subNodeName) { 21 | $baseValue = $this->base ? $this->base->$subNodeName : null; 22 | $headValue = $this->head ? $this->head->$subNodeName : null; 23 | 24 | if (is_array($baseValue) || is_array($headValue)) { 25 | $_status = $this->factory->createDiff($baseValue, $headValue) 26 | ->getStatus(); 27 | } elseif (is_object($baseValue) || is_object($headValue)) { 28 | $_status = $this->factory->createDiff($baseValue, $headValue) 29 | ->getStatus(); 30 | } else { 31 | $_status = ($baseValue === $headValue ? Status::NO_CHANGES : Status::INTERNAL_CHANGES); 32 | } 33 | 34 | $status = max($status, $_status); 35 | } 36 | 37 | $this->status = $status; 38 | } 39 | 40 | return $this->status; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Diff/ParameterDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class ParameterDiff extends AbstractDiff 10 | { 11 | public function getStatus() 12 | { 13 | $base = $this->base; 14 | $head = $this->head; 15 | 16 | if (!$base) { 17 | if ($head->default) { 18 | return Status::API_ADDITIONS; 19 | } 20 | 21 | return Status::INCOMPATIBLE_API; 22 | } 23 | 24 | if (!$head) { 25 | return Status::API_CHANGES; 26 | } 27 | 28 | if ( 29 | $base->default && !$head->default 30 | || $base->variadic != $head->variadic 31 | || $base->byRef != $head->byRef 32 | || (string)$head->type !== (string)$base->type 33 | ) { 34 | return Status::INCOMPATIBLE_API; 35 | } 36 | 37 | if ($base->name !== $head->name) { 38 | $status = Status::INTERNAL_CHANGES; 39 | } else { 40 | $status = Status::NO_CHANGES; 41 | } 42 | 43 | if ($head->default) { 44 | if (!$base->default) { 45 | return max($status, Status::API_ADDITIONS); 46 | } 47 | 48 | $status = max( 49 | $status, 50 | $this->factory->createDiff($base->default, $head->default) 51 | ->getStatus() ? Status::API_CHANGES : Status::NO_CHANGES 52 | ); 53 | } 54 | 55 | return $status; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/Diff/ClassDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class ClassDiff extends AbstractDiff 10 | { 11 | public function getStatus() 12 | { 13 | if (!$this->base) { 14 | return Status::API_ADDITIONS; 15 | } 16 | 17 | if ( 18 | !$this->head 19 | || (!$this->base->isAbstract() && $this->head->isAbstract()) 20 | || (!$this->base->isFinal() && $this->head->isFinal()) 21 | || ($this->base->extends && (string)$this->base->extends !== (string)$this->head->extends) 22 | || count($this->base->implements) > count($this->head->implements) 23 | || array_diff($this->toStrings($this->base->implements), $this->toStrings($this->head->implements)) 24 | ) { 25 | return Status::INCOMPATIBLE_API; 26 | } 27 | 28 | if ( 29 | ($this->base->isAbstract() && !$this->head->isAbstract()) 30 | || (!$this->base->extends && $this->head->extends) 31 | || ($this->base->isFinal() && !$this->head->isFinal()) 32 | || array_diff($this->toStrings($this->head->implements), $this->toStrings($this->base->implements)) 33 | ) { 34 | $status = Status::API_CHANGES; 35 | } else { 36 | $status = Status::NO_CHANGES; 37 | } 38 | 39 | $composite = $this->factory->createDiff($this->base->stmts ?: [], $this->head->stmts ?: []); 40 | 41 | return max($status, $composite->getStatus()); 42 | } 43 | 44 | private function toStrings(array $stringables) 45 | { 46 | $strings = []; 47 | 48 | foreach ($stringables as $stringable) { 49 | $strings[] = (string)$stringable; 50 | } 51 | 52 | return $strings; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/Diff/Factory.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class Factory 10 | { 11 | public function createDiff($base = null, $head = null) 12 | { 13 | if (is_null($base)) { 14 | if (is_null($head)) { 15 | return new NullDiff; 16 | } 17 | 18 | $type = $this->getType($head); 19 | } else { 20 | if (!is_null($head) && $this->getType($base) !== $this->getType($head)) { 21 | return new TypeMismatchDiff($base, $head); 22 | } 23 | 24 | $type = $this->getType($base); 25 | } 26 | 27 | switch ($type) { 28 | case 'Stmt_Class': 29 | return new ClassDiff($this, $base, $head); 30 | 31 | case 'Stmt_ClassMethod': 32 | return new MethodDiff($this, $base, $head); 33 | 34 | case 'Const': 35 | return new ConstantDiff($this, $base, $head); 36 | 37 | case 'Param': 38 | return new ParameterDiff($this, $base, $head); 39 | 40 | case 'Stmt_Property': 41 | return new PropertyDiff($this, $base, $head); 42 | 43 | case 'array': 44 | return new CompositeDiff($this, $base ?: [], $head ?: []); 45 | 46 | case 'scalar': 47 | return new StringDiff($this, (string)$base, (string)$head); 48 | 49 | default: 50 | return new GenericDiff($this, $base, $head); 51 | } 52 | } 53 | 54 | private function getType($value) 55 | { 56 | if ($value instanceof Node) { 57 | return $value->getType(); 58 | } 59 | 60 | if (is_array($value)) { 61 | return 'array'; 62 | } 63 | 64 | if (is_scalar($value)) { 65 | return 'scalar'; 66 | } 67 | 68 | return null; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/Diff/MethodDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class MethodDiff extends AbstractDiff 10 | { 11 | public function getStatus() 12 | { 13 | $base = $this->base; 14 | $head = $this->head; 15 | 16 | if (!$base) { 17 | if ($head->isPrivate()) { 18 | return Status::INTERNAL_CHANGES; 19 | } 20 | 21 | return Status::API_ADDITIONS; 22 | } 23 | 24 | if (!$head) { 25 | if ($base->isPrivate()) { 26 | return Status::INTERNAL_CHANGES; 27 | } 28 | 29 | return Status::INCOMPATIBLE_API; 30 | } 31 | 32 | if ($base->isPrivate() && !$head->isPrivate()) { 33 | return Status::INTERNAL_CHANGES; 34 | } 35 | 36 | if ($base->name !== $head->name) { 37 | return Status::INCOMPATIBLE_API; 38 | } 39 | 40 | if ($base->isPublic()) { 41 | if (!$head->isPublic()) { 42 | return Status::INCOMPATIBLE_API; 43 | } 44 | } elseif ($base->isProtected() && $head->isPrivate()) { 45 | return Status::INCOMPATIBLE_API; 46 | } 47 | 48 | if ( 49 | $base->isStatic() != $head->isStatic() 50 | || !$base->isAbstract() && $head->isAbstract() 51 | || !$base->isFinal() && $head->isFinal() 52 | || $base->byRef != $head->byRef 53 | ) { 54 | if ($head->isPrivate()) { 55 | return Status::INTERNAL_CHANGES; 56 | } 57 | 58 | return Status::INCOMPATIBLE_API; 59 | } 60 | 61 | $status = $this->factory->createDiff($this->base->params ?: [], $this->head->params ?: []) 62 | ->getStatus(); 63 | 64 | if ($status == Status::NO_CHANGES) { 65 | $status = $this->factory->createDiff($this->base->stmts ?: [], $this->head->stmts ?: []) 66 | ->getStatus(); 67 | } 68 | 69 | return $status; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/Diff/PropertyDiff.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class PropertyDiff extends AbstractDiff 10 | { 11 | public function getStatus() 12 | { 13 | $base = $this->base; 14 | $head = $this->head; 15 | 16 | if (!$base) { 17 | if ($head->isPrivate()) { 18 | return Status::INTERNAL_CHANGES; 19 | } 20 | 21 | return Status::API_ADDITIONS; 22 | } 23 | 24 | if (!$head) { 25 | if ($base->isPrivate()) { 26 | return Status::INTERNAL_CHANGES; 27 | } 28 | 29 | return Status::INCOMPATIBLE_API; 30 | } 31 | 32 | if ($base->isPrivate() && !$head->isPrivate()) { 33 | return Status::INTERNAL_CHANGES; 34 | } 35 | 36 | if ($base->name !== $head->name) { 37 | return Status::INCOMPATIBLE_API; 38 | } 39 | 40 | if ($base->isPublic()) { 41 | if (!$head->isPublic()) { 42 | return Status::INCOMPATIBLE_API; 43 | } 44 | } elseif ($base->isProtected() && $head->isPrivate()) { 45 | return Status::INCOMPATIBLE_API; 46 | } 47 | 48 | if ($base->isStatic() != $head->isStatic()) { 49 | if ($head->isPrivate()) { 50 | return Status::INTERNAL_CHANGES; 51 | } 52 | 53 | return Status::INCOMPATIBLE_API; 54 | } 55 | 56 | if ($base->default && $head->default) { 57 | $defaultValueDiff = $this->factory->createDiff($base->default, $head->default); 58 | if ($defaultValueDiff->getStatus()) { 59 | if ($head->isPrivate()) { 60 | return Status::INTERNAL_CHANGES; 61 | } 62 | 63 | return Status::API_CHANGES; 64 | } 65 | } 66 | 67 | if ((bool)$base->default != (bool)$head->default) { 68 | if ($head->isPrivate()) { 69 | return Status::INTERNAL_CHANGES; 70 | } 71 | 72 | return Status::API_CHANGES; 73 | } 74 | 75 | return Status::NO_CHANGES; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/Diff/CompositeDiff.php: -------------------------------------------------------------------------------- 1 | factory = $factory; 20 | $this->head = $head; 21 | $this->base = $base; 22 | } 23 | 24 | public function getStatus() 25 | { 26 | if (is_null($this->status)) { 27 | $innerDiffs = $this->getInnerDiffs(); 28 | $status = $this->defaultStatus; 29 | 30 | foreach ($innerDiffs as $diff) { 31 | $status = max($status, $diff->getStatus()); 32 | } 33 | 34 | $this->status = $status; 35 | } 36 | 37 | return $this->status; 38 | } 39 | 40 | public function getInnerDiffs() 41 | { 42 | if (is_null($this->innerDiffs)) { 43 | $base = $this->flattenNodes($this->base); 44 | $head = $this->flattenNodes($this->head); 45 | 46 | $diffs = $this->extractAndDiffNamedNodes($base, $head); 47 | 48 | if (count($base) !== count($head)) { 49 | $this->defaultStatus = Status::INTERNAL_CHANGES; 50 | } 51 | 52 | $this->innerDiffs = array_merge($diffs, $this->getDiffs($base, $head)); 53 | unset($this->base); 54 | unset($this->head); 55 | } 56 | 57 | return $this->innerDiffs; 58 | } 59 | 60 | private function flattenNodes(array $nodes) 61 | { 62 | $flattened = []; 63 | 64 | foreach ($nodes as $node) { 65 | if (!is_object($node)) { 66 | $flattened[] = $node; 67 | continue; 68 | } 69 | 70 | switch ($node->getType()) { 71 | case 'Stmt_Const': 72 | case 'Stmt_ClassConst': 73 | foreach ($node->consts as $const) { 74 | $flattened[] = $const; 75 | } 76 | break; 77 | 78 | case 'Stmt_Property': 79 | foreach ($node->props as $prop) { 80 | $_prop = new Property($node->type, []); 81 | $_prop->name = $prop->name; 82 | $_prop->default = $prop->default; 83 | $flattened[] = $_prop; 84 | } 85 | break; 86 | 87 | default: 88 | $flattened[] = $node; 89 | break; 90 | } 91 | } 92 | 93 | return $flattened; 94 | } 95 | 96 | private function getDiffs(array $baseNodes, array $headNodes) 97 | { 98 | $diffs = []; 99 | 100 | $maxCount = max(count($baseNodes), count($headNodes)); 101 | for ($i = 0; $i < $maxCount; $i++) { 102 | $diffs[] = $this->factory->createDiff( 103 | isset($baseNodes[$i]) ? $baseNodes[$i] : null, 104 | isset($headNodes[$i]) ? $headNodes[$i] : null 105 | ); 106 | } 107 | 108 | return $diffs; 109 | } 110 | 111 | private function extractAndDiffNamedNodes(array &$baseNodes, array &$headNodes) 112 | { 113 | $diffs = []; 114 | 115 | foreach ($this->extractNamedNodes($baseNodes, $headNodes) as $nodes) { 116 | foreach ($nodes as $baseAndHeadNodes) { 117 | $diffs[] = $this->factory->createDiff( 118 | isset($baseAndHeadNodes[0]) ? $baseAndHeadNodes[0] : null, 119 | isset($baseAndHeadNodes[1]) ? $baseAndHeadNodes[1] : null 120 | ); 121 | } 122 | } 123 | 124 | return $diffs; 125 | } 126 | 127 | private function extractNamedNodes(array &$baseNodes, array &$headNodes) 128 | { 129 | $namedNodes = []; 130 | 131 | foreach ([&$baseNodes, &$headNodes] as $nodeSetKey => &$nodeSet) { 132 | foreach ($nodeSet as $nodeKey => $node) { 133 | if (!isset($node->name) || !is_string($node->name)) { 134 | continue; 135 | } 136 | 137 | if ('Param' === $node->getType()) { // params are identified by their index, not by their name 138 | $namedNodes[$node->getType()][$nodeKey][$nodeSetKey] = $node; 139 | } else { 140 | $namedNodes[$node->getType()][(string)$node->name][$nodeSetKey] = $node; 141 | } 142 | 143 | unset($nodeSet[$nodeKey]); 144 | } 145 | } 146 | 147 | return $namedNodes; 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /tests/Diff/FactoryTest.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class FactoryTest extends PHPUnit_Framework_TestCase 13 | { 14 | private $factory; 15 | 16 | public function setUp() 17 | { 18 | $this->factory = new Factory; 19 | } 20 | 21 | /** 22 | * @dataProvider provideGetStatus 23 | */ 24 | public function testGetStatus($expectedStatus, array $base = null, array $head = null) 25 | { 26 | $diff = $this->factory->createDiff($base, $head); 27 | $this->assertEquals($expectedStatus, $diff->getStatus()); 28 | } 29 | 30 | public function provideGetStatus() 31 | { 32 | $parser = new Parser(new Lexer); 33 | 34 | foreach ($this->getTestCases() as $testId => $testCase) { 35 | yield $testId => [ 36 | $testCase[0], 37 | $parser->parse($testCase[1]), 38 | $parser->parse($testCase[2]), 39 | ]; 40 | } 41 | } 42 | 43 | public function getTestCases() 44 | { 45 | return [ 46 | [ 47 | Status::NO_CHANGES, 48 | << 629 | */ 630 | class Mage_DB_Exception extends Exception { 631 | 632 | } 633 | CODE 634 | , 635 | << 668 | */ 669 | class Mage_DB_Exception extends Exception { 670 | 671 | } 672 | CODE 673 | , 674 | ], 675 | [ 676 | Status::NO_CHANGES, 677 | <<controller()->url(\$action, \$params); 795 | } 796 | 797 | /** 798 | * Retrieve base url 799 | * 800 | * @return string 801 | */ 802 | public function baseUrl() 803 | { 804 | return str_replace('\\\\', '/', dirname(\$_SERVER['SCRIPT_NAME'])); 805 | } 806 | 807 | /** 808 | * Retrieve url of magento 809 | * 810 | * @return string 811 | */ 812 | public function mageUrl() 813 | { 814 | return str_replace('\\\\', '/', dirname(\$this->baseUrl())); 815 | } 816 | 817 | /** 818 | * Include template 819 | * 820 | * @param string \$name 821 | * @return string 822 | */ 823 | public function template(\$name) 824 | { 825 | ob_start(); 826 | include \$this->controller()->filepath('template/'.\$name); 827 | return ob_get_clean(); 828 | } 829 | 830 | /** 831 | * Set value for key 832 | * 833 | * @param string \$key 834 | * @param mixed \$value 835 | * @return Maged_Controller 836 | */ 837 | public function set(\$key, \$value) 838 | { 839 | \$this->_data[\$key] = \$value; 840 | return \$this; 841 | } 842 | 843 | /** 844 | * Get value by key 845 | * 846 | * @param string \$key 847 | * @return mixed 848 | */ 849 | public function get(\$key) 850 | { 851 | return isset(\$this->_data[\$key]) ? \$this->_data[\$key] : null; 852 | } 853 | 854 | /** 855 | * Translator 856 | * 857 | * @param string \$string 858 | * @return string 859 | */ 860 | public function __(\$string) 861 | { 862 | return \$string; 863 | } 864 | 865 | /** 866 | * Retrieve link for header menu 867 | * 868 | * @param mixed \$action 869 | */ 870 | public function getNavLinkParams(\$action) 871 | { 872 | \$params = 'href="'.\$this->url(\$action).'"'; 873 | if (\$this->controller()->getAction()==\$action) { 874 | \$params .= ' class="active"'; 875 | } 876 | return \$params; 877 | } 878 | 879 | /** 880 | * Retrieve Session Form Key 881 | * 882 | * @return string 883 | */ 884 | public function getFormKey() 885 | { 886 | return \$this->controller()->getFormKey(); 887 | } 888 | } 889 | CODE 890 | , 891 | <<controller()->url(\$action, \$params); 963 | } 964 | 965 | /** 966 | * Retrieve base url 967 | * 968 | * @return string 969 | */ 970 | public function baseUrl() 971 | { 972 | return str_replace('\\\\', '/', dirname(\$_SERVER['SCRIPT_NAME'])); 973 | } 974 | 975 | /** 976 | * Retrieve url of magento 977 | * 978 | * @return string 979 | */ 980 | public function mageUrl() 981 | { 982 | return str_replace('\\\\', '/', dirname(\$this->baseUrl())); 983 | } 984 | 985 | /** 986 | * Include template 987 | * 988 | * @param string \$name 989 | * @return string 990 | */ 991 | public function template(\$name) 992 | { 993 | ob_start(); 994 | include \$this->controller()->filepath('template/'.\$name); 995 | return ob_get_clean(); 996 | } 997 | 998 | /** 999 | * Set value for key 1000 | * 1001 | * @param string \$key 1002 | * @param mixed \$value 1003 | * @return Maged_Controller 1004 | */ 1005 | public function set(\$key, \$value) 1006 | { 1007 | \$this->_data[\$key] = \$value; 1008 | return \$this; 1009 | } 1010 | 1011 | /** 1012 | * Get value by key 1013 | * 1014 | * @param string \$key 1015 | * @return mixed 1016 | */ 1017 | public function get(\$key) 1018 | { 1019 | return isset(\$this->_data[\$key]) ? \$this->_data[\$key] : null; 1020 | } 1021 | 1022 | /** 1023 | * Translator 1024 | * 1025 | * @param string \$string 1026 | * @return string 1027 | */ 1028 | public function __(\$string) 1029 | { 1030 | return \$string; 1031 | } 1032 | 1033 | /** 1034 | * Retrieve link for header menu 1035 | * 1036 | * @param mixed \$action 1037 | */ 1038 | public function getNavLinkParams(\$action) 1039 | { 1040 | \$params = 'href="'.\$this->url(\$action).'"'; 1041 | if (\$this->controller()->getAction()==\$action) { 1042 | \$params .= ' class="active"'; 1043 | } 1044 | return \$params; 1045 | } 1046 | 1047 | /** 1048 | * Retrieve Session Form Key 1049 | * 1050 | * @return string 1051 | */ 1052 | public function getFormKey() 1053 | { 1054 | return \$this->controller()->getFormKey(); 1055 | } 1056 | } 1057 | CODE 1058 | , 1059 | ], 1060 | [ 1061 | Status::INTERNAL_CHANGES, 1062 | <<=5.3" 26 | }, 27 | "type": "library", 28 | "extra": { 29 | "branch-alias": { 30 | "dev-master": "1.0-dev" 31 | } 32 | }, 33 | "autoload": { 34 | "files": [ 35 | "lib/bootstrap.php" 36 | ] 37 | }, 38 | "notification-url": "https://packagist.org/downloads/", 39 | "license": [ 40 | "BSD-3-Clause" 41 | ], 42 | "authors": [ 43 | { 44 | "name": "Nikita Popov" 45 | } 46 | ], 47 | "description": "A PHP parser written in PHP", 48 | "keywords": [ 49 | "parser", 50 | "php" 51 | ], 52 | "time": "2015-01-18 11:29:59" 53 | } 54 | ], 55 | "packages-dev": [ 56 | { 57 | "name": "guzzle/guzzle", 58 | "version": "v3.9.2", 59 | "source": { 60 | "type": "git", 61 | "url": "https://github.com/guzzle/guzzle3.git", 62 | "reference": "54991459675c1a2924122afbb0e5609ade581155" 63 | }, 64 | "dist": { 65 | "type": "zip", 66 | "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/54991459675c1a2924122afbb0e5609ade581155", 67 | "reference": "54991459675c1a2924122afbb0e5609ade581155", 68 | "shasum": "" 69 | }, 70 | "require": { 71 | "ext-curl": "*", 72 | "php": ">=5.3.3", 73 | "symfony/event-dispatcher": "~2.1" 74 | }, 75 | "replace": { 76 | "guzzle/batch": "self.version", 77 | "guzzle/cache": "self.version", 78 | "guzzle/common": "self.version", 79 | "guzzle/http": "self.version", 80 | "guzzle/inflection": "self.version", 81 | "guzzle/iterator": "self.version", 82 | "guzzle/log": "self.version", 83 | "guzzle/parser": "self.version", 84 | "guzzle/plugin": "self.version", 85 | "guzzle/plugin-async": "self.version", 86 | "guzzle/plugin-backoff": "self.version", 87 | "guzzle/plugin-cache": "self.version", 88 | "guzzle/plugin-cookie": "self.version", 89 | "guzzle/plugin-curlauth": "self.version", 90 | "guzzle/plugin-error-response": "self.version", 91 | "guzzle/plugin-history": "self.version", 92 | "guzzle/plugin-log": "self.version", 93 | "guzzle/plugin-md5": "self.version", 94 | "guzzle/plugin-mock": "self.version", 95 | "guzzle/plugin-oauth": "self.version", 96 | "guzzle/service": "self.version", 97 | "guzzle/stream": "self.version" 98 | }, 99 | "require-dev": { 100 | "doctrine/cache": "~1.3", 101 | "monolog/monolog": "~1.0", 102 | "phpunit/phpunit": "3.7.*", 103 | "psr/log": "~1.0", 104 | "symfony/class-loader": "~2.1", 105 | "zendframework/zend-cache": "2.*,<2.3", 106 | "zendframework/zend-log": "2.*,<2.3" 107 | }, 108 | "type": "library", 109 | "extra": { 110 | "branch-alias": { 111 | "dev-master": "3.9-dev" 112 | } 113 | }, 114 | "autoload": { 115 | "psr-0": { 116 | "Guzzle": "src/", 117 | "Guzzle\\Tests": "tests/" 118 | } 119 | }, 120 | "notification-url": "https://packagist.org/downloads/", 121 | "license": [ 122 | "MIT" 123 | ], 124 | "authors": [ 125 | { 126 | "name": "Michael Dowling", 127 | "email": "mtdowling@gmail.com", 128 | "homepage": "https://github.com/mtdowling" 129 | }, 130 | { 131 | "name": "Guzzle Community", 132 | "homepage": "https://github.com/guzzle/guzzle/contributors" 133 | } 134 | ], 135 | "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", 136 | "homepage": "http://guzzlephp.org/", 137 | "keywords": [ 138 | "client", 139 | "curl", 140 | "framework", 141 | "http", 142 | "http client", 143 | "rest", 144 | "web service" 145 | ], 146 | "time": "2014-08-11 04:32:36" 147 | }, 148 | { 149 | "name": "phpunit/php-code-coverage", 150 | "version": "1.2.18", 151 | "source": { 152 | "type": "git", 153 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 154 | "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b" 155 | }, 156 | "dist": { 157 | "type": "zip", 158 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b", 159 | "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b", 160 | "shasum": "" 161 | }, 162 | "require": { 163 | "php": ">=5.3.3", 164 | "phpunit/php-file-iterator": ">=1.3.0@stable", 165 | "phpunit/php-text-template": ">=1.2.0@stable", 166 | "phpunit/php-token-stream": ">=1.1.3,<1.3.0" 167 | }, 168 | "require-dev": { 169 | "phpunit/phpunit": "3.7.*@dev" 170 | }, 171 | "suggest": { 172 | "ext-dom": "*", 173 | "ext-xdebug": ">=2.0.5" 174 | }, 175 | "type": "library", 176 | "extra": { 177 | "branch-alias": { 178 | "dev-master": "1.2.x-dev" 179 | } 180 | }, 181 | "autoload": { 182 | "classmap": [ 183 | "PHP/" 184 | ] 185 | }, 186 | "notification-url": "https://packagist.org/downloads/", 187 | "include-path": [ 188 | "" 189 | ], 190 | "license": [ 191 | "BSD-3-Clause" 192 | ], 193 | "authors": [ 194 | { 195 | "name": "Sebastian Bergmann", 196 | "email": "sb@sebastian-bergmann.de", 197 | "role": "lead" 198 | } 199 | ], 200 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 201 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 202 | "keywords": [ 203 | "coverage", 204 | "testing", 205 | "xunit" 206 | ], 207 | "time": "2014-09-02 10:13:14" 208 | }, 209 | { 210 | "name": "phpunit/php-file-iterator", 211 | "version": "1.3.4", 212 | "source": { 213 | "type": "git", 214 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 215 | "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" 216 | }, 217 | "dist": { 218 | "type": "zip", 219 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", 220 | "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", 221 | "shasum": "" 222 | }, 223 | "require": { 224 | "php": ">=5.3.3" 225 | }, 226 | "type": "library", 227 | "autoload": { 228 | "classmap": [ 229 | "File/" 230 | ] 231 | }, 232 | "notification-url": "https://packagist.org/downloads/", 233 | "include-path": [ 234 | "" 235 | ], 236 | "license": [ 237 | "BSD-3-Clause" 238 | ], 239 | "authors": [ 240 | { 241 | "name": "Sebastian Bergmann", 242 | "email": "sb@sebastian-bergmann.de", 243 | "role": "lead" 244 | } 245 | ], 246 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 247 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 248 | "keywords": [ 249 | "filesystem", 250 | "iterator" 251 | ], 252 | "time": "2013-10-10 15:34:57" 253 | }, 254 | { 255 | "name": "phpunit/php-text-template", 256 | "version": "1.2.0", 257 | "source": { 258 | "type": "git", 259 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 260 | "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" 261 | }, 262 | "dist": { 263 | "type": "zip", 264 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", 265 | "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", 266 | "shasum": "" 267 | }, 268 | "require": { 269 | "php": ">=5.3.3" 270 | }, 271 | "type": "library", 272 | "autoload": { 273 | "classmap": [ 274 | "Text/" 275 | ] 276 | }, 277 | "notification-url": "https://packagist.org/downloads/", 278 | "include-path": [ 279 | "" 280 | ], 281 | "license": [ 282 | "BSD-3-Clause" 283 | ], 284 | "authors": [ 285 | { 286 | "name": "Sebastian Bergmann", 287 | "email": "sb@sebastian-bergmann.de", 288 | "role": "lead" 289 | } 290 | ], 291 | "description": "Simple template engine.", 292 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 293 | "keywords": [ 294 | "template" 295 | ], 296 | "time": "2014-01-30 17:20:04" 297 | }, 298 | { 299 | "name": "phpunit/php-timer", 300 | "version": "1.0.5", 301 | "source": { 302 | "type": "git", 303 | "url": "https://github.com/sebastianbergmann/php-timer.git", 304 | "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" 305 | }, 306 | "dist": { 307 | "type": "zip", 308 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", 309 | "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", 310 | "shasum": "" 311 | }, 312 | "require": { 313 | "php": ">=5.3.3" 314 | }, 315 | "type": "library", 316 | "autoload": { 317 | "classmap": [ 318 | "PHP/" 319 | ] 320 | }, 321 | "notification-url": "https://packagist.org/downloads/", 322 | "include-path": [ 323 | "" 324 | ], 325 | "license": [ 326 | "BSD-3-Clause" 327 | ], 328 | "authors": [ 329 | { 330 | "name": "Sebastian Bergmann", 331 | "email": "sb@sebastian-bergmann.de", 332 | "role": "lead" 333 | } 334 | ], 335 | "description": "Utility class for timing", 336 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 337 | "keywords": [ 338 | "timer" 339 | ], 340 | "time": "2013-08-02 07:42:54" 341 | }, 342 | { 343 | "name": "phpunit/php-token-stream", 344 | "version": "1.2.2", 345 | "source": { 346 | "type": "git", 347 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 348 | "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32" 349 | }, 350 | "dist": { 351 | "type": "zip", 352 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32", 353 | "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32", 354 | "shasum": "" 355 | }, 356 | "require": { 357 | "ext-tokenizer": "*", 358 | "php": ">=5.3.3" 359 | }, 360 | "type": "library", 361 | "extra": { 362 | "branch-alias": { 363 | "dev-master": "1.2-dev" 364 | } 365 | }, 366 | "autoload": { 367 | "classmap": [ 368 | "PHP/" 369 | ] 370 | }, 371 | "notification-url": "https://packagist.org/downloads/", 372 | "include-path": [ 373 | "" 374 | ], 375 | "license": [ 376 | "BSD-3-Clause" 377 | ], 378 | "authors": [ 379 | { 380 | "name": "Sebastian Bergmann", 381 | "email": "sb@sebastian-bergmann.de", 382 | "role": "lead" 383 | } 384 | ], 385 | "description": "Wrapper around PHP's tokenizer extension.", 386 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 387 | "keywords": [ 388 | "tokenizer" 389 | ], 390 | "time": "2014-03-03 05:10:30" 391 | }, 392 | { 393 | "name": "phpunit/phpunit", 394 | "version": "3.7.38", 395 | "source": { 396 | "type": "git", 397 | "url": "https://github.com/sebastianbergmann/phpunit.git", 398 | "reference": "38709dc22d519a3d1be46849868aa2ddf822bcf6" 399 | }, 400 | "dist": { 401 | "type": "zip", 402 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/38709dc22d519a3d1be46849868aa2ddf822bcf6", 403 | "reference": "38709dc22d519a3d1be46849868aa2ddf822bcf6", 404 | "shasum": "" 405 | }, 406 | "require": { 407 | "ext-ctype": "*", 408 | "ext-dom": "*", 409 | "ext-json": "*", 410 | "ext-pcre": "*", 411 | "ext-reflection": "*", 412 | "ext-spl": "*", 413 | "php": ">=5.3.3", 414 | "phpunit/php-code-coverage": "~1.2", 415 | "phpunit/php-file-iterator": "~1.3", 416 | "phpunit/php-text-template": "~1.1", 417 | "phpunit/php-timer": "~1.0", 418 | "phpunit/phpunit-mock-objects": "~1.2", 419 | "symfony/yaml": "~2.0" 420 | }, 421 | "require-dev": { 422 | "pear-pear.php.net/pear": "1.9.4" 423 | }, 424 | "suggest": { 425 | "phpunit/php-invoker": "~1.1" 426 | }, 427 | "bin": [ 428 | "composer/bin/phpunit" 429 | ], 430 | "type": "library", 431 | "extra": { 432 | "branch-alias": { 433 | "dev-master": "3.7.x-dev" 434 | } 435 | }, 436 | "autoload": { 437 | "classmap": [ 438 | "PHPUnit/" 439 | ] 440 | }, 441 | "notification-url": "https://packagist.org/downloads/", 442 | "include-path": [ 443 | "", 444 | "../../symfony/yaml/" 445 | ], 446 | "license": [ 447 | "BSD-3-Clause" 448 | ], 449 | "authors": [ 450 | { 451 | "name": "Sebastian Bergmann", 452 | "email": "sebastian@phpunit.de", 453 | "role": "lead" 454 | } 455 | ], 456 | "description": "The PHP Unit Testing framework.", 457 | "homepage": "http://www.phpunit.de/", 458 | "keywords": [ 459 | "phpunit", 460 | "testing", 461 | "xunit" 462 | ], 463 | "time": "2014-10-17 09:04:17" 464 | }, 465 | { 466 | "name": "phpunit/phpunit-mock-objects", 467 | "version": "1.2.3", 468 | "source": { 469 | "type": "git", 470 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 471 | "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875" 472 | }, 473 | "dist": { 474 | "type": "zip", 475 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5794e3c5c5ba0fb037b11d8151add2a07fa82875", 476 | "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875", 477 | "shasum": "" 478 | }, 479 | "require": { 480 | "php": ">=5.3.3", 481 | "phpunit/php-text-template": ">=1.1.1@stable" 482 | }, 483 | "suggest": { 484 | "ext-soap": "*" 485 | }, 486 | "type": "library", 487 | "autoload": { 488 | "classmap": [ 489 | "PHPUnit/" 490 | ] 491 | }, 492 | "notification-url": "https://packagist.org/downloads/", 493 | "include-path": [ 494 | "" 495 | ], 496 | "license": [ 497 | "BSD-3-Clause" 498 | ], 499 | "authors": [ 500 | { 501 | "name": "Sebastian Bergmann", 502 | "email": "sb@sebastian-bergmann.de", 503 | "role": "lead" 504 | } 505 | ], 506 | "description": "Mock Object library for PHPUnit", 507 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 508 | "keywords": [ 509 | "mock", 510 | "xunit" 511 | ], 512 | "time": "2013-01-13 10:24:48" 513 | }, 514 | { 515 | "name": "psr/log", 516 | "version": "1.0.0", 517 | "source": { 518 | "type": "git", 519 | "url": "https://github.com/php-fig/log.git", 520 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" 521 | }, 522 | "dist": { 523 | "type": "zip", 524 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", 525 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", 526 | "shasum": "" 527 | }, 528 | "type": "library", 529 | "autoload": { 530 | "psr-0": { 531 | "Psr\\Log\\": "" 532 | } 533 | }, 534 | "notification-url": "https://packagist.org/downloads/", 535 | "license": [ 536 | "MIT" 537 | ], 538 | "authors": [ 539 | { 540 | "name": "PHP-FIG", 541 | "homepage": "http://www.php-fig.org/" 542 | } 543 | ], 544 | "description": "Common interface for logging libraries", 545 | "keywords": [ 546 | "log", 547 | "psr", 548 | "psr-3" 549 | ], 550 | "time": "2012-12-21 11:40:51" 551 | }, 552 | { 553 | "name": "satooshi/php-coveralls", 554 | "version": "dev-master", 555 | "source": { 556 | "type": "git", 557 | "url": "https://github.com/satooshi/php-coveralls.git", 558 | "reference": "2fbf803803d179ab1082807308a67bbd5a760c70" 559 | }, 560 | "dist": { 561 | "type": "zip", 562 | "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/2fbf803803d179ab1082807308a67bbd5a760c70", 563 | "reference": "2fbf803803d179ab1082807308a67bbd5a760c70", 564 | "shasum": "" 565 | }, 566 | "require": { 567 | "ext-json": "*", 568 | "ext-simplexml": "*", 569 | "guzzle/guzzle": ">=2.7", 570 | "php": ">=5.3", 571 | "psr/log": "1.0.0", 572 | "symfony/config": ">=2.0", 573 | "symfony/console": ">=2.0", 574 | "symfony/stopwatch": ">=2.2", 575 | "symfony/yaml": ">=2.0" 576 | }, 577 | "require-dev": { 578 | "apigen/apigen": "2.8.*@stable", 579 | "pdepend/pdepend": "dev-master as 2.0.0", 580 | "phpmd/phpmd": "dev-master", 581 | "phpunit/php-invoker": ">=1.1.0,<1.2.0", 582 | "phpunit/phpunit": "3.7.*@stable", 583 | "sebastian/finder-facade": "dev-master", 584 | "sebastian/phpcpd": "1.4.*@stable", 585 | "squizlabs/php_codesniffer": "1.4.*@stable", 586 | "theseer/fdomdocument": "dev-master" 587 | }, 588 | "suggest": { 589 | "symfony/http-kernel": "Allows Symfony integration" 590 | }, 591 | "bin": [ 592 | "composer/bin/coveralls" 593 | ], 594 | "type": "library", 595 | "extra": { 596 | "branch-alias": { 597 | "dev-master": "0.7-dev" 598 | } 599 | }, 600 | "autoload": { 601 | "psr-0": { 602 | "Satooshi\\Component": "src/", 603 | "Satooshi\\Bundle": "src/" 604 | } 605 | }, 606 | "notification-url": "https://packagist.org/downloads/", 607 | "license": [ 608 | "MIT" 609 | ], 610 | "authors": [ 611 | { 612 | "name": "Kitamura Satoshi", 613 | "email": "with.no.parachute@gmail.com", 614 | "homepage": "https://www.facebook.com/satooshi.jp" 615 | } 616 | ], 617 | "description": "PHP client library for Coveralls API", 618 | "homepage": "https://github.com/satooshi/php-coveralls", 619 | "keywords": [ 620 | "ci", 621 | "coverage", 622 | "github", 623 | "test" 624 | ], 625 | "time": "2014-11-11 15:35:34" 626 | }, 627 | { 628 | "name": "symfony/config", 629 | "version": "v2.6.3", 630 | "target-dir": "Symfony/Component/Config", 631 | "source": { 632 | "type": "git", 633 | "url": "https://github.com/symfony/Config.git", 634 | "reference": "d94f222eff99a22ce313555b78642b4873418d56" 635 | }, 636 | "dist": { 637 | "type": "zip", 638 | "url": "https://api.github.com/repos/symfony/Config/zipball/d94f222eff99a22ce313555b78642b4873418d56", 639 | "reference": "d94f222eff99a22ce313555b78642b4873418d56", 640 | "shasum": "" 641 | }, 642 | "require": { 643 | "php": ">=5.3.3", 644 | "symfony/filesystem": "~2.3" 645 | }, 646 | "type": "library", 647 | "extra": { 648 | "branch-alias": { 649 | "dev-master": "2.6-dev" 650 | } 651 | }, 652 | "autoload": { 653 | "psr-0": { 654 | "Symfony\\Component\\Config\\": "" 655 | } 656 | }, 657 | "notification-url": "https://packagist.org/downloads/", 658 | "license": [ 659 | "MIT" 660 | ], 661 | "authors": [ 662 | { 663 | "name": "Symfony Community", 664 | "homepage": "http://symfony.com/contributors" 665 | }, 666 | { 667 | "name": "Fabien Potencier", 668 | "email": "fabien@symfony.com" 669 | } 670 | ], 671 | "description": "Symfony Config Component", 672 | "homepage": "http://symfony.com", 673 | "time": "2015-01-03 08:01:59" 674 | }, 675 | { 676 | "name": "symfony/console", 677 | "version": "v2.6.3", 678 | "target-dir": "Symfony/Component/Console", 679 | "source": { 680 | "type": "git", 681 | "url": "https://github.com/symfony/Console.git", 682 | "reference": "6ac6491ff60c0e5a941db3ccdc75a07adbb61476" 683 | }, 684 | "dist": { 685 | "type": "zip", 686 | "url": "https://api.github.com/repos/symfony/Console/zipball/6ac6491ff60c0e5a941db3ccdc75a07adbb61476", 687 | "reference": "6ac6491ff60c0e5a941db3ccdc75a07adbb61476", 688 | "shasum": "" 689 | }, 690 | "require": { 691 | "php": ">=5.3.3" 692 | }, 693 | "require-dev": { 694 | "psr/log": "~1.0", 695 | "symfony/event-dispatcher": "~2.1", 696 | "symfony/process": "~2.1" 697 | }, 698 | "suggest": { 699 | "psr/log": "For using the console logger", 700 | "symfony/event-dispatcher": "", 701 | "symfony/process": "" 702 | }, 703 | "type": "library", 704 | "extra": { 705 | "branch-alias": { 706 | "dev-master": "2.6-dev" 707 | } 708 | }, 709 | "autoload": { 710 | "psr-0": { 711 | "Symfony\\Component\\Console\\": "" 712 | } 713 | }, 714 | "notification-url": "https://packagist.org/downloads/", 715 | "license": [ 716 | "MIT" 717 | ], 718 | "authors": [ 719 | { 720 | "name": "Symfony Community", 721 | "homepage": "http://symfony.com/contributors" 722 | }, 723 | { 724 | "name": "Fabien Potencier", 725 | "email": "fabien@symfony.com" 726 | } 727 | ], 728 | "description": "Symfony Console Component", 729 | "homepage": "http://symfony.com", 730 | "time": "2015-01-06 17:50:02" 731 | }, 732 | { 733 | "name": "symfony/event-dispatcher", 734 | "version": "v2.6.3", 735 | "target-dir": "Symfony/Component/EventDispatcher", 736 | "source": { 737 | "type": "git", 738 | "url": "https://github.com/symfony/EventDispatcher.git", 739 | "reference": "40ff70cadea3785d83cac1c8309514b36113064e" 740 | }, 741 | "dist": { 742 | "type": "zip", 743 | "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/40ff70cadea3785d83cac1c8309514b36113064e", 744 | "reference": "40ff70cadea3785d83cac1c8309514b36113064e", 745 | "shasum": "" 746 | }, 747 | "require": { 748 | "php": ">=5.3.3" 749 | }, 750 | "require-dev": { 751 | "psr/log": "~1.0", 752 | "symfony/config": "~2.0,>=2.0.5", 753 | "symfony/dependency-injection": "~2.6", 754 | "symfony/expression-language": "~2.6", 755 | "symfony/stopwatch": "~2.3" 756 | }, 757 | "suggest": { 758 | "symfony/dependency-injection": "", 759 | "symfony/http-kernel": "" 760 | }, 761 | "type": "library", 762 | "extra": { 763 | "branch-alias": { 764 | "dev-master": "2.6-dev" 765 | } 766 | }, 767 | "autoload": { 768 | "psr-0": { 769 | "Symfony\\Component\\EventDispatcher\\": "" 770 | } 771 | }, 772 | "notification-url": "https://packagist.org/downloads/", 773 | "license": [ 774 | "MIT" 775 | ], 776 | "authors": [ 777 | { 778 | "name": "Symfony Community", 779 | "homepage": "http://symfony.com/contributors" 780 | }, 781 | { 782 | "name": "Fabien Potencier", 783 | "email": "fabien@symfony.com" 784 | } 785 | ], 786 | "description": "Symfony EventDispatcher Component", 787 | "homepage": "http://symfony.com", 788 | "time": "2015-01-05 14:28:40" 789 | }, 790 | { 791 | "name": "symfony/filesystem", 792 | "version": "v2.6.3", 793 | "target-dir": "Symfony/Component/Filesystem", 794 | "source": { 795 | "type": "git", 796 | "url": "https://github.com/symfony/Filesystem.git", 797 | "reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7" 798 | }, 799 | "dist": { 800 | "type": "zip", 801 | "url": "https://api.github.com/repos/symfony/Filesystem/zipball/a1f566d1f92e142fa1593f4555d6d89e3044a9b7", 802 | "reference": "a1f566d1f92e142fa1593f4555d6d89e3044a9b7", 803 | "shasum": "" 804 | }, 805 | "require": { 806 | "php": ">=5.3.3" 807 | }, 808 | "type": "library", 809 | "extra": { 810 | "branch-alias": { 811 | "dev-master": "2.6-dev" 812 | } 813 | }, 814 | "autoload": { 815 | "psr-0": { 816 | "Symfony\\Component\\Filesystem\\": "" 817 | } 818 | }, 819 | "notification-url": "https://packagist.org/downloads/", 820 | "license": [ 821 | "MIT" 822 | ], 823 | "authors": [ 824 | { 825 | "name": "Symfony Community", 826 | "homepage": "http://symfony.com/contributors" 827 | }, 828 | { 829 | "name": "Fabien Potencier", 830 | "email": "fabien@symfony.com" 831 | } 832 | ], 833 | "description": "Symfony Filesystem Component", 834 | "homepage": "http://symfony.com", 835 | "time": "2015-01-03 21:13:09" 836 | }, 837 | { 838 | "name": "symfony/stopwatch", 839 | "version": "v2.6.3", 840 | "target-dir": "Symfony/Component/Stopwatch", 841 | "source": { 842 | "type": "git", 843 | "url": "https://github.com/symfony/Stopwatch.git", 844 | "reference": "e8da5286132ba75ce4b4275fbf0f4cd369bfd71c" 845 | }, 846 | "dist": { 847 | "type": "zip", 848 | "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/e8da5286132ba75ce4b4275fbf0f4cd369bfd71c", 849 | "reference": "e8da5286132ba75ce4b4275fbf0f4cd369bfd71c", 850 | "shasum": "" 851 | }, 852 | "require": { 853 | "php": ">=5.3.3" 854 | }, 855 | "type": "library", 856 | "extra": { 857 | "branch-alias": { 858 | "dev-master": "2.6-dev" 859 | } 860 | }, 861 | "autoload": { 862 | "psr-0": { 863 | "Symfony\\Component\\Stopwatch\\": "" 864 | } 865 | }, 866 | "notification-url": "https://packagist.org/downloads/", 867 | "license": [ 868 | "MIT" 869 | ], 870 | "authors": [ 871 | { 872 | "name": "Symfony Community", 873 | "homepage": "http://symfony.com/contributors" 874 | }, 875 | { 876 | "name": "Fabien Potencier", 877 | "email": "fabien@symfony.com" 878 | } 879 | ], 880 | "description": "Symfony Stopwatch Component", 881 | "homepage": "http://symfony.com", 882 | "time": "2015-01-03 08:01:59" 883 | }, 884 | { 885 | "name": "symfony/yaml", 886 | "version": "v2.6.3", 887 | "target-dir": "Symfony/Component/Yaml", 888 | "source": { 889 | "type": "git", 890 | "url": "https://github.com/symfony/Yaml.git", 891 | "reference": "82462a90848a52c2533aa6b598b107d68076b018" 892 | }, 893 | "dist": { 894 | "type": "zip", 895 | "url": "https://api.github.com/repos/symfony/Yaml/zipball/82462a90848a52c2533aa6b598b107d68076b018", 896 | "reference": "82462a90848a52c2533aa6b598b107d68076b018", 897 | "shasum": "" 898 | }, 899 | "require": { 900 | "php": ">=5.3.3" 901 | }, 902 | "type": "library", 903 | "extra": { 904 | "branch-alias": { 905 | "dev-master": "2.6-dev" 906 | } 907 | }, 908 | "autoload": { 909 | "psr-0": { 910 | "Symfony\\Component\\Yaml\\": "" 911 | } 912 | }, 913 | "notification-url": "https://packagist.org/downloads/", 914 | "license": [ 915 | "MIT" 916 | ], 917 | "authors": [ 918 | { 919 | "name": "Symfony Community", 920 | "homepage": "http://symfony.com/contributors" 921 | }, 922 | { 923 | "name": "Fabien Potencier", 924 | "email": "fabien@symfony.com" 925 | } 926 | ], 927 | "description": "Symfony Yaml Component", 928 | "homepage": "http://symfony.com", 929 | "time": "2015-01-03 15:33:07" 930 | } 931 | ], 932 | "aliases": [], 933 | "minimum-stability": "stable", 934 | "stability-flags": { 935 | "satooshi/php-coveralls": 20 936 | }, 937 | "prefer-stable": false, 938 | "prefer-lowest": false, 939 | "platform": { 940 | "php": ">=5.5" 941 | }, 942 | "platform-dev": [] 943 | } 944 | --------------------------------------------------------------------------------