From a44cc53cdfea31be373073f0d7f0a1f97fa9b28a Mon Sep 17 00:00:00 2001 From: Marcel Strahl Date: Wed, 5 Feb 2020 08:00:25 +0100 Subject: [PATCH 1/6] Improve serializer factory logic. serializer can handle array iterator objects, now --- src/ResponseFactory.php | 18 +++++++- tests/ResponseFactory/Response.php | 28 ++++++++++++ tests/ResponseFactory/Response/Item.php | 25 +++++++++++ tests/ResponseFactory/dummy_array.php | 15 +++++++ tests/ResponseFactoryTest.php | 60 +++++++++++++++++++++++++ 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 tests/ResponseFactory/Response.php create mode 100644 tests/ResponseFactory/Response/Item.php create mode 100644 tests/ResponseFactory/dummy_array.php diff --git a/src/ResponseFactory.php b/src/ResponseFactory.php index b2cdf5b..a6c17bc 100644 --- a/src/ResponseFactory.php +++ b/src/ResponseFactory.php @@ -4,6 +4,7 @@ namespace Dropelikeit\LaravelJmsSerializer; +use ArrayIterator; use Dropelikeit\LaravelJmsSerializer\Config\Config; use JMS\Serializer\SerializationContext; use JMS\Serializer\SerializerInterface; @@ -52,7 +53,13 @@ public function withContext(SerializationContext $context): void public function create(object $jmsResponse): JsonResponse { - $content = $this->serializer->serialize($jmsResponse, $this->config->getSerializeType(), $this->context); + $initialType = $this->getInitialType($jmsResponse); + + $content = $this->serializer->serialize( + $jmsResponse, + $this->config->getSerializeType(), + $this->context, $initialType + ); return new JsonResponse($content, $this->status, ['application/json'], true); } @@ -63,4 +70,13 @@ public function createFromArray(array $jmsResponse): JsonResponse return new JsonResponse($content, $this->status, ['application/json'], true); } + + private function getInitialType(object $jmsResponse): ?string + { + if ($jmsResponse instanceof ArrayIterator) { + return 'array'; + } + + return null; + } } diff --git a/tests/ResponseFactory/Response.php b/tests/ResponseFactory/Response.php new file mode 100644 index 0000000..9a4c22d --- /dev/null +++ b/tests/ResponseFactory/Response.php @@ -0,0 +1,28 @@ + + */ +class Response extends ArrayIterator +{ + private function __construct(array $items) + { + Assert::allIsInstanceOf($items, Item::class); + Assert::isList($items); + + parent::__construct($items); + } + + public static function create(array $items): self + { + return new self($items); + } +} diff --git a/tests/ResponseFactory/Response/Item.php b/tests/ResponseFactory/Response/Item.php new file mode 100644 index 0000000..7d5a12b --- /dev/null +++ b/tests/ResponseFactory/Response/Item.php @@ -0,0 +1,25 @@ + + */ +class Item +{ + /** + * @Serializer\Type("string") + * @var string + */ + private $key = 'magic_number'; + + /** + * @Serializer\Type("integer") + * @var int + */ + private $value = 12; +} \ No newline at end of file diff --git a/tests/ResponseFactory/dummy_array.php b/tests/ResponseFactory/dummy_array.php new file mode 100644 index 0000000..6525793 --- /dev/null +++ b/tests/ResponseFactory/dummy_array.php @@ -0,0 +1,15 @@ + [ + 'person' => [ + 'first_name' => 'Max', + 'last_name' => 'Mustermann', + 'birthdate' => '01.01.1976', + 'birth_place' => 'Berlin', + 'nationality' => 'german', + ], + ], +]; diff --git a/tests/ResponseFactoryTest.php b/tests/ResponseFactoryTest.php index d839d01..6ab6658 100644 --- a/tests/ResponseFactoryTest.php +++ b/tests/ResponseFactoryTest.php @@ -9,6 +9,7 @@ use Dropelikeit\LaravelJmsSerializer\ResponseFactory; use Dropelikeit\LaravelJmsSerializer\Serializer\Factory; use Dropelikeit\LaravelJmsSerializer\Tests\ResponseFactory\Dummy; +use Dropelikeit\LaravelJmsSerializer\Tests\ResponseFactory\Response; use JMS\Serializer\SerializationContext; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; @@ -60,6 +61,65 @@ public function canCreateResponse(): void $this->assertEquals('{"amount":12,"text":"Hello World!"}', $response->getContent()); } + /** + * @test + */ + public function canCreateFromArrayIterator(): void + { + $this->config + ->expects($this->once()) + ->method('getCacheDir') + ->willReturn(__DIR__); + + $this->config + ->expects($this->once()) + ->method('debug') + ->willReturn(true); + + $this->config + ->expects($this->once()) + ->method('getSerializeType') + ->willReturn(Config::SERIALIZE_TYPE_JSON); + + $responseFactory = new ResponseFactory((new Factory())->getSerializer($this->config), $this->config); + + $response = $responseFactory->create(Response::create([new Response\Item()])); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals('[{"key":"magic_number","value":12}]', $response->getContent()); + } + + /** + * @test + */ + public function canCreateResponseFromArray(): void + { + $this->config + ->expects($this->once()) + ->method('getCacheDir') + ->willReturn(__DIR__); + + $this->config + ->expects($this->once()) + ->method('debug') + ->willReturn(true); + + $this->config + ->expects($this->once()) + ->method('getSerializeType') + ->willReturn(Config::SERIALIZE_TYPE_JSON); + + $responseFactory = new ResponseFactory((new Factory())->getSerializer($this->config), $this->config); + + $response = $responseFactory->createFromArray(require __DIR__.'/ResponseFactory/dummy_array.php'); + + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals( + '{"some_objects":{"person":{"first_name":"Max","last_name":"Mustermann","birthdate":"01.01.1976","birth_place":"Berlin","nationality":"german"}}}', + $response->getContent() + ); + } + /** * @test */ From 5cc517a1ec2cba206d214ee39e1ec14dab613c4f Mon Sep 17 00:00:00 2001 From: Marcel Strahl Date: Wed, 5 Feb 2020 08:01:19 +0100 Subject: [PATCH 2/6] Improve serializer factory logic. serializer can handle array iterator objects, now --- src/Exception/MissingRequiredItems.php | 6 +++--- src/ResponseFactory.php | 3 ++- src/Serializer/Factory.php | 4 ++-- tests/ResponseFactory/Response/Item.php | 2 +- tests/ResponseFactoryTest.php | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Exception/MissingRequiredItems.php b/src/Exception/MissingRequiredItems.php index f5d87a1..bdd5977 100644 --- a/src/Exception/MissingRequiredItems.php +++ b/src/Exception/MissingRequiredItems.php @@ -15,9 +15,9 @@ public static function fromConfig(string $fields): self { return new self( sprintf( - 'Missing required fields, please check your serializer-config. Missing fields "%s"', - $fields - ), + 'Missing required fields, please check your serializer-config. Missing fields "%s"', + $fields + ), 400 ); } diff --git a/src/ResponseFactory.php b/src/ResponseFactory.php index a6c17bc..b2ca6a8 100644 --- a/src/ResponseFactory.php +++ b/src/ResponseFactory.php @@ -58,7 +58,8 @@ public function create(object $jmsResponse): JsonResponse $content = $this->serializer->serialize( $jmsResponse, $this->config->getSerializeType(), - $this->context, $initialType + $this->context, + $initialType ); return new JsonResponse($content, $this->status, ['application/json'], true); diff --git a/src/Serializer/Factory.php b/src/Serializer/Factory.php index b571d22..71eda0f 100644 --- a/src/Serializer/Factory.php +++ b/src/Serializer/Factory.php @@ -5,11 +5,11 @@ namespace Dropelikeit\LaravelJmsSerializer\Serializer; use Dropelikeit\LaravelJmsSerializer\Config\Config; +use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy; +use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; use JMS\Serializer\SerializationContext; use JMS\Serializer\SerializerBuilder; use JMS\Serializer\SerializerInterface; -use JMS\Serializer\Naming\SerializedNameAnnotationStrategy; -use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy; /** * @author Marcel Strahl diff --git a/tests/ResponseFactory/Response/Item.php b/tests/ResponseFactory/Response/Item.php index 7d5a12b..121748d 100644 --- a/tests/ResponseFactory/Response/Item.php +++ b/tests/ResponseFactory/Response/Item.php @@ -22,4 +22,4 @@ class Item * @var int */ private $value = 12; -} \ No newline at end of file +} diff --git a/tests/ResponseFactoryTest.php b/tests/ResponseFactoryTest.php index 6ab6658..7f254cc 100644 --- a/tests/ResponseFactoryTest.php +++ b/tests/ResponseFactoryTest.php @@ -111,7 +111,7 @@ public function canCreateResponseFromArray(): void $responseFactory = new ResponseFactory((new Factory())->getSerializer($this->config), $this->config); - $response = $responseFactory->createFromArray(require __DIR__.'/ResponseFactory/dummy_array.php'); + $response = $responseFactory->createFromArray(require __DIR__ . '/ResponseFactory/dummy_array.php'); $this->assertEquals(200, $response->getStatusCode()); $this->assertEquals( From ec0ec2fbc6a963cbd50756b4dc3ecfcba8ad82db Mon Sep 17 00:00:00 2001 From: Marcel Strahl Date: Wed, 5 Feb 2020 09:07:26 +0100 Subject: [PATCH 3/6] add README.md --- README.md | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..7aadf96 --- /dev/null +++ b/README.md @@ -0,0 +1,145 @@ +# JMS Serializer for Laravel + +This package integrates the JMS serializer into Laravel. + +JMS-Serializer: https://github.com/schmittjoh/serializer + +You are also welcome to use the Issue Tracker to set bugs, improvements or upgrade requests. + +### Installation + +``` composer require dropelikeit/laravel-jms-serializer ``` + + + +### How to use + +Laravel 5.5 and later uses Package Auto-Discovery, so you do not need to add the service provider manually. +For Laravel versions below 5.5, the package must be added manually, add the following line in the "providers" array in config/app.php: + +```php + Dropelikeit\LaravelJmsSerializer\ServiceProvider::class, +``` + +For example, to use the JMS serializer in a controller, add the ResponseFactory in the constructor. + +```php + responseFactory = $responseFactory; + } + + public function myAction(): JsonResponse + { + $myDataObjectWithSerializerAnnotations = new Object('some data'); + return $this->responseFactory->create($myDataObjectWithSerializerAnnotations); + } + } +``` + +Publish the Serializer Config with the command + +```bash + php artisan vendor:publish +``` + +After that you will see a config file in your config folder named "laravel-jms-serializer.php" with the following content: + + +```php + true, + 'serialize_type' => Config\Config::SERIALIZE_TYPE_JSON, + 'debug' => false, +]; +``` + +As you can see zero values are serialized by default. + +## Using Custom-Context + +To use your own JMS contexts, use the "withContext" method + +To learn more about JMS context, read the JMS Serializer documentation: http://jmsyst.com/libs/serializer/master + +```php + responseFactory = $responseFactory; + } + + public function myAction(): JsonResponse + { + $myDataObjectWithSerializerAnnotations = new Object('some data'); + + $context = SerializationContext::create()->setSerializeNull(true); + + $this->responseFactory->withContext($context); + return $this->responseFactory->create($myDataObjectWithSerializerAnnotations); + } + } +``` + +## Using Status-Code + +You do not always want to hand over a status code of 200 to the frontend. You can achieve this with the following code. Use the method "withStatusCode" for this + +```php + responseFactory = $responseFactory; + } + + public function myAction(): JsonResponse + { + $myDataObjectWithSerializerAnnotations = new Object('some data'); + + $this->responseFactory->withStatusCode(400); + return $this->responseFactory->create($myDataObjectWithSerializerAnnotations); + } + } +``` + + + From 011c4a23868fb02932cdf499f6e0fcea92340dfe Mon Sep 17 00:00:00 2001 From: Marcel Strahl Date: Wed, 5 Feb 2020 10:45:09 +0100 Subject: [PATCH 4/6] add travis and coveralls support --- .coveralls.yml | 3 +++ .travis.yml | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ composer.json | 4 +++- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 .coveralls.yml create mode 100644 .travis.yml diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 0000000..90cf2a6 --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1,3 @@ +service_name: travis-ci +coverage_clover: build/logs/clover.xml +json_path: build/logs/coveralls-upload.json \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..6897d2a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,61 @@ +# Project language +language: php + +# Allows use container-based infrastructure +sudo: false + +# Start mysql service +#services: +# - mysql + +# Cache composer packages so "composer install" is faster +cache: + directories: + - $HOME/.composer/cache/files + +# Matrix to test in every php version +matrix: + # Fast finish allows to set the build as "finished" even if the "allow_failures" matrix elements are not finished yet. + fast_finish: true + include: + - php: 7.2 + - php: 7.3 + allow_failures: + - php: hhvm + +# Define an environment variable +#env: + #- SYMFONY_VERSION="3.0.*" DB=mysql + +# Update composer +before-install: + - composer self-update + +# Install composer dependencies, +# Create database, schema and fixtures +install: + - composer install + - wget -c -nc --retry-connrefused --tries=0 https://github.com/php-coveralls/php-coveralls/releases/download/v2.0.0/php-coveralls.phar + - chmod +x php-coveralls.phar + - php php-coveralls.phar --version + #- cp app/config/parameters.yml.dist app/config/parameters.yml + #- php bin/console doctrine:database:create --env=test + #- php bin/console doctrine:schema:create --env=test + #- php bin/console doctrine:fixtures:load -n --env=test + #- php bin/console assets:install + +# Run script +script: + - composer test + - phpunit --coverage-clover build/logs/clover.xml + - composer cs-check + +after_success: + - travis_retry php php-coveralls.phar -v + + +# After a build, send email notification with the build results +notifications: +email: + on_success: never + on_failure: always \ No newline at end of file diff --git a/composer.json b/composer.json index a12bef3..3ef200c 100644 --- a/composer.json +++ b/composer.json @@ -43,9 +43,11 @@ "cs-check": "php-cs-fixer -v --dry-run --using-cache=no fix", "cs-fix": "php-cs-fixer --using-cache=no fix", "test": "phpunit", + "test-coverage": "phpunit --coverage-clover build/logs/clover.xml", "check": [ "@cs-check", - "@test" + "@test", + "@test-coverage" ] } } From 36ae8c13bbc57caaabedcc3ee62ef2c99354dff2 Mon Sep 17 00:00:00 2001 From: Marcel Strahl Date: Wed, 5 Feb 2020 10:57:10 +0100 Subject: [PATCH 5/6] add badges --- .travis.yml | 1 - README.md | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6897d2a..90a706d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,6 @@ matrix: # Fast finish allows to set the build as "finished" even if the "allow_failures" matrix elements are not finished yet. fast_finish: true include: - - php: 7.2 - php: 7.3 allow_failures: - php: hhvm diff --git a/README.md b/README.md index 7aadf96..b40eb36 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +[![Build Status](https://travis-ci.org/Dropelikeit/laravel-jms-serializer.svg?branch=master)](https://travis-ci.org/Dropelikeit/PriceCalculator) +[![Coverage Status](https://coveralls.io/repos/github/Dropelikeit/laravel-jms-serializer/badge.svg)](https://coveralls.io/github/Dropelikeit/laravel-jms-serializer) +[![Monthly Downloads](https://poser.pugx.org/dropelikeit/laravel-jms-serializer/d/monthly)](https://packagist.org/packages/dropelikeit/laravel-jms-serializer) +[![Daily Downloads](https://poser.pugx.org/dropelikeit/laravel-jms-serializer/d/daily)](https://packagist.org/packages/dropelikeit/laravel-jms-serializer) +[![Total Downloads](https://poser.pugx.org/dropelikeit/laravel-jms-serializer/downloads)](https://packagist.org/packages/dropelikeit/laravel-jms-serializer) +[![Latest Stable Version](https://poser.pugx.org/dropelikeit/laravel-jms-serializer/v/stable)](https://packagist.org/packages/dropelikeit/laravel-jms-serializer) +[![Total Downloads](https://poser.pugx.org/dropelikeit/laravel-jms-serializer/downloads)](https://packagist.org/packages/dropelikeit/laravel-jms-serializer) +[![License](https://poser.pugx.org/dropelikeit/laravel-jms-serializer/license)](https://packagist.org/packages/dropelikeit/laravel-jms-serializer) +[![composer.lock](https://poser.pugx.org/dropelikeit/laravel-jms-serializer/composerlock)](https://packagist.org/packages/dropelikeit/laravel-jms-serializer) + # JMS Serializer for Laravel This package integrates the JMS serializer into Laravel. From 56b16e659375acdccafcfd80a4c2ddf0acd01720 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2020 11:00:23 +0000 Subject: [PATCH 6/6] Bump symfony/http-foundation from 4.4.2 to 4.4.7 Bumps [symfony/http-foundation](https://github.com/symfony/http-foundation) from 4.4.2 to 4.4.7. - [Release notes](https://github.com/symfony/http-foundation/releases) - [Changelog](https://github.com/symfony/http-foundation/blob/master/CHANGELOG.md) - [Commits](https://github.com/symfony/http-foundation/compare/v4.4.2...v4.4.7) Signed-off-by: dependabot[bot] --- composer.lock | 58 +++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/composer.lock b/composer.lock index e31e351..ba297f5 100644 --- a/composer.lock +++ b/composer.lock @@ -2029,16 +2029,16 @@ }, { "name": "symfony/http-foundation", - "version": "v4.4.2", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "fcae1cff5b57b2a9c3aabefeb1527678705ddb62" + "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/fcae1cff5b57b2a9c3aabefeb1527678705ddb62", - "reference": "fcae1cff5b57b2a9c3aabefeb1527678705ddb62", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62f92509c9abfd1f73e17b8cf1b72c0bdac6611b", + "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b", "shasum": "" }, "require": { @@ -2080,7 +2080,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-12-19T15:57:49+00:00" + "time": "2020-03-30T14:07:33+00:00" }, { "name": "symfony/http-kernel", @@ -2174,16 +2174,16 @@ }, { "name": "symfony/mime", - "version": "v5.0.2", + "version": "v5.0.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "0e6a4ced216e49d457eddcefb61132173a876d79" + "reference": "481b7d6da88922fb1e0d86a943987722b08f3955" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/0e6a4ced216e49d457eddcefb61132173a876d79", - "reference": "0e6a4ced216e49d457eddcefb61132173a876d79", + "url": "https://api.github.com/repos/symfony/mime/zipball/481b7d6da88922fb1e0d86a943987722b08f3955", + "reference": "481b7d6da88922fb1e0d86a943987722b08f3955", "shasum": "" }, "require": { @@ -2232,7 +2232,7 @@ "mime", "mime-type" ], - "time": "2019-11-30T14:12:50+00:00" + "time": "2020-03-27T16:56:45+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2294,22 +2294,22 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "symfony/polyfill-php72": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -2317,7 +2317,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -2352,20 +2352,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", "shasum": "" }, "require": { @@ -2377,7 +2377,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -2411,20 +2411,20 @@ "portable", "shim" ], - "time": "2019-11-27T14:18:11+00:00" + "time": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + "reference": "37b0976c78b94856543260ce09b460a7bc852747" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747", + "reference": "37b0976c78b94856543260ce09b460a7bc852747", "shasum": "" }, "require": { @@ -2433,7 +2433,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -2466,7 +2466,7 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/polyfill-php73",