├── .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 | [](https://travis-ci.org/joshdifabio/semantic-diff) [](https://coveralls.io/r/joshdifabio/semantic-diff) [](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 |
--------------------------------------------------------------------------------