diff --git a/.gitignore b/.gitignore index 643e421..cb3443f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ /build/ /vendor/ /bin/ +/.idea/ diff --git a/README.md b/README.md index 48c90a1..3b751c8 100644 --- a/README.md +++ b/README.md @@ -42,35 +42,57 @@ Access the project with your favourite browser. You should see similar welcome s ## Test tasks: +/!\ Précision: je suis sous Windows ("/" "\") 1. Change the text on symfony homepage from "Welcome to Symfony 2.8.8" to "This is a test" +OK 1. Run the PhpUnit test. Check if there are any errors, if so fix them. +OK (en mettant en commentaires "swiftmailer" dans config_test.yml et modifier le test) +(commande à la racine : "phpunit -c app/ src/AppBundle/Tests/Controller/DefaultControllerTest.php") 1. Create a new Bundle "InterviewBundle" within the namespace "Test" +OK (changement de l'index de l'appli avec la commande generate:bundle) +(commande à la racine: "php app/console generate:bundle --namespace=Test/InterviewBundle --bundle-name=TestInterviewBundle") 1. Create a method helloAction under AppBundle\Controller\DefaultController * for route `/hello` * with a proper json return `{"hello":"world!"}` +Ok (return JsonResponse) 1. Create a "Bios" collection and load the example data into your MongoDB server * copy the json string from mongodb website ([link](https://docs.mongodb.com/manual/reference/bios-example-collection/)) * or download and load the archive dump ([link](https://raw.githubusercontent.com/OskHa/php_interview_test/master/symfony_mongodb_example.archive)) +OK mais il faut que vous fassiez la manip: +* mettre la collection en copier/coller dans une database "test" ou changer dans app/config/parameters.yml +* utiliser le dump symfony_mongodb_example.archive à la racine 1. Define ODM "Bios" document under namespace Test/InterviewBundle/Documents +Ok sauf qu'on ne doit pas utiliser "Documents" mais "Document" pour que le mapping fonctionne (pas trouvé d'autres solutions) +(commande à la racine pour les setters/getters: "php app/console doctrine:mongodb:generate:documents TestInterviewBundle") 1. Define ODM "Bios" repository under namespace Test/InterviewBundle/Repositories +Ok sauf qu'on doit utiliser "Repository" et non "Repositories" +(commande à la racine; "php app/console doctrine:mongodb:generate:repositories TestInterviewBundle") +/!\A partir de ce point, j'ai créé une methode (avec la route \testdb) pour tester les methodes demandées +De plus, les nouvelles routes sont définies dans le routing du Bundle pour la portabilité 1. Implement following repository methods * findByFirstName($firstName) * findByContribution($contributionName) * findByDeadBefore($year) +OK (on peut voir les résultats sur /testdb, on peut changer les paramètres des recherches dans le controller +src/Test/InterviewBundle/Controller/DefaultController.php) +/!\ les ids de la db sont parfois 'bizarre' (expl: 51df07b094c6acd67e492f41 (oui oui c'est bien un id)) 1. Define and create a service "BiosService" under namespace Test/InterviewBundle/Services and implement following methods * getAllAwards() * Use the logger to log operations (error, warning, debug) +Ok, inscrit dans les services du Bundle (pour la portabilité) +Cependant, j'ai utilisé ma classe test pour tester le service, mais je ne me suis pas servi du logger 1. Create ContributionsController under namespace Test/InterviewBundle/Controller +OK 1. Add a contributionsAction method to your ContributionsController * for route `/contributions` @@ -78,6 +100,7 @@ Access the project with your favourite browser. You should see similar welcome s * avoid logic under controller * method should list all contributions * with a proper json return `["contrib", ...]` +OK 1. Add a biosByContributionAction method to your ContributionsController * for route `/contributions/{contributionName}` @@ -85,6 +108,7 @@ Access the project with your favourite browser. You should see similar welcome s * avoid logic under controller * method should list all bios documents with provided contribution * with a proper json return `[{...}]` +Ok 1. make a unit test for the controller * check if route `/hello` has response code 200 @@ -92,15 +116,18 @@ Access the project with your favourite browser. You should see similar welcome s * check if route `/contributions` has response code 200 * check if route `/contributions/fake` has response code 404 * check if route `/contributions/OOP` has response code 200 - +Ok j'ai mis les tests dans Test/InterviewBundle/Tests/Controller/DefaultControllerTest.php +(commande à la racine: "phpunit -c app/ src/Test/InterviewBundle//Tests/Controller/DefaultControllerTest.php") + 1. make a unit test for the BiosService * at least 1 method of your choice +Ok j'ai mis un test de 'getAllContributions' avec retour Json à la suite des tests précédents 1. write a command called `test:command` that should accept 1 argument called id under namespace Test/InterviewBundle/Command * The command should check if a Bios document with an id of the argument exists * if document exists, return info "document exists" * if document doesnt exist, return error "document doesnt exist" - +Ok (par contre Mongo a un petit soucis pour find un objet avec un id, pas moyen de le faire proprement en 'requête' alors j'ai du le faire en php) ## Bonus tasks @@ -109,14 +136,17 @@ Access the project with your favourite browser. You should see similar welcome s test: ping: pong ``` +Ok 1. Check the symfony application for errors and fix them if any. +Ok, j'ai du modifier "test:" en "test_interview:" qui est le namespace du bundle +et ajouter du code dans le DependencyInjection/Configuration pour ajouter le paramètre ping de valeur pong (valeur par défaut obligatoire) 1. write a prompt for the command `test:command` * Prompt text is "This is a test. Do you want to continue (y/N) ?" * If you decline, return error "Nothing done. Exiting..." * If you accept, run the command - +OK, j'ai du modifier le code demandé en 15 forcément # That's it! ## Thank you for your participation! Good luck submitting your results! diff --git a/app/AppKernel.php b/app/AppKernel.php index d06ef93..6e28f8d 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -15,6 +15,8 @@ public function registerBundles() new Symfony\Bundle\MonologBundle\MonologBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new AppBundle\AppBundle(), + new Test\InterviewBundle\TestInterviewBundle(), + new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), ); if (in_array($this->getEnvironment(), array('dev', 'test'), true)) { diff --git a/app/Resources/views/default/index.html.twig b/app/Resources/views/default/index.html.twig index 7319df7..a1c13f3 100644 --- a/app/Resources/views/default/index.html.twig +++ b/app/Resources/views/default/index.html.twig @@ -4,7 +4,9 @@
-

Welcome to Symfony {{ constant('Symfony\\Component\\HttpKernel\\Kernel::VERSION') }}

+ +

This is a test

+
diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php index 841338f..7e7a99d 100644 --- a/app/SymfonyRequirements.php +++ b/app/SymfonyRequirements.php @@ -168,6 +168,9 @@ public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $ */ class RequirementCollection implements IteratorAggregate { + /** + * @var Requirement[] + */ private $requirements = array(); /** @@ -265,7 +268,7 @@ public function addCollection(RequirementCollection $collection) /** * Returns both requirements and recommendations. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function all() { @@ -275,7 +278,7 @@ public function all() /** * Returns all mandatory requirements. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getRequirements() { @@ -292,7 +295,7 @@ public function getRequirements() /** * Returns the mandatory requirements that were not met. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getFailedRequirements() { @@ -309,7 +312,7 @@ public function getFailedRequirements() /** * Returns all optional recommendations. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getRecommendations() { @@ -326,7 +329,7 @@ public function getRecommendations() /** * Returns the recommendations that were not met. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getFailedRecommendations() { @@ -376,7 +379,8 @@ public function getPhpIniConfigPath() */ class SymfonyRequirements extends RequirementCollection { - const REQUIRED_PHP_VERSION = '5.3.3'; + const LEGACY_REQUIRED_PHP_VERSION = '5.3.3'; + const REQUIRED_PHP_VERSION = '5.5.9'; /** * Constructor that initializes the requirements. @@ -386,16 +390,26 @@ public function __construct() /* mandatory requirements follow */ $installedPhpVersion = phpversion(); + $requiredPhpVersion = $this->getPhpRequiredVersion(); - $this->addRequirement( - version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>='), - sprintf('PHP version must be at least %s (%s installed)', self::REQUIRED_PHP_VERSION, $installedPhpVersion), - sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. - Before using Symfony, upgrade your PHP installation, preferably to the latest version.', - $installedPhpVersion, self::REQUIRED_PHP_VERSION), - sprintf('Install PHP %s or newer (installed version is %s)', self::REQUIRED_PHP_VERSION, $installedPhpVersion) + $this->addRecommendation( + $requiredPhpVersion, + 'Vendors should be installed in order to check all requirements.', + 'Run the composer install command.', + 'Run the "composer install" command.' ); + if (false !== $requiredPhpVersion) { + $this->addRequirement( + version_compare($installedPhpVersion, $requiredPhpVersion, '>='), + sprintf('PHP version must be at least %s (%s installed)', $requiredPhpVersion, $installedPhpVersion), + sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. + Before using Symfony, upgrade your PHP installation, preferably to the latest version.', + $installedPhpVersion, $requiredPhpVersion), + sprintf('Install PHP %s or newer (installed version is %s)', $requiredPhpVersion, $installedPhpVersion) + ); + } + $this->addRequirement( version_compare($installedPhpVersion, '5.3.16', '!='), 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', @@ -433,7 +447,7 @@ public function __construct() ); } - if (version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>=')) { + if (false !== $requiredPhpVersion && version_compare($installedPhpVersion, $requiredPhpVersion, '>=')) { $timezones = array(); foreach (DateTimeZone::listAbbreviations() as $abbreviations) { foreach ($abbreviations as $abbreviation) { @@ -681,10 +695,17 @@ function_exists('posix_isatty'), if (class_exists('Symfony\Component\Intl\Intl')) { $this->addRecommendation( - \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), - sprintf('intl ICU version installed on your system (%s) should match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), - 'In most cases you should be fine, but please verify there is no inconsistencies between data provided by Symfony and the intl extension. See https://github.com/symfony/symfony/issues/15007 for an example of inconsistencies you might run into.' + \Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion(), + sprintf('intl ICU version installed on your system is outdated (%s) and does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), + 'To get the latest internationalization data upgrade the ICU system package and the intl PHP extension.' ); + if (\Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion()) { + $this->addRecommendation( + \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), + sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), + 'To avoid internationalization data inconsistencies upgrade the symfony/intl component.' + ); + } } $this->addPhpIniRecommendation( @@ -718,9 +739,9 @@ function_exists('posix_isatty'), if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $this->addRecommendation( - $this->getRealpathCacheSize() > 1000, - 'realpath_cache_size should be above 1024 in php.ini', - 'Set "realpath_cache_size" to e.g. "1024" in php.ini* to improve performance on windows.' + $this->getRealpathCacheSize() >= 5 * 1024 * 1024, + 'realpath_cache_size should be at least 5M in php.ini', + 'Setting "realpath_cache_size" to e.g. "5242880" or "5M" in php.ini* may improve performance on Windows significantly in some cases.' ); } @@ -759,7 +780,11 @@ protected function getRealpathCacheSize() { $size = ini_get('realpath_cache_size'); $size = trim($size); - $unit = strtolower(substr($size, -1, 1)); + $unit = ''; + if (!ctype_digit($size)) { + $unit = strtolower(substr($size, -1, 1)); + $size = (int) substr($size, 0, -1); + } switch ($unit) { case 'g': return $size * 1024 * 1024 * 1024; @@ -771,4 +796,28 @@ protected function getRealpathCacheSize() return (int) $size; } } + + /** + * Defines PHP required version from Symfony version. + * + * @return string|false The PHP required version or false if it could not be guessed + */ + protected function getPhpRequiredVersion() + { + if (!file_exists($path = __DIR__.'/../composer.lock')) { + return false; + } + + $composerLock = json_decode(file_get_contents($path), true); + foreach ($composerLock['packages'] as $package) { + $name = $package['name']; + if ('symfony/symfony' !== $name && 'symfony/http-kernel' !== $name) { + continue; + } + + return (int) $package['version'][1] > 2 ? self::REQUIRED_PHP_VERSION : self::LEGACY_REQUIRED_PHP_VERSION; + } + + return false; + } } diff --git a/app/check.php b/app/check.php index cf1e6b0..2cf2dce 100644 --- a/app/check.php +++ b/app/check.php @@ -21,7 +21,6 @@ $messages = array(); foreach ($symfonyRequirements->getRequirements() as $req) { - /** @var $req Requirement */ if ($helpText = get_error_message($req, $lineSize)) { echo_style('red', 'E'); $messages['error'][] = $helpText; @@ -120,10 +119,14 @@ function echo_block($style, $title, $message) echo PHP_EOL.PHP_EOL; - echo_style($style, str_repeat(' ', $width).PHP_EOL); - echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT).PHP_EOL); - echo_style($style, str_pad($message, $width, ' ', STR_PAD_RIGHT).PHP_EOL); - echo_style($style, str_repeat(' ', $width).PHP_EOL); + echo_style($style, str_repeat(' ', $width)); + echo PHP_EOL; + echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT)); + echo PHP_EOL; + echo_style($style, $message); + echo PHP_EOL; + echo_style($style, str_repeat(' ', $width)); + echo PHP_EOL; } function has_color_support() diff --git a/app/config/config.yml b/app/config/config.yml index efc3c14..09e1583 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -44,4 +44,9 @@ doctrine_mongodb: default_database: "%mongodb.default_database%" document_managers: default: - auto_mapping: true \ No newline at end of file + auto_mapping: true + +# Bonus Task 1 +#test: <-- non fonctionnel +test_interview: + ping: pong \ No newline at end of file diff --git a/app/config/config_dev.yml b/app/config/config_dev.yml index 7eb4739..537a0a3 100644 --- a/app/config/config_dev.yml +++ b/app/config/config_dev.yml @@ -30,5 +30,8 @@ monolog: # type: chromephp # level: info -#swiftmailer: -# delivery_address: me@example.com +# Demande 2, on ne sert pas (pour le moment) de mailer donc on peut désactiver la configuration +# pour que le test PhpUnit passe +swiftmailer: + delivery_address: thomas.petithory@gmail.com + disable_delivery: true \ No newline at end of file diff --git a/app/config/config_test.yml b/app/config/config_test.yml index 2f6d925..a196df7 100644 --- a/app/config/config_test.yml +++ b/app/config/config_test.yml @@ -12,5 +12,5 @@ web_profiler: toolbar: false intercept_redirects: false -swiftmailer: - disable_delivery: true +#swiftmailer: +# disable_delivery: true diff --git a/app/config/routing.yml b/app/config/routing.yml index 8eadc31..4b0625b 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -1,3 +1,11 @@ +test_interview: + resource: "@TestInterviewBundle/Resources/config/routing.yml" + prefix: / + app: resource: "@AppBundle/Controller/" type: annotation + +hello: + path: /hello + defaults: {_controller: AppBundle:Default:hello} \ No newline at end of file diff --git a/composer.json b/composer.json index 5372592..59d37be 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,7 @@ }, "require": { "php": ">=5.3.9", + "symfony/swiftmailer-bundle": "^2.3", "symfony/symfony": "2.8.*", "doctrine/mongodb-odm": "^1.1", "doctrine/mongodb-odm-bundle": "3.2", diff --git a/composer.lock b/composer.lock index 0b8b976..fa61d9f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,40 +4,39 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "10ee79394982ef933c4b820da1dd278b", - "content-hash": "cdd8f92a5679d579b02ad661daf29454", + "content-hash": "9b96e66be407813e75a5b5f74d55b9e9", "packages": [ { "name": "doctrine/annotations", - "version": "v1.2.7", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535" + "reference": "bd4461328621bde0ae6b1b2675fbc6aca4ceb558" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535", - "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/bd4461328621bde0ae6b1b2675fbc6aca4ceb558", + "reference": "bd4461328621bde0ae6b1b2675fbc6aca4ceb558", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": ">=5.3.2" + "php": "^5.6 || ^7.0" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^5.6.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Annotations\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", @@ -73,20 +72,20 @@ "docblock", "parser" ], - "time": "2015-08-31 12:32:49" + "time": "2016-12-30T15:59:45+00:00" }, { "name": "doctrine/cache", - "version": "v1.6.0", + "version": "v1.6.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6" + "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/f8af318d14bdb0eff0336795b428b547bd39ccb6", - "reference": "f8af318d14bdb0eff0336795b428b547bd39ccb6", + "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3", + "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3", "shasum": "" }, "require": { @@ -143,7 +142,7 @@ "cache", "caching" ], - "time": "2015-12-31 16:37:02" + "time": "2016-10-29T11:16:17+00:00" }, { "name": "doctrine/collections", @@ -209,20 +208,20 @@ "collections", "iterator" ], - "time": "2015-04-14 22:21:58" + "time": "2015-04-14T22:21:58+00:00" }, { "name": "doctrine/common", - "version": "v2.6.1", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "a579557bc689580c19fee4e27487a67fe60defc0" + "reference": "5954c297e9d93ff84554906c2fbbc2a133c43941" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/a579557bc689580c19fee4e27487a67fe60defc0", - "reference": "a579557bc689580c19fee4e27487a67fe60defc0", + "url": "https://api.github.com/repos/doctrine/common/zipball/5954c297e9d93ff84554906c2fbbc2a133c43941", + "reference": "5954c297e9d93ff84554906c2fbbc2a133c43941", "shasum": "" }, "require": { @@ -231,10 +230,10 @@ "doctrine/collections": "1.*", "doctrine/inflector": "1.*", "doctrine/lexer": "1.*", - "php": "~5.5|~7.0" + "php": "~5.6|~7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8|~5.0" + "phpunit/phpunit": "^5.4.6" }, "type": "library", "extra": { @@ -282,7 +281,7 @@ "persistence", "spl" ], - "time": "2015-12-25 13:18:31" + "time": "2016-12-03T08:15:01+00:00" }, { "name": "doctrine/data-fixtures", @@ -290,12 +289,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "f6ffd3185c31ee6e0ea9bd2c5eefd2d7ab61cc40" + "reference": "17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/f6ffd3185c31ee6e0ea9bd2c5eefd2d7ab61cc40", - "reference": "f6ffd3185c31ee6e0ea9bd2c5eefd2d7ab61cc40", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e", + "reference": "17fa5bfe6ff52e35cb3d9ec37c934a2f4bd1fa2e", "shasum": "" }, "require": { @@ -341,7 +340,7 @@ "keywords": [ "database" ], - "time": "2016-07-05 22:04:12" + "time": "2016-09-20 10:07:57" }, { "name": "doctrine/inflector", @@ -408,7 +407,7 @@ "singularize", "string" ], - "time": "2015-11-06 14:35:42" + "time": "2015-11-06T14:35:42+00:00" }, { "name": "doctrine/instantiator", @@ -462,7 +461,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14 21:17:01" + "time": "2015-06-14T21:17:01+00:00" }, { "name": "doctrine/lexer", @@ -516,38 +515,39 @@ "lexer", "parser" ], - "time": "2014-09-09 13:34:57" + "time": "2014-09-09T13:34:57+00:00" }, { "name": "doctrine/mongodb", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/mongodb.git", - "reference": "b4eb8683d66d44de4e9e4e974149bdce327dc818" + "reference": "293ad1ee54b507e269d6a1309dbeb8c00621b00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/mongodb/zipball/b4eb8683d66d44de4e9e4e974149bdce327dc818", - "reference": "b4eb8683d66d44de4e9e4e974149bdce327dc818", + "url": "https://api.github.com/repos/doctrine/mongodb/zipball/293ad1ee54b507e269d6a1309dbeb8c00621b00e", + "reference": "293ad1ee54b507e269d6a1309dbeb8c00621b00e", "shasum": "" }, "require": { "doctrine/common": "^2.2", "ext-mongo": "^1.5", - "php": "^5.5 || ^7.0" + "php": "^5.6 || ^7.0" }, "require-dev": { "jmikola/geojson": "^1.0", "phpunit/phpunit": "~4.8|~5.0" }, "suggest": { + "alcaeus/mongo-php-adapter": "Allows usage of PHP 7", "jmikola/geojson": "Support GeoJSON geometry objects in 2dsphere queries" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { @@ -592,20 +592,20 @@ "mongodb", "persistence" ], - "time": "2016-03-19 18:45:48" + "time": "2016-11-22T19:01:59+00:00" }, { "name": "doctrine/mongodb-odm", - "version": "1.1.0", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/mongodb-odm.git", - "reference": "1137922032d098a2e284575f2ce30e83abbecea2" + "reference": "e839648ef7649757aae3b9818236a6fa47c016cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/1137922032d098a2e284575f2ce30e83abbecea2", - "reference": "1137922032d098a2e284575f2ce30e83abbecea2", + "url": "https://api.github.com/repos/doctrine/mongodb-odm/zipball/e839648ef7649757aae3b9818236a6fa47c016cd", + "reference": "e839648ef7649757aae3b9818236a6fa47c016cd", "shasum": "" }, "require": { @@ -624,6 +624,7 @@ "symfony/yaml": "~2.3|~3.0" }, "suggest": { + "alcaeus/mongo-php-adapter": "Allows usage of PHP 7", "symfony/yaml": "Enables the YAML metadata mapping driver" }, "type": "library", @@ -675,7 +676,7 @@ "odm", "persistence" ], - "time": "2016-06-09 14:21:30" + "time": "2016-10-07T09:18:05+00:00" }, { "name": "doctrine/mongodb-odm-bundle", @@ -747,7 +748,7 @@ "persistence", "symfony" ], - "time": "2016-06-30 12:19:21" + "time": "2016-06-30T12:19:21+00:00" }, { "name": "incenteev/composer-parameter-handler", @@ -798,7 +799,7 @@ "keywords": [ "parameters management" ], - "time": "2015-11-10 17:04:01" + "time": "2015-11-10T17:04:01+00:00" }, { "name": "ircmaxell/password-compat", @@ -840,20 +841,20 @@ "hashing", "password" ], - "time": "2014-11-20 16:49:30" + "time": "2014-11-20T16:49:30+00:00" }, { "name": "monolog/monolog", - "version": "1.20.0", + "version": "1.22.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "55841909e2bcde01b5318c35f2b74f8ecc86e037" + "reference": "bad29cb8d18ab0315e6c477751418a82c850d558" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/55841909e2bcde01b5318c35f2b74f8ecc86e037", - "reference": "55841909e2bcde01b5318c35f2b74f8ecc86e037", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bad29cb8d18ab0315e6c477751418a82c850d558", + "reference": "bad29cb8d18ab0315e6c477751418a82c850d558", "shasum": "" }, "require": { @@ -864,7 +865,7 @@ "psr/log-implementation": "1.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9", + "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", "jakub-onderka/php-parallel-lint": "0.9", @@ -918,20 +919,20 @@ "logging", "psr-3" ], - "time": "2016-07-02 14:02:10" + "time": "2016-11-26T00:15:39+00:00" }, { "name": "paragonie/random_compat", - "version": "v2.0.2", + "version": "v2.0.4", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "088c04e2f261c33bed6ca5245491cfca69195ccf" + "reference": "a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/088c04e2f261c33bed6ca5245491cfca69195ccf", - "reference": "088c04e2f261c33bed6ca5245491cfca69195ccf", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e", + "reference": "a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e", "shasum": "" }, "require": { @@ -966,26 +967,34 @@ "pseudorandom", "random" ], - "time": "2016-04-03 06:00:07" + "time": "2016-11-07T23:38:38+00:00" }, { "name": "psr/log", - "version": "1.0.0", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", "shasum": "" }, + "require": { + "php": ">=5.3.0" + }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { - "psr-0": { - "Psr\\Log\\": "" + "psr-4": { + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -999,30 +1008,31 @@ } ], "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ "log", "psr", "psr-3" ], - "time": "2012-12-21 11:40:51" + "time": "2016-10-10T12:19:37+00:00" }, { "name": "sensio/distribution-bundle", - "version": "v5.0.7", + "version": "v5.0.16", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", - "reference": "a9c4723cbdbc6cf7fbfdfde3c639cb1943f0293a" + "reference": "68e3dc02e66fec5036557d457cfdffa332a40da4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/a9c4723cbdbc6cf7fbfdfde3c639cb1943f0293a", - "reference": "a9c4723cbdbc6cf7fbfdfde3c639cb1943f0293a", + "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/68e3dc02e66fec5036557d457cfdffa332a40da4", + "reference": "68e3dc02e66fec5036557d457cfdffa332a40da4", "shasum": "" }, "require": { "php": ">=5.3.9", - "sensiolabs/security-checker": "~3.0", + "sensiolabs/security-checker": "~3.0|~4.0", "symfony/class-loader": "~2.3|~3.0", "symfony/config": "~2.3|~3.0", "symfony/dependency-injection": "~2.3|~3.0", @@ -1056,20 +1066,20 @@ "configuration", "distribution" ], - "time": "2016-06-23 16:11:33" + "time": "2016-12-31T08:39:25+00:00" }, { "name": "sensio/framework-extra-bundle", - "version": "v3.0.16", + "version": "v3.0.18", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "507a15f56fa7699f6cc8c2c7de4080b19ce22546" + "reference": "c38bc608e12e81089d5d9dfbf72775ed553c61af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/507a15f56fa7699f6cc8c2c7de4080b19ce22546", - "reference": "507a15f56fa7699f6cc8c2c7de4080b19ce22546", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/c38bc608e12e81089d5d9dfbf72775ed553c61af", + "reference": "c38bc608e12e81089d5d9dfbf72775ed553c61af", "shasum": "" }, "require": { @@ -1078,14 +1088,20 @@ "symfony/framework-bundle": "~2.3|~3.0" }, "require-dev": { + "symfony/asset": "~2.7|~3.0", "symfony/browser-kit": "~2.3|~3.0", "symfony/dom-crawler": "~2.3|~3.0", "symfony/expression-language": "~2.4|~3.0", "symfony/finder": "~2.3|~3.0", - "symfony/phpunit-bridge": "~2.7|~3.0", + "symfony/phpunit-bridge": "~3.2", + "symfony/psr-http-message-bridge": "^0.3", "symfony/security-bundle": "~2.4|~3.0", + "symfony/templating": "~2.3|~3.0", + "symfony/translation": "~2.3|~3.0", "symfony/twig-bundle": "~2.3|~3.0", - "twig/twig": "~1.11|~2.0" + "symfony/yaml": "~2.3|~3.0", + "twig/twig": "~1.11|~2.0", + "zendframework/zend-diactoros": "^1.3" }, "suggest": { "symfony/expression-language": "", @@ -1118,24 +1134,24 @@ "annotations", "controllers" ], - "time": "2016-03-25 17:08:27" + "time": "2016-12-14T08:30:06+00:00" }, { "name": "sensiolabs/security-checker", - "version": "v3.0.2", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/sensiolabs/security-checker.git", - "reference": "21696b0daa731064c23cfb694c60a2584a7b6e93" + "reference": "116027b57b568ed61b7b1c80eeb4f6ee9e8c599c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/21696b0daa731064c23cfb694c60a2584a7b6e93", - "reference": "21696b0daa731064c23cfb694c60a2584a7b6e93", + "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/116027b57b568ed61b7b1c80eeb4f6ee9e8c599c", + "reference": "116027b57b568ed61b7b1c80eeb4f6ee9e8c599c", "shasum": "" }, "require": { - "symfony/console": "~2.0|~3.0" + "symfony/console": "~2.7|~3.0" }, "bin": [ "security-checker" @@ -1143,7 +1159,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1162,20 +1178,74 @@ } ], "description": "A security checker for your composer.lock", - "time": "2015-11-07 08:07:40" + "time": "2016-09-23T18:09:57+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.5", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "cd142238a339459b10da3d8234220963f392540c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/cd142238a339459b10da3d8234220963f392540c", + "reference": "cd142238a339459b10da3d8234220963f392540c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2016-12-29T10:02:40+00:00" }, { "name": "symfony/monolog-bundle", - "version": "2.11.1", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00" + "reference": "6acef3bd201c4f35e42e52dedf1fe088f30e07e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00", - "reference": "e7caf4936c7be82bc6d68df87f1d23a0d5bf6e00", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/6acef3bd201c4f35e42e52dedf1fe088f30e07e8", + "reference": "6acef3bd201c4f35e42e52dedf1fe088f30e07e8", "shasum": "" }, "require": { @@ -1222,20 +1292,20 @@ "log", "logging" ], - "time": "2016-04-13 16:21:01" + "time": "2016-11-06T18:54:50+00:00" }, { "name": "symfony/polyfill-apcu", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-apcu.git", - "reference": "6d58bceaeea2c2d3eb62503839b18646e161cd6b" + "reference": "5d4474f447403c3348e37b70acc2b95475b7befa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/6d58bceaeea2c2d3eb62503839b18646e161cd6b", - "reference": "6d58bceaeea2c2d3eb62503839b18646e161cd6b", + "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/5d4474f447403c3348e37b70acc2b95475b7befa", + "reference": "5d4474f447403c3348e37b70acc2b95475b7befa", "shasum": "" }, "require": { @@ -1244,7 +1314,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1275,20 +1345,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "0f8dc2c45f69f8672379e9210bca4a115cd5146f" + "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/0f8dc2c45f69f8672379e9210bca4a115cd5146f", - "reference": "0f8dc2c45f69f8672379e9210bca4a115cd5146f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/2d6e2b20d457603eefb6e614286c22efca30fdb4", + "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4", "shasum": "" }, "require": { @@ -1301,7 +1371,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1333,20 +1403,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "dff51f72b0706335131b00a7f49606168c582594" + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/dff51f72b0706335131b00a7f49606168c582594", - "reference": "dff51f72b0706335131b00a7f49606168c582594", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", "shasum": "" }, "require": { @@ -1358,7 +1428,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1392,20 +1462,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php54", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php54.git", - "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1" + "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1", - "reference": "34d761992f6f2cc6092cc0e5e93f38b53ba5e4f1", + "url": "https://api.github.com/repos/symfony/polyfill-php54/zipball/90e085822963fdcc9d1c5b73deb3d2e5783b16a0", + "reference": "90e085822963fdcc9d1c5b73deb3d2e5783b16a0", "shasum": "" }, "require": { @@ -1414,7 +1484,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1450,20 +1520,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php55", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php55.git", - "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d" + "reference": "03e3f0350bca2220e3623a0e340eef194405fc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d", - "reference": "bf2ff9ad6be1a4772cb873e4eea94d70daa95c6d", + "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/03e3f0350bca2220e3623a0e340eef194405fc67", + "reference": "03e3f0350bca2220e3623a0e340eef194405fc67", "shasum": "" }, "require": { @@ -1473,7 +1543,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1506,20 +1576,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php56", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a" + "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/3edf57a8fbf9a927533344cef65ad7e1cf31030a", - "reference": "3edf57a8fbf9a927533344cef65ad7e1cf31030a", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/1dd42b9b89556f18092f3d1ada22cb05ac85383c", + "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c", "shasum": "" }, "require": { @@ -1529,7 +1599,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1562,20 +1632,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php70", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "a42f4b6b05ed458910f8af4c4e1121b0101b2d85" + "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/a42f4b6b05ed458910f8af4c4e1121b0101b2d85", - "reference": "a42f4b6b05ed458910f8af4c4e1121b0101b2d85", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", + "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", "shasum": "" }, "require": { @@ -1585,7 +1655,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1621,20 +1691,20 @@ "portable", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-util", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-util.git", - "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99" + "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ef830ce3d218e622b221d6bfad42c751d974bf99", - "reference": "ef830ce3d218e622b221d6bfad42c751d974bf99", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/746bce0fca664ac0a575e465f65c6643faddf7fb", + "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb", "shasum": "" }, "require": { @@ -1643,7 +1713,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -1673,7 +1743,7 @@ "polyfill", "shim" ], - "time": "2016-05-18 14:26:46" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/security-acl", @@ -1734,20 +1804,79 @@ ], "description": "Symfony Security Component - ACL (Access Control List)", "homepage": "https://symfony.com", - "time": "2015-12-28 09:39:46" + "time": "2015-12-28T09:39:46+00:00" + }, + { + "name": "symfony/swiftmailer-bundle", + "version": "v2.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/swiftmailer-bundle.git", + "reference": "ad751095576ce0c12a284e30e3fff80c91f27225" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/ad751095576ce0c12a284e30e3fff80c91f27225", + "reference": "ad751095576ce0c12a284e30e3fff80c91f27225", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "swiftmailer/swiftmailer": ">=4.2.0,~5.0", + "symfony/config": "~2.7|~3.0", + "symfony/dependency-injection": "~2.7|~3.0", + "symfony/http-kernel": "~2.7|~3.0" + }, + "require-dev": { + "symfony/console": "~2.7|~3.0", + "symfony/framework-bundle": "~2.7|~3.0", + "symfony/phpunit-bridge": "~2.7|~3.0", + "symfony/yaml": "~2.7|~3.0" + }, + "suggest": { + "psr/log": "Allows logging" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SwiftmailerBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony SwiftmailerBundle", + "homepage": "http://symfony.com", + "time": "2016-12-20T04:44:33+00:00" }, { "name": "symfony/symfony", - "version": "v2.8.8", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "038d13264f732f9bba850c423e374dc72874d1a6" + "reference": "3ec15b9379ebb0758e296d4193926a7b4121a964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/038d13264f732f9bba850c423e374dc72874d1a6", - "reference": "038d13264f732f9bba850c423e374dc72874d1a6", + "url": "https://api.github.com/repos/symfony/symfony/zipball/3ec15b9379ebb0758e296d4193926a7b4121a964", + "reference": "3ec15b9379ebb0758e296d4193926a7b4121a964", "shasum": "" }, "require": { @@ -1763,7 +1892,7 @@ "symfony/polyfill-php70": "~1.0", "symfony/polyfill-util": "~1.0", "symfony/security-acl": "~2.7|~3.0.0", - "twig/twig": "~1.23|~2.0" + "twig/twig": "~1.28|~2.0" }, "conflict": { "phpdocumentor/reflection": "<1.0.7" @@ -1824,7 +1953,8 @@ "egulias/email-validator": "~1.2,>=1.2.1", "monolog/monolog": "~1.11", "ocramius/proxy-manager": "~0.4|~1.0|~2.0", - "phpdocumentor/reflection": "^1.0.7" + "phpdocumentor/reflection": "^1.0.7", + "symfony/phpunit-bridge": "~3.2" }, "type": "library", "extra": { @@ -1868,20 +1998,20 @@ "keywords": [ "framework" ], - "time": "2016-06-30 15:42:24" + "time": "2016-12-13T12:16:34+00:00" }, { "name": "twig/twig", - "version": "v1.24.1", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512" + "reference": "c6ff71094fde15d12398eaba029434b013dc5e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/3566d311a92aae4deec6e48682dc5a4528c4a512", - "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/c6ff71094fde15d12398eaba029434b013dc5e59", + "reference": "c6ff71094fde15d12398eaba029434b013dc5e59", "shasum": "" }, "require": { @@ -1889,12 +2019,12 @@ }, "require-dev": { "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~2.7" + "symfony/phpunit-bridge": "~3.2@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.24-dev" + "dev-master": "1.30-dev" } }, "autoload": { @@ -1929,22 +2059,22 @@ "keywords": [ "templating" ], - "time": "2016-05-30 09:11:59" + "time": "2016-12-23T11:06:22+00:00" } ], "packages-dev": [ { "name": "myclabs/deep-copy", - "version": "1.5.1", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "a8773992b362b58498eed24bf85005f363c34771" + "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/a8773992b362b58498eed24bf85005f363c34771", - "reference": "a8773992b362b58498eed24bf85005f363c34771", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108", + "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108", "shasum": "" }, "require": { @@ -1973,7 +2103,7 @@ "object", "object graph" ], - "time": "2015-11-20 12:04:31" + "time": "2016-10-31T17:19:45+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2027,20 +2157,20 @@ "reflection", "static analysis" ], - "time": "2015-12-27 11:43:31" + "time": "2015-12-27T11:43:31+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", - "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", "shasum": "" }, "require": { @@ -2072,20 +2202,20 @@ } ], "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-06-10 09:48:41" + "time": "2016-09-30T07:12:33+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.2", + "version": "0.2.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", - "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", "shasum": "" }, "require": { @@ -2119,20 +2249,20 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-06-10 07:14:17" + "time": "2016-11-25T06:54:22+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.6.1", + "version": "v1.6.2", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "58a8137754bc24b25740d4281399a4a3596058e0" + "reference": "6c52c2722f8460122f96f86346600e1077ce22cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", - "reference": "58a8137754bc24b25740d4281399a4a3596058e0", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", + "reference": "6c52c2722f8460122f96f86346600e1077ce22cb", "shasum": "" }, "require": { @@ -2140,10 +2270,11 @@ "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", "sebastian/comparator": "^1.1", - "sebastian/recursion-context": "^1.0" + "sebastian/recursion-context": "^1.0|^2.0" }, "require-dev": { - "phpspec/phpspec": "^2.0" + "phpspec/phpspec": "^2.0", + "phpunit/phpunit": "^4.8 || ^5.6.5" }, "type": "library", "extra": { @@ -2181,20 +2312,20 @@ "spy", "stub" ], - "time": "2016-06-07 08:13:47" + "time": "2016-11-21T14:58:47+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "4.0.0", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "900370c81280cc0d942ffbc5912d80464eaee7e9" + "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/900370c81280cc0d942ffbc5912d80464eaee7e9", - "reference": "900370c81280cc0d942ffbc5912d80464eaee7e9", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c14196e64a78570034afd0b7a9f3757ba71c2a0a", + "reference": "c14196e64a78570034afd0b7a9f3757ba71c2a0a", "shasum": "" }, "require": { @@ -2203,7 +2334,7 @@ "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", + "sebastian/environment": "^1.3.2 || ^2.0", "sebastian/version": "~1.0|~2.0" }, "require-dev": { @@ -2244,20 +2375,20 @@ "testing", "xunit" ], - "time": "2016-06-03 05:03:56" + "time": "2016-12-20T15:22:42+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", "shasum": "" }, "require": { @@ -2291,7 +2422,7 @@ "filesystem", "iterator" ], - "time": "2015-06-21 13:08:43" + "time": "2016-10-03T07:40:28+00:00" }, { "name": "phpunit/php-text-template", @@ -2332,7 +2463,7 @@ "keywords": [ "template" ], - "time": "2015-06-21 13:50:34" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", @@ -2376,20 +2507,20 @@ "keywords": [ "timer" ], - "time": "2016-05-12 18:03:57" + "time": "2016-05-12T18:03:57+00:00" }, { "name": "phpunit/php-token-stream", - "version": "1.4.8", + "version": "1.4.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" + "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", - "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", + "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", "shasum": "" }, "require": { @@ -2425,42 +2556,42 @@ "keywords": [ "tokenizer" ], - "time": "2015-09-15 10:49:45" + "time": "2016-11-15T14:06:22+00:00" }, { "name": "phpunit/phpunit", - "version": "5.4.6", + "version": "5.7.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "2f1fc94b77ea6418bd6a06c64a1dac0645fbce59" + "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2f1fc94b77ea6418bd6a06c64a1dac0645fbce59", - "reference": "2f1fc94b77ea6418bd6a06c64a1dac0645fbce59", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50fd2be8f3e23e91da825f36f08e5f9633076ffe", + "reference": "50fd2be8f3e23e91da825f36f08e5f9633076ffe", "shasum": "" }, "require": { "ext-dom": "*", "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", "myclabs/deep-copy": "~1.3", "php": "^5.6 || ^7.0", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "^4.0", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.3", "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.1", + "sebastian/comparator": "~1.2.2", "sebastian/diff": "~1.2", - "sebastian/environment": "^1.3 || ^2.0", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/object-enumerator": "~1.0", + "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" @@ -2468,7 +2599,11 @@ "conflict": { "phpdocumentor/reflection-docblock": "3.0.2" }, + "require-dev": { + "ext-pdo": "*" + }, "suggest": { + "ext-xdebug": "*", "phpunit/php-invoker": "~1.1" }, "bin": [ @@ -2477,7 +2612,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4.x-dev" + "dev-master": "5.7.x-dev" } }, "autoload": { @@ -2503,27 +2638,27 @@ "testing", "xunit" ], - "time": "2016-06-16 06:01:15" + "time": "2016-12-28T07:18:51+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "3.2.3", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "b13d0d9426ced06958bd32104653526a6c998a52" + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/b13d0d9426ced06958bd32104653526a6c998a52", - "reference": "b13d0d9426ced06958bd32104653526a6c998a52", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.6 || ^7.0", "phpunit/php-text-template": "^1.2", - "sebastian/exporter": "^1.2" + "sebastian/exporter": "^1.2 || ^2.0" }, "conflict": { "phpunit/phpunit": "<5.4.0" @@ -2562,7 +2697,7 @@ "mock", "xunit" ], - "time": "2016-06-12 07:37:26" + "time": "2016-12-08T20:27:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -2607,26 +2742,26 @@ ], "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-13 06:45:14" + "time": "2016-02-13T06:45:14+00:00" }, { "name": "sebastian/comparator", - "version": "1.2.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" + "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", + "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" + "sebastian/exporter": "~1.2 || ~2.0" }, "require-dev": { "phpunit/phpunit": "~4.4" @@ -2671,7 +2806,7 @@ "compare", "equality" ], - "time": "2015-07-26 15:48:44" + "time": "2016-11-19T09:18:40+00:00" }, { "name": "sebastian/diff", @@ -2723,32 +2858,32 @@ "keywords": [ "diff" ], - "time": "2015-12-08 07:14:41" + "time": "2015-12-08T07:14:41+00:00" }, { "name": "sebastian/environment", - "version": "1.3.7", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.6 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2773,25 +2908,25 @@ "environment", "hhvm" ], - "time": "2016-05-17 03:18:57" + "time": "2016-11-26T07:53:53+00:00" }, { "name": "sebastian/exporter", - "version": "1.2.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", "shasum": "" }, "require": { "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" + "sebastian/recursion-context": "~2.0" }, "require-dev": { "ext-mbstring": "*", @@ -2800,7 +2935,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2840,7 +2975,7 @@ "export", "exporter" ], - "time": "2016-06-17 09:04:28" + "time": "2016-11-19T08:54:04+00:00" }, { "name": "sebastian/global-state", @@ -2891,25 +3026,25 @@ "keywords": [ "global state" ], - "time": "2015-10-12 03:26:01" + "time": "2015-10-12T03:26:01+00:00" }, { "name": "sebastian/object-enumerator", - "version": "1.0.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "d4ca2fb70344987502567bc50081c03e6192fb26" + "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26", - "reference": "d4ca2fb70344987502567bc50081c03e6192fb26", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", + "reference": "96f8a3f257b69e8128ad74d3a7fd464bcbaa3b35", "shasum": "" }, "require": { "php": ">=5.6", - "sebastian/recursion-context": "~1.0" + "sebastian/recursion-context": "~2.0" }, "require-dev": { "phpunit/phpunit": "~5" @@ -2917,7 +3052,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2937,20 +3072,20 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2016-01-28 13:25:10" + "time": "2016-11-19T07:35:10+00:00" }, { "name": "sebastian/recursion-context", - "version": "1.0.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", - "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", "shasum": "" }, "require": { @@ -2962,7 +3097,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -2990,7 +3125,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-11-11 19:50:13" + "time": "2016-11-19T07:33:16+00:00" }, { "name": "sebastian/resource-operations", @@ -3032,20 +3167,20 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28 20:34:47" + "time": "2015-07-28T20:34:47+00:00" }, { "name": "sebastian/version", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5" + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", - "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", "shasum": "" }, "require": { @@ -3075,37 +3210,37 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-02-04 12:56:52" + "time": "2016-10-03T07:35:21+00:00" }, { "name": "sensio/generator-bundle", - "version": "v3.0.7", + "version": "v3.1.2", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git", - "reference": "d1be460925376703a470a3ac6ec034eb7eab3892" + "reference": "ec278c0bd530edf155c4a00900577b5cb80f559e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/d1be460925376703a470a3ac6ec034eb7eab3892", - "reference": "d1be460925376703a470a3ac6ec034eb7eab3892", + "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/ec278c0bd530edf155c4a00900577b5cb80f559e", + "reference": "ec278c0bd530edf155c4a00900577b5cb80f559e", "shasum": "" }, "require": { "symfony/console": "~2.7|~3.0", "symfony/framework-bundle": "~2.7|~3.0", "symfony/process": "~2.7|~3.0", - "symfony/yaml": "~2.7|~3.0" + "symfony/yaml": "~2.7|~3.0", + "twig/twig": "^1.28.2|^2.0" }, "require-dev": { "doctrine/orm": "~2.4", - "symfony/doctrine-bridge": "~2.7|~3.0", - "twig/twig": "~1.18" + "symfony/doctrine-bridge": "~2.7|~3.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -3127,20 +3262,20 @@ } ], "description": "This bundle generates code for you", - "time": "2016-06-20 05:58:05" + "time": "2016-12-05T16:01:19+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v2.8.8", + "version": "v2.8.15", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "bc61b781fa7f07f9a2ed4e69b15d5c2238695fc0" + "reference": "3a1f8c81595f8f69e24cf03134996cb99a8537c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/bc61b781fa7f07f9a2ed4e69b15d5c2238695fc0", - "reference": "bc61b781fa7f07f9a2ed4e69b15d5c2238695fc0", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3a1f8c81595f8f69e24cf03134996cb99a8537c1", + "reference": "3a1f8c81595f8f69e24cf03134996cb99a8537c1", "shasum": "" }, "require": { @@ -3182,32 +3317,33 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2016-06-29 05:31:50" + "time": "2016-11-16T18:56:22+00:00" }, { "name": "webmozart/assert", - "version": "1.0.2", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde" + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", - "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", + "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.6" + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -3231,7 +3367,7 @@ "check", "validate" ], - "time": "2015-08-24 13:29:44" + "time": "2016-11-23T20:04:58+00:00" } ], "aliases": [], diff --git a/src/AppBundle/Controller/DefaultController.php b/src/AppBundle/Controller/DefaultController.php index 3bd7675..f820b58 100644 --- a/src/AppBundle/Controller/DefaultController.php +++ b/src/AppBundle/Controller/DefaultController.php @@ -5,6 +5,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\JsonResponse; class DefaultController extends Controller { @@ -18,4 +19,13 @@ public function indexAction(Request $request) 'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'), )); } + + // Demande 4 + /** + * @Route("/hello", name="hello") + */ + public function helloAction() + { + return new JsonResponse(array('hello' => 'world')); + } } diff --git a/src/AppBundle/Tests/Controller/DefaultControllerTest.php b/src/AppBundle/Tests/Controller/DefaultControllerTest.php index 87989da..a338ae0 100644 --- a/src/AppBundle/Tests/Controller/DefaultControllerTest.php +++ b/src/AppBundle/Tests/Controller/DefaultControllerTest.php @@ -13,6 +13,8 @@ public function testIndex() $crawler = $client->request('GET', '/'); $this->assertEquals(200, $client->getResponse()->getStatusCode()); - $this->assertContains('Welcome to Symfony', $crawler->filter('#container h1')->text()); + // Demande 2 + //$this->assertContains('Welcome to Symfony', $crawler->filter('#container h1')->text()); + $this->assertContains('This is a test', $crawler->filter('#container h1')->text()); } } diff --git a/src/Test/InterviewBundle/Command/TestCommand.php b/src/Test/InterviewBundle/Command/TestCommand.php new file mode 100644 index 0000000..41dd0b6 --- /dev/null +++ b/src/Test/InterviewBundle/Command/TestCommand.php @@ -0,0 +1,49 @@ +setName('test:command') + ->setDescription('Demande 15') + ->addArgument( + 'id' + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + // Demande Bonus 2 + $id= $input->getArgument('id'); + if (!isset($id)) { + $output->writeln("Missing Parameter (signature 'test:command {id}'). Exiting..."); + return; + } + $helper = $this->getHelper('question'); + $question = new ConfirmationQuestion('This is a test. Do you want to continue (y/N)?', false); + + if (!$helper->ask($input, $output, $question)) { + $output->writeln("Nothing done. Exiting..."); + return; + } + // Fin Demande Bonus 2 + + $container = $this->getContainer(); + + $service = $container->get('testinterview.biosservice'); + $result = $service->getById($id); + + $text = $result->getContent() === 'true' ?'document exists' : 'document doesnt exist'; + + $output->writeln($text); + } +} \ No newline at end of file diff --git a/src/Test/InterviewBundle/Controller/ContributionsController.php b/src/Test/InterviewBundle/Controller/ContributionsController.php new file mode 100644 index 0000000..bcde5ae --- /dev/null +++ b/src/Test/InterviewBundle/Controller/ContributionsController.php @@ -0,0 +1,20 @@ +forward('testinterview.biosservice:getAllContributions'); + } + + // Demande 12 + public function biosByContributionAction ($contributionName) + { + return $this->forward('testinterview.biosservice:getBiosByContributionName',array("contributionName" => $contributionName)); + } +} \ No newline at end of file diff --git a/src/Test/InterviewBundle/Controller/DefaultController.php b/src/Test/InterviewBundle/Controller/DefaultController.php new file mode 100644 index 0000000..15b0792 --- /dev/null +++ b/src/Test/InterviewBundle/Controller/DefaultController.php @@ -0,0 +1,71 @@ +Index du Bundle Test/Interview"); + } + + // fonction de test permettant de vérifier les query et les résultats + public function testdbAction() { + // Initialisation (captain obvious) + $dm = $this->get('doctrine.odm.mongodb.document_manager'); + $repository = $dm->getRepository('TestInterviewBundle:Bios'); + + // Test de findByFirstName(name) avec un retour JSON listant les Ids des entités trouvées + /*------ Paramètre(s) utilisé(s) ------*/ + // param de findByFirstName + $test_first_name = 'John'; + // param de findByContribution + $test_contribution_name = 'OOP'; + // param de findByDeadBefore + $test_date_dead_before = 2012; + /*------ Fin ------*/ + + // Test findByFirstName((string) name) + // return array of bios id + $result = $repository->findByFirstName($test_first_name); + $ids_bios_by_first_name = array(); + if ($result != false) + foreach ($result as $bios) { + $ids_bios_by_first_name[] = $bios->getId(); + } + + // Test de findByContribution((string) name) + // return array of bios id + $result = $repository->findByContribution($test_contribution_name); + $ids_bios_by_contribution_name = array(); + if ($result != false) + foreach ($result as $bios) { + $ids_bios_by_contribution_name[] = $bios->getId(); + } + + // Test de findByDeadBefore((integer) year) + // return array of bios id + $result = $repository->findByDeadBefore($test_date_dead_before); + $ids_bios_by_dead_before = array(); + if ($result != false) + foreach ($result as $bios) { + $ids_bios_by_dead_before[] = $bios->getId(); + } + + // Test du Service et GetAllAwards + $service = $this->forward('testinterview.biosservice:getAllAwards'); + + // la réponse Html n'utilise pas de template Twig donc pas très jolie, c'est juste pour vérifier les données retournées par les fonctions + // (si vide, un résultat ou plusieurs) + return new Response("" + ."Test findByFirstName : Ids des Bios pour le first name $test_first_name : ".implode(",", $ids_bios_by_first_name)."
" + ."Test findByContribution : Ids des Bios pour le contribution name $test_contribution_name : ".implode(",", $ids_bios_by_contribution_name)."
" + ."Test findByDeadBefore : Ids des Bios pour les morts avant le 1er Janvier $test_date_dead_before 00:00:00 : ".implode(",", $ids_bios_by_dead_before)."
" + ."Test BiosService GetAllAwards (Format Json) : ".$service->getContent()."
" + .""); + } +} diff --git a/src/Test/InterviewBundle/DependencyInjection/Configuration.php b/src/Test/InterviewBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..f7ad1c4 --- /dev/null +++ b/src/Test/InterviewBundle/DependencyInjection/Configuration.php @@ -0,0 +1,37 @@ +root('test_interview'); + // Bonus Task 1 + $rootNode + ->children() + ->scalarNode('ping') + ->defaultValue('pong') + // ->defaultValue() + ->end() + ->end(); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/src/Test/InterviewBundle/DependencyInjection/TestInterviewExtension.php b/src/Test/InterviewBundle/DependencyInjection/TestInterviewExtension.php new file mode 100644 index 0000000..f828145 --- /dev/null +++ b/src/Test/InterviewBundle/DependencyInjection/TestInterviewExtension.php @@ -0,0 +1,28 @@ +processConfiguration($configuration, $configs); + + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.yml'); + } +} diff --git a/src/Test/InterviewBundle/Document/Bios.php b/src/Test/InterviewBundle/Document/Bios.php new file mode 100644 index 0000000..0c76b1a --- /dev/null +++ b/src/Test/InterviewBundle/Document/Bios.php @@ -0,0 +1,137 @@ +id; + } + + /** + * Set death + * + * @param date $death + * @return $this + */ + public function setDeath($death) + { + $this->death = $death; + return $this; + } + + /** + * Get death + * + * @return date $death + */ + public function getDeath() + { + return $this->death; + } + + /** + * Set name + * + * @param collection $name + * @return $this + */ + public function setName($name) + { + $this->name = $name; + return $this; + } + + /** + * Get name + * + * @return collection $name + */ + public function getName() + { + return $this->name; + } + + /** + * Set contribs + * + * @param collection $contribs + * @return $this + */ + public function setContribs($contribs) + { + $this->contribs = $contribs; + return $this; + } + + /** + * Get contribs + * + * @return collection $contribs + */ + public function getContribs() + { + return $this->contribs; + } + + /** + * Set awards + * + * @param collection $awards + * @return $this + */ + public function setAwards($awards) + { + $this->awards = $awards; + return $this; + } + + /** + * Get awards + * + * @return collection $awards + */ + public function getAwards() + { + return $this->awards; + } +} diff --git a/src/Test/InterviewBundle/Document/Bios.php~ b/src/Test/InterviewBundle/Document/Bios.php~ new file mode 100644 index 0000000..07877f5 --- /dev/null +++ b/src/Test/InterviewBundle/Document/Bios.php~ @@ -0,0 +1,112 @@ +id; + } + + /** + * Set death + * + * @param date $death + * @return $this + */ + public function setDeath($death) + { + $this->death = $death; + return $this; + } + + /** + * Get death + * + * @return date $death + */ + public function getDeath() + { + return $this->death; + } + + /** + * Set name + * + * @param collection $name + * @return $this + */ + public function setName($name) + { + $this->name = $name; + return $this; + } + + /** + * Get name + * + * @return collection $name + */ + public function getName() + { + return $this->name; + } + + /** + * Set contribs + * + * @param collection $contribs + * @return $this + */ + public function setContribs($contribs) + { + $this->contribs = $contribs; + return $this; + } + + /** + * Get contribs + * + * @return collection $contribs + */ + public function getContribs() + { + return $this->contribs; + } +} diff --git a/src/Test/InterviewBundle/Repository/BiosRepository.php b/src/Test/InterviewBundle/Repository/BiosRepository.php new file mode 100644 index 0000000..861ee8d --- /dev/null +++ b/src/Test/InterviewBundle/Repository/BiosRepository.php @@ -0,0 +1,66 @@ +createQueryBuilder() + ->find() + ->field('name.first')->equals($firstName) + ->getQuery() + ->execute() + ->toArray(); + // toujours tester qu'il existe un résultat sinon on retourne false pour éviter un 404 + if (empty($result)) + return false; + // on assume le fait que plusieurs personnes peuvent avoir le même prénom + // donc on retourne toujours un tableau d'objet BiosDocument + foreach($result as $bios){ + $data[] = $bios; + } + return $data; + } + + // Demande 8.2 + public function findByContribution($contributionName) + { + $result = $this->createQueryBuilder() + ->find() + ->field('contribs')->equals($contributionName) + ->getQuery() + ->execute() + ->toArray(); + if (empty($result)) + return false; + foreach($result as $bios){ + $data[] = $bios; + } + return $data; + } + + // Demande 8.3 + public function findByDeadBefore($year) + { + // On assume le fait que le décès doit être avant le 01/01/$year 00:00:00 + $date_search = new \MongoDate(strtotime("$year-01-01 00:00:00")); + $result = $this->createQueryBuilder() + ->find() + ->field('death')->lte($date_search) + ->getQuery() + ->execute() + ->toArray(); + return $result; + } + +} diff --git a/src/Test/InterviewBundle/Resources/config/routing.yml b/src/Test/InterviewBundle/Resources/config/routing.yml new file mode 100644 index 0000000..d089c81 --- /dev/null +++ b/src/Test/InterviewBundle/Resources/config/routing.yml @@ -0,0 +1,15 @@ +test_interview_homepage: + path: /interview + defaults: { _controller: TestInterviewBundle:Default:index } + +contributions: + path: /contributions + defaults: {_controller: TestInterviewBundle:Contributions:contributions} + +contribution: + path: /contributions/{contributionName} + defaults: {_controller: TestInterviewBundle:Contributions:biosByContribution} + +testdb: + path: /testdb + defaults: {_controller: TestInterviewBundle:Default:testdb} \ No newline at end of file diff --git a/src/Test/InterviewBundle/Resources/config/services.yml b/src/Test/InterviewBundle/Resources/config/services.yml new file mode 100644 index 0000000..a9e0c1c --- /dev/null +++ b/src/Test/InterviewBundle/Resources/config/services.yml @@ -0,0 +1,7 @@ +# Demande 9 +services: + testinterview.biosservice: + class: Test\InterviewBundle\Service\BiosService + arguments: + entityManager: "@doctrine.odm.mongodb.document_manager" + logger: "@logger" diff --git a/src/Test/InterviewBundle/Resources/views/Default/index.html.twig b/src/Test/InterviewBundle/Resources/views/Default/index.html.twig new file mode 100644 index 0000000..980a0d5 --- /dev/null +++ b/src/Test/InterviewBundle/Resources/views/Default/index.html.twig @@ -0,0 +1 @@ +Hello World! diff --git a/src/Test/InterviewBundle/Service/BiosService.php b/src/Test/InterviewBundle/Service/BiosService.php new file mode 100644 index 0000000..fccdbb4 --- /dev/null +++ b/src/Test/InterviewBundle/Service/BiosService.php @@ -0,0 +1,113 @@ +em = $em; + $this->logger = $logger; + + } + + // Demande 9 + public function getAllAwards() + { + $entities = $this->em + ->getRepository('TestInterviewBundle:Bios') + ->findAll(); + if (empty($entities)) { + $this->logger->info('BiosService: Aucun éléments trouvé'); + $result = false; + } else { + $result = array(); + if ($entities) { + foreach ($entities as $bios) { + if (!is_null($bios->getAwards())) { + $this->logger->info("BiosService: Awards pour le bios d'id : ".strval($bios->getId())); + $result[] = $bios->getAwards(); + } else { + $this->logger->info("BiosService: Awards inexistants pour le bios d'id : ".strval($bios->getId())); + } + } + } + } + // La je fais un retour JsonResponse pour mes tests mais il n'y a pas de précisions dans la demande + return new JsonResponse($result); + } + + // Demande 11 + public function getAllContributions() + { + $entities = $this->em + ->getRepository('TestInterviewBundle:Bios') + ->findAll(); + if (empty($entities)) { + $result = false; + } else { + $result = array(); + if ($entities) { + foreach ($entities as $bios) { + if (!is_null($bios->getContribs())) { + $result[] = $bios->getContribs(); + } + } + } + } + return new JsonResponse($result); + } + + // Demande 12 + public function getBiosByContributionName($contributionName) + { + $result = $this->em + ->getRepository('TestInterviewBundle:Bios') + ->createQueryBuilder() + ->find() + ->field('contribs')->equals($contributionName) + ->getQuery() + ->execute() + ->toArray(); + $data = array(); + if (empty($result)) { + // demande 13 pour le test /contributions/fake => 404 + throw new NotFoundHttpException('Sorry not existing!'); + } + foreach($result as $bios){ + $data[] = $bios; + } + return new JsonResponse($data); + } + + // Demande 15 + public function getById($id) + { + $result = $this->em + ->getRepository('TestInterviewBundle:Bios') + // ne fonctionne pas, pas moyen de mapper avec l'id des objets... + // => https://github.com/Automattic/mongoose/issues/3079 (avec mongoose mais j'ai exactement le même soucis) + //->find($id); + ->findAll(); + // vu que j'arrive pas à le faire 'normalement' avec un find(id) tout simple + // ben je vais le faire en PHP... + if (empty($result)) + return false; + $rendu = false; + foreach($result as $bios){ + if ($bios->getId() == $id) + $rendu = true; + } + return new JsonResponse($rendu); + } + + + +} \ No newline at end of file diff --git a/src/Test/InterviewBundle/TestInterviewBundle.php b/src/Test/InterviewBundle/TestInterviewBundle.php new file mode 100644 index 0000000..89ccde6 --- /dev/null +++ b/src/Test/InterviewBundle/TestInterviewBundle.php @@ -0,0 +1,10 @@ +request('GET', '/hello'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + $this->assertSame('application/json', $client->getResponse()->headers->get('Content-Type')); + + $client->request('GET', '/contributions'); + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $client->request('GET', '/contributions/fake'); + $this->assertEquals(404, $client->getResponse()->getStatusCode()); + + $client->request('GET', '/contributions/OOP'); + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + } +} diff --git a/src/Test/InterviewBundle/Tests/Service/DefaultServiceTest.php b/src/Test/InterviewBundle/Tests/Service/DefaultServiceTest.php new file mode 100644 index 0000000..a9af4a1 --- /dev/null +++ b/src/Test/InterviewBundle/Tests/Service/DefaultServiceTest.php @@ -0,0 +1,19 @@ +boot(); + $container = $kernel->getContainer(); + $service = $container->get('testinterview.biosservice'); + $this->assertSame('application/json', $service->getAllContributions()->headers->get('Content-Type') + ); + } +} diff --git a/tests/InterviewBundle/Controller/DefaultControllerTest.php b/tests/InterviewBundle/Controller/DefaultControllerTest.php new file mode 100644 index 0000000..cad973e --- /dev/null +++ b/tests/InterviewBundle/Controller/DefaultControllerTest.php @@ -0,0 +1,17 @@ +request('GET', '/'); + + $this->assertContains('Hello World', $client->getResponse()->getContent()); + } +} diff --git a/web/config.php b/web/config.php index 38d022e..8bdfd46 100644 --- a/web/config.php +++ b/web/config.php @@ -28,6 +28,8 @@ $majorProblems = $symfonyRequirements->getFailedRequirements(); $minorProblems = $symfonyRequirements->getFailedRecommendations(); +$hasMajorProblems = (bool) count($majorProblems); +$hasMinorProblems = (bool) count($minorProblems); ?> @@ -36,9 +38,216 @@ Symfony Configuration Checker - - -