From 59536133139eb194b0164aeebae2317a212d53d8 Mon Sep 17 00:00:00 2001 From: Pierre Hennequart Date: Fri, 28 Jul 2017 16:32:56 +0200 Subject: [PATCH] update dependencies - change php compatibility to 7.1 - use symfony 3.4 dev packages - add IncenteevParameterHandler dev package - fix phpdoc comments - strict mode - add interfaces --- .formatter.yml | 1 + .travis.yml | 4 +- composer.json | 30 +- composer.lock | 1655 ++++++++++------- example.png | Bin 55628 -> 55574 bytes src/Command/DoctrinevizCommand.php | 22 +- src/DependencyInjection/Configuration.php | 8 +- .../DoctrinevizBundleExtension.php | 2 + src/DoctrinevizBundle.php | 4 +- src/Graphviz/{Node.php => Attributable.php} | 42 +- src/Graphviz/Attribute.php | 14 +- src/Graphviz/AttributeInterface.php | 49 + src/Graphviz/Edge.php | 54 +- src/Graphviz/EdgeInterface.php | 70 + src/Graphviz/Edgeable.php | 44 +- src/Graphviz/Element.php | 44 + src/Graphviz/ElementInterface.php | 49 + src/Graphviz/Graph.php | 73 +- src/Graphviz/GraphInterface.php | 106 ++ src/Graphviz/Graphviz.php | 55 +- src/Graphviz/Record.php | 58 +- src/Graphviz/RecordInterface.php | 35 + src/Graphviz/Vertex.php | 72 +- src/Graphviz/VertexInterface.php | 81 + test/Command/DoctrinevizCommandTest.php | 3 + .../DependencyInjection/ConfigurationTest.php | 6 +- .../DoctrinevizBundleExtensionTest.php | 3 + test/DoctrinevizBundleTest.php | 2 + test/DoctrinevizTestCase.php | 15 + test/Entity/Address.php | 2 + test/Entity/Email.php | 2 + test/Entity/Group.php | 2 + test/Entity/User.php | 2 + .../{NodeTest.php => AttributableTest.php} | 6 +- test/Graphviz/AttributeTest.php | 2 + test/Graphviz/EdgeTest.php | 31 +- test/Graphviz/EdgeableTest.php | 6 + test/Graphviz/GraphTest.php | 2 + test/Graphviz/GraphvizTest.php | 6 +- test/Graphviz/RecordTest.php | 2 + test/Graphviz/VertexTest.php | 2 + 41 files changed, 1763 insertions(+), 903 deletions(-) rename src/Graphviz/{Node.php => Attributable.php} (66%) create mode 100644 src/Graphviz/AttributeInterface.php create mode 100644 src/Graphviz/EdgeInterface.php create mode 100644 src/Graphviz/Element.php create mode 100644 src/Graphviz/ElementInterface.php create mode 100644 src/Graphviz/GraphInterface.php create mode 100644 src/Graphviz/RecordInterface.php create mode 100644 src/Graphviz/VertexInterface.php rename test/Graphviz/{NodeTest.php => AttributableTest.php} (95%) diff --git a/.formatter.yml b/.formatter.yml index ceb4fa3..ef8ca96 100644 --- a/.formatter.yml +++ b/.formatter.yml @@ -1,3 +1,4 @@ +strict: true header: | /* * This file is part of the doctrineviz package diff --git a/.travis.yml b/.travis.yml index dfa4517..4bfbe60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,13 @@ language: php services: - mysql php: - - '5.6' - - '7.0' - '7.1' before_install: - sudo apt-get update - sudo apt-get install graphviz - mysql -e 'CREATE DATABASE doctrineviz;' install: - - mv env/config/parameters.yml.dist env/config/parameters.yml + - cp env/config/parameters.yml.dist env/config/parameters.yml - composer install - php env/console doctrine:schema:create script: diff --git a/composer.json b/composer.json index b08d2a9..08faccb 100644 --- a/composer.json +++ b/composer.json @@ -20,15 +20,29 @@ } }, "require": { - "php": ">=5.6" + "php": ">=7.1" }, "require-dev": { - "symfony/symfony": "2.8.*", - "doctrine/orm": "^2.4.8", - "doctrine/doctrine-bundle": "~1.4", - "symfony/monolog-bundle": "~2.11.3", - "symfony/phpunit-bridge": "~2.7", - "phpunit/phpunit": "^5.6", - "satooshi/php-coveralls": "^1.0" + "symfony/symfony": "^3.4", + "doctrine/orm": "^2.5", + "doctrine/doctrine-bundle": "^1.6", + "symfony/monolog-bundle": "^3.1.0", + "symfony/phpunit-bridge": "^3.0", + "phpunit/phpunit": "^6.2", + "satooshi/php-coveralls": "^1.0", + "incenteev/composer-parameter-handler": "^2.1" + }, + "scripts": { + "post-install-cmd": [ + "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters" + ], + "post-update-cmd": [ + "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters" + ] + }, + "extra": { + "incenteev-parameters": { + "file": "env/config/parameters.yml" + } } } diff --git a/composer.lock b/composer.lock index da94dc1..534acc1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,35 +4,35 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "a4348ad1bace517ccd06fbbeead90a5c", + "content-hash": "5ae3525c52d1a44c6c3efaebeb4c5e70", "packages": [], "packages-dev": [ { "name": "doctrine/annotations", - "version": "v1.3.1", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "bd4461328621bde0ae6b1b2675fbc6aca4ceb558" + "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/bd4461328621bde0ae6b1b2675fbc6aca4ceb558", - "reference": "bd4461328621bde0ae6b1b2675fbc6aca4ceb558", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5beebb01b025c94e93686b7a0ed3edae81fe3e7f", + "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": "^5.6 || ^7.0" + "php": "^7.1" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^5.6.1" + "phpunit/phpunit": "^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "1.5.x-dev" } }, "autoload": { @@ -73,37 +73,41 @@ "docblock", "parser" ], - "time": "2016-12-30T15:59:45+00:00" + "time": "2017-07-22T10:58:02+00:00" }, { "name": "doctrine/cache", - "version": "v1.6.1", + "version": "v1.7.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3" + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3", - "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3", + "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a", + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a", "shasum": "" }, "require": { - "php": "~5.5|~7.0" + "php": "~7.1" }, "conflict": { "doctrine/common": ">2.2,<2.4" }, "require-dev": { - "phpunit/phpunit": "~4.8|~5.0", - "predis/predis": "~1.0", - "satooshi/php-coveralls": "~0.6" + "alcaeus/mongo-php-adapter": "^1.1", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^5.7", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -143,24 +147,24 @@ "cache", "caching" ], - "time": "2016-10-29T11:16:17+00:00" + "time": "2017-08-25T07:02:50+00:00" }, { "name": "doctrine/collections", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", - "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", + "url": "https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf", + "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.1" }, "require-dev": { "doctrine/coding-standard": "~0.1@dev", @@ -210,20 +214,20 @@ "collections", "iterator" ], - "time": "2017-01-03T10:49:41+00:00" + "time": "2017-07-22T10:37:32+00:00" }, { "name": "doctrine/common", - "version": "v2.7.2", + "version": "v2.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "930297026c8009a567ac051fd545bf6124150347" + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/930297026c8009a567ac051fd545bf6124150347", - "reference": "930297026c8009a567ac051fd545bf6124150347", + "url": "https://api.github.com/repos/doctrine/common/zipball/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", "shasum": "" }, "require": { @@ -232,15 +236,15 @@ "doctrine/collections": "1.*", "doctrine/inflector": "1.*", "doctrine/lexer": "1.*", - "php": "~5.6|~7.0" + "php": "~7.1" }, "require-dev": { - "phpunit/phpunit": "^5.4.6" + "phpunit/phpunit": "^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7.x-dev" + "dev-master": "2.8.x-dev" } }, "autoload": { @@ -283,28 +287,30 @@ "persistence", "spl" ], - "time": "2017-01-13T14:02:13+00:00" + "time": "2017-08-31T08:43:38+00:00" }, { "name": "doctrine/dbal", - "version": "v2.5.10", + "version": "v2.6.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "fc376f7a61498e18520cd6fa083752a4ca08072b" + "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/fc376f7a61498e18520cd6fa083752a4ca08072b", - "reference": "fc376f7a61498e18520cd6fa083752a4ca08072b", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13", + "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13", "shasum": "" }, "require": { - "doctrine/common": ">=2.4,<2.8-dev", - "php": ">=5.3.2" + "doctrine/common": "^2.7.1", + "ext-pdo": "*", + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "4.*", + "phpunit/phpunit": "^5.4.6", + "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5", "symfony/console": "2.*||^3.0" }, "suggest": { @@ -316,7 +322,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5.x-dev" + "dev-master": "2.6.x-dev" } }, "autoload": { @@ -354,41 +360,45 @@ "persistence", "queryobject" ], - "time": "2017-01-23T23:17:10+00:00" + "time": "2017-11-19T13:38:54+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "1.6.7", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "a01d99bc6c9a6c8a8ace0012690099dd957ce9b9" + "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/a01d99bc6c9a6c8a8ace0012690099dd957ce9b9", - "reference": "a01d99bc6c9a6c8a8ace0012690099dd957ce9b9", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/eb6e4fb904a459be28872765ab6e2d246aac7c87", + "reference": "eb6e4fb904a459be28872765ab6e2d246aac7c87", "shasum": "" }, "require": { - "doctrine/dbal": "~2.3", - "doctrine/doctrine-cache-bundle": "~1.0", - "jdorn/sql-formatter": "~1.1", - "php": ">=5.5.9", - "symfony/console": "~2.7|~3.0", - "symfony/dependency-injection": "~2.7|~3.0", - "symfony/doctrine-bridge": "~2.7|~3.0", - "symfony/framework-bundle": "~2.7|~3.0" + "doctrine/dbal": "^2.5.12", + "doctrine/doctrine-cache-bundle": "~1.2", + "jdorn/sql-formatter": "^1.2.16", + "php": "^5.5.9|^7.0", + "symfony/console": "~2.7|~3.0|~4.0", + "symfony/dependency-injection": "~2.7|~3.0|~4.0", + "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", + "symfony/framework-bundle": "~2.7|~3.0|~4.0" + }, + "conflict": { + "symfony/http-foundation": "<2.6" }, "require-dev": { "doctrine/orm": "~2.3", - "phpunit/phpunit": "~4", + "phpunit/phpunit": "^4.8.36|^5.7|^6.4", "satooshi/php-coveralls": "^1.0", - "symfony/phpunit-bridge": "~2.7|~3.0", - "symfony/property-info": "~2.8|~3.0", - "symfony/validator": "~2.7|~3.0", - "symfony/yaml": "~2.7|~3.0", - "twig/twig": "~1.10|~2.0" + "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", + "symfony/property-info": "~2.8|~3.0|~4.0", + "symfony/validator": "~2.7|~3.0|~4.0", + "symfony/web-profiler-bundle": "~2.7|~3.0|~4.0", + "symfony/yaml": "~2.7|~3.0|~4.0", + "twig/twig": "~1.26|~2.0" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -397,7 +407,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -435,27 +445,27 @@ "orm", "persistence" ], - "time": "2017-01-16T12:01:26+00:00" + "time": "2017-11-24T13:09:19+00:00" }, { "name": "doctrine/doctrine-cache-bundle", - "version": "1.3.0", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineCacheBundle.git", - "reference": "18c600a9b82f6454d2e81ca4957cdd56a1cf3504" + "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/18c600a9b82f6454d2e81ca4957cdd56a1cf3504", - "reference": "18c600a9b82f6454d2e81ca4957cdd56a1cf3504", + "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1", + "reference": "9baecbd6bfdd1123b0cf8c1b88fee0170a84ddd1", "shasum": "" }, "require": { "doctrine/cache": "^1.4.2", "doctrine/inflector": "~1.0", "php": ">=5.3.2", - "symfony/doctrine-bridge": "~2.2|~3.0" + "symfony/doctrine-bridge": "~2.2|~3.0|~4.0" }, "require-dev": { "instaclick/coding-standard": "~1.1", @@ -463,15 +473,15 @@ "instaclick/symfony2-coding-standard": "dev-remaster", "phpunit/phpunit": "~4", "predis/predis": "~0.8", - "satooshi/php-coveralls": "~0.6.1", + "satooshi/php-coveralls": "^1.0", "squizlabs/php_codesniffer": "~1.5", - "symfony/console": "~2.2|~3.0", - "symfony/finder": "~2.2|~3.0", - "symfony/framework-bundle": "~2.2|~3.0", - "symfony/phpunit-bridge": "~2.7|~3.0", + "symfony/console": "~2.2|~3.0|~4.0", + "symfony/finder": "~2.2|~3.0|~4.0", + "symfony/framework-bundle": "~2.2|~3.0|~4.0", + "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", "symfony/security-acl": "~2.3|~3.0", - "symfony/validator": "~2.2|~3.0", - "symfony/yaml": "~2.2|~3.0" + "symfony/validator": "~2.2|~3.0|~4.0", + "symfony/yaml": "~2.2|~3.0|~4.0" }, "suggest": { "symfony/security-acl": "For using this bundle to cache ACLs" @@ -479,7 +489,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -523,37 +533,37 @@ "cache", "caching" ], - "time": "2016-01-26T17:28:51+00:00" + "time": "2017-10-12T17:23:29+00:00" }, { "name": "doctrine/inflector", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -590,36 +600,36 @@ "singularize", "string" ], - "time": "2015-11-06T14:35:42+00:00" + "time": "2017-07-22T12:18:28+00:00" }, { "name": "doctrine/instantiator", - "version": "1.0.5", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "php": "^7.1" }, "require-dev": { "athletic/athletic": "~0.1.8", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "phpunit/phpunit": "^6.2.3", + "squizlabs/php_codesniffer": "^3.0.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -644,7 +654,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14T21:17:01+00:00" + "time": "2017-07-22T11:58:36+00:00" }, { "name": "doctrine/lexer", @@ -702,31 +712,31 @@ }, { "name": "doctrine/orm", - "version": "v2.5.6", + "version": "v2.5.13", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "e6c434196c8ef058239aaa0724b4aadb0107940b" + "reference": "93103f44a3e36e7b48165b6e6b736833f33b18ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/e6c434196c8ef058239aaa0724b4aadb0107940b", - "reference": "e6c434196c8ef058239aaa0724b4aadb0107940b", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/93103f44a3e36e7b48165b6e6b736833f33b18ef", + "reference": "93103f44a3e36e7b48165b6e6b736833f33b18ef", "shasum": "" }, "require": { "doctrine/cache": "~1.4", "doctrine/collections": "~1.2", - "doctrine/common": ">=2.5-dev,<2.8-dev", - "doctrine/dbal": ">=2.5-dev,<2.6-dev", - "doctrine/instantiator": "~1.0.1", + "doctrine/common": ">=2.5-dev,<2.9-dev", + "doctrine/dbal": ">=2.5-dev,<2.7-dev", + "doctrine/instantiator": "^1.0.1", "ext-pdo": "*", "php": ">=5.4", - "symfony/console": "~2.5|~3.0" + "symfony/console": "~2.5|~3.0|~4.0" }, "require-dev": { "phpunit/phpunit": "~4.0", - "symfony/yaml": "~2.3|~3.0" + "symfony/yaml": "~2.3|~3.0|~4.0" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" @@ -774,26 +784,80 @@ "database", "orm" ], - "time": "2016-12-18T15:42:34+00:00" + "time": "2017-11-27T23:25:55+00:00" + }, + { + "name": "fig/link-util", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/link-util.git", + "reference": "1a07821801a148be4add11ab0603e4af55a72fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac", + "reference": "1a07821801a148be4add11ab0603e4af55a72fac", + "shasum": "" + }, + "require": { + "php": ">=5.5.0", + "psr/link": "~1.0@dev" + }, + "require-dev": { + "phpunit/phpunit": "^5.1", + "squizlabs/php_codesniffer": "^2.3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Fig\\Link\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common utility implementations for HTTP links", + "keywords": [ + "http", + "http-link", + "link", + "psr", + "psr-13", + "rest" + ], + "time": "2016-10-17T18:31:11+00:00" }, { "name": "guzzle/guzzle", - "version": "v3.9.3", + "version": "v3.8.1", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle3.git", - "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9" + "url": "https://github.com/guzzle/guzzle.git", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9", - "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba", "shasum": "" }, "require": { "ext-curl": "*", "php": ">=5.3.3", - "symfony/event-dispatcher": "~2.1" + "symfony/event-dispatcher": ">=2.1" }, "replace": { "guzzle/batch": "self.version", @@ -820,21 +884,18 @@ "guzzle/stream": "self.version" }, "require-dev": { - "doctrine/cache": "~1.3", - "monolog/monolog": "~1.0", + "doctrine/cache": "*", + "monolog/monolog": "1.*", "phpunit/phpunit": "3.7.*", - "psr/log": "~1.0", - "symfony/class-loader": "~2.1", - "zendframework/zend-cache": "2.*,<2.3", - "zendframework/zend-log": "2.*,<2.3" - }, - "suggest": { - "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated." + "psr/log": "1.0.*", + "symfony/class-loader": "*", + "zendframework/zend-cache": "<2.3", + "zendframework/zend-log": "<2.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.9-dev" + "dev-master": "3.8-dev" } }, "autoload": { @@ -858,7 +919,7 @@ "homepage": "https://github.com/guzzle/guzzle/contributors" } ], - "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle", + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", "homepage": "http://guzzlephp.org/", "keywords": [ "client", @@ -870,30 +931,41 @@ "web service" ], "abandoned": "guzzlehttp/guzzle", - "time": "2015-03-18T18:23:50+00:00" + "time": "2014-01-28T22:29:15+00:00" }, { - "name": "ircmaxell/password-compat", - "version": "v1.0.4", + "name": "incenteev/composer-parameter-handler", + "version": "v2.1.2", "source": { "type": "git", - "url": "https://github.com/ircmaxell/password_compat.git", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c" + "url": "https://github.com/Incenteev/ParameterHandler.git", + "reference": "d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c", - "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c", + "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc", + "reference": "d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc", "shasum": "" }, + "require": { + "php": ">=5.3.3", + "symfony/yaml": "~2.3|~3.0" + }, "require-dev": { - "phpunit/phpunit": "4.*" + "composer/composer": "1.0.*@dev", + "phpspec/prophecy-phpunit": "~1.0", + "symfony/filesystem": "~2.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, "autoload": { - "files": [ - "lib/password.php" - ] + "psr-4": { + "Incenteev\\ParameterHandler\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -901,18 +973,16 @@ ], "authors": [ { - "name": "Anthony Ferrara", - "email": "ircmaxell@php.net", - "homepage": "http://blog.ircmaxell.com" + "name": "Christophe Coevoet", + "email": "stof@notk.org" } ], - "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", - "homepage": "https://github.com/ircmaxell/password_compat", + "description": "Composer script handling your ignored parameter file", + "homepage": "https://github.com/Incenteev/ParameterHandler", "keywords": [ - "hashing", - "password" + "parameters management" ], - "time": "2014-11-20T16:49:30+00:00" + "time": "2015-11-10T17:04:01+00:00" }, { "name": "jdorn/sql-formatter", @@ -966,16 +1036,16 @@ }, { "name": "monolog/monolog", - "version": "1.22.0", + "version": "1.23.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "bad29cb8d18ab0315e6c477751418a82c850d558" + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bad29cb8d18ab0315e6c477751418a82c850d558", - "reference": "bad29cb8d18ab0315e6c477751418a82c850d558", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", "shasum": "" }, "require": { @@ -996,7 +1066,7 @@ "phpunit/phpunit-mock-objects": "2.3.0", "ruflin/elastica": ">=0.90 <3.0", "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "~5.3" + "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -1040,41 +1110,44 @@ "logging", "psr-3" ], - "time": "2016-11-26T00:15:39+00:00" + "time": "2017-06-19T01:22:40+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.6.0", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe" + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe", - "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": "^5.6 || ^7.0" }, "require-dev": { - "doctrine/collections": "1.*", - "phpunit/phpunit": "~4.1" + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" }, "type": "library", "autoload": { "psr-4": { "DeepCopy\\": "src/DeepCopy/" - } + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", - "homepage": "https://github.com/myclabs/DeepCopy", "keywords": [ "clone", "copy", @@ -1082,20 +1155,20 @@ "object", "object graph" ], - "time": "2017-01-26T22:05:40+00:00" + "time": "2017-10-19T19:58:43+00:00" }, { "name": "paragonie/random_compat", - "version": "v2.0.4", + "version": "v2.0.11", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e" + "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e", - "reference": "a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", + "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", "shasum": "" }, "require": { @@ -1130,20 +1203,122 @@ "pseudorandom", "random" ], - "time": "2016-11-07T23:38:38+00:00" + "time": "2017-09-27T21:40:39+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2017-03-05T18:14:27+00:00" + }, + { + "name": "phar-io/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2017-03-05T17:38:23+00:00" }, { "name": "phpdocumentor/reflection-common", - "version": "1.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "shasum": "" }, "require": { @@ -1184,33 +1359,39 @@ "reflection", "static analysis" ], - "time": "2015-12-27T11:43:31+00:00" + "time": "2017-09-11T18:02:19+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.1.1", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" + "reference": "66465776cfc249844bde6d117abff1d22e06c2da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/66465776cfc249844bde6d117abff1d22e06c2da", + "reference": "66465776cfc249844bde6d117abff1d22e06c2da", "shasum": "" }, "require": { - "php": ">=5.5", - "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.2.0", + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ @@ -1229,24 +1410,24 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-09-30T07:12:33+00:00" + "time": "2017-11-27T17:38:31+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.2.1", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", "shasum": "" }, "require": { - "php": ">=5.5", + "php": "^5.5 || ^7.0", "phpdocumentor/reflection-common": "^1.0" }, "require-dev": { @@ -1276,37 +1457,37 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-11-25T06:54:22+00:00" + "time": "2017-07-14T14:27:02+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.6.2", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "6c52c2722f8460122f96f86346600e1077ce22cb" + "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", - "reference": "6c52c2722f8460122f96f86346600e1077ce22cb", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", + "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", - "sebastian/comparator": "^1.1", - "sebastian/recursion-context": "^1.0|^2.0" + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, "require-dev": { - "phpspec/phpspec": "^2.0", - "phpunit/phpunit": "^4.8 || ^5.6.5" + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -1339,44 +1520,45 @@ "spy", "stub" ], - "time": "2016-11-21T14:58:47+00:00" + "time": "2017-11-24T13:59:53+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "4.0.5", + "version": "5.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c19cfc7cbb0e9338d8c469c7eedecc2a428b0971" + "reference": "033ec97498cf530cc1be4199264cad568b19be26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c19cfc7cbb0e9338d8c469c7eedecc2a428b0971", - "reference": "c19cfc7cbb0e9338d8c469c7eedecc2a428b0971", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/033ec97498cf530cc1be4199264cad568b19be26", + "reference": "033ec97498cf530cc1be4199264cad568b19be26", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "^1.4.2", - "sebastian/code-unit-reverse-lookup": "~1.0", - "sebastian/environment": "^1.3.2 || ^2.0", - "sebastian/version": "~1.0|~2.0" + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.0", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^2.0.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" }, "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "^5.4" + "ext-xdebug": "^2.5", + "phpunit/phpunit": "^6.0" }, "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.4.0", - "ext-xmlwriter": "*" + "ext-xdebug": "^2.5.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-master": "5.2.x-dev" } }, "autoload": { @@ -1402,20 +1584,20 @@ "testing", "xunit" ], - "time": "2017-01-20T15:06:43+00:00" + "time": "2017-11-27T09:00:30+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.2", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", "shasum": "" }, "require": { @@ -1449,7 +1631,7 @@ "filesystem", "iterator" ], - "time": "2016-10-03T07:40:28+00:00" + "time": "2017-11-27T13:52:08+00:00" }, { "name": "phpunit/php-text-template", @@ -1494,25 +1676,30 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.8", + "version": "1.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4|~5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1534,33 +1721,33 @@ "keywords": [ "timer" ], - "time": "2016-05-12T18:03:57+00:00" + "time": "2017-02-26T11:10:40+00:00" }, { "name": "phpunit/php-token-stream", - "version": "1.4.9", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" + "reference": "791198a2c6254db10131eecfe8c06670700904db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", - "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", + "reference": "791198a2c6254db10131eecfe8c06670700904db", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=5.3.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "^6.2.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1583,20 +1770,20 @@ "keywords": [ "tokenizer" ], - "time": "2016-11-15T14:06:22+00:00" + "time": "2017-11-27T05:48:46+00:00" }, { "name": "phpunit/phpunit", - "version": "5.7.8", + "version": "6.4.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "bee7755d964f8e56d6ecb79046480fd0320b686d" + "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bee7755d964f8e56d6ecb79046480fd0320b686d", - "reference": "bee7755d964f8e56d6ecb79046480fd0320b686d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/562f7dc75d46510a4ed5d16189ae57fbe45a9932", + "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932", "shasum": "" }, "require": { @@ -1605,33 +1792,35 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "~1.3", - "php": "^5.6 || ^7.0", - "phpspec/prophecy": "^1.6.2", - "phpunit/php-code-coverage": "^4.0.4", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "^3.2", - "sebastian/comparator": "~1.2.2", - "sebastian/diff": "~1.2", - "sebastian/environment": "^1.3.4 || ^2.0", - "sebastian/exporter": "~2.0", - "sebastian/global-state": "^1.0 || ^2.0", - "sebastian/object-enumerator": "~2.0", - "sebastian/resource-operations": "~1.0", - "sebastian/version": "~1.0|~2.0", - "symfony/yaml": "~2.1|~3.0" + "myclabs/deep-copy": "^1.6.1", + "phar-io/manifest": "^1.0.1", + "phar-io/version": "^1.0", + "php": "^7.0", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^5.2.2", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^1.0.9", + "phpunit/phpunit-mock-objects": "^4.0.3", + "sebastian/comparator": "^2.0.2", + "sebastian/diff": "^2.0", + "sebastian/environment": "^3.1", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^1.0", + "sebastian/version": "^2.0.1" }, "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2" + "phpdocumentor/reflection-docblock": "3.0.2", + "phpunit/dbunit": "<3.0" }, "require-dev": { "ext-pdo": "*" }, "suggest": { "ext-xdebug": "*", - "phpunit/php-invoker": "~1.1" + "phpunit/php-invoker": "^1.1" }, "bin": [ "phpunit" @@ -1639,7 +1828,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.7.x-dev" + "dev-master": "6.4.x-dev" } }, "autoload": { @@ -1665,33 +1854,33 @@ "testing", "xunit" ], - "time": "2017-01-26T15:28:51+00:00" + "time": "2017-11-08T11:26:09+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "3.4.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" + "reference": "2f789b59ab89669015ad984afa350c4ec577ade0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", - "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/2f789b59ab89669015ad984afa350c4ec577ade0", + "reference": "2f789b59ab89669015ad984afa350c4ec577ade0", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.6 || ^7.0", - "phpunit/php-text-template": "^1.2", - "sebastian/exporter": "^1.2 || ^2.0" + "doctrine/instantiator": "^1.0.5", + "php": "^7.0", + "phpunit/php-text-template": "^1.2.1", + "sebastian/exporter": "^3.0" }, "conflict": { - "phpunit/phpunit": "<5.4.0" + "phpunit/phpunit": "<6.0" }, "require-dev": { - "phpunit/phpunit": "^5.4" + "phpunit/phpunit": "^6.0" }, "suggest": { "ext-soap": "*" @@ -1699,7 +1888,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -1724,20 +1913,20 @@ "mock", "xunit" ], - "time": "2016-12-08T20:27:08+00:00" + "time": "2017-08-03T14:08:16+00:00" }, { - "name": "psr/log", - "version": "1.0.2", + "name": "psr/cache", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { @@ -1751,7 +1940,7 @@ }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1764,50 +1953,40 @@ "homepage": "http://www.php-fig.org/" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Common interface for caching libraries", "keywords": [ - "log", + "cache", "psr", - "psr-3" + "psr-6" ], - "time": "2016-10-10T12:19:37+00:00" + "time": "2016-08-06T20:24:11+00:00" }, { - "name": "satooshi/php-coveralls", - "version": "v1.0.1", + "name": "psr/container", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/satooshi/php-coveralls.git", - "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c" + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/da51d304fe8622bf9a6da39a8446e7afd432115c", - "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", "shasum": "" }, "require": { - "ext-json": "*", - "ext-simplexml": "*", - "guzzle/guzzle": "^2.8|^3.0", - "php": ">=5.3.3", - "psr/log": "^1.0", - "symfony/config": "^2.1|^3.0", - "symfony/console": "^2.1|^3.0", - "symfony/stopwatch": "^2.0|^3.0", - "symfony/yaml": "^2.0|^3.0" - }, - "suggest": { - "symfony/http-kernel": "Allows Symfony integration" + "php": ">=5.3.0" }, - "bin": [ - "bin/coveralls" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Satooshi\\": "src/Satooshi/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1816,40 +1995,37 @@ ], "authors": [ { - "name": "Kitamura Satoshi", - "email": "with.no.parachute@gmail.com", - "homepage": "https://www.facebook.com/satooshi.jp" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "PHP client library for Coveralls API", - "homepage": "https://github.com/satooshi/php-coveralls", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "ci", - "coverage", - "github", - "test" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], - "time": "2016-01-20T17:35:46+00:00" + "time": "2017-02-14T16:28:37+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", + "name": "psr/link", "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" + "url": "https://github.com/php-fig/link.git", + "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", - "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", + "url": "https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562", + "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562", "shasum": "" }, "require": { - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "~5" + "php": ">=5.3.0" }, "type": "library", "extra": { @@ -1858,56 +2034,264 @@ } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Link\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2016-02-13T06:45:14+00:00" + "description": "Common interfaces for HTTP links", + "keywords": [ + "http", + "http-link", + "link", + "psr", + "psr-13", + "rest" + ], + "time": "2016-10-28T16:06:13+00:00" }, { - "name": "sebastian/comparator", - "version": "1.2.2", + "name": "psr/log", + "version": "1.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-01-02T13:31:39+00:00" + }, + { + "name": "satooshi/php-coveralls", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-coveralls/php-coveralls.git", + "reference": "9c07b63acbc9709344948b6fd4f63a32b2ef4127" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/9c07b63acbc9709344948b6fd4f63a32b2ef4127", + "reference": "9c07b63acbc9709344948b6fd4f63a32b2ef4127", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-simplexml": "*", + "guzzle/guzzle": "^2.8 || ^3.0", + "php": "^5.3.3 || ^7.0", + "psr/log": "^1.0", + "symfony/config": "^2.1 || ^3.0 || ^4.0", + "symfony/console": "^2.1 || ^3.0 || ^4.0", + "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0", + "symfony/yaml": "^2.0 || ^3.0 || ^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0" + }, + "suggest": { + "symfony/http-kernel": "Allows Symfony integration" + }, + "bin": [ + "bin/coveralls" + ], + "type": "library", + "autoload": { + "psr-4": { + "Satooshi\\": "src/Satooshi/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kitamura Satoshi", + "email": "with.no.parachute@gmail.com", + "homepage": "https://www.facebook.com/satooshi.jp" + } + ], + "description": "PHP client library for Coveralls API", + "homepage": "https://github.com/php-coveralls/php-coveralls", + "keywords": [ + "ci", + "coverage", + "github", + "test" + ], + "time": "2017-10-14T23:15:34+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1174d9018191e93cb9d719edec01257fc05f8158" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1174d9018191e93cb9d719edec01257fc05f8158", + "reference": "1174d9018191e93cb9d719edec01257fc05f8158", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/diff": "^2.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1932,38 +2316,38 @@ } ], "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], - "time": "2016-11-19T09:18:40+00:00" + "time": "2017-11-03T07:16:52+00:00" }, { "name": "sebastian/diff", - "version": "1.4.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1990,32 +2374,32 @@ "keywords": [ "diff" ], - "time": "2015-12-08T07:14:41+00:00" + "time": "2017-08-03T08:09:46+00:00" }, { "name": "sebastian/environment", - "version": "2.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^5.0" + "phpunit/phpunit": "^6.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -2040,34 +2424,34 @@ "environment", "hhvm" ], - "time": "2016-11-26T07:53:53+00:00" + "time": "2017-07-01T08:51:00+00:00" }, { "name": "sebastian/exporter", - "version": "2.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~2.0" + "php": "^7.0", + "sebastian/recursion-context": "^3.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -2107,27 +2491,27 @@ "export", "exporter" ], - "time": "2016-11-19T08:54:04+00:00" + "time": "2017-04-03T13:19:02+00:00" }, { "name": "sebastian/global-state", - "version": "1.1.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "^6.0" }, "suggest": { "ext-uopz": "*" @@ -2135,7 +2519,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2158,33 +2542,34 @@ "keywords": [ "global state" ], - "time": "2015-10-12T03:26:01+00:00" + "time": "2017-04-27T15:39:26+00:00" }, { "name": "sebastian/object-enumerator", - "version": "2.0.0", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35" + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", - "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", "shasum": "" }, "require": { - "php": ">=5.6", - "sebastian/recursion-context": "~2.0" + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "phpunit/phpunit": "~5" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -2204,32 +2589,77 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2016-11-19T07:35:10+00:00" + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" }, { "name": "sebastian/recursion-context", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -2257,7 +2687,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-11-19T07:33:16+00:00" + "time": "2017-03-03T06:23:57+00:00" }, { "name": "sebastian/resource-operations", @@ -2346,41 +2776,44 @@ }, { "name": "symfony/monolog-bundle", - "version": "2.11.3", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "0b427134a6868050fd9a95cc5eae3df85e5c759b" + "reference": "2b41b8b6d2c6edb1a5494f02f8e4129be2a44784" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/0b427134a6868050fd9a95cc5eae3df85e5c759b", - "reference": "0b427134a6868050fd9a95cc5eae3df85e5c759b", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/2b41b8b6d2c6edb1a5494f02f8e4129be2a44784", + "reference": "2b41b8b6d2c6edb1a5494f02f8e4129be2a44784", "shasum": "" }, "require": { - "monolog/monolog": "~1.18", + "monolog/monolog": "~1.22", "php": ">=5.3.2", - "symfony/config": "~2.3|~3.0", - "symfony/dependency-injection": "~2.3|~3.0", - "symfony/http-kernel": "~2.3|~3.0", - "symfony/monolog-bridge": "~2.3|~3.0" + "symfony/config": "~2.7|~3.0|~4.0", + "symfony/dependency-injection": "~2.7|~3.0|~4.0", + "symfony/http-kernel": "~2.7|~3.0|~4.0", + "symfony/monolog-bridge": "~2.7|~3.0|~4.0" }, "require-dev": { - "phpunit/phpunit": "^4.8", - "symfony/console": "~2.3|~3.0", - "symfony/yaml": "~2.3|~3.0" + "symfony/console": "~2.3|~3.0|~4.0", + "symfony/phpunit-bridge": "^3.3|^4.0", + "symfony/yaml": "~2.3|~3.0|~4.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { "Symfony\\Bundle\\MonologBundle\\": "" - } + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2402,32 +2835,39 @@ "log", "logging" ], - "time": "2016-10-19T07:54:05+00:00" + "time": "2017-11-06T16:02:17+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v2.8.16", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "1e76e80da601c6969336309678a0af4018abcae7" + "reference": "292c1a79c5c32360c62bbe67022a38c6535094d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/1e76e80da601c6969336309678a0af4018abcae7", - "reference": "1e76e80da601c6969336309678a0af4018abcae7", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/292c1a79c5c32360c62bbe67022a38c6535094d5", + "reference": "292c1a79c5c32360c62bbe67022a38c6535094d5", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, "suggest": { + "ext-zip": "Zip support is required when using bin/simple-phpunit", "symfony/debug": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" }, + "bin": [ + "bin/simple-phpunit" + ], "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -2457,20 +2897,20 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2017-01-02T20:30:24+00:00" + "time": "2017-11-22T11:41:29+00:00" }, { "name": "symfony/polyfill-apcu", - "version": "v1.3.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-apcu.git", - "reference": "5d4474f447403c3348e37b70acc2b95475b7befa" + "reference": "04f62674339602def515bff4bc6901fc1d4951e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/5d4474f447403c3348e37b70acc2b95475b7befa", - "reference": "5d4474f447403c3348e37b70acc2b95475b7befa", + "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/04f62674339602def515bff4bc6901fc1d4951e8", + "reference": "04f62674339602def515bff4bc6901fc1d4951e8", "shasum": "" }, "require": { @@ -2479,10 +2919,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.6-dev" } }, "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Apcu\\": "" + }, "files": [ "bootstrap.php" ] @@ -2510,25 +2953,25 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2017-10-11T12:05:26+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.3.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4" + "reference": "d2bb2ef00dd8605d6fbd4db53ed4af1395953497" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/2d6e2b20d457603eefb6e614286c22efca30fdb4", - "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d2bb2ef00dd8605d6fbd4db53ed4af1395953497", + "reference": "d2bb2ef00dd8605d6fbd4db53ed4af1395953497", "shasum": "" }, "require": { "php": ">=5.3.3", - "symfony/intl": "~2.3|~3.0" + "symfony/intl": "~2.3|~3.0|~4.0" }, "suggest": { "ext-intl": "For best performance" @@ -2536,7 +2979,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -2568,20 +3011,20 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2017-10-11T12:05:26+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.3.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", - "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", + "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", "shasum": "" }, "require": { @@ -2593,7 +3036,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -2627,134 +3070,20 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" - }, - { - "name": "symfony/polyfill-php54", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php54.git", - "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/90e085822963fdcc9d1c5b73deb3d2e5783b16a0", - "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php54\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2016-11-14T01:06:16+00:00" - }, - { - "name": "symfony/polyfill-php55", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php55.git", - "reference": "03e3f0350bca2220e3623a0e340eef194405fc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/03e3f0350bca2220e3623a0e340eef194405fc67", - "reference": "03e3f0350bca2220e3623a0e340eef194405fc67", - "shasum": "" - }, - "require": { - "ircmaxell/password-compat": "~1.0", - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php55\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2017-10-11T12:05:26+00:00" }, { "name": "symfony/polyfill-php56", - "version": "v1.3.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c" + "reference": "265fc96795492430762c29be291a371494ba3a5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/1dd42b9b89556f18092f3d1ada22cb05ac85383c", - "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/265fc96795492430762c29be291a371494ba3a5b", + "reference": "265fc96795492430762c29be291a371494ba3a5b", "shasum": "" }, "require": { @@ -2764,7 +3093,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -2797,20 +3126,20 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2017-10-11T12:05:26+00:00" }, { "name": "symfony/polyfill-php70", - "version": "v1.3.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2" + "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", - "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", + "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", "shasum": "" }, "require": { @@ -2820,7 +3149,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -2856,20 +3185,20 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2017-10-11T12:05:26+00:00" }, { "name": "symfony/polyfill-util", - "version": "v1.3.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-util.git", - "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb" + "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/746bce0fca664ac0a575e465f65c6643faddf7fb", - "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/6e719200c8e540e0c0effeb31f96bdb344b94176", + "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176", "shasum": "" }, "require": { @@ -2878,7 +3207,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -2908,104 +3237,55 @@ "polyfill", "shim" ], - "time": "2016-11-14T01:06:16+00:00" - }, - { - "name": "symfony/security-acl", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-acl.git", - "reference": "053b49bf4aa333a392c83296855989bcf88ddad1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-acl/zipball/053b49bf4aa333a392c83296855989bcf88ddad1", - "reference": "053b49bf4aa333a392c83296855989bcf88ddad1", - "shasum": "" - }, - "require": { - "php": ">=5.5.9", - "symfony/security-core": "~2.8|~3.0" - }, - "require-dev": { - "doctrine/common": "~2.2", - "doctrine/dbal": "~2.2", - "psr/log": "~1.0", - "symfony/phpunit-bridge": "~2.8|~3.0" - }, - "suggest": { - "doctrine/dbal": "For using the built-in ACL implementation", - "symfony/class-loader": "For using the ACL generateSql script", - "symfony/finder": "For using the ACL generateSql script" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\Acl\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Security Component - ACL (Access Control List)", - "homepage": "https://symfony.com", - "time": "2015-12-28T09:39:46+00:00" + "time": "2017-10-11T12:05:26+00:00" }, { "name": "symfony/symfony", - "version": "v2.8.16", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "9fef72a3ab561c4bfa703a70369db028dec387d2" + "reference": "0a47db379b8cc74cdd84e1e6870fafc4a4ac8351" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/9fef72a3ab561c4bfa703a70369db028dec387d2", - "reference": "9fef72a3ab561c4bfa703a70369db028dec387d2", + "url": "https://api.github.com/repos/symfony/symfony/zipball/0a47db379b8cc74cdd84e1e6870fafc4a4ac8351", + "reference": "0a47db379b8cc74cdd84e1e6870fafc4a4ac8351", "shasum": "" }, "require": { "doctrine/common": "~2.4", - "php": ">=5.3.9", + "ext-xml": "*", + "fig/link-util": "^1.0", + "php": "^5.5.9|>=7.0.8", + "psr/cache": "~1.0", + "psr/container": "^1.0", + "psr/link": "^1.0", "psr/log": "~1.0", + "psr/simple-cache": "^1.0", "symfony/polyfill-apcu": "~1.1", "symfony/polyfill-intl-icu": "~1.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php54": "~1.0", - "symfony/polyfill-php55": "~1.0", "symfony/polyfill-php56": "~1.0", - "symfony/polyfill-php70": "~1.0", + "symfony/polyfill-php70": "~1.6", "symfony/polyfill-util": "~1.0", - "symfony/security-acl": "~2.7|~3.0.0", - "twig/twig": "~1.28|~2.0" + "twig/twig": "^1.35|^2.4.4" }, "conflict": { - "phpdocumentor/reflection": "<1.0.7" + "phpdocumentor/reflection-docblock": "<3.0||>=3.2.0,<3.2.2", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/container-implementation": "1.0", + "psr/log-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" }, "replace": { "symfony/asset": "self.version", "symfony/browser-kit": "self.version", + "symfony/cache": "self.version", "symfony/class-loader": "self.version", "symfony/config": "self.version", "symfony/console": "self.version", @@ -3015,6 +3295,7 @@ "symfony/dependency-injection": "self.version", "symfony/doctrine-bridge": "self.version", "symfony/dom-crawler": "self.version", + "symfony/dotenv": "self.version", "symfony/event-dispatcher": "self.version", "symfony/expression-language": "self.version", "symfony/filesystem": "self.version", @@ -3023,9 +3304,10 @@ "symfony/framework-bundle": "self.version", "symfony/http-foundation": "self.version", "symfony/http-kernel": "self.version", + "symfony/inflector": "self.version", "symfony/intl": "self.version", "symfony/ldap": "self.version", - "symfony/locale": "self.version", + "symfony/lock": "self.version", "symfony/monolog-bridge": "self.version", "symfony/options-resolver": "self.version", "symfony/process": "self.version", @@ -3041,31 +3323,38 @@ "symfony/security-http": "self.version", "symfony/serializer": "self.version", "symfony/stopwatch": "self.version", - "symfony/swiftmailer-bridge": "self.version", "symfony/templating": "self.version", "symfony/translation": "self.version", "symfony/twig-bridge": "self.version", "symfony/twig-bundle": "self.version", "symfony/validator": "self.version", "symfony/var-dumper": "self.version", + "symfony/web-link": "self.version", "symfony/web-profiler-bundle": "self.version", + "symfony/web-server-bundle": "self.version", + "symfony/workflow": "self.version", "symfony/yaml": "self.version" }, "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.6", "doctrine/data-fixtures": "1.0.*", "doctrine/dbal": "~2.4", - "doctrine/doctrine-bundle": "~1.2", + "doctrine/doctrine-bundle": "~1.4", "doctrine/orm": "~2.4,>=2.4.5", - "egulias/email-validator": "~1.2,>=1.2.1", + "egulias/email-validator": "~1.2,>=1.2.8|~2.0", "monolog/monolog": "~1.11", "ocramius/proxy-manager": "~0.4|~1.0|~2.0", - "phpdocumentor/reflection": "^1.0.7", - "symfony/phpunit-bridge": "~3.2" + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "predis/predis": "~1.0", + "symfony/phpunit-bridge": "~3.4|~4.0", + "symfony/security-acl": "~2.8|~3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "3.4-dev" } }, "autoload": { @@ -3073,7 +3362,6 @@ "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/", "Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/", "Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/", - "Symfony\\Bridge\\Swiftmailer\\": "src/Symfony/Bridge/Swiftmailer/", "Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/", "Symfony\\Bundle\\": "src/Symfony/Bundle/", "Symfony\\Component\\": "src/Symfony/Component/" @@ -3104,38 +3392,83 @@ "keywords": [ "framework" ], - "time": "2017-01-12T20:27:46+00:00" + "time": "2017-11-30T16:56:19+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2017-04-07T12:08:54+00:00" }, { "name": "twig/twig", - "version": "v1.31.0", + "version": "v2.4.4", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "ddc9e3e20ee9c0b6908f401ac8353635b750eca7" + "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/ddc9e3e20ee9c0b6908f401ac8353635b750eca7", - "reference": "ddc9e3e20ee9c0b6908f401ac8353635b750eca7", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/eddb97148ad779f27e670e1e3f19fb323aedafeb", + "reference": "eddb97148ad779f27e670e1e3f19fb323aedafeb", "shasum": "" }, "require": { - "php": ">=5.2.7" + "php": "^7.0", + "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { + "psr/container": "^1.0", "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~3.2" + "symfony/phpunit-bridge": "~3.3@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.31-dev" + "dev-master": "2.4-dev" } }, "autoload": { "psr-0": { "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3165,7 +3498,7 @@ "keywords": [ "templating" ], - "time": "2017-01-11T19:36:15+00:00" + "time": "2017-09-27T18:10:31+00:00" }, { "name": "webmozart/assert", @@ -3224,7 +3557,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.6" + "php": ">=7.1" }, "platform-dev": [] } diff --git a/example.png b/example.png index 0374bf5a8c69163cc529f2454f78241bd57a326f..bfde17a7be4f77cec161f76f08ff66fe383c2b8c 100644 GIT binary patch literal 55574 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 P{82llbuvrYJn;VjVwYTt literal 55628 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 z z#YF1v?j8Zf)|cQcMl<852SiYEA+#@2Ht2y5lER+uEZ@9uDB%NbRn#g1s&@zUgUucC zDgb+*8#D^UK~f($vbC^^KNI=!<43=5P|Ir|N222#Iou(w(EjCT`N&O3>m%~+$_c&< z(0iBIKo>N5Xd`19E+MM|5S}V&?Q0JW2^j%VBZ)_nwqFF1iDkYT@#c9HE)$W(4;GL3 zdCZtx{lg7=^$9TE@=_pc;GV|U!^W}O#wEs1i$B3+5Qv-UQ0Is`R>Kl+#?H1~AWB~b zxF(6&4%ktVx6Gw2Af~dQ{a2jn&93nE3IMYp=|8dyoaE4Wc?O13C`CGxb{Pxt>TJ4J2S1X|0IoK;?rl1KsmhAcz#|k0XcUUVT_S z9*ea#qHAtTjDB(e*TR)NR92pEg>v+(4b1)c- zaF(RH6LF6XI*_D1q!3wf+T?WF&5d^vjw8eDd8Ci{ zg=f`@h~|53W<=K=;By69BTy9}7ZK!Ljuh$~3VtYOtMB_D{=x#9Hq>S5Xz}-2!W&y! z8mw6>yP=|CBzP&S2JV$@2MB1?0l~TqKcsr!09&`Q04%e2(<)kQ3sJIh6PKz#n){x4 z_JFOe;B_=ud1_m#J}niO7Ba8}!J#OQGw?%SJjq=9`%5II{%8X5>3J=db&2X*To`mD zamO0?IA90S2%>p->m`?`-V`zd{*^bcE*_L^(X(pc(h(j~e0v=G5_vhCv=cfO7F<5H zPi-%Tdhf+EW#SgM&yff9bkYIIP-*A@!=FLnVPEaRYrQ`HA;1Ck-h>0aOyQDbUYy^_@QZES3AHJb9FJ7T7VL#aDaId<(s=`aa!D{|L!L;urvqbS@U`sVTyY2;Np_t`5;;B!dhPAUUEM4{JoJ!ot`k2Xg^1~rQERyHRW(M6#uNK(_Y#I zCaa^{CwL-qf54VGx-s<@ks8~uDGKYJH4VB}Em`)%BxwVXJbZNAvjw#`bu4jI+KzSg zAsmH3Hsyt_&~SXT`1&|D^UbbW(%{xY((%Fbf#so(sYNn@q@W8kGu*z)82qx^E^(`% zC?n0M??9~19`$hmVW|gb+O{8zbqZA5~JfDJLfNa=7 zVh0u}_ktEPMeDKK-wFYY_R%D~Rb-242i%q!V6fzSsd?68k$LnU>8oi7Do_|9p!J?& zlnQljeyU9 zxixlupGXawx!c=&5lW7DsIv7>oeE%@{LC4A1Gn!jt76|dP)nrSygLo@7*g&#AYItQ z`*qM$o^I|C$Mpdv`#Z$n)vhLhlJzMESoc08J*w9ZH`3}%gxZ%Ze(4z8m6zNNw(`zz zc(Vnk;`#ZL1G`X;u*M4tx=$k>Qf15075*SRNvz;)_ z;?rgj)rN&xWHMPbrPu-8i3z%sk?Q;Hl)Qh9?<>VplMx7ckV|TPy>>pRNnN>$Ra1st zj*%!=>;1)aVa@UjJ+`1@)HLR~J(Xv-%5mZ0GJRv!e(jXRZjH~z-`P9Wqa<~w5`A2(I1a{^+!TE+lhD!-HZ5Q znLYm_f__Dn-2b0J|NcC#blA~(7AN}#S1+*k<;9q}1gqBh8Ll0(t8pAGG+wk~DD_mM T+I{yr_;pfAO)*8m#QXmMxTKJQ diff --git a/src/Command/DoctrinevizCommand.php b/src/Command/DoctrinevizCommand.php index 9e74bad..f596ac7 100644 --- a/src/Command/DoctrinevizCommand.php +++ b/src/Command/DoctrinevizCommand.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Command; use Doctrine\ORM\EntityManager; @@ -55,7 +57,7 @@ protected function configure() * * @return int Status code */ - public function execute(InputInterface $input, OutputInterface $output) + public function execute(InputInterface $input, OutputInterface $output): int { $pattern = '/'.$input->getOption('pattern').'/'; /** @var EntityManager $em */ @@ -159,17 +161,19 @@ public function execute(InputInterface $input, OutputInterface $output) $binary = $input->getOption('binary', null); $path = $input->getOption('output-path', null); $graphviz = new Graphviz($format, $binary); - if (!$path) { - if ('dot' === $format) { - $output->writeln((string) $graph); - } else { - $graphviz->display($graph); - } + if ($path) { + return (int) !file_put_contents($path, $graphviz->createImageData($graph)); + } + if ('dot' === $format) { + $output->writeln((string) $graph); return 0; } + // @codeCoverageIgnoreStart + $graphviz->display($graph); - return (int) !file_put_contents($path, $graphviz->createImageData($graph)); + return 0; + // @codeCoverageIgnoreEnd } /** @@ -180,7 +184,7 @@ public function execute(InputInterface $input, OutputInterface $output) * * @return string */ - protected function getFieldMappingDisplayName(array $fieldMapping, $nameKey = 'columnName') + protected function getFieldMappingDisplayName(array $fieldMapping, string $nameKey = 'columnName'): string { $name = $fieldMapping[$nameKey]; $type = array_key_exists('type', $fieldMapping) ? $fieldMapping['type'] : 'integer'; diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 69dcc8b..1d4c4a0 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\DependencyInjection; use Symfony\Component\Config\Definition\Builder\TreeBuilder; @@ -33,7 +35,7 @@ class Configuration implements ConfigurationInterface * * @param string $root */ - public function __construct($root) + public function __construct(string $root) { $this->root = $root; } @@ -41,7 +43,7 @@ public function __construct($root) /** * {@inheritdoc} */ - public function getConfigTreeBuilder() + public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root($this->getRoot()); @@ -58,7 +60,7 @@ public function getConfigTreeBuilder() * * @return string */ - public function getRoot() + public function getRoot(): string { return $this->root; } diff --git a/src/DependencyInjection/DoctrinevizBundleExtension.php b/src/DependencyInjection/DoctrinevizBundleExtension.php index a446428..68ef04d 100644 --- a/src/DependencyInjection/DoctrinevizBundleExtension.php +++ b/src/DependencyInjection/DoctrinevizBundleExtension.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerBuilder; diff --git a/src/DoctrinevizBundle.php b/src/DoctrinevizBundle.php index 0321456..0aa7929 100644 --- a/src/DoctrinevizBundle.php +++ b/src/DoctrinevizBundle.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz; use Janalis\Doctrineviz\DependencyInjection\DoctrinevizBundleExtension; @@ -28,7 +30,7 @@ class DoctrinevizBundle extends Bundle * * @return DoctrinevizBundleExtension */ - public function getContainerExtension() + public function getContainerExtension(): DoctrinevizBundleExtension { return new DoctrinevizBundleExtension(); } diff --git a/src/Graphviz/Node.php b/src/Graphviz/Attributable.php similarity index 66% rename from src/Graphviz/Node.php rename to src/Graphviz/Attributable.php index 4f7aaec..f00420f 100644 --- a/src/Graphviz/Node.php +++ b/src/Graphviz/Attributable.php @@ -13,12 +13,14 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; -abstract class Node +trait Attributable { /** @var Attribute[] */ - protected $attributes; + protected $attributes = []; /** * Indent all. @@ -28,11 +30,11 @@ abstract class Node * * @return array */ - protected function indentAll(array $strings = null, $spaces = 2) + protected function indentAll(array $strings = null, int $spaces = 2): array { $strings = $strings ?: []; foreach ($strings as $key => $string) { - $strings[$key] = $this->indent($string, $spaces); + $strings[$key] = $this->indent((string) $string, $spaces); } return $strings; @@ -46,7 +48,7 @@ protected function indentAll(array $strings = null, $spaces = 2) * * @return string */ - protected function indent($string, $spaces = 2) + protected function indent(string $string, int $spaces = 2): string { $pad = str_repeat(' ', $spaces); @@ -56,9 +58,9 @@ protected function indent($string, $spaces = 2) /** * Get attributes. * - * @return Attribute[] + * @return AttributeInterface[] */ - public function getAttributes() + public function getAttributes(): array { return $this->attributes ? array_values($this->attributes) : []; } @@ -66,9 +68,9 @@ public function getAttributes() /** * Set attributes. * - * @param Attribute[] $attributes + * @param AttributeInterface[] $attributes */ - public function setAttributes($attributes) + public function setAttributes($attributes): void { foreach ($attributes as $attribute) { $this->attributes[$attribute->getId()] = $attribute; @@ -78,12 +80,14 @@ public function setAttributes($attributes) /** * Get attribute. * - * @return string|null + * @param string $id + * + * @return AttributeInterface|null */ - public function getAttribute($id) + public function getAttribute(string $id): ?AttributeInterface { if (!array_key_exists($id, $this->attributes)) { - return; + return null; } return $this->attributes[$id]; @@ -95,9 +99,9 @@ public function getAttribute($id) * @param string $id * @param string $value * - * @return Attribute + * @return AttributeInterface */ - public function createAttribute($id, $value) + public function createAttribute($id, $value): AttributeInterface { $attribute = new Attribute($id, $value); $this->attributes[$id] = $attribute; @@ -110,7 +114,7 @@ public function createAttribute($id, $value) * * @param string $id */ - public function deleteAttribute($id) + public function deleteAttribute(string $id): void { unset($this->attributes[$id]); } @@ -118,9 +122,9 @@ public function deleteAttribute($id) /** * Add attribute. * - * @param Attribute $attribute + * @param AttributeInterface $attribute */ - public function addAttribute(Attribute $attribute) + public function addAttribute(AttributeInterface $attribute): void { $this->attributes[$attribute->getId()] = $attribute; } @@ -128,9 +132,9 @@ public function addAttribute(Attribute $attribute) /** * Remove attribute. * - * @param Attribute $attribute + * @param AttributeInterface $attribute */ - public function removeAttribute(Attribute $attribute) + public function removeAttribute(AttributeInterface $attribute): void { unset($this->attributes[$attribute->getId()]); } diff --git a/src/Graphviz/Attribute.php b/src/Graphviz/Attribute.php index 9e3cf86..f6e9e8c 100644 --- a/src/Graphviz/Attribute.php +++ b/src/Graphviz/Attribute.php @@ -13,9 +13,11 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; -class Attribute +class Attribute implements AttributeInterface { /** @var string */ protected $id; @@ -37,7 +39,7 @@ public function __toString() * @param string $id * @param string $value */ - public function __construct($id, $value) + public function __construct(string $id, string $value) { $this->id = $id; $this->value = $value; @@ -48,7 +50,7 @@ public function __construct($id, $value) * * @return string */ - public function getId() + public function getId(): string { return $this->id; } @@ -58,7 +60,7 @@ public function getId() * * @param string $id */ - public function setId($id) + public function setId(string $id): void { $this->id = $id; } @@ -68,7 +70,7 @@ public function setId($id) * * @return string */ - public function getValue() + public function getValue(): string { return $this->value; } @@ -78,7 +80,7 @@ public function getValue() * * @param string $value */ - public function setValue($value) + public function setValue(string $value): void { $this->value = $value; } diff --git a/src/Graphviz/AttributeInterface.php b/src/Graphviz/AttributeInterface.php new file mode 100644 index 0000000..82997bd --- /dev/null +++ b/src/Graphviz/AttributeInterface.php @@ -0,0 +1,49 @@ + + */ + +declare(strict_types=1); + +namespace Janalis\Doctrineviz\Graphviz; + +interface AttributeInterface +{ + /** + * Get id. + * + * @return string + */ + public function getId(): string; + + /** + * Set id. + * + * @param string $id + */ + public function setId(string $id): void; + + /** + * Get value. + * + * @return string + */ + public function getValue(): string; + + /** + * Set value. + * + * @param string $value + */ + public function setValue(string $value): void; +} diff --git a/src/Graphviz/Edge.php b/src/Graphviz/Edge.php index 26175d6..a622280 100644 --- a/src/Graphviz/Edge.php +++ b/src/Graphviz/Edge.php @@ -13,14 +13,18 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; -class Edge extends Node +class Edge implements EdgeInterface { - /** @var Vertex|Record */ + use Attributable; + + /** @var ElementInterface */ protected $from; - /** @var Vertex|Record */ + /** @var ElementInterface */ protected $to; /** @var string */ @@ -39,37 +43,37 @@ public function __toString() /** * Get attributes. * - * @return Attribute[] + * @return AttributeInterface[] */ - public function getAttributes() + public function getAttributes(): array { if (null !== $this->label) { $this->createAttribute('label', $this->label); } - return parent::getAttributes(); + return $this->attributes ? array_values($this->attributes) : []; } /** * Get vertex id. * - * @param Vertex|Record $element + * @param ElementInterface $element * * @return string */ - protected function getId($element) + protected function getId(ElementInterface $element): string { - return $element instanceof Record ? "{$element->getVertex()->getId()}:{$element->getId()}" : "{$element->getId()}"; + return $element instanceof RecordInterface ? "{$element->getVertex()->getId()}:{$element->getId()}" : "{$element->getId()}"; } /** * Edge constructor. * - * @param Vertex|Record $from - * @param Vertex|Record $to - * @param null|string $label + * @param ElementInterface|null $from + * @param ElementInterface|null $to + * @param null|string $label */ - public function __construct($from, $to, $label = null) + public function __construct(ElementInterface $from = null, ElementInterface $to = null, string $label = null) { $this->from = $from; $this->to = $to; @@ -79,9 +83,9 @@ public function __construct($from, $to, $label = null) /** * Get from. * - * @return Vertex|Record + * @return ElementInterface|null */ - public function getFrom() + public function getFrom(): ?ElementInterface { return $this->from; } @@ -89,9 +93,9 @@ public function getFrom() /** * Set from. * - * @param Vertex|Record $from + * @param ElementInterface $from */ - public function setFrom($from) + public function setFrom(ElementInterface $from): void { $this->from = $from; } @@ -99,9 +103,9 @@ public function setFrom($from) /** * Get to. * - * @return Vertex|Record + * @return ElementInterface|null */ - public function getTo() + public function getTo(): ?ElementInterface { return $this->to; } @@ -109,9 +113,9 @@ public function getTo() /** * Set to. * - * @param Vertex|Record $to + * @param ElementInterface $to */ - public function setTo($to) + public function setTo($to): void { $this->to = $to; } @@ -119,9 +123,9 @@ public function setTo($to) /** * Get label. * - * @return string + * @return string|null */ - public function getLabel() + public function getLabel(): ?string { return $this->label; } @@ -129,9 +133,9 @@ public function getLabel() /** * Set label. * - * @param string $label + * @param string|null $label */ - public function setLabel($label) + public function setLabel(string $label = null): void { $this->label = $label; } diff --git a/src/Graphviz/EdgeInterface.php b/src/Graphviz/EdgeInterface.php new file mode 100644 index 0000000..150cfc2 --- /dev/null +++ b/src/Graphviz/EdgeInterface.php @@ -0,0 +1,70 @@ + + */ + +declare(strict_types=1); + +namespace Janalis\Doctrineviz\Graphviz; + +interface EdgeInterface +{ + /** + * Get attributes. + * + * @return AttributeInterface[] + */ + public function getAttributes(): array; + + /** + * Get from. + * + * @return ElementInterface|null + */ + public function getFrom(): ?ElementInterface; + + /** + * Set from. + * + * @param ElementInterface $from + */ + public function setFrom(ElementInterface $from): void; + + /** + * Get to. + * + * @return ElementInterface|null + */ + public function getTo(): ?ElementInterface; + + /** + * Set to. + * + * @param Vertex|Record $to + */ + public function setTo($to): void; + + /** + * Get label. + * + * @return string|null + */ + public function getLabel(): ?string; + + /** + * Set label. + * + * @param string|null $label + */ + public function setLabel(string $label = null): void; +} diff --git a/src/Graphviz/Edgeable.php b/src/Graphviz/Edgeable.php index e246feb..ec53024 100644 --- a/src/Graphviz/Edgeable.php +++ b/src/Graphviz/Edgeable.php @@ -13,19 +13,21 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; trait Edgeable { - /** @var Graph */ + /** @var GraphInterface */ protected $graph; /** * Get graph. * - * @return Graph + * @return GraphInterface */ - public function getGraph() + public function getGraph(): ?GraphInterface { return $this->graph; } @@ -33,9 +35,9 @@ public function getGraph() /** * Set graph. * - * @param Graph $graph + * @param GraphInterface|null $graph */ - public function setGraph($graph) + public function setGraph(GraphInterface $graph = null): void { $this->graph = $graph; } @@ -43,12 +45,14 @@ public function setGraph($graph) /** * Add edge to. * - * @param Vertex|Record $element - * @param null|string $label + * @param ElementInterface $element + * @param null|string $label * - * @return Edge + * @return EdgeInterface + * + * @throws \RuntimeException */ - public function addEdgeTo($element, $label = null) + public function addEdgeTo(ElementInterface $element, string $label = null): EdgeInterface { if (!$this->graph) { throw new \RuntimeException('Graph is not defined'); @@ -60,10 +64,12 @@ public function addEdgeTo($element, $label = null) /** * Remove edge to. * - * @param Vertex|Record $element - * @param null|string $label + * @param ElementInterface $element + * @param null|string $label + * + * @throws \RuntimeException */ - public function removeEdgeTo($element, $label = null) + public function removeEdgeTo(ElementInterface $element, string $label = null): void { if (!$this->graph) { throw new \RuntimeException('Graph is not defined'); @@ -74,12 +80,14 @@ public function removeEdgeTo($element, $label = null) /** * Add edge from. * - * @param Vertex|Record $element - * @param null|string $label + * @param ElementInterface $element + * @param null|string $label * - * @return Edge + * @return EdgeInterface + * + * @throws \RuntimeException */ - public function addEdgeFrom($element, $label = null) + public function addEdgeFrom(ElementInterface $element, string $label = null): EdgeInterface { if (!$this->graph) { throw new \RuntimeException('Graph is not defined'); @@ -93,8 +101,10 @@ public function addEdgeFrom($element, $label = null) * * @param Vertex|Record $element * @param null|string $label + * + * @throws \RuntimeException */ - public function removeEdgeFrom($element, $label = null) + public function removeEdgeFrom($element, string $label = null): void { if (!$this->graph) { throw new \RuntimeException('Graph is not defined'); diff --git a/src/Graphviz/Element.php b/src/Graphviz/Element.php new file mode 100644 index 0000000..ea030f8 --- /dev/null +++ b/src/Graphviz/Element.php @@ -0,0 +1,44 @@ + + */ + +declare(strict_types=1); + +namespace Janalis\Doctrineviz\Graphviz; + +abstract class Element implements ElementInterface +{ + /** @var string */ + protected $id; + + /** + * Get id. + * + * @return string + */ + public function getId(): ?string + { + return $this->id; + } + + /** + * Set id. + * + * @param string $id + */ + public function setId(string $id): void + { + $this->id = $id; + } +} diff --git a/src/Graphviz/ElementInterface.php b/src/Graphviz/ElementInterface.php new file mode 100644 index 0000000..2fe7932 --- /dev/null +++ b/src/Graphviz/ElementInterface.php @@ -0,0 +1,49 @@ + + */ + +declare(strict_types=1); + +namespace Janalis\Doctrineviz\Graphviz; + +interface ElementInterface +{ + /** + * Get id. + * + * @return string + */ + public function getId(): ?string; + + /** + * Set id. + * + * @param string $id + */ + public function setId(string $id): void; + + /** + * Get graph. + * + * @return GraphInterface|null + */ + public function getGraph(): ?GraphInterface; + + /** + * Set graph. + * + * @param GraphInterface + */ + public function setGraph(GraphInterface $graph): void; +} diff --git a/src/Graphviz/Graph.php b/src/Graphviz/Graph.php index 3c84cac..3118822 100644 --- a/src/Graphviz/Graph.php +++ b/src/Graphviz/Graph.php @@ -13,14 +13,18 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; -class Graph extends Node +class Graph implements GraphInterface { - /** @var Vertex[] */ + use Attributable; + + /** @var VertexInterface[] */ protected $vertices; - /** @var Edge[] */ + /** @var EdgeInterface[] */ protected $edges; /** @@ -28,12 +32,9 @@ class Graph extends Node */ public function __toString() { - return 'digraph g {'.PHP_EOL.(!count($this->getAttributes()) ? '' : - implode(PHP_EOL, $this->indentAll($this->getAttributes())). - PHP_EOL).(!count($this->getVertices()) ? '' : - implode(PHP_EOL, $this->indentAll($this->getVertices())). - PHP_EOL).(!count($this->getEdges()) ? '' : - implode(PHP_EOL, $this->indentAll($this->getEdges())). + return 'digraph g {'.PHP_EOL.(!count($this->getAttributes()) ? '' : implode(PHP_EOL, $this->indentAll($this->getAttributes())). + PHP_EOL).(!count($this->getVertices()) ? '' : implode(PHP_EOL, $this->indentAll($this->getVertices())). + PHP_EOL).(!count($this->getEdges()) ? '' : implode(PHP_EOL, $this->indentAll($this->getEdges())). PHP_EOL).'}'; } @@ -42,9 +43,9 @@ public function __toString() * * @param string $id * - * @return Vertex + * @return VertexInterface */ - public function createVertex($id) + public function createVertex(string $id): VertexInterface { return new Vertex($id, $this); } @@ -52,9 +53,9 @@ public function createVertex($id) /** * Get vertices. * - * @return Vertex[] + * @return VertexInterface[] */ - public function getVertices() + public function getVertices(): array { if ($this->vertices) { ksort($this->vertices); @@ -66,9 +67,9 @@ public function getVertices() /** * Set vertices. * - * @param array $vertices + * @param VertexInterface[] $vertices */ - public function setVertices($vertices) + public function setVertices(array $vertices): void { foreach ($vertices as $vertex) { $this->addVertex($vertex); @@ -78,12 +79,14 @@ public function setVertices($vertices) /** * Get vertex. * - * @return string|null + * @param string $id + * + * @return VertexInterface */ - public function getVertex($id) + public function getVertex(string $id): ?VertexInterface { if (!array_key_exists($id, $this->vertices)) { - return; + return null; } return $this->vertices[$id]; @@ -92,9 +95,9 @@ public function getVertex($id) /** * Add vertex. * - * @param Vertex $vertex + * @param VertexInterface $vertex */ - public function addVertex(Vertex $vertex) + public function addVertex(VertexInterface $vertex): void { $vertex->setGraph($this); $this->vertices[$vertex->getId()] = $vertex; @@ -103,9 +106,9 @@ public function addVertex(Vertex $vertex) /** * Remove vertex. * - * @param Vertex $vertex + * @param VertexInterface $vertex */ - public function removeVertex(Vertex $vertex) + public function removeVertex(VertexInterface $vertex): void { unset($this->vertices[$vertex->getId()]); } @@ -113,9 +116,9 @@ public function removeVertex(Vertex $vertex) /** * Get edges. * - * @return Edge[] + * @return EdgeInterface[] */ - public function getEdges() + public function getEdges(): array { if ($this->edges) { ksort($this->edges); @@ -127,9 +130,9 @@ public function getEdges() /** * Set edges. * - * @param array $edges + * @param EdgeInterface[] $edges */ - public function setEdges($edges) + public function setEdges(array $edges): void { $this->edges = $edges; } @@ -137,12 +140,14 @@ public function setEdges($edges) /** * Get edge. * - * @return string|null + * @param string $id + * + * @return EdgeInterface|null */ - public function getEdge($id) + public function getEdge(string $id): ?EdgeInterface { if (!array_key_exists($id, $this->edges)) { - return; + return null; } return $this->edges[$id]; @@ -151,11 +156,11 @@ public function getEdge($id) /** * Add edge. * - * @param Edge $edge + * @param EdgeInterface $edge * - * @return Edge + * @return EdgeInterface */ - public function addEdge(Edge $edge) + public function addEdge(EdgeInterface $edge): EdgeInterface { $this->edges[(string) $edge] = $edge; @@ -165,9 +170,9 @@ public function addEdge(Edge $edge) /** * Remove edge. * - * @param Edge $edge + * @param EdgeInterface $edge */ - public function removeEdge(Edge $edge) + public function removeEdge(EdgeInterface $edge): void { unset($this->edges[(string) $edge]); } diff --git a/src/Graphviz/GraphInterface.php b/src/Graphviz/GraphInterface.php new file mode 100644 index 0000000..3e3391e --- /dev/null +++ b/src/Graphviz/GraphInterface.php @@ -0,0 +1,106 @@ + + */ + +declare(strict_types=1); + +namespace Janalis\Doctrineviz\Graphviz; + +interface GraphInterface +{ + /** + * Create vertex. + * + * @param string $id + * + * @return VertexInterface + */ + public function createVertex(string $id): VertexInterface; + + /** + * Get vertices. + * + * @return VertexInterface[] + */ + public function getVertices(): array; + + /** + * Set vertices. + * + * @param VertexInterface[] $vertices + */ + public function setVertices(array $vertices): void; + + /** + * Get vertex. + * + * @param string $id + * + * @return VertexInterface + */ + public function getVertex(string $id): ?VertexInterface; + + /** + * Add vertex. + * + * @param VertexInterface $vertex + */ + public function addVertex(VertexInterface $vertex): void; + + /** + * Remove vertex. + * + * @param VertexInterface $vertex + */ + public function removeVertex(VertexInterface $vertex): void; + + /** + * Get edges. + * + * @return EdgeInterface[] + */ + public function getEdges(): array; + + /** + * Set edges. + * + * @param EdgeInterface[] $edges + */ + public function setEdges(array $edges): void; + + /** + * Get edge. + * + * @param string $id + * + * @return EdgeInterface|null + */ + public function getEdge(string $id): ?EdgeInterface; + + /** + * Add edge. + * + * @param EdgeInterface $edge + * + * @return EdgeInterface + */ + public function addEdge(EdgeInterface $edge): EdgeInterface; + + /** + * Remove edge. + * + * @param EdgeInterface $edge + */ + public function removeEdge(EdgeInterface $edge): void; +} diff --git a/src/Graphviz/Graphviz.php b/src/Graphviz/Graphviz.php index 0f6558f..9a35f10 100644 --- a/src/Graphviz/Graphviz.php +++ b/src/Graphviz/Graphviz.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; use Symfony\Component\Process\Process; @@ -39,22 +41,22 @@ class Graphviz * @param string $format * @param string $binary */ - public function __construct($format = 'png', $binary = null) + public function __construct(string $format = 'png', string $binary = null) { - $this->format = $format ?: 'png'; - $this->binary = $binary ?: 'dot'.(0 === strpos(strtoupper(PHP_OS), 'WIN') ? '.exe' : ''); + $this->format = $format; + $this->binary = $binary ?: 'dot'.(0 === stripos(PHP_OS, 'WIN') ? '.exe' : ''); } /** * Create image file. * - * @param Graph $graph to display + * @param GraphInterface $graph to display * * @throws \RuntimeException on error * * @return string filename */ - public function createImageFile(Graph $graph) + public function createImageFile(GraphInterface $graph): string { // @codeCoverageIgnoreStart if (false === $tmp = tempnam(sys_get_temp_dir(), 'doctrineviz')) { @@ -63,7 +65,6 @@ public function createImageFile(Graph $graph) if (false === file_put_contents($tmp, (string) $graph, LOCK_EX)) { throw new \RuntimeException('Unable to write graphviz script to temporary file'); } - // @codeCoverageIgnoreEnd $path = "$tmp.{$this->format}"; $this->execute( '%s -T %s %s -o %s', @@ -72,6 +73,7 @@ public function createImageFile(Graph $graph) $tmp, $path ); + // @codeCoverageIgnoreEnd return $path; } @@ -79,38 +81,40 @@ public function createImageFile(Graph $graph) /** * Display. * - * @param Graph $graph to display + * @param GraphInterface $graph to display */ - public function display(Graph $graph) + public function display(GraphInterface $graph): void { // @codeCoverageIgnoreStart switch (true) { - case 0 === strpos(strtoupper(PHP_OS), 'WIN'): + case 0 === stripos(PHP_OS, 'WIN'): $binary = 'start'; + break; case 'DARWIN' === strtoupper(PHP_OS): $binary = 'open'; + break; default: $binary = 'xdg-open'; } - // @codeCoverageIgnoreEnd $path = $this->createImageFile($graph); $this->execute( '%s %s', $binary, $path ); + // @codeCoverageIgnoreEnd } /** * Create image data. * - * @param Graph $graph to display + * @param GraphInterface $graph to display * * @return string */ - public function createImageData(Graph $graph) + public function createImageData(GraphInterface $graph): string { if ('dot' === $this->format) { return (string) $graph; @@ -125,11 +129,11 @@ public function createImageData(Graph $graph) /** * Create image src. * - * @param Graph $graph to display + * @param GraphInterface $graph to display * * @return string */ - public function createImageSrc(Graph $graph) + public function createImageSrc(GraphInterface $graph): string { $format = ('svg' === $this->format || 'svgz' === $this->format) ? 'svg+xml' : $this->format; @@ -139,11 +143,11 @@ public function createImageSrc(Graph $graph) /** * Create image html. * - * @param Graph $graph to display + * @param GraphInterface $graph to display * * @return string */ - public function createImageHtml(Graph $graph) + public function createImageHtml(GraphInterface $graph): string { if ('svg' === $this->format || 'svgz' === $this->format) { return ''; @@ -160,14 +164,11 @@ public function createImageHtml(Graph $graph) * * @return Process */ - protected function execute($format, ...$args) + protected function execute(string $format, ...$args): Process { - $process = new Process(sprintf( - $format, - ...array_map(function ($arg, $index) use ($format) { - return 0 === $index && 0 === strpos('%s', $format) ? escapeshellcmd($arg) : escapeshellarg($arg); - }, $args, array_keys($args)) - )); + $process = new Process(sprintf($format, ...array_map(function ($arg, $index) use ($format) { + return 0 === $index && 0 === strpos('%s', $format) ? escapeshellcmd($arg) : escapeshellarg($arg); + }, $args, array_keys($args)))); $process->mustRun(); return $process; @@ -178,7 +179,7 @@ protected function execute($format, ...$args) * * @return string */ - public function getFormat() + public function getFormat(): string { return $this->format; } @@ -188,7 +189,7 @@ public function getFormat() * * @param string $format */ - public function setFormat($format) + public function setFormat(string $format): void { $this->format = $format; } @@ -198,7 +199,7 @@ public function setFormat($format) * * @return string */ - public function getBinary() + public function getBinary(): string { return $this->binary; } @@ -208,7 +209,7 @@ public function getBinary() * * @param string $binary */ - public function setBinary($binary) + public function setBinary($binary): void { $this->binary = $binary; } diff --git a/src/Graphviz/Record.php b/src/Graphviz/Record.php index fc443ab..4c141e9 100644 --- a/src/Graphviz/Record.php +++ b/src/Graphviz/Record.php @@ -1,14 +1,26 @@ + */ + +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; -class Record +class Record extends Element implements RecordInterface { use Edgeable; - /** @var string */ - protected $id; - /** @var Vertex */ protected $vertex; @@ -23,9 +35,9 @@ public function __toString() /** * Get graph. * - * @return Graph|null + * @return GraphInterface|null */ - public function getGraph() + public function getGraph(): ?GraphInterface { return $this->graph; } @@ -33,10 +45,10 @@ public function getGraph() /** * Record constructor. * - * @param null|string $id - * @param null|Vertex $vertex + * @param null|string $id + * @param null|VertexInterface $vertex */ - public function __construct($id = null, Vertex $vertex = null) + public function __construct(string $id = null, VertexInterface $vertex = null) { $this->id = $id; if ($vertex) { @@ -44,32 +56,12 @@ public function __construct($id = null, Vertex $vertex = null) } } - /** - * Get id. - * - * @return string - */ - public function getId() - { - return $this->id; - } - - /** - * Set id. - * - * @param string $id - */ - public function setId($id) - { - $this->id = $id; - } - /** * Get vertex. * - * @return Vertex + * @return VertexInterface */ - public function getVertex() + public function getVertex(): ?VertexInterface { return $this->vertex; } @@ -77,9 +69,9 @@ public function getVertex() /** * Set vertex. * - * @param Vertex $vertex + * @param VertexInterface $vertex */ - public function setVertex($vertex) + public function setVertex(VertexInterface $vertex): void { $this->vertex = $vertex; } diff --git a/src/Graphviz/RecordInterface.php b/src/Graphviz/RecordInterface.php new file mode 100644 index 0000000..fc45de1 --- /dev/null +++ b/src/Graphviz/RecordInterface.php @@ -0,0 +1,35 @@ + + */ + +declare(strict_types=1); + +namespace Janalis\Doctrineviz\Graphviz; + +interface RecordInterface extends ElementInterface +{ + /** + * Get vertex. + * + * @return VertexInterface|null + */ + public function getVertex(): ?VertexInterface; + + /** + * Set vertex. + * + * @param VertexInterface $vertex + */ + public function setVertex(VertexInterface $vertex): void; +} diff --git a/src/Graphviz/Vertex.php b/src/Graphviz/Vertex.php index 86b88ad..fb772b6 100644 --- a/src/Graphviz/Vertex.php +++ b/src/Graphviz/Vertex.php @@ -13,16 +13,16 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Graphviz; -class Vertex extends Node +class Vertex extends Element implements VertexInterface { + use Attributable; use Edgeable; - /** @var string */ - protected $id; - - /** @var Record[] */ + /** @var RecordInterface[] */ protected $records = []; /** @@ -38,22 +38,22 @@ public function __toString() /** * Get attributes. * - * @return Attribute[] + * @return AttributeInterface[] */ - public function getAttributes() + public function getAttributes(): array { $this->createAttribute('label', count($this->records) ? mb_convert_case($this->id, MB_CASE_UPPER).'|'.implode('|', $this->records) : $this->id); - return parent::getAttributes(); + return $this->attributes ? array_values($this->attributes) : []; } /** * Vertex constructor. * - * @param string $id - * @param Graph $graph + * @param string $id + * @param GraphInterface $graph */ - public function __construct($id = null, $graph = null) + public function __construct(string $id = null, GraphInterface $graph = null) { $this->id = $id; if ($graph) { @@ -61,32 +61,12 @@ public function __construct($id = null, $graph = null) } } - /** - * Get id. - * - * @return string - */ - public function getId() - { - return $this->id; - } - - /** - * Set id. - * - * @param $id - */ - public function setId($id) - { - $this->id = $id; - } - /** * Get records. * - * @return Record[] + * @return RecordInterface[] */ - public function getRecords() + public function getRecords(): array { return $this->records ? array_values($this->records) : []; } @@ -94,9 +74,9 @@ public function getRecords() /** * Set records. * - * @param Record[] $records + * @param RecordInterface[] $records */ - public function setRecords($records) + public function setRecords(array $records): void { foreach ($records as $record) { $this->addRecord($record); @@ -106,9 +86,9 @@ public function setRecords($records) /** * Add record. * - * @param Record $record + * @param RecordInterface $record */ - public function addRecord(Record $record) + public function addRecord(RecordInterface $record): void { $record->setGraph($this->graph); $record->setVertex($this); @@ -118,9 +98,9 @@ public function addRecord(Record $record) /** * Remove record. * - * @param Record $record + * @param RecordInterface $record */ - public function removeRecord(Record $record) + public function removeRecord(RecordInterface $record): void { unset($this->records[$record->getId()]); } @@ -130,9 +110,9 @@ public function removeRecord(Record $record) * * @param string $id * - * @return Record + * @return RecordInterface */ - public function createRecord($id) + public function createRecord(string $id): RecordInterface { return new Record($id, $this); } @@ -142,7 +122,7 @@ public function createRecord($id) * * @param string $id */ - public function deleteRecord($id) + public function deleteRecord(string $id): void { unset($this->records[$id]); } @@ -150,14 +130,14 @@ public function deleteRecord($id) /** * Get record. * - * @param $id + * @param string $id * - * @return Record + * @return RecordInterface */ - public function getRecord($id) + public function getRecord(string $id): ?RecordInterface { if (!array_key_exists($id, $this->records)) { - return; + return null; } return $this->records[$id]; diff --git a/src/Graphviz/VertexInterface.php b/src/Graphviz/VertexInterface.php new file mode 100644 index 0000000..7494cae --- /dev/null +++ b/src/Graphviz/VertexInterface.php @@ -0,0 +1,81 @@ + + */ + +declare(strict_types=1); + +namespace Janalis\Doctrineviz\Graphviz; + +interface VertexInterface extends ElementInterface +{ + /** + * Get attributes. + * + * @return AttributeInterface[] + */ + public function getAttributes(): array; + + /** + * Get records. + * + * @return RecordInterface[] + */ + public function getRecords(): array; + + /** + * Set records. + * + * @param RecordInterface[] $records + */ + public function setRecords(array $records): void; + + /** + * Add record. + * + * @param RecordInterface $record + */ + public function addRecord(RecordInterface $record): void; + + /** + * Remove record. + * + * @param RecordInterface $record + */ + public function removeRecord(RecordInterface $record): void; + + /** + * Create record. + * + * @param string $id + * + * @return RecordInterface + */ + public function createRecord(string $id): RecordInterface; + + /** + * Delete record. + * + * @param string $id + */ + public function deleteRecord(string $id): void; + + /** + * Get record. + * + * @param string $id + * + * @return RecordInterface + */ + public function getRecord(string $id): ?RecordInterface; +} diff --git a/test/Command/DoctrinevizCommandTest.php b/test/Command/DoctrinevizCommandTest.php index 0a080b7..d28d26b 100644 --- a/test/Command/DoctrinevizCommandTest.php +++ b/test/Command/DoctrinevizCommandTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Command; use Janalis\Doctrineviz\Command\DoctrinevizCommand; @@ -127,6 +129,7 @@ public function testExecuteUpdateExample() ]), $command->getDefinition()); $output = new BufferedOutput(); $command->execute($input, $output); + $this->assertNotNull($output); } /** diff --git a/test/DependencyInjection/ConfigurationTest.php b/test/DependencyInjection/ConfigurationTest.php index 35d8277..d8f21a9 100644 --- a/test/DependencyInjection/ConfigurationTest.php +++ b/test/DependencyInjection/ConfigurationTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\DependencyInjection; use Janalis\Doctrineviz\DependencyInjection\Configuration; @@ -34,7 +36,9 @@ class ConfigurationTest extends DoctrinevizTestCase */ public function testConstructor() { - new Configuration('foo'); + $root = 'foo'; + $config = new Configuration($root); + $this->assertEquals($root, $config->getRoot()); } /** diff --git a/test/DependencyInjection/DoctrinevizBundleExtensionTest.php b/test/DependencyInjection/DoctrinevizBundleExtensionTest.php index 8997f81..d4e62f6 100644 --- a/test/DependencyInjection/DoctrinevizBundleExtensionTest.php +++ b/test/DependencyInjection/DoctrinevizBundleExtensionTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\DependencyInjection; use Janalis\Doctrineviz\DependencyInjection\DoctrinevizBundleExtension; @@ -79,5 +81,6 @@ public function testLoad() $containerBuilder = $this->getMockBuilder(ContainerBuilder::class)->getMock(); $extension = new DoctrinevizBundleExtension(); $extension->load([], $containerBuilder); + $this->assertNotNull($extension); } } diff --git a/test/DoctrinevizBundleTest.php b/test/DoctrinevizBundleTest.php index 1b5ef87..2e7eea0 100644 --- a/test/DoctrinevizBundleTest.php +++ b/test/DoctrinevizBundleTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test; use Janalis\Doctrineviz\DependencyInjection\DoctrinevizBundleExtension; diff --git a/test/DoctrinevizTestCase.php b/test/DoctrinevizTestCase.php index cd131c6..15ec6c2 100644 --- a/test/DoctrinevizTestCase.php +++ b/test/DoctrinevizTestCase.php @@ -1,5 +1,20 @@ + */ + +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; diff --git a/test/Entity/Address.php b/test/Entity/Address.php index 9348c31..8b52ae5 100644 --- a/test/Entity/Address.php +++ b/test/Entity/Address.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Entity; use Doctrine\ORM\Mapping as ORM; diff --git a/test/Entity/Email.php b/test/Entity/Email.php index fc43550..677e672 100644 --- a/test/Entity/Email.php +++ b/test/Entity/Email.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Entity; use Doctrine\ORM\Mapping as ORM; diff --git a/test/Entity/Group.php b/test/Entity/Group.php index 70669ef..d738601 100644 --- a/test/Entity/Group.php +++ b/test/Entity/Group.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Entity; use Doctrine\ORM\Mapping as ORM; diff --git a/test/Entity/User.php b/test/Entity/User.php index 81abaad..2257d01 100644 --- a/test/Entity/User.php +++ b/test/Entity/User.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Entity; use Doctrine\ORM\Mapping as ORM; diff --git a/test/Graphviz/NodeTest.php b/test/Graphviz/AttributableTest.php similarity index 95% rename from test/Graphviz/NodeTest.php rename to test/Graphviz/AttributableTest.php index 110e8b7..739aa03 100644 --- a/test/Graphviz/NodeTest.php +++ b/test/Graphviz/AttributableTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Attribute; @@ -21,10 +23,8 @@ /** * Node test. - * - * @coversDefaultClass \Janalis\Doctrineviz\Graphviz\Node */ -class NodeTest extends DoctrinevizTestCase +class AttributableTest extends DoctrinevizTestCase { /** * Test accessors. diff --git a/test/Graphviz/AttributeTest.php b/test/Graphviz/AttributeTest.php index 19ca803..8db2833 100644 --- a/test/Graphviz/AttributeTest.php +++ b/test/Graphviz/AttributeTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Attribute; diff --git a/test/Graphviz/EdgeTest.php b/test/Graphviz/EdgeTest.php index 67e90f6..338dff0 100644 --- a/test/Graphviz/EdgeTest.php +++ b/test/Graphviz/EdgeTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Edge; @@ -28,11 +30,11 @@ class EdgeTest extends DoctrinevizTestCase { /** - * Test accessors. + * Test constructor. * * @group graphviz */ - public function testAccessors() + public function testConstructor() { // init values $from = $this->getMockBuilder(Vertex::class) @@ -59,12 +61,29 @@ public function testAccessors() '];', (string) $edge); $this->assertEquals($from, $edge->getFrom()); $this->assertEquals($to, $edge->getTo()); + } + + /** + * Test accessors. + * + * @group graphviz + */ + public function testAccessors() + { + // init values + $from = $this->getMockBuilder(Vertex::class) + ->disableOriginalConstructor() + ->getMock(); + $to = $this->getMockBuilder(Record::class) + ->disableOriginalConstructor() + ->getMock(); // getters and setters - $edge->setFrom(null); - $edge->setTo(null); + $edge = new Edge(); + $edge->setFrom($from); + $edge->setTo($to); $edge->setLabel(null); - $this->assertNull($edge->getFrom()); - $this->assertNull($edge->getTo()); + $this->assertEquals($from, $edge->getFrom()); + $this->assertEquals($to, $edge->getTo()); $this->assertNull($edge->getLabel()); } } diff --git a/test/Graphviz/EdgeableTest.php b/test/Graphviz/EdgeableTest.php index 4dd6f70..090e8fd 100644 --- a/test/Graphviz/EdgeableTest.php +++ b/test/Graphviz/EdgeableTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Edge; @@ -63,11 +65,13 @@ public function testEdgeTo() // exceptions $vertex1->setGraph(null); $vertex2->setGraph(null); + try { $vertex1->addEdgeTo($vertex2); $this->fail('Exception should have been thrown.'); } catch (\Exception $ignore) { } + try { $vertex1->removeEdgeTo($vertex2); $this->fail('Exception should have been thrown.'); @@ -97,11 +101,13 @@ public function testEdgeFrom() // exceptions $vertex1->setGraph(null); $vertex2->setGraph(null); + try { $vertex1->addEdgeFrom($vertex2); $this->fail('Exception should have been thrown.'); } catch (\Exception $ignore) { } + try { $vertex1->removeEdgeFrom($vertex2); $this->fail('Exception should have been thrown.'); diff --git a/test/Graphviz/GraphTest.php b/test/Graphviz/GraphTest.php index dfd7071..8124b04 100644 --- a/test/Graphviz/GraphTest.php +++ b/test/Graphviz/GraphTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Attribute; diff --git a/test/Graphviz/GraphvizTest.php b/test/Graphviz/GraphvizTest.php index 33aba00..558e574 100644 --- a/test/Graphviz/GraphvizTest.php +++ b/test/Graphviz/GraphvizTest.php @@ -13,11 +13,14 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Graph; use Janalis\Doctrineviz\Graphviz\Graphviz; use Janalis\Doctrineviz\Test\DoctrinevizTestCase; +use Symfony\Component\Process\Process; /** * Graphviz test. @@ -93,6 +96,7 @@ public function testDisplay() { $graph = new Graph(); $this->setMethodAccessible(Graphviz::class, 'execute'); + $process = $this->getMockBuilder(Process::class)->disableOriginalConstructor()->getMock(); $graphviz = $this->getMockBuilder(Graphviz::class) ->setMethods([ 'createImageFile', @@ -104,7 +108,7 @@ public function testDisplay() ->will($this->returnValue('foo')); $graphviz->expects($this->once()) ->method('execute') - ->will($this->returnValue('bar')); + ->will($this->returnValue($process)); $graphviz->display($graph); } diff --git a/test/Graphviz/RecordTest.php b/test/Graphviz/RecordTest.php index b61554f..bdbbb30 100644 --- a/test/Graphviz/RecordTest.php +++ b/test/Graphviz/RecordTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Graph; diff --git a/test/Graphviz/VertexTest.php b/test/Graphviz/VertexTest.php index e9a3a68..ba48368 100644 --- a/test/Graphviz/VertexTest.php +++ b/test/Graphviz/VertexTest.php @@ -13,6 +13,8 @@ * @author Pierre Hennequart */ +declare(strict_types=1); + namespace Janalis\Doctrineviz\Test\Graphviz; use Janalis\Doctrineviz\Graphviz\Graph;