From 120a5480f76a38f60197a8739f90b0b6e09a3aa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 4 Feb 2021 21:01:26 +0100 Subject: [PATCH 1/3] Implement automatic xml import controlled by uploaded timestamp files --- .../Service/ContingentImportService.php | 16 ++++++- .../Classes/Service/DateImportService.php | 30 ++++++++++--- .../Service/ImportTimestampService.php | 44 +++++++++++++++++++ .../Classes/Task/ImportContingentsTask.php | 7 ++- .../Classes/Task/ImportDatesTask.php | 7 ++- 5 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 public/typo3conf/ext/ep_products/Classes/Service/ImportTimestampService.php diff --git a/public/typo3conf/ext/ep_products/Classes/Service/ContingentImportService.php b/public/typo3conf/ext/ep_products/Classes/Service/ContingentImportService.php index 0202fcc4..872cdd99 100644 --- a/public/typo3conf/ext/ep_products/Classes/Service/ContingentImportService.php +++ b/public/typo3conf/ext/ep_products/Classes/Service/ContingentImportService.php @@ -57,14 +57,20 @@ class ContingentImportService implements SingletonInterface, LoggerAwareInterfac * @var Connection */ protected $db; + /** + * @var ImportTimestampService + */ + private $importTimestampService; /** * @param ConfigurationManagerInterface $manager * @throws \Doctrine\DBAL\DBALException */ - public function __construct(ConfigurationManagerInterface $manager) + public function __construct(ConfigurationManagerInterface $manager, ImportTimestampService $importTimestampService) { $this->configurationManager = $manager; + $this->importTimestampService = $importTimestampService; + $settings = GeneralUtility::removeDotsFromTS( $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT) ); @@ -92,6 +98,14 @@ class ContingentImportService implements SingletonInterface, LoggerAwareInterfac return $contingentCount; } + public function isImportRequired(): bool + { + return $this->importTimestampService->isImportRequired( + 'fileadmin/xmlexportzimmer/uebertragung.info', + 'fileadmin/contingents_import.info' + ); + } + /** * @param string $path * @return int diff --git a/public/typo3conf/ext/ep_products/Classes/Service/DateImportService.php b/public/typo3conf/ext/ep_products/Classes/Service/DateImportService.php index a95bb1dc..d5e27804 100644 --- a/public/typo3conf/ext/ep_products/Classes/Service/DateImportService.php +++ b/public/typo3conf/ext/ep_products/Classes/Service/DateImportService.php @@ -85,6 +85,11 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface */ protected $cacheService; + /** + * @var ImportTimestampService + */ + private $importTimestampService; + /** * @var array */ @@ -96,10 +101,15 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface * @param ConfigurationManagerInterface $configurationManager * @param CacheService $cacheService */ - public function __construct(ConfigurationManagerInterface $configurationManager, CacheService $cacheService) - { + public function __construct + ( + ConfigurationManagerInterface $configurationManager, + CacheService $cacheService, + ImportTimestampService $importTimestampService + ) { $this->configurationManager = $configurationManager; $this->cacheService = $cacheService; + $this->importTimestampService = $importTimestampService; $settings = GeneralUtility::removeDotsFromTS( $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT) @@ -133,6 +143,14 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface return $dateCount; } + public function isImportRequired(): bool + { + return $this->importTimestampService->isImportRequired( + 'fileadmin/xmlexport/uebertragung.info', + 'fileadmin/products_import.info' + ); + } + /** * @param $path * @@ -246,7 +264,7 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface WHERE p.deleted = 0 AND p.hidden = 0 AND p.code = :code '; - $products = $this->db->fetchAll($sql, ['code' => $code]); + $products = $this->db->fetchAllAssociative($sql, ['code' => $code]); // Skip import in case product can't be found if (count($products) === 0) { @@ -748,7 +766,7 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface protected function getRoomMappings() { $sql = 'SELECT code, type FROM tx_epproducts_domain_model_roommapping'; - $roomMappings = $this->db->fetchAll($sql); + $roomMappings = $this->db->fetchAllAssociative($sql); foreach ($roomMappings as $mapping) { $this->roomMappings[mb_strtolower($mapping['code'])] = $mapping['type']; @@ -773,7 +791,7 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface ) u LEFT JOIN tx_epproducts_domain_model_hotel h ON u.uid = h.uid '; - $rows = $this->db->fetchAll($sql); + $rows = $this->db->fetchAllAssociative($sql); foreach ($rows as $row) { $this->hotelMappings[$row['code']] = [ @@ -809,7 +827,7 @@ class DateImportService implements SingletonInterface, LoggerAwareInterface LIMIT 0,1 '; - return $this->db->fetchColumn($sql, ['uid' => $uid]); + return $this->db->fetchOne($sql, ['uid' => $uid]); } /** diff --git a/public/typo3conf/ext/ep_products/Classes/Service/ImportTimestampService.php b/public/typo3conf/ext/ep_products/Classes/Service/ImportTimestampService.php new file mode 100644 index 00000000..9f89f33f --- /dev/null +++ b/public/typo3conf/ext/ep_products/Classes/Service/ImportTimestampService.php @@ -0,0 +1,44 @@ +format('d.m.Y H:i:s')); + + return true; + } + + $line = trim(file($lastImportTimestampPath)[0]); + $lastImportAt = \DateTime::createFromFormat('d.m.Y H:i:s', $line); + + if ($lastUploadAt > $lastImportAt) { + $now = new \DateTime('now'); + file_put_contents($lastImportTimestampPath, $now->format('d.m.Y H:i:s')); + + return true; + } + + return false; + } + +} diff --git a/public/typo3conf/ext/ep_products/Classes/Task/ImportContingentsTask.php b/public/typo3conf/ext/ep_products/Classes/Task/ImportContingentsTask.php index ef9f541a..6d5c062a 100644 --- a/public/typo3conf/ext/ep_products/Classes/Task/ImportContingentsTask.php +++ b/public/typo3conf/ext/ep_products/Classes/Task/ImportContingentsTask.php @@ -40,8 +40,11 @@ class ImportContingentsTask extends AbstractTask $objectManager = GeneralUtility::makeInstance(ObjectManager::class); /** @var \EP\EpProducts\Service\ContingentImportService $importService */ $importService = $objectManager->get(ContingentImportService::class); - $path = GeneralUtility::getFileAbsFileName('fileadmin/xmlexportzimmer'); - $importService->import($path); + if ($importService->isImportRequired()) { + $path = GeneralUtility::getFileAbsFileName('fileadmin/xmlexportzimmer'); + $importService->import($path); + } + return true; } } diff --git a/public/typo3conf/ext/ep_products/Classes/Task/ImportDatesTask.php b/public/typo3conf/ext/ep_products/Classes/Task/ImportDatesTask.php index ee2c21c2..266ceb4d 100644 --- a/public/typo3conf/ext/ep_products/Classes/Task/ImportDatesTask.php +++ b/public/typo3conf/ext/ep_products/Classes/Task/ImportDatesTask.php @@ -40,8 +40,11 @@ class ImportDatesTask extends AbstractTask $objectManager = GeneralUtility::makeInstance(ObjectManager::class); /** @var \EP\EpProducts\Service\DateImportService $importService */ $importService = $objectManager->get(DateImportService::class); - $path = GeneralUtility::getFileAbsFileName('fileadmin/xmlexport'); - $importService->import($path); + if ($importService->isImportRequired()) { + $path = GeneralUtility::getFileAbsFileName('fileadmin/xmlexport'); + $importService->import($path); + } + return true; } } From 753dcc98b6342c33466d7642a44700a8a28c1ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 4 Feb 2021 21:01:42 +0100 Subject: [PATCH 2/3] Extend ddev config for ssh access --- .ddev/config.yaml | 6 ++++++ .ddev/docker-compose.override.yaml | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.ddev/config.yaml b/.ddev/config.yaml index 869ea69e..df03fe64 100644 --- a/.ddev/config.yaml +++ b/.ddev/config.yaml @@ -19,6 +19,12 @@ provider: default omit_containers: [dba] use_dns_when_possible: true timezone: Europe/Berlin +webimage_extra_packages: [ ssh ] + +hooks: + post-start: + - exec: "sudo chmod 600 /home/fromme/.ssh/authorized_keys" + - exec: "sudo service ssh start" # This config.yaml was created with ddev version v1.14.0 diff --git a/.ddev/docker-compose.override.yaml b/.ddev/docker-compose.override.yaml index 9e605db8..f191db1c 100644 --- a/.ddev/docker-compose.override.yaml +++ b/.ddev/docker-compose.override.yaml @@ -4,6 +4,7 @@ services: web: environment: - TYPO3_CONTEXT=Development - - PHP_IDE_CONFIG=serverName=${DDEV_SITENAME}.ddev.site volumes: - ../public/typo3conf/ext/ep_theme/Resources/Private/Assets:/var/www/html/public/typo3conf/ext/ep_theme/Resources/Private/Assets:consistent + ports: + - "9922:22" From 2a28ff79cfaf55d8f5e6b6bd311fa8a8e4657dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 4 Feb 2021 21:03:34 +0100 Subject: [PATCH 3/3] Update project dependencies --- composer.lock | 217 +++++++++++++++++++++++++------------------------- 1 file changed, 109 insertions(+), 108 deletions(-) diff --git a/composer.lock b/composer.lock index 8917ecf3..468b435c 100644 --- a/composer.lock +++ b/composer.lock @@ -2149,16 +2149,16 @@ }, { "name": "symfony/asset", - "version": "v5.2.1", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "d254631bc20fb82a5827602dc2fa84a3118ec3f5" + "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/d254631bc20fb82a5827602dc2fa84a3118ec3f5", - "reference": "d254631bc20fb82a5827602dc2fa84a3118ec3f5", + "url": "https://api.github.com/repos/symfony/asset/zipball/54a42aa50f9359d1184bf7e954521b45ca3d5828", + "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828", "shasum": "" }, "require": { @@ -2195,7 +2195,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Asset Component", + "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "funding": [ { @@ -2211,20 +2211,20 @@ "type": "tidelift" } ], - "time": "2020-12-14T07:03:02+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/cache", - "version": "v5.2.1", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5e61d63b1ef4fb4852994038267ad45e12f3ec52" + "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5e61d63b1ef4fb4852994038267ad45e12f3ec52", - "reference": "5e61d63b1ef4fb4852994038267ad45e12f3ec52", + "url": "https://api.github.com/repos/symfony/cache/zipball/d6aed6c1bbf6f59e521f46437475a0ff4878d388", + "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388", "shasum": "" }, "require": { @@ -2283,7 +2283,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "description": "Provides an extended PSR-6, PSR-16 (and tags) implementation", "homepage": "https://symfony.com", "keywords": [ "caching", @@ -2303,7 +2303,7 @@ "type": "tidelift" } ], - "time": "2020-12-10T19:16:15+00:00" + "time": "2021-01-27T11:24:50+00:00" }, { "name": "symfony/cache-contracts", @@ -2383,16 +2383,16 @@ }, { "name": "symfony/console", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "12e071278e396cc3e1c149857337e9e192deca0b" + "reference": "24026c44fc37099fa145707fecd43672831b837a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/12e071278e396cc3e1c149857337e9e192deca0b", - "reference": "12e071278e396cc3e1c149857337e9e192deca0b", + "url": "https://api.github.com/repos/symfony/console/zipball/24026c44fc37099fa145707fecd43672831b837a", + "reference": "24026c44fc37099fa145707fecd43672831b837a", "shasum": "" }, "require": { @@ -2449,7 +2449,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "funding": [ { @@ -2465,7 +2465,7 @@ "type": "tidelift" } ], - "time": "2020-12-18T07:41:31+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2533,16 +2533,16 @@ }, { "name": "symfony/expression-language", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "c1763368a38d5061e5aa03160b328075d000291b" + "reference": "066402a1894fcaef22cbff1591c8a0bdf7f66e9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/c1763368a38d5061e5aa03160b328075d000291b", - "reference": "c1763368a38d5061e5aa03160b328075d000291b", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/066402a1894fcaef22cbff1591c8a0bdf7f66e9b", + "reference": "066402a1894fcaef22cbff1591c8a0bdf7f66e9b", "shasum": "" }, "require": { @@ -2573,7 +2573,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony ExpressionLanguage Component", + "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "funding": [ { @@ -2589,20 +2589,20 @@ "type": "tidelift" } ], - "time": "2020-12-08T16:59:59+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/finder", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ebd0965f2dc2d4e0f11487c16fbb041e50b5c09b" + "reference": "25d79cfccfc12e84e7a63a248c3f0720fdd92db6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ebd0965f2dc2d4e0f11487c16fbb041e50b5c09b", - "reference": "ebd0965f2dc2d4e0f11487c16fbb041e50b5c09b", + "url": "https://api.github.com/repos/symfony/finder/zipball/25d79cfccfc12e84e7a63a248c3f0720fdd92db6", + "reference": "25d79cfccfc12e84e7a63a248c3f0720fdd92db6", "shasum": "" }, "require": { @@ -2631,7 +2631,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "funding": [ { @@ -2647,20 +2647,20 @@ "type": "tidelift" } ], - "time": "2020-12-08T16:59:59+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/http-client", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "dc518f62677944938026746e6e58ac37ebcc6238" + "reference": "d8df50fe9229576b254c6822eb5cfff36c02c967" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/dc518f62677944938026746e6e58ac37ebcc6238", - "reference": "dc518f62677944938026746e6e58ac37ebcc6238", + "url": "https://api.github.com/repos/symfony/http-client/zipball/d8df50fe9229576b254c6822eb5cfff36c02c967", + "reference": "d8df50fe9229576b254c6822eb5cfff36c02c967", "shasum": "" }, "require": { @@ -2677,7 +2677,7 @@ "symfony/http-client-implementation": "1.1" }, "require-dev": { - "guzzlehttp/promises": "^1.3.1", + "guzzlehttp/promises": "^1.4", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", @@ -2708,7 +2708,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpClient component", + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "funding": [ { @@ -2724,7 +2724,7 @@ "type": "tidelift" } ], - "time": "2020-12-05T06:03:08+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/http-client-contracts", @@ -2804,16 +2804,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.2.1", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "a1f6218b29897ab52acba58cfa905b83625bef8d" + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a1f6218b29897ab52acba58cfa905b83625bef8d", - "reference": "a1f6218b29897ab52acba58cfa905b83625bef8d", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36", + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36", "shasum": "" }, "require": { @@ -2854,7 +2854,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "funding": [ { @@ -2870,20 +2870,20 @@ "type": "tidelift" } ], - "time": "2020-12-18T10:00:10+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "symfony/inflector", - "version": "v5.2.1", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/inflector.git", - "reference": "e529917d701a057a12354845150be3e1c4b34084" + "reference": "4c285002228d0e27480e5eee871f4e3f0a05a4eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/e529917d701a057a12354845150be3e1c4b34084", - "reference": "e529917d701a057a12354845150be3e1c4b34084", + "url": "https://api.github.com/repos/symfony/inflector/zipball/4c285002228d0e27480e5eee871f4e3f0a05a4eb", + "reference": "4c285002228d0e27480e5eee871f4e3f0a05a4eb", "shasum": "" }, "require": { @@ -2914,7 +2914,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Inflector Component", + "description": "Converts words between their singular and plural forms (English only)", "homepage": "https://symfony.com", "keywords": [ "inflection", @@ -2938,20 +2938,20 @@ "type": "tidelift" } ], - "time": "2020-12-01T20:15:15+00:00" + "time": "2021-01-10T16:29:19+00:00" }, { "name": "symfony/options-resolver", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "157a252222251310fe50c71012b4e72f01325850" + "reference": "cd8c6a2778d5f8b5e8fc4b7abdf126790b5d5095" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/157a252222251310fe50c71012b4e72f01325850", - "reference": "157a252222251310fe50c71012b4e72f01325850", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/cd8c6a2778d5f8b5e8fc4b7abdf126790b5d5095", + "reference": "cd8c6a2778d5f8b5e8fc4b7abdf126790b5d5095", "shasum": "" }, "require": { @@ -2980,7 +2980,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony OptionsResolver Component", + "description": "Provides an improved replacement for the array_replace PHP function", "homepage": "https://symfony.com", "keywords": [ "config", @@ -3001,7 +3001,7 @@ "type": "tidelift" } ], - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3714,16 +3714,16 @@ }, { "name": "symfony/process", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "075316ff72233ce3d04a9743414292e834f2cb4a" + "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/075316ff72233ce3d04a9743414292e834f2cb4a", - "reference": "075316ff72233ce3d04a9743414292e834f2cb4a", + "url": "https://api.github.com/repos/symfony/process/zipball/7e950b6366d4da90292c2e7fa820b3c1842b965a", + "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a", "shasum": "" }, "require": { @@ -3752,7 +3752,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Process Component", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "funding": [ { @@ -3768,20 +3768,20 @@ "type": "tidelift" } ], - "time": "2020-12-08T16:59:59+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/property-access", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "439d92bc88fdda717f2c31335e8db41483ca5c8d" + "reference": "94a1d9837396c71a0d8c31686c16693a15651622" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/439d92bc88fdda717f2c31335e8db41483ca5c8d", - "reference": "439d92bc88fdda717f2c31335e8db41483ca5c8d", + "url": "https://api.github.com/repos/symfony/property-access/zipball/94a1d9837396c71a0d8c31686c16693a15651622", + "reference": "94a1d9837396c71a0d8c31686c16693a15651622", "shasum": "" }, "require": { @@ -3817,7 +3817,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony PropertyAccess Component", + "description": "Provides functions to read and write from/to an object or array using a simple string notation", "homepage": "https://symfony.com", "keywords": [ "access", @@ -3844,20 +3844,20 @@ "type": "tidelift" } ], - "time": "2020-12-10T16:34:26+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/routing", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "80b042c20b035818daec844723e23b9825134ba0" + "reference": "87529f6e305c7acb162840d1ea57922038072425" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/80b042c20b035818daec844723e23b9825134ba0", - "reference": "80b042c20b035818daec844723e23b9825134ba0", + "url": "https://api.github.com/repos/symfony/routing/zipball/87529f6e305c7acb162840d1ea57922038072425", + "reference": "87529f6e305c7acb162840d1ea57922038072425", "shasum": "" }, "require": { @@ -3869,7 +3869,7 @@ "symfony/yaml": "<3.4" }, "require-dev": { - "doctrine/annotations": "~1.2", + "doctrine/annotations": "^1.10.4", "psr/log": "~1.0", "symfony/config": "^4.2|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", @@ -3907,7 +3907,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Routing Component", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", @@ -3929,20 +3929,20 @@ "type": "tidelift" } ], - "time": "2020-12-08T16:59:59+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/serializer", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "f5a4c865c6c9d8af89915101c8a67efa7415f430" + "reference": "6b383bc45777d14857b634e9f8fa2b8a2e69b66d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/f5a4c865c6c9d8af89915101c8a67efa7415f430", - "reference": "f5a4c865c6c9d8af89915101c8a67efa7415f430", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6b383bc45777d14857b634e9f8fa2b8a2e69b66d", + "reference": "6b383bc45777d14857b634e9f8fa2b8a2e69b66d", "shasum": "" }, "require": { @@ -3950,23 +3950,24 @@ "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "phpdocumentor/type-resolver": "<0.2.1", + "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2", + "phpdocumentor/type-resolver": "<0.3.0|1.3.*", "symfony/dependency-injection": "<3.4", "symfony/property-access": "<3.4", "symfony/property-info": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { - "doctrine/annotations": "~1.0", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", - "phpdocumentor/reflection-docblock": "^3.2|^4.0", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "symfony/cache": "^3.4|^4.0|^5.0", "symfony/config": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/error-handler": "^4.4|^5.0", "symfony/http-foundation": "^3.4|^4.0|^5.0", "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-access": "^3.4.41|^4.4.9|^5.0.9", "symfony/property-info": "^3.4.13|~4.0|^5.0", "symfony/validator": "^3.4|^4.0|^5.0", "symfony/yaml": "^3.4|^4.0|^5.0" @@ -4004,7 +4005,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Serializer Component", + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "funding": [ { @@ -4020,7 +4021,7 @@ "type": "tidelift" } ], - "time": "2020-12-18T07:41:31+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/service-contracts", @@ -4100,16 +4101,16 @@ }, { "name": "symfony/string", - "version": "v5.2.1", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed" + "reference": "c95468897f408dd0aca2ff582074423dd0455122" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", - "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", + "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122", + "reference": "c95468897f408dd0aca2ff582074423dd0455122", "shasum": "" }, "require": { @@ -4152,7 +4153,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony String component", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ "grapheme", @@ -4176,20 +4177,20 @@ "type": "tidelift" } ], - "time": "2020-12-05T07:33:16+00:00" + "time": "2021-01-25T15:14:59+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.2.1", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "fbc3507f23d263d75417e09a12d77c009f39676c" + "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fbc3507f23d263d75417e09a12d77c009f39676c", - "reference": "fbc3507f23d263d75417e09a12d77c009f39676c", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5aed4875ab514c8cb9b6ff4772baa25fa4c10307", + "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307", "shasum": "" }, "require": { @@ -4222,7 +4223,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", "homepage": "https://symfony.com", "keywords": [ "clone", @@ -4246,20 +4247,20 @@ "type": "tidelift" } ], - "time": "2020-10-28T21:31:18+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/web-link", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "4965045a9a0052537bef698be0e5859de27f4d32" + "reference": "e063a969693e2c0804df709f661bd50e10f13665" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/4965045a9a0052537bef698be0e5859de27f4d32", - "reference": "4965045a9a0052537bef698be0e5859de27f4d32", + "url": "https://api.github.com/repos/symfony/web-link/zipball/e063a969693e2c0804df709f661bd50e10f13665", + "reference": "e063a969693e2c0804df709f661bd50e10f13665", "shasum": "" }, "require": { @@ -4303,7 +4304,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony WebLink Component", + "description": "Manages links between resources", "homepage": "https://symfony.com", "keywords": [ "dns-prefetch", @@ -4331,20 +4332,20 @@ "type": "tidelift" } ], - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-01-10T16:25:35+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.18", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "bbce94f14d73732340740366fcbe63363663a403" + "reference": "17ed9f14c1aa05b1a5cf2e2c5ef2d0be28058ef9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/bbce94f14d73732340740366fcbe63363663a403", - "reference": "bbce94f14d73732340740366fcbe63363663a403", + "url": "https://api.github.com/repos/symfony/yaml/zipball/17ed9f14c1aa05b1a5cf2e2c5ef2d0be28058ef9", + "reference": "17ed9f14c1aa05b1a5cf2e2c5ef2d0be28058ef9", "shasum": "" }, "require": { @@ -4383,7 +4384,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "funding": [ { @@ -4399,7 +4400,7 @@ "type": "tidelift" } ], - "time": "2020-12-08T16:59:59+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "typo3/class-alias-loader",