From 5ac080636620d19cde93c8a4c0bc72ef3d94cda8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 24 Dec 2019 22:28:43 +0100 Subject: [PATCH 001/151] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b94f9a4..63c73b4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -#TLE API +# TLE API ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) From 2971dcba8f2fe20df46190281d89330aa9359685 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 29 Dec 2019 22:18:08 +0100 Subject: [PATCH 002/151] refactor --- composer.json | 1 + composer.lock | 47 ++- .../{Api => }/AbstractApiController.php | 300 ++++++++---------- src/Controller/{Api => }/TleController.php | 157 ++++----- src/Event/ApiExceptionSubscriber.php | 54 ++-- src/Repository/TleRepository.php | 5 - src/Service/Validator/RequestValidator.php | 81 +++++ src/ViewModel/SortDirectionEnum.php | 11 + .../TleCollectionSortableFieldsEnum.php | 11 + symfony.lock | 3 + 10 files changed, 401 insertions(+), 269 deletions(-) rename src/Controller/{Api => }/AbstractApiController.php (69%) rename src/Controller/{Api => }/TleController.php (69%) create mode 100644 src/Service/Validator/RequestValidator.php create mode 100644 src/ViewModel/SortDirectionEnum.php create mode 100644 src/ViewModel/TleCollectionSortableFieldsEnum.php diff --git a/composer.json b/composer.json index 91a68f9..4024eaa 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*", + "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", "symfony/asset": "5.0.*", "symfony/browser-kit": "5.0.*", diff --git a/composer.lock b/composer.lock index 568f416..8ecd477 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ad45ae0642275997354a798821f94a16", + "content-hash": "ec5c6ae08688e1589ca9aacfd26a1e50", "packages": [ { "name": "doctrine/annotations", @@ -1194,6 +1194,51 @@ ], "time": "2014-01-12T16:20:24+00:00" }, + { + "name": "myclabs/php-enum", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "45f01adf6922df6082bcda36619deb466e826acf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/45f01adf6922df6082bcda36619deb466e826acf", + "reference": "45f01adf6922df6082bcda36619deb466e826acf", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "time": "2019-08-19T13:53:00+00:00" + }, { "name": "ocramius/package-versions", "version": "1.5.1", diff --git a/src/Controller/Api/AbstractApiController.php b/src/Controller/AbstractApiController.php similarity index 69% rename from src/Controller/Api/AbstractApiController.php rename to src/Controller/AbstractApiController.php index 90e4743..1c29db5 100644 --- a/src/Controller/Api/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -1,170 +1,130 @@ -serializer = $serializer; - } - - /** - * @required - * - * @param RouterInterface $router - */ - public function setRouter(RouterInterface $router): void - { - $this->router = $router; - } - - public function getSort(Request $request, string $default, array $available): string - { - if ($request->get(self::SORT_PARAM) && \in_array($request->get(self::SORT_PARAM), $available, true)) { - $default = strtolower($request->get('sort')); - } - - return $default; - } - - public function getSortDirection(Request $request, string $default): string - { - if ($request->get(self::SORT_DIR_PARAM) && \in_array( - $request->get(self::SORT_DIR_PARAM), - self::$sortDirection, - true - )) { - $default = strtolower($request->get(self::SORT_DIR_PARAM)); - } - - return $default; - } - - public function getPageSize(Request $request, int $default = self::PAGE_SIZE): int - { - if ($request->get(self::PAGE_SIZE_PARAM) && \is_numeric($request->get(self::PAGE_SIZE_PARAM))) { - $default = $request->get(self::PAGE_SIZE_PARAM); - } - - return $default; - } - - public function getPage(Request $request): int - { - $page = $request->get(self::PAGE_PARAM, 1); - - if ($page < 1) { - throw new \LogicException('Page parameter must be greater than zero.'); - } - - return $page; - } - - public function getPageOffset(int $page, int $pageSize): int - { - $offset = 0; - if ($page > 1) { - $offset = ($page - 1) * $pageSize; - } - - return $offset; - } - - public function getPagination(Request $request, int $total, int $pageSize): array - { - $params = $request->query->all(); - - $page = $this->getPage($request); - $pages = max(1, ceil($total / $pageSize)); - - $nextPage = $page; - if ($page < $pages) { - $nextPage = $page + 1; - } - - $previousPage = $page; - if ($page > 1) { - $previousPage = $page - 1; - } - - $result = [ - '@id' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $page]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - '@type' => 'PartialCollectionView', - 'first' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => 1]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'previous' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $previousPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'next' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $nextPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'last' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $pages]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - ]; - - if ($page === 1) { - unset($result['previous']); - } - - if ($page === $nextPage) { - unset($result['next']); - } - - return $result; - } - - public function response($response): Response - { - return new Response( - $this->serializer->serialize($response, 'json'), - Response::HTTP_OK, - [ - 'Content-type' => 'application/json', - 'Access-Control-Allow-Origin' => '*', - ] - ); - } -} +serializer = $serializer; + } + + /** + * @required + * + * @param RouterInterface $router + */ + public function setRouter(RouterInterface $router): void + { + $this->router = $router; + } + + public function getPage(Request $request): int + { + return (int)$request->get(self::PAGE_PARAM, 1); + } + + public function getPageOffset(int $page, int $pageSize): int + { + $offset = 0; + if ($page > 1) { + $offset = ($page - 1) * $pageSize; + } + + return $offset; + } + + public function getPagination(Request $request, int $total, int $pageSize): array + { + $params = $request->query->all(); + + $page = $this->getPage($request); + $pages = max(1, ceil($total / $pageSize)); + + $nextPage = $page; + if ($page < $pages) { + $nextPage = $page + 1; + } + + $previousPage = $page; + if ($page > 1) { + $previousPage = $page - 1; + } + + $result = [ + '@id' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $page]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + '@type' => 'PartialCollectionView', + 'first' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => 1]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'previous' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $previousPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'next' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $nextPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'last' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $pages]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + ]; + + if ($page === 1) { + unset($result['previous']); + } + + if ($page === $nextPage) { + unset($result['next']); + } + + return $result; + } + + public function response($response): Response + { + return new Response( + $this->serializer->serialize($response, 'json'), + Response::HTTP_OK, + [ + 'Content-type' => 'application/json', + 'Access-Control-Allow-Origin' => '*', + ] + ); + } +} diff --git a/src/Controller/Api/TleController.php b/src/Controller/TleController.php similarity index 69% rename from src/Controller/Api/TleController.php rename to src/Controller/TleController.php index 516f8ad..206ad46 100644 --- a/src/Controller/Api/TleController.php +++ b/src/Controller/TleController.php @@ -1,73 +1,84 @@ -findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - return $this->response($tle); - } - - /** - * @Route(name="tle_collection") - */ - public function collection(Request $request, TleRepository $repository): Response - { - $search = $request->get(self::SEARCH_PARAM); - $sort = $this->getSort($request, TleRepository::SORT_NAME, TleRepository::$sort); - $sortDir = $this->getSortDirection($request, self::SORT_ASC); - $pageSize = min($this->getPageSize($request, self::PAGE_SIZE), self::MAX_PAGE_SIZE); - - $collection = $repository->collection( - $search, - $sort, - $sortDir, - $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize) - ); - - return $this->response( - [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', - '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $collection->getTotal(), - 'member' => $collection->getCollection(), - 'parameters' => [ - self::SEARCH_PARAM => $search ?? '*', - self::SORT_PARAM => $sort, - self::SORT_DIR_PARAM => $sortDir, - self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $pageSize, - ], - 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), - ] - ); - } -} +findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $this->response($tle); + } + + /** + * @Route(name="tle_collection") + */ + public function collection(Request $request, TleRepository $repository): Response + { + $this + ->assertParamIsInteger($request, self::PAGE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) + ->assertParamIsInteger($request, self::PAGE_SIZE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) + ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) + ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) + ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + + $search = $request->get(self::SEARCH_PARAM); + $sort = $request->get(self::SORT_DIR_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); + + $collection = $repository->collection( + $search, + $sort, + $sortDir, + $pageSize, + $this->getPageOffset($this->getPage($request), $pageSize) + ); + + return $this->response( + [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => $collection->getTotal(), + 'member' => $collection->getCollection(), + 'parameters' => [ + self::SEARCH_PARAM => $search ?? '*', + self::SORT_PARAM => $sort, + self::SORT_DIR_PARAM => $sortDir, + self::PAGE_PARAM => $this->getPage($request), + self::PAGE_SIZE_PARAM => $pageSize, + ], + 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), + ] + ); + } +} diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 268ba55..83a5b91 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -4,9 +4,9 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; -use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\KernelEvents; class ApiExceptionSubscriber implements EventSubscriberInterface @@ -32,37 +32,51 @@ public static function getSubscribedEvents(): array public function onException(ExceptionEvent $event): void { + if (strpos($event->getRequest()->getPathInfo(), self::API_PATH) === false) { + return; + } + $exception = $event->getThrowable(); - $path = $event->getRequest()->getPathInfo(); + $response = ['message' => 'Unspecified error']; - if (strpos($path, self::API_PATH) === false) { - return; + if ($this->env === 'dev') { + $response['message'] = $exception->getMessage(); + $response['exception'] = $this->throwableToArray($exception); } - if ($exception instanceof NotFoundHttpException) { - $this->setResponse($event, $exception->getMessage()); - } + if ($exception instanceof HttpException) { + $response['message'] = $exception->getMessage(); - if ($exception instanceof AccessDeniedHttpException) { - $this->setResponse($event, 'Forbidden'); + $this->setJsonResponse($event, $response); + return; } - if ($this->env === 'dev') { - $this->setResponse($event, $exception->getMessage()); - } + $this->setJsonResponse($event, $response); } - private function setResponse(ExceptionEvent $event, string $message): void + private function setJsonResponse(ExceptionEvent $event, array $response): void { - $response = new JsonResponse( - [ - 'response' => [ - 'message' => $message, + $event->setResponse( + new JsonResponse( + [ + 'response' => $response ], - ] + Response::HTTP_OK, + [ + 'Access-Control-Allow-Origin' => '*', + ] + ) ); + } - $event->setResponse($response); + private function throwableToArray(\Throwable $throwable): array + { + return [ + 'code' => $throwable->getCode(), + 'file' => $throwable->getFile() . ':' . $throwable->getLine(), + 'message' => $throwable->getMessage(), + 'trace' => $throwable->getTrace(), + ]; } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 1d825a2..31935ec 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -10,11 +10,6 @@ class TleRepository extends ServiceEntityRepository { - public const SORT_ID = 'id'; - public const SORT_NAME = 'name'; - - public static array $sort = [self::SORT_ID, self::SORT_NAME]; - public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Tle::class); diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php new file mode 100644 index 0000000..e99095b --- /dev/null +++ b/src/Service/Validator/RequestValidator.php @@ -0,0 +1,81 @@ +get($name); + + if ($param === null) { + return $this; + } + + if (!preg_match('/^\d+$/', $param)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be integer.', $name) + ); + } + + return $this; + } + + protected function assertParamIsGreaterThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param > $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be greater than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamIsLessThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param <= $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be less than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamInEnum(Request $request, string $name, array $values): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!\in_array($param, $values, true)) { + throw new BadRequestHttpException( + \sprintf( + 'Parameter \'%s\' must be one of the following: %s', + $name, + '\'' . implode('\', \'', $values) . '\'', + ) + ); + } + + return $this; + } +} \ No newline at end of file diff --git a/src/ViewModel/SortDirectionEnum.php b/src/ViewModel/SortDirectionEnum.php new file mode 100644 index 0000000..9c18548 --- /dev/null +++ b/src/ViewModel/SortDirectionEnum.php @@ -0,0 +1,11 @@ + Date: Wed, 1 Jan 2020 22:28:09 +0100 Subject: [PATCH 003/151] Add web profiler --- composer.json | 6 +- composer.lock | 94 +++++++++++++++++++++++- config/bundles.php | 2 +- config/packages/dev/web_profiler.yaml | 6 ++ config/packages/test/web_profiler.yaml | 6 ++ config/routes/dev/web_profiler.yaml | 7 ++ deploy.php | 41 +++++++++++ src/Controller/ApiController.php | 2 +- src/Controller/TleController.php | 2 +- src/Migrations/Version20191217203053.php | 26 ++++--- src/Repository/TleRepository.php | 19 +++-- src/ViewModel/Model/TleModel.php | 1 + symfony.lock | 17 +++++ tests/CollectionTest.php | 23 ++---- tests/DocumentationTest.php | 7 -- 15 files changed, 213 insertions(+), 46 deletions(-) create mode 100644 config/packages/dev/web_profiler.yaml create mode 100644 config/packages/test/web_profiler.yaml create mode 100644 config/routes/dev/web_profiler.yaml create mode 100644 deploy.php diff --git a/composer.json b/composer.json index 4024eaa..b8f8515 100644 --- a/composer.json +++ b/composer.json @@ -16,13 +16,13 @@ "symfony/framework-bundle": "5.0.*", "symfony/orm-pack": "^1.0", "symfony/serializer": "5.0.*", - "symfony/twig-bundle": "5.0.*", "symfony/yaml": "5.0.*" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/maker-bundle": "^1.9", - "symfony/phpunit-bridge": "^5.0" + "symfony/phpunit-bridge": "^5.0", + "symfony/profiler-pack": "^1.0" }, "config": { "preferred-install": { @@ -68,7 +68,7 @@ "symfony/symfony": "*" }, "extra": { - "public-dir": "./", + "public-dir": "./public", "symfony": { "allow-contrib": false, "require": "5.0.*" diff --git a/composer.lock b/composer.lock index 8ecd477..23d5066 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ec5c6ae08688e1589ca9aacfd26a1e50", + "content-hash": "c2da72aac0eebb9bc8c88b53206965a5", "packages": [ { "name": "doctrine/annotations", @@ -4319,6 +4319,98 @@ "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", "time": "2019-11-28T14:20:16+00:00" + }, + { + "name": "symfony/profiler-pack", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/profiler-pack.git", + "reference": "99c4370632c2a59bb0444852f92140074ef02209" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", + "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/stopwatch": "*", + "symfony/twig-bundle": "*", + "symfony/web-profiler-bundle": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Symfony web profiler", + "time": "2018-12-10T12:11:44+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "6cc40446060e174a690e0f6da90731133b29b664" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6cc40446060e174a690e0f6da90731133b29b664", + "reference": "6cc40446060e174a690e0f6da90731133b29b664", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/framework-bundle": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/form": "<4.4", + "symfony/messenger": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony WebProfilerBundle", + "homepage": "https://symfony.com", + "time": "2019-11-21T07:02:40+00:00" } ], "aliases": [], diff --git a/config/bundles.php b/config/bundles.php index e1fa41c..879419a 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,5 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml new file mode 100644 index 0000000..e92166a --- /dev/null +++ b/config/packages/dev/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: true + intercept_redirects: false + +framework: + profiler: { only_exceptions: false } diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml new file mode 100644 index 0000000..03752de --- /dev/null +++ b/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml new file mode 100644 index 0000000..c82beff --- /dev/null +++ b/config/routes/dev/web_profiler.yaml @@ -0,0 +1,7 @@ +web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + +web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/deploy.php b/deploy.php new file mode 100644 index 0000000..ec33a3d --- /dev/null +++ b/deploy.php @@ -0,0 +1,41 @@ +user('glutenfr') + ->port(2233) + ->stage('production') + ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); + +// Tasks + +task('build', function () { + run('cd {{release_path}} && build'); +}); + +// [Optional] if deploy fails automatically unlock. +after('deploy:failed', 'deploy:unlock'); + +// Migrate database before symlink new release. + +before('deploy:symlink', 'database:migrate'); + diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index af187a7..80f2ad9 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -13,7 +13,7 @@ class ApiController extends AbstractController use FileSystemAwareTrait; /** - * @Route("/api/{name}.json", name="app_api_docs_json") + * @Route("/api/{name}/json", name="app_api_docs_json") */ public function getJson(string $name): JsonResponse { diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 206ad46..d9baea1 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -51,7 +51,7 @@ public function collection(Request $request, TleRepository $repository): Respons ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); $search = $request->get(self::SEARCH_PARAM); - $sort = $request->get(self::SORT_DIR_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index a34cb43..9147c0d 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -7,28 +7,32 @@ use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; -/** - * Auto-generated Migration: Please modify to your needs! - */ final class Version20191217203053 extends AbstractMigration { - public function getDescription() : string + public function getDescription(): string { return ''; } - public function up(Schema $schema) : void + public function up(Schema $schema): void { - // this up() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - - $this->addSql('CREATE TABLE tle (id INT AUTO_INCREMENT NOT NULL, updated_at DATETIME NOT NULL, name VARCHAR(255) NOT NULL, line1 VARCHAR(255) NOT NULL, line2 VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); + + $this->addSql( + 'CREATE TABLE tle (id INT AUTO_INCREMENT NOT NULL, updated_at DATETIME NOT NULL, name VARCHAR(255) NOT NULL, line1 VARCHAR(255) NOT NULL, line2 VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB' + ); } - public function down(Schema $schema) : void + public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs - $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + $this->abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); $this->addSql('DROP TABLE tle'); } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 31935ec..478d10a 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -6,6 +6,7 @@ use App\ViewModel\Model\PaginationCollection; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; class TleRepository extends ServiceEntityRepository @@ -31,8 +32,7 @@ public function collection( string $sortDir, int $pageSize, int $offset - ): PaginationCollection - { + ): PaginationCollection { $builder = $this->createQueryBuilder('tle'); // search @@ -44,14 +44,13 @@ public function collection( $builder->expr()->like('tle.name', ':search') ) ) - ->setParameter('search', '%'.$search.'%'); + ->setParameter('search', '%' . $search . '%'); } - // get total - $total = \count($builder->getQuery()->getResult()); + $total = $this->getCount($builder); // sort - $builder->orderBy('tle.'.$sort, $sortDir); + $builder->orderBy('tle.' . $sort, $sortDir); // limit $builder->setMaxResults($pageSize); @@ -64,4 +63,12 @@ public function collection( return $collection; } + + private function getCount(QueryBuilder $builder): int + { + $builder = clone $builder; + + $builder->select('count(tle.id)'); + return $builder->getQuery()->getSingleScalarResult(); + } } diff --git a/src/ViewModel/Model/TleModel.php b/src/ViewModel/Model/TleModel.php index 5409119..4bbeda8 100644 --- a/src/ViewModel/Model/TleModel.php +++ b/src/ViewModel/Model/TleModel.php @@ -197,6 +197,7 @@ private function getLineByNumber(int $lineNumber): string throw new \InvalidArgumentException(\sprintf('Invalid line number %d', $lineNumber)); } + // refactor: TleValidator private function checksum(string $line): int { $line = substr($line, 0, -1); // remove checksum diff --git a/symfony.lock b/symfony.lock index 1190672..cb43eda 100644 --- a/symfony.lock +++ b/symfony.lock @@ -265,6 +265,9 @@ "symfony/polyfill-php73": { "version": "v1.13.1" }, + "symfony/profiler-pack": { + "version": "v1.0.4" + }, "symfony/routing": { "version": "4.2", "recipe": { @@ -314,6 +317,20 @@ "symfony/var-exporter": { "version": "v5.0.1" }, + "symfony/web-profiler-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" + }, + "files": [ + "config/packages/dev/web_profiler.yaml", + "config/packages/test/web_profiler.yaml", + "config/routes/dev/web_profiler.yaml" + ] + }, "symfony/yaml": { "version": "v5.0.1" }, diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index 5feec34..2319e07 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -2,13 +2,10 @@ namespace App\Tests; -use LogicException; use Symfony\Component\HttpFoundation\Response; final class CollectionTest extends AbstractWebTestCase { - // ToDo add tests for page -1, 0, and page size -1, 0, 1 - private const TEST = [ [ 'page' => 1, @@ -69,36 +66,32 @@ public function testPaginationWorks(): void public function testPaginationError(): void { - $this->expectException(LogicException::class); $response = $this->getCollection(-1, 2); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page -1' + 'Assert HTTP 400 is returned for page -1' ); - $this->expectException(LogicException::class); $response = $this->getCollection(0, 2); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page 0' + 'Assert HTTP 400 is returned for page 0' ); - $this->expectException(LogicException::class); $response = $this->getCollection(1, -1); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page size -1' + 'Assert HTTP 400 is returned for page size -1' ); - $this->expectException(LogicException::class); $response = $this->getCollection(1, 0); self::assertEquals( - Response::HTTP_INTERNAL_SERVER_ERROR, + Response::HTTP_BAD_REQUEST, $response->getStatusCode(), - 'Assert HTTP 500 is returned for page size 0' + 'Assert HTTP 400 is returned for page size 0' ); } diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index fc3997a..c8c999e 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -6,13 +6,6 @@ final class DocumentationTest extends AbstractWebTestCase { - public function testDocumentationIsAvailable(): void - { - $response = $this->get('/api/tle/docs'); - - self::assertEquals(200, $response->getStatusCode(), 'Assert documentation is available'); - } - public function testDocumentationIsCorrect(): void { $response = $this->get('/api/tle/json'); From 6c25ea84254efdd658014f095df22893c52ed725 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 1 Jan 2020 22:46:11 +0100 Subject: [PATCH 004/151] Remove twig --- composer.json | 1 - composer.lock | 688 ++++++++++++----------------- config/bundles.php | 1 - config/custom/general.json | 210 --------- config/custom/tle.json | 2 +- config/packages/test/twig.yaml | 2 - deploy.php | 12 +- symfony.lock | 12 - templates/base-empty.html.twig | 23 - templates/base.html.twig | 12 - templates/pages/api/docs.html.twig | 9 - 11 files changed, 295 insertions(+), 677 deletions(-) delete mode 100644 config/custom/general.json delete mode 100644 config/packages/test/twig.yaml delete mode 100644 templates/base-empty.html.twig delete mode 100644 templates/base.html.twig delete mode 100644 templates/pages/api/docs.html.twig diff --git a/composer.json b/composer.json index b8f8515..a39ec65 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,6 @@ }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/maker-bundle": "^1.9", "symfony/phpunit-bridge": "^5.0", "symfony/profiler-pack": "^1.0" }, diff --git a/composer.lock b/composer.lock index 23d5066..604dad4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c2da72aac0eebb9bc8c88b53206965a5", + "content-hash": "ffa9487bbc881e7e0d42386efe326e94", "packages": [ { "name": "doctrine/annotations", @@ -3401,239 +3401,6 @@ "homepage": "https://symfony.com", "time": "2019-11-18T17:27:11+00:00" }, - { - "name": "symfony/translation-contracts", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "shasum": "" - }, - "require": { - "php": "^7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2019-11-18T17:27:11+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/abbaeee38ff39651e335c55be40752be2ddd0976", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/form": "<5.0", - "symfony/http-foundation": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.0", - "symfony/workflow": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/asset": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "^4.4|^5.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "time": "2019-12-18T16:23:52+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/framework-bundle": "<5.0", - "symfony/translation": "<5.0" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/framework-bundle": "^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "https://symfony.com", - "time": "2019-12-10T11:06:55+00:00" - }, { "name": "symfony/var-dumper", "version": "v5.0.2", @@ -3829,89 +3596,25 @@ "time": "2019-12-10T11:06:55+00:00" }, { - "name": "twig/twig", - "version": "v3.0.0", + "name": "zendframework/zend-code", + "version": "3.4.1", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26" + "url": "https://github.com/zendframework/zend-code.git", + "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", + "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", "shasum": "" }, "require": { - "php": "^7.2.9", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "php": "^7.1", + "zendframework/zend-eventmanager": "^2.6 || ^3.0" }, - "require-dev": { - "psr/container": "^1.0", - "symfony/debug": "^3.4|^4.2|^5.0", - "symfony/phpunit-bridge": "^4.4@dev|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "homepage": "https://twig.symfony.com/contributors", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "time": "2019-11-15T20:38:32+00:00" - }, - { - "name": "zendframework/zend-code", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-code.git", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", - "shasum": "" - }, - "require": { - "php": "^7.1", - "zendframework/zend-eventmanager": "^2.6 || ^3.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" + "conflict": { + "phpspec/prophecy": "<1.9.0" }, "require-dev": { "doctrine/annotations": "^1.7", @@ -3947,6 +3650,7 @@ "code", "zf" ], + "abandoned": "laminas/laminas-code", "time": "2019-12-10T19:21:15+00:00" }, { @@ -4001,6 +3705,7 @@ "events", "zf2" ], + "abandoned": "laminas/laminas-eventmanager", "time": "2018-04-25T15:33:34+00:00" } ], @@ -4136,103 +3841,127 @@ "time": "2019-11-13T15:46:58+00:00" }, { - "name": "nikic/php-parser", - "version": "v4.3.0", + "name": "symfony/phpunit-bridge", + "version": "v5.0.2", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc", - "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/010cf42a81e7bec744edfdef5f76d6394f4906a7", + "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=5.5.9" }, - "require-dev": { - "ircmaxell/php-yacc": "0.0.5", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + "conflict": { + "phpunit/phpunit": "<5.4.3" + }, + "suggest": { + "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" }, "bin": [ - "bin/php-parse" + "bin/simple-phpunit" ], - "type": "library", + "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "4.3-dev" + "dev-master": "5.0-dev" + }, + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "PhpParser\\": "lib/PhpParser" - } + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" + "description": "Symfony PHPUnit Bridge", + "homepage": "https://symfony.com", + "time": "2019-11-28T14:20:16+00:00" + }, + { + "name": "symfony/profiler-pack", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/profiler-pack.git", + "reference": "99c4370632c2a59bb0444852f92140074ef02209" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", + "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/stopwatch": "*", + "symfony/twig-bundle": "*", + "symfony/web-profiler-bundle": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "time": "2019-11-08T13:50:10+00:00" + "description": "A pack for the Symfony web profiler", + "time": "2018-12-10T12:11:44+00:00" }, { - "name": "symfony/maker-bundle", - "version": "v1.14.3", + "name": "symfony/translation-contracts", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/symfony/maker-bundle.git", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c864e7f9b8d1e1f5f60acc3beda11299f637aded", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", + "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", "shasum": "" }, "require": { - "doctrine/inflector": "^1.2", - "nikic/php-parser": "^4.0", - "php": "^7.0.8", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/filesystem": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/framework-bundle": "^3.4|^4.0|^5.0", - "symfony/http-kernel": "^3.4|^4.0|^5.0" + "php": "^7.2.5" }, - "require-dev": { - "doctrine/doctrine-bundle": "^1.8|^2.0", - "doctrine/orm": "^2.3", - "friendsofphp/php-cs-fixer": "^2.8", - "friendsoftwig/twigcs": "^3.1.2", - "symfony/http-client": "^4.3|^5.0", - "symfony/phpunit-bridge": "^4.3|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/security-core": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "suggest": { + "symfony/translation-implementation": "" }, - "type": "symfony-bundle", + "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Bundle\\MakerBundle\\": "src/" + "Symfony\\Contracts\\Translation\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -4240,63 +3969,105 @@ "MIT" ], "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", - "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", "keywords": [ - "code generator", - "generator", - "scaffold", - "scaffolding" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], - "time": "2019-11-07T00:56:03+00:00" + "time": "2019-11-18T17:27:11+00:00" }, { - "name": "symfony/phpunit-bridge", + "name": "symfony/twig-bridge", "version": "v5.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "abbaeee38ff39651e335c55be40752be2ddd0976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/010cf42a81e7bec744edfdef5f76d6394f4906a7", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/abbaeee38ff39651e335c55be40752be2ddd0976", + "reference": "abbaeee38ff39651e335c55be40752be2ddd0976", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^7.2.5", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.10|^3.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3" + "symfony/console": "<4.4", + "symfony/form": "<5.0", + "symfony/http-foundation": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.0", + "symfony/workflow": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/asset": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "^4.4|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/cssinliner-extra": "^2.12", + "twig/inky-extra": "^2.12", + "twig/markdown-extra": "^2.12" }, "suggest": { - "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" }, - "bin": [ - "bin/simple-phpunit" - ], "type": "symfony-bridge", "extra": { "branch-alias": { "dev-master": "5.0-dev" - }, - "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" + "Symfony\\Bridge\\Twig\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4308,45 +4079,92 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony PHPUnit Bridge", + "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2019-11-28T14:20:16+00:00" + "time": "2019-12-18T16:23:52+00:00" }, { - "name": "symfony/profiler-pack", - "version": "v1.0.4", + "name": "symfony/twig-bundle", + "version": "v5.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/profiler-pack.git", - "reference": "99c4370632c2a59bb0444852f92140074ef02209" + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", - "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a54f6db9d452aa06a77e9f8562974a61e15bfa42", + "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42", "shasum": "" }, "require": { - "php": "^7.0", - "symfony/stopwatch": "*", - "symfony/twig-bundle": "*", - "symfony/web-profiler-bundle": "*" + "php": "^7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^5.0", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/framework-bundle": "<5.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "symfony/asset": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, - "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A pack for the Symfony web profiler", - "time": "2018-12-10T12:11:44+00:00" + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony TwigBundle", + "homepage": "https://symfony.com", + "time": "2019-12-10T11:06:55+00:00" }, { "name": "symfony/web-profiler-bundle", @@ -4411,6 +4229,70 @@ "description": "Symfony WebProfilerBundle", "homepage": "https://symfony.com", "time": "2019-11-21T07:02:40+00:00" + }, + { + "name": "twig/twig", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", + "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", + "shasum": "" + }, + "require": { + "php": "^7.2.9", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/debug": "^3.4|^4.2|^5.0", + "symfony/phpunit-bridge": "^4.4@dev|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "homepage": "https://twig.symfony.com/contributors", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "time": "2019-11-15T20:38:32+00:00" } ], "aliases": [], diff --git a/config/bundles.php b/config/bundles.php index 879419a..fb04fb4 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -4,7 +4,6 @@ Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], - Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/config/custom/general.json b/config/custom/general.json deleted file mode 100644 index e70dacc..0000000 --- a/config/custom/general.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "TLE API", - "version": "1.3.0" - }, - "servers": [ - { - "url": "/" - } - ], - "paths": {}, - "components": { - "schemas": { - "ValueUnit": { - "properties": { - "value": { - "type": "float" - }, - "unit": { - "type": "string" - } - } - }, - "Pagination": { - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - }, - "type": "object" - }, - "Exception": { - "properties": { - "response": { - "properties": { - "code": { - "type": "integer" - }, - "message": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "METAR": { - "allOf": [ - { - "properties": { - "icao": { - "type": "string", - "example": "LYBE" - }, - "date": { - "type": "string", - "example": "2018-10-23T19:00:00+00:00" - }, - "temperature": { - "$ref": "#/components/schemas/ValueUnit" - }, - "dewPoint": { - "$ref": "#/components/schemas/ValueUnit" - }, - "pressure": { - "$ref": "#/components/schemas/ValueUnit" - }, - "raw": { - "type": "string", - "example": "METAR LYBE 171530Z 11004KT CAVOK 22/04 Q1018 NOSIG" - } - }, - "type": "object" - } - ] - }, - "TLE": { - "allOf": [ - { - "properties": { - "@id": { - "type": "string", - "example": "https://ivanstanojevic.me/api/tle/43630" - }, - "@type": { - "type": "string", - "example": "TleModel" - }, - "satelliteId": { - "type": "integer", - "example": "43630" - }, - "date": { - "type": "string", - "example": "2018-10-21T11:40:23+00:00" - }, - "name": { - "type": "string", - "example": "HTV-7 (KOUNOTORI 7)" - }, - "line1": { - "type": "string", - "example": "1 43630U 18073A 18285.64337553 .00002296 00000-0 42374-4 0 9998" - }, - "line2": { - "type": "string", - "example": "2 43630 51.6412 153.3949 0003517 275.8456 137.9883 15.53813372136786" - } - }, - "type": "object" - } - ] - } - }, - "responses": { - "404": { - "description": "Resource not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "code": 404, - "message": "Not found" - } - } - } - } - }, - "500": { - "description": "Server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "code": 500, - "message": "Server error" - } - } - } - } - } - }, - "parameters": { - "search": { - "name": "search", - "in": "query", - "description": "Search string", - "schema": { - "type": "string", - "default": "*" - } - }, - "sortDirection": { - "name": "sort-dir", - "in": "query", - "description": "Sort direction", - "schema": { - "type": "string", - "default": "asc", - "enum": [ - "asc", - "desc" - ] - } - }, - "pageNumber": { - "name": "page", - "in": "query", - "description": "Page number", - "schema": { - "type": "integer", - "default": 1, - "minimum": "1" - } - }, - "pageSize": { - "name": "page-size", - "in": "query", - "description": "Number of items per page", - "schema": { - "type": "integer", - "default": "50" - } - } - } - } -} diff --git a/config/custom/tle.json b/config/custom/tle.json index 1af51be..48670b2 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -310,4 +310,4 @@ } } } -} +} \ No newline at end of file diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml deleted file mode 100644 index 8c6e0b4..0000000 --- a/config/packages/test/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - strict_variables: true diff --git a/deploy.php b/deploy.php index ec33a3d..f4de55d 100644 --- a/deploy.php +++ b/deploy.php @@ -11,11 +11,17 @@ set('git_tty', true); // Shared files/dirs between deploys -add('shared_files', []); -add('shared_dirs', []); +add('shared_files', [ + '.env' +]); +add('shared_dirs', [ + 'var' +]); // Writable dirs by web server -add('writable_dirs', []); +add('writable_dirs', [ + 'var' +]); // Hosts diff --git a/symfony.lock b/symfony.lock index cb43eda..e9c1c0e 100644 --- a/symfony.lock +++ b/symfony.lock @@ -96,9 +96,6 @@ "myclabs/php-enum": { "version": "1.7.2" }, - "nikic/php-parser": { - "version": "v4.3.0" - }, "ocramius/package-versions": { "version": "1.5.1" }, @@ -225,15 +222,6 @@ "symfony/http-kernel": { "version": "v5.0.1" }, - "symfony/maker-bundle": { - "version": "1.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "1.0", - "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" - } - }, "symfony/mime": { "version": "v5.0.1" }, diff --git a/templates/base-empty.html.twig b/templates/base-empty.html.twig deleted file mode 100644 index 5ecab0c..0000000 --- a/templates/base-empty.html.twig +++ /dev/null @@ -1,23 +0,0 @@ - - - - {% block head %} - - - {% block title %}{{ app_name }}{% endblock %} - {% block stylesheets %} -{# #} - - {% endblock %} - {% endblock %} - - - {% block body %} - {% block javascripts %} - - - {% endblock %} - {% endblock %} - - diff --git a/templates/base.html.twig b/templates/base.html.twig deleted file mode 100644 index 043f42d..0000000 --- a/templates/base.html.twig +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {% block title %}Welcome!{% endblock %} - {% block stylesheets %}{% endblock %} - - - {% block body %}{% endblock %} - {% block javascripts %}{% endblock %} - - diff --git a/templates/pages/api/docs.html.twig b/templates/pages/api/docs.html.twig deleted file mode 100644 index 770fac5..0000000 --- a/templates/pages/api/docs.html.twig +++ /dev/null @@ -1,9 +0,0 @@ -{% extends 'base-empty.html.twig' %} - -{% block title %} API Documentation | {{ parent() }}{% endblock %} - -{% block body %} -
- {{ parent() }} -{% endblock %} - From 0cd4d6fff8e4afebec79e8e4604513e1ee4f6971 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 1 Jan 2020 23:04:27 +0100 Subject: [PATCH 005/151] change deployment --- composer.json | 2 -- deploy.php | 57 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/composer.json b/composer.json index a39ec65..01586f7 100644 --- a/composer.json +++ b/composer.json @@ -52,8 +52,6 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd", - "doctrine:migrations:migrate --no-interaction": "symfony-cmd", "cache:warmup": "symfony-cmd" }, "post-install-cmd": [ diff --git a/deploy.php b/deploy.php index f4de55d..ae59b2f 100644 --- a/deploy.php +++ b/deploy.php @@ -8,21 +8,29 @@ set('repository', 'https://github.com/ivanstan/tle-api'); // [Optional] Allocate tty for git clone. Default value is false. -set('git_tty', true); +set('git_tty', true); // Shared files/dirs between deploys -add('shared_files', [ - '.env' -]); -add('shared_dirs', [ - 'var' -]); +add( + 'shared_files', + [ + '.env' + ] +); +add( + 'shared_dirs', + [ + 'var' + ] +); // Writable dirs by web server -add('writable_dirs', [ - 'var' -]); - +add( + 'writable_dirs', + [ + 'var' + ] +); // Hosts @@ -31,12 +39,31 @@ ->port(2233) ->stage('production') ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); - + // Tasks -task('build', function () { - run('cd {{release_path}} && build'); -}); +task( + 'deploy', + [ + 'deploy:info', + 'deploy:prepare', + 'deploy:lock', + 'deploy:release', + 'deploy:update_code', + 'deploy:clear_paths', + 'deploy:create_cache_dir', + 'deploy:shared', + 'deploy:assets', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'deploy:writable', + 'database:migrate', + 'deploy:symlink', + 'deploy:unlock', + 'cleanup', + ] +); // [Optional] if deploy fails automatically unlock. after('deploy:failed', 'deploy:unlock'); From d791e757b7b4550b6c6c017f7f82d1e933d887d8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 2 Jan 2020 20:50:09 +0100 Subject: [PATCH 006/151] add twig as dev dependency --- composer.lock | 89 +++++++++++++++++++++++++++++++++++++++++++++- config/bundles.php | 1 + deploy.php | 10 +++--- symfony.lock | 6 ++++ 4 files changed, 99 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 604dad4..85cd8ca 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ffa9487bbc881e7e0d42386efe326e94", + "content-hash": "22241f1d5382f4ed3664dbec0f50d5f0", "packages": [ { "name": "doctrine/annotations", @@ -4166,6 +4166,34 @@ "homepage": "https://symfony.com", "time": "2019-12-10T11:06:55+00:00" }, + { + "name": "symfony/twig-pack", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-pack.git", + "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-pack/zipball/8b278ea4b61fba7c051f172aacae6d87ef4be0e0", + "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/twig-bundle": "*", + "twig/extra-bundle": "^2.12|^3.0", + "twig/twig": "^2.12|^3.0" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A Twig pack for Symfony projects", + "time": "2019-10-17T05:44:22+00:00" + }, { "name": "symfony/web-profiler-bundle", "version": "v5.0.2", @@ -4230,6 +4258,65 @@ "homepage": "https://symfony.com", "time": "2019-11-21T07:02:40+00:00" }, + { + "name": "twig/extra-bundle", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", + "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/framework-bundle": "^4.3|^5.0", + "symfony/twig-bundle": "^4.3|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "require-dev": { + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "time": "2019-12-28T07:09:27+00:00" + }, { "name": "twig/twig", "version": "v3.0.0", diff --git a/config/bundles.php b/config/bundles.php index fb04fb4..26f3038 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,4 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/deploy.php b/deploy.php index ae59b2f..334cc9a 100644 --- a/deploy.php +++ b/deploy.php @@ -9,6 +9,9 @@ // [Optional] Allocate tty for git clone. Default value is false. set('git_tty', true); +set('bin_dir', 'bin'); +set('http_user', 'glutenfr'); +set('writable_mode', 'chmod'); // Shared files/dirs between deploys add( @@ -25,12 +28,7 @@ ); // Writable dirs by web server -add( - 'writable_dirs', - [ - 'var' - ] -); +add('writable_dirs', []); // Hosts diff --git a/symfony.lock b/symfony.lock index e9c1c0e..1fcaa55 100644 --- a/symfony.lock +++ b/symfony.lock @@ -299,6 +299,9 @@ "templates/base.html.twig" ] }, + "symfony/twig-pack": { + "version": "v1.0.0" + }, "symfony/var-dumper": { "version": "v5.0.1" }, @@ -322,6 +325,9 @@ "symfony/yaml": { "version": "v5.0.1" }, + "twig/extra-bundle": { + "version": "v3.0.1" + }, "twig/twig": { "version": "v3.0.0" }, From 7d90b5cf17334da9b8e6c0d2d379f29bb1663a26 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 2 Jan 2020 22:12:24 +0100 Subject: [PATCH 007/151] setup tests before deploy --- deploy.php | 81 +++++++++++++++++++----------------------------------- 1 file changed, 29 insertions(+), 52 deletions(-) diff --git a/deploy.php b/deploy.php index 334cc9a..f5c94eb 100644 --- a/deploy.php +++ b/deploy.php @@ -1,72 +1,49 @@ -user('glutenfr') ->port(2233) ->stage('production') ->set('deploy_path', '~/projects/tle.ivanstanojevic.me'); -// Tasks - -task( - 'deploy', - [ - 'deploy:info', - 'deploy:prepare', - 'deploy:lock', - 'deploy:release', - 'deploy:update_code', - 'deploy:clear_paths', - 'deploy:create_cache_dir', - 'deploy:shared', - 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'deploy:writable', - 'database:migrate', - 'deploy:symlink', - 'deploy:unlock', - 'cleanup', - ] -); - -// [Optional] if deploy fails automatically unlock. +task('test', function () { + set('symfony_env', 'dev'); + runLocally('bin/phpunit'); +}); + +task('deploy', [ + 'deploy:info', + 'deploy:prepare', + 'deploy:lock', + 'deploy:release', + 'deploy:update_code', + 'deploy:clear_paths', + 'deploy:create_cache_dir', + 'deploy:shared', + 'deploy:assets', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'deploy:writable', + 'database:migrate', + 'deploy:symlink', + 'deploy:unlock', + 'cleanup', +]); + +before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); - -// Migrate database before symlink new release. - -before('deploy:symlink', 'database:migrate'); - From 6dbb1b9c01a8696591bd4eb09bfb9ba5e72ffa80 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 2 Jan 2020 22:59:18 +0100 Subject: [PATCH 008/151] update documentation --- config/custom/tle.json | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 48670b2..fe47e27 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -13,7 +13,7 @@ "/api/tle/{id}": { "get": { "summary": "Record", - "operationId": "tle-record", + "operationId": "record", "parameters": [ { "name": "id", @@ -48,24 +48,15 @@ "/api/tle": { "get": { "summary": "Collection", - "operationId": "tle-collection", + "operationId": "collection", "parameters": [ { "$ref": "#/components/parameters/search" }, - { - "name": "prn", - "in": "query", - "description": "Filter by pseudo-random noise.", - "schema": { - "type": "number", - "default": "null" - } - }, { "name": "sort", "in": "query", - "description": "Sort field", + "description": "Sort by", "schema": { "type": "string", "default": "name", @@ -182,9 +173,6 @@ "properties": { "response": { "properties": { - "code": { - "type": "integer" - }, "message": { "type": "string" } @@ -206,10 +194,6 @@ "type": "string", "example": "TleModel" }, - "satelliteId": { - "type": "integer", - "example": "43630" - }, "name": { "type": "string", "example": "HTV-7 (KOUNOTORI 7)" @@ -242,7 +226,6 @@ }, "example": { "response": { - "code": 404, "message": "Not found" } } @@ -258,7 +241,6 @@ }, "example": { "response": { - "code": 500, "message": "Server error" } } @@ -296,7 +278,7 @@ "schema": { "type": "integer", "default": 1, - "minimum": "1" + "minimum": 1 } }, "pageSize": { @@ -305,7 +287,9 @@ "description": "Number of items per page", "schema": { "type": "integer", - "default": "50" + "default": 20, + "minimum": 1, + "maximum": 100 } } } From b06ca938a0c4044f0faf679a46e5076f7c2cf39e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 3 Jan 2020 22:04:45 +0100 Subject: [PATCH 009/151] fix tests --- composer.json | 3 +- composer.lock | 478 +------------------------ config/bootstrap.php | 10 +- config/bundles.php | 2 - config/packages/dev/web_profiler.yaml | 6 - config/packages/test/web_profiler.yaml | 6 - config/parameters.yaml | 1 - config/routes/dev/web_profiler.yaml | 7 - src/Serializer/TleModelNormalizer.php | 1 - symfony.lock | 46 --- tests/TleTest.php | 2 - 11 files changed, 7 insertions(+), 555 deletions(-) delete mode 100644 config/packages/dev/web_profiler.yaml delete mode 100644 config/packages/test/web_profiler.yaml delete mode 100644 config/routes/dev/web_profiler.yaml diff --git a/composer.json b/composer.json index 01586f7..ba6d382 100644 --- a/composer.json +++ b/composer.json @@ -20,8 +20,7 @@ }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0", - "symfony/profiler-pack": "^1.0" + "symfony/phpunit-bridge": "^5.0" }, "config": { "preferred-install": { diff --git a/composer.lock b/composer.lock index 85cd8ca..7625623 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "22241f1d5382f4ed3664dbec0f50d5f0", + "content-hash": "757b98014fe5c4a0788a2cbb83297329", "packages": [ { "name": "doctrine/annotations", @@ -3904,482 +3904,6 @@ "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", "time": "2019-11-28T14:20:16+00:00" - }, - { - "name": "symfony/profiler-pack", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/profiler-pack.git", - "reference": "99c4370632c2a59bb0444852f92140074ef02209" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", - "reference": "99c4370632c2a59bb0444852f92140074ef02209", - "shasum": "" - }, - "require": { - "php": "^7.0", - "symfony/stopwatch": "*", - "symfony/twig-bundle": "*", - "symfony/web-profiler-bundle": "*" - }, - "type": "symfony-pack", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A pack for the Symfony web profiler", - "time": "2018-12-10T12:11:44+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", - "shasum": "" - }, - "require": { - "php": "^7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2019-11-18T17:27:11+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/abbaeee38ff39651e335c55be40752be2ddd0976", - "reference": "abbaeee38ff39651e335c55be40752be2ddd0976", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/form": "<5.0", - "symfony/http-foundation": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.0", - "symfony/workflow": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/asset": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "^4.4|^5.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "time": "2019-12-18T16:23:52+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "reference": "a54f6db9d452aa06a77e9f8562974a61e15bfa42", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/framework-bundle": "<5.0", - "symfony/translation": "<5.0" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/framework-bundle": "^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "https://symfony.com", - "time": "2019-12-10T11:06:55+00:00" - }, - { - "name": "symfony/twig-pack", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-pack.git", - "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-pack/zipball/8b278ea4b61fba7c051f172aacae6d87ef4be0e0", - "reference": "8b278ea4b61fba7c051f172aacae6d87ef4be0e0", - "shasum": "" - }, - "require": { - "php": "^7.0", - "symfony/twig-bundle": "*", - "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" - }, - "type": "symfony-pack", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A Twig pack for Symfony projects", - "time": "2019-10-17T05:44:22+00:00" - }, - { - "name": "symfony/web-profiler-bundle", - "version": "v5.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "6cc40446060e174a690e0f6da90731133b29b664" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6cc40446060e174a690e0f6da90731133b29b664", - "reference": "6cc40446060e174a690e0f6da90731133b29b664", - "shasum": "" - }, - "require": { - "php": "^7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/framework-bundle": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/form": "<4.4", - "symfony/messenger": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony WebProfilerBundle", - "homepage": "https://symfony.com", - "time": "2019-11-21T07:02:40+00:00" - }, - { - "name": "twig/extra-bundle", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", - "reference": "ce5c97dd566d9acd5d1fbd5eb76b6d264614725a", - "shasum": "" - }, - "require": { - "php": "^7.1.3", - "symfony/framework-bundle": "^4.3|^5.0", - "symfony/twig-bundle": "^4.3|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "require-dev": { - "twig/cssinliner-extra": "^2.12|^3.0", - "twig/html-extra": "^2.12|^3.0", - "twig/inky-extra": "^2.12|^3.0", - "twig/intl-extra": "^2.12|^3.0", - "twig/markdown-extra": "^2.12|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\Extra\\TwigExtraBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Symfony bundle for extra Twig extensions", - "homepage": "https://twig.symfony.com", - "keywords": [ - "bundle", - "extra", - "twig" - ], - "time": "2019-12-28T07:09:27+00:00" - }, - { - "name": "twig/twig", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", - "reference": "9b58bb8ac7a41d72fbb5a7dc643e07923e5ccc26", - "shasum": "" - }, - "require": { - "php": "^7.2.9", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/debug": "^3.4|^4.2|^5.0", - "symfony/phpunit-bridge": "^4.4@dev|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "homepage": "https://twig.symfony.com/contributors", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "time": "2019-11-15T20:38:32+00:00" } ], "aliases": [], diff --git a/config/bootstrap.php b/config/bootstrap.php index 1a0c60f..d40335e 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -15,16 +15,16 @@ && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] ) { foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && 0 !== strpos($k, 'HTTP_') ? $_SERVER[$k] : $v); + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); } -} elseif (!class_exists(Dotenv::class)) { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} else { +} elseif (class_exists(Dotenv::class)) { // load all the .env files (new Dotenv(false))->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); } -if ('test' === $_SERVER['APP_ENV']) { +if ($_SERVER['APP_ENV'] === 'test') { $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel $kernel->boot(); diff --git a/config/bundles.php b/config/bundles.php index 26f3038..8c7b01e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,6 +5,4 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], - Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['dev' => true, 'test' => true], ]; diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml deleted file mode 100644 index e92166a..0000000 --- a/config/packages/dev/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: true - intercept_redirects: false - -framework: - profiler: { only_exceptions: false } diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml deleted file mode 100644 index 03752de..0000000 --- a/config/packages/test/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: false - intercept_redirects: false - -framework: - profiler: { collect: false } diff --git a/config/parameters.yaml b/config/parameters.yaml index 89b37f7..05163a5 100644 --- a/config/parameters.yaml +++ b/config/parameters.yaml @@ -1,2 +1 @@ parameters: - app_name: 'TLE API' diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml deleted file mode 100644 index c82beff..0000000 --- a/config/routes/dev/web_profiler.yaml +++ /dev/null @@ -1,7 +0,0 @@ -web_profiler_wdt: - resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' - prefix: /_wdt - -web_profiler_profiler: - resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' - prefix: /_profiler diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 0e8bedd..57201d0 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -32,7 +32,6 @@ public function normalize($entity, string $format = null, array $context = []) return [ '@id' => $id, '@type' => 'TleModel', - 'satelliteId' => $model->getId(), 'name' => $model->getName(), 'date' => $model->getDate(), 'line1' => $model->getLine1(), diff --git a/symfony.lock b/symfony.lock index 1fcaa55..412623f 100644 --- a/symfony.lock +++ b/symfony.lock @@ -253,9 +253,6 @@ "symfony/polyfill-php73": { "version": "v1.13.1" }, - "symfony/profiler-pack": { - "version": "v1.0.4" - }, "symfony/routing": { "version": "4.2", "recipe": { @@ -279,58 +276,15 @@ "symfony/stopwatch": { "version": "v5.0.1" }, - "symfony/translation-contracts": { - "version": "v2.0.1" - }, - "symfony/twig-bridge": { - "version": "v5.0.1" - }, - "symfony/twig-bundle": { - "version": "5.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "5.0", - "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" - }, - "files": [ - "config/packages/test/twig.yaml", - "config/packages/twig.yaml", - "templates/base.html.twig" - ] - }, - "symfony/twig-pack": { - "version": "v1.0.0" - }, "symfony/var-dumper": { "version": "v5.0.1" }, "symfony/var-exporter": { "version": "v5.0.1" }, - "symfony/web-profiler-bundle": { - "version": "3.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "3.3", - "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" - }, - "files": [ - "config/packages/dev/web_profiler.yaml", - "config/packages/test/web_profiler.yaml", - "config/routes/dev/web_profiler.yaml" - ] - }, "symfony/yaml": { "version": "v5.0.1" }, - "twig/extra-bundle": { - "version": "v3.0.1" - }, - "twig/twig": { - "version": "v3.0.0" - }, "zendframework/zend-code": { "version": "3.4.1" }, diff --git a/tests/TleTest.php b/tests/TleTest.php index 3829923..062b163 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -18,7 +18,6 @@ public function testTleSingleRecord(): void self::assertArrayHasKey('@id', $response); self::assertArrayHasKey('@type', $response); - self::assertArrayHasKey('satelliteId', $response); self::assertArrayHasKey('name', $response); self::assertArrayHasKey('date', $response); self::assertArrayHasKey('line1', $response); @@ -26,7 +25,6 @@ public function testTleSingleRecord(): void self::assertEquals('http://localhost/api/tle/'.$tle->getId(), $response['@id']); self::assertEquals('TleModel', $response['@type']); - self::assertEquals($tle->getId(), $response['satelliteId']); self::assertEquals($tle->getName(), $response['name']); self::assertEquals(TleFixtures::$date, $response['date']); self::assertEquals($tle->getLine1(), $response['line1']); From e182fb67862dd1d05289a031e872ae21704b0ff9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 3 Jan 2020 22:17:32 +0100 Subject: [PATCH 010/151] fix code issues --- deploy.php | 6 ++++++ src/Command/DoctrineReloadCommand.php | 13 +++++++++---- src/Kernel.php | 7 +++++++ src/Migrations/Version20191217203053.php | 8 ++------ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/deploy.php b/deploy.php index f5c94eb..2e0c7f2 100644 --- a/deploy.php +++ b/deploy.php @@ -25,6 +25,11 @@ runLocally('bin/phpunit'); }); + +task('dump-autoload', function () { + run('composer dump-env prod'); +}); + task('deploy', [ 'deploy:info', 'deploy:prepare', @@ -38,6 +43,7 @@ 'deploy:vendors', 'deploy:cache:clear', 'deploy:cache:warmup', + 'dump-autoload', 'deploy:writable', 'database:migrate', 'deploy:symlink', diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php index 784de82..95ea3bc 100644 --- a/src/Command/DoctrineReloadCommand.php +++ b/src/Command/DoctrineReloadCommand.php @@ -11,8 +11,6 @@ final class DoctrineReloadCommand extends Command { - protected static $defaultName = 'doctrine:reload'; - private static array $choices = [ 'y' => 'Yes', 'n' => 'No', @@ -31,11 +29,18 @@ public function __construct($env) $this->env = $env; } + /** @noinspection PhpMissingParentCallCommonInspection */ protected function configure(): void { - $this->setDescription('Purge database, execute migrations and load fixtures'); + $this + ->setName('doctrine:reload') + ->setDescription('Purge database, execute migrations and load fixtures'); } + /** + * @noinspection PhpMissingParentCallCommonInspection + * @throws \Exception + */ protected function execute(InputInterface $input, OutputInterface $output): int { $io = new SymfonyStyle($input, $output); @@ -51,7 +56,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $application = $this->getApplication(); if ($application === null) { - return 1; + throw new \RuntimeException('Application instance not found.'); } if ($input->getOption('no-interaction') || $helper->ask($input, $output, $question) === 'y') { diff --git a/src/Kernel.php b/src/Kernel.php index 5ffa385..65c5230 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -15,6 +15,10 @@ class Kernel extends BaseKernel private const CONFIG_EXTS = '.{php,xml,yaml,yml}'; + /** + * @noinspection UsingInclusionReturnValueInspection + * @noinspection PhpIncludeInspection + */ public function registerBundles(): iterable { $contents = require $this->getProjectDir().'/config/bundles.php'; @@ -25,11 +29,13 @@ public function registerBundles(): iterable } } + /** @noinspection PhpMissingParentCallCommonInspection */ public function getProjectDir(): string { return \dirname(__DIR__); } + /** @throws \Exception */ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); @@ -44,6 +50,7 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); } + /** @throws \Exception */ protected function configureRoutes(RouteCollectionBuilder $routes): void { $confDir = $this->getProjectDir().'/config'; diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index 9147c0d..db9f18d 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -9,11 +9,7 @@ final class Version20191217203053 extends AbstractMigration { - public function getDescription(): string - { - return ''; - } - + /** @throws \Exception */ public function up(Schema $schema): void { $this->abortIf( @@ -26,9 +22,9 @@ public function up(Schema $schema): void ); } + /** @throws \Exception */ public function down(Schema $schema): void { - // this down() migration is auto-generated, please modify it to your needs $this->abortIf( $this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.' From 53afc0176191171e6971f4f5975e5b6c7c42c2ec Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:05:44 +0100 Subject: [PATCH 011/151] Create php.yml --- .github/workflows/php.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/php.yml diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml new file mode 100644 index 0000000..8962a94 --- /dev/null +++ b/.github/workflows/php.yml @@ -0,0 +1,26 @@ +name: PHP Composer + +on: + push: + branches: + - production + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Validate composer.json and composer.lock + run: composer validate + + - name: Install dependencies + run: composer install --prefer-dist --no-progress --no-suggest + + # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" + # Docs: https://getcomposer.org/doc/articles/scripts.md + + # - name: Run test suite + # run: composer run-script test From 6e6aa21615379b389421a53cccb52b29b543ef78 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:20:29 +0100 Subject: [PATCH 012/151] add travis ci --- README.md | 1 + composer.json | 3 ++- travis.yaml | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 travis.yaml diff --git a/README.md b/README.md index 63c73b4..f22dc3e 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,4 @@ ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) +[![Known Vulnerabilities](https://snyk.io/test/github/ivanstan/tle-api/badge.svg?targetFile=composer.lock)](https://snyk.io/test/github/ivanstan/tle-api?targetFile=composer.lock) \ No newline at end of file diff --git a/composer.json b/composer.json index ba6d382..1683ff5 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,8 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "cache:warmup": "symfony-cmd" + "cache:warmup": "symfony-cmd", + "test": "bin/phpunit" }, "post-install-cmd": [ "@auto-scripts" diff --git a/travis.yaml b/travis.yaml new file mode 100644 index 0000000..d2bc1be --- /dev/null +++ b/travis.yaml @@ -0,0 +1,19 @@ +language: php + +cache: + directories: + - $HOME/.composer/cache + +branches: + only: + - master + +matrix: + include: + - php: 7.4 + +install: + - composer update $COMPOSER_FLAGS + +script: + - composer test \ No newline at end of file From e938182765865e981f65b95dc161611c2625ee78 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:28:35 +0100 Subject: [PATCH 013/151] Rename travis.yaml to travis.yml --- travis.yaml => travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename travis.yaml => travis.yml (91%) diff --git a/travis.yaml b/travis.yml similarity index 91% rename from travis.yaml rename to travis.yml index d2bc1be..006f820 100644 --- a/travis.yaml +++ b/travis.yml @@ -16,4 +16,4 @@ install: - composer update $COMPOSER_FLAGS script: - - composer test \ No newline at end of file + - composer test From f22ac4abfa6d40880e9bb660b364abac8fe8a23c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:29:37 +0100 Subject: [PATCH 014/151] Rename travis.yml to .travis.yaml --- travis.yml => .travis.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename travis.yml => .travis.yaml (100%) diff --git a/travis.yml b/.travis.yaml similarity index 100% rename from travis.yml rename to .travis.yaml From 0d5c94012a828f32e837dfdd7102ba55367f97b3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:30:00 +0100 Subject: [PATCH 015/151] Rename .travis.yaml to .travis.yml --- .travis.yaml => .travis.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .travis.yaml => .travis.yml (100%) diff --git a/.travis.yaml b/.travis.yml similarity index 100% rename from .travis.yaml rename to .travis.yml From dc5b73d350b7a80902edad2b36bdd6063341bc10 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:35:58 +0100 Subject: [PATCH 016/151] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 1683ff5..154cefc 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "auto-scripts": { "cache:clear": "symfony-cmd", "cache:warmup": "symfony-cmd", - "test": "bin/phpunit" + "test": "php bin/phpunit" }, "post-install-cmd": [ "@auto-scripts" From be3700edc4cd17f60a41e8189c02aa6fbe578b77 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:38:07 +0100 Subject: [PATCH 017/151] add travis ci --- .travis.yml | 2 +- composer.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 006f820..26637aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ matrix: - php: 7.4 install: - - composer update $COMPOSER_FLAGS + - composer install script: - composer test diff --git a/composer.json b/composer.json index 154cefc..9b19612 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "symfony/yaml": "5.0.*" }, "require-dev": { + "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/phpunit-bridge": "^5.0" }, From c6d57b08c81d952cea418c651fa02c94ebb86a26 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 13:40:14 +0100 Subject: [PATCH 018/151] add travis ci --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9b19612..944765b 100644 --- a/composer.json +++ b/composer.json @@ -53,7 +53,7 @@ "auto-scripts": { "cache:clear": "symfony-cmd", "cache:warmup": "symfony-cmd", - "test": "php bin/phpunit" + "test": "@php bin/phpunit" }, "post-install-cmd": [ "@auto-scripts" From 17171cc4a1c8a269a69f241c6e23e692f29d6ec5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:00:01 +0100 Subject: [PATCH 019/151] add travis ci --- .env.test | 1 + .travis.yml | 3 +++ composer.json | 6 +++--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.env.test b/.env.test index d048686..8f679b3 100644 --- a/.env.test +++ b/.env.test @@ -3,3 +3,4 @@ KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 PANTHER_APP_ENV=panther +DATABASE_URL=mysql://root@127.0.0.1:3306/tle?serverVersion=5.7 \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 26637aa..48923d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,8 @@ language: php +services: + - mysql + cache: directories: - $HOME/.composer/cache diff --git a/composer.json b/composer.json index 944765b..7930a5f 100644 --- a/composer.json +++ b/composer.json @@ -52,15 +52,15 @@ "scripts": { "auto-scripts": { "cache:clear": "symfony-cmd", - "cache:warmup": "symfony-cmd", - "test": "@php bin/phpunit" + "cache:warmup": "symfony-cmd" }, "post-install-cmd": [ "@auto-scripts" ], "post-update-cmd": [ "@auto-scripts" - ] + ], + "test": "@php bin/phpunit" }, "conflict": { "symfony/symfony": "*" From f005b4dc0997f99b7022d27e32b2944da63ba22c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:13:58 +0100 Subject: [PATCH 020/151] add coveralls --- .coveralls.yml | 1 + README.md | 3 ++- composer.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 .coveralls.yml diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 0000000..f28385f --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1 @@ +repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo \ No newline at end of file diff --git a/README.md b/README.md index f22dc3e..0ef2d36 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # TLE API +[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) + ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -[![Known Vulnerabilities](https://snyk.io/test/github/ivanstan/tle-api/badge.svg?targetFile=composer.lock)](https://snyk.io/test/github/ivanstan/tle-api?targetFile=composer.lock) \ No newline at end of file diff --git a/composer.json b/composer.json index 7930a5f..e5e6959 100644 --- a/composer.json +++ b/composer.json @@ -60,7 +60,7 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "@php bin/phpunit" + "test": "@php bin/phpunit --coverage-text" }, "conflict": { "symfony/symfony": "*" From a146b8dbe8353a3d44fe7bd52d7d972d0365aefa Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:19:49 +0100 Subject: [PATCH 021/151] add coveralls --- .coveralls.yml | 5 ++++- .travis.yml | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.coveralls.yml b/.coveralls.yml index f28385f..93f2685 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1 +1,4 @@ -repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo \ No newline at end of file +repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo +coverage_clover: tests/logs/clover.xml +json_path: tests/logs/coveralls-upload.json +service_name: travis-ci \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 48923d2..f9d1ab5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,14 @@ matrix: include: - php: 7.4 +before_install: + - composer require satooshi/php-coveralls:dev-master + install: - composer install script: - - composer test + - php bin/phpunit --coverage-clover ./tests/logs/clover.xml + +after_script: + - php vendor/bin/coveralls -v From 24a4fb160f6834c6d011456c7be52ea053de25ea Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:21:33 +0100 Subject: [PATCH 022/151] add coveralls --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f9d1ab5..f5bee87 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ matrix: - php: 7.4 before_install: - - composer require satooshi/php-coveralls:dev-master + - composer require satooshi/php-coveralls install: - composer install From 86a584af9a5acd94a38dbba974975cb7cb9ab145 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:31:25 +0100 Subject: [PATCH 023/151] add coveralls --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f5bee87..6ef876a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: - - php vendor/bin/coveralls -v + - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage-clover ./tests/logs/clover.xml From b83e50ce4a94e1ec297fa2526e435bc7d4324434 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:34:18 +0100 Subject: [PATCH 024/151] add coveralls --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6ef876a..c43e132 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: - - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage-clover ./tests/logs/clover.xml + - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage_clover ./tests/logs/clover.xml From 1dcf63d14c8997c76916bba9713a949d6c3dc936 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:38:32 +0100 Subject: [PATCH 025/151] add coveralls --- .coveralls.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.coveralls.yml b/.coveralls.yml index 93f2685..15d2afe 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1,4 +1 @@ repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo -coverage_clover: tests/logs/clover.xml -json_path: tests/logs/coveralls-upload.json -service_name: travis-ci \ No newline at end of file From 6a793a806b0d0511178e92c5bb7354923fdaa226 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:42:06 +0100 Subject: [PATCH 026/151] `add coveralls` --- .coveralls.yml | 3 +++ .travis.yml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.coveralls.yml b/.coveralls.yml index 15d2afe..93f2685 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1 +1,4 @@ repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo +coverage_clover: tests/logs/clover.xml +json_path: tests/logs/coveralls-upload.json +service_name: travis-ci \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index c43e132..a85f38e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,4 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: - - php vendor/satooshi/php-coveralls/bin/php-coveralls --coverage_clover ./tests/logs/clover.xml + - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml From 6c6b349bca69e86b8e38bba1b265e9dd933f0555 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:47:38 +0100 Subject: [PATCH 027/151] `add coveralls` --- .travis.yml | 3 +++ README.md | 2 ++ 2 files changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index a85f38e..b7cf21c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,7 @@ script: - php bin/phpunit --coverage-clover ./tests/logs/clover.xml after_script: + - export CI_BUILD_NUMBER="$TRAVIS_BUILD_NUMBER" + - export CI_PULL_REQUEST="$TRAVIS_PULL_REQUEST" + - export CI_BRANCH="$TRAVIS_BRANCH" - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml diff --git a/README.md b/README.md index 0ef2d36..45c3f31 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,5 @@ ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) + +Code repository that powers TLE API, listed on NASA api page \ No newline at end of file From 9b942103857690a898eaf6265a0d9ecc54caefe0 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 14:55:53 +0100 Subject: [PATCH 028/151] `add coveralls` --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 45c3f31..88a3b42 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # TLE API [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) +[![Coverage Status](https://coveralls.io/repos/github/ivanstan/tle-api/badge.svg?branch=master)](https://coveralls.io/github/ivanstan/tle-api?branch=master) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -Code repository that powers TLE API, listed on NASA api page \ No newline at end of file +Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ + From b308d456ba5ffe1bd5ffc238cb20572c1d502ddc Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 21:10:44 +0100 Subject: [PATCH 029/151] update documentation --- README.md | 27 +++++++++++++-- docs/logo512.png | Bin 0 -> 36838 bytes docs/tle.html | 56 +++++++++++++++++++++++++++++++ src/Controller/ApiController.php | 2 +- tests/DocumentationTest.php | 2 +- 5 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 docs/logo512.png create mode 100644 docs/tle.html diff --git a/README.md b/README.md index 88a3b42..b3efc73 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,32 @@ # TLE API [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) -[![Coverage Status](https://coveralls.io/repos/github/ivanstan/tle-api/badge.svg?branch=master)](https://coveralls.io/github/ivanstan/tle-api?branch=master) - ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ +Code repository that powers TLE API backend, listed on NASA API catalog +https://api.nasa.gov/ + +API provides up to date two line element set records, the data is updated +daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) +is a data format encoding a list of orbital elements of an +Earth-orbiting object for a given point in time. +For more information on TLE data format visit [Definition of +Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). + +## Usage +Further documentation and response examples are available at: +http://data.ivanstanojevic.me/api/tle/docs + + +Available endpoints +The TLE API consists of two endpoints GET http://data.ivanstanojevic.me + +| Endpoint | Description | +|----------|:------:| +| `GET /api/tle?search={q}` | Perform search by satellite name | +| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | +Example query +http://data.ivanstanojevic.me/api/tle diff --git a/docs/logo512.png b/docs/logo512.png new file mode 100644 index 0000000000000000000000000000000000000000..2a06d5e7e8ba9f7eb8bbec665675b07c115fceac GIT binary patch literal 36838 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 API + +

The TLE API provides up to date two line element set records, the data is updated daily from CelesTrak + and served in JSON format. + A two-line element set (TLE) is a data format encoding a list of orbital elements of an Earth-orbiting object for a + given point in time. For more information on TLE data format visit Definition + of Two-line Element Set Coordinate System. +

+ +

Further documentation and response examples are available at: + http://data.ivanstanojevic.me/ + + api/tle/docs +

+ +

Available endpoints

+

+ The TLE API consists of two endpoints + + GET http://data.ivanstanojevic.me + +

+ + + + + + + + + + + + + + + + + + +
EndpointDescription
GET /api/tle?search={q}Performing a search by satellite name
GET /api/tle/{q}Retrieving a single TLE record where query is satellite number
+ +

Example query

+

+ + + http://data.ivanstanojevic.me/ + + api/tle + + +

diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index 80f2ad9..af187a7 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -13,7 +13,7 @@ class ApiController extends AbstractController use FileSystemAwareTrait; /** - * @Route("/api/{name}/json", name="app_api_docs_json") + * @Route("/api/{name}.json", name="app_api_docs_json") */ public function getJson(string $name): JsonResponse { diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index c8c999e..d2aaf3e 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -8,7 +8,7 @@ final class DocumentationTest extends AbstractWebTestCase { public function testDocumentationIsCorrect(): void { - $response = $this->get('/api/tle/json'); + $response = $this->get('/api/tle.json'); self::assertEquals(200, $response->getStatusCode(), 'Assert json documentation is available'); From 1f7841894f6296608e4a2d432fc63c05a45ccf50 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 21:14:21 +0100 Subject: [PATCH 030/151] update documentation --- README.md | 2 ++ docs/logo192.png | Bin 0 -> 12929 bytes 2 files changed, 2 insertions(+) create mode 100644 docs/logo192.png diff --git a/README.md b/README.md index b3efc73..e3f8d21 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) +![logo](https://github.com/ivanstan/tle-api/blob/master/docs/logo512.png?raw=true) + Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ diff --git a/docs/logo192.png b/docs/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..027c5f3301ecd3a9cbbc63ed5f71c47895c445bf GIT binary patch literal 12929 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 NPs>=dR^283e*vEsT>k(7 literal 0 HcmV?d00001 From 707bf259aadc30da7dec7c7d41b29a24c9ce631e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 5 Jan 2020 21:17:14 +0100 Subject: [PATCH 031/151] update documentation --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e3f8d21..c3ffde0 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -![logo](https://github.com/ivanstan/tle-api/blob/master/docs/logo512.png?raw=true) +

+ +

Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ From 1e5f3ac1c56405750649a9ca712ea716399f6f97 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 17:34:31 +0100 Subject: [PATCH 032/151] add dependency ivanstan/tle-php --- .github/workflows/php.yml | 26 - README.md | 5 +- composer.json | 1 + composer.lock | 830 ++++++++++++++++++++++---- public/favicon.ico | Bin 0 -> 1150 bytes src/Command/DoctrineReloadCommand.php | 2 +- symfony.lock | 15 + 7 files changed, 734 insertions(+), 145 deletions(-) delete mode 100644 .github/workflows/php.yml create mode 100644 public/favicon.ico diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml deleted file mode 100644 index 8962a94..0000000 --- a/.github/workflows/php.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: PHP Composer - -on: - push: - branches: - - production - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Install dependencies - run: composer install --prefer-dist --no-progress --no-suggest - - # Add a test script to composer.json, for instance: "test": "vendor/bin/phpunit" - # Docs: https://getcomposer.org/doc/articles/scripts.md - - # - name: Run test suite - # run: composer run-script test diff --git a/README.md b/README.md index c3ffde0..f4f03f1 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,8 @@ Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/si Further documentation and response examples are available at: http://data.ivanstanojevic.me/api/tle/docs - -Available endpoints -The TLE API consists of two endpoints GET http://data.ivanstanojevic.me +###Available endpoints +The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` | Endpoint | Description | |----------|:------:| diff --git a/composer.json b/composer.json index e5e6959..4ac57ef 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*", + "ivanstan/tle-php": "^1.0", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", "symfony/asset": "5.0.*", diff --git a/composer.lock b/composer.lock index 7625623..b2a1e5b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "757b98014fe5c4a0788a2cbb83297329", + "content-hash": "e147328d3b45617aa4be85dc153b6b38", "packages": [ { "name": "doctrine/annotations", @@ -1144,6 +1144,236 @@ ], "time": "2018-06-14T14:45:07+00:00" }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2019-12-23T11:57:10+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "ivanstan/tle-php", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/ivanstan/tle-php.git", + "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/5bd7487aa242248ad255b041f5fe99a8f5daca33", + "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^6.5", + "myclabs/php-enum": "^1.7" + }, + "require-dev": { + "phpunit/phpunit": "^8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ivanstan\\Tle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivan Stanojevic", + "email": "ivan.stanojevic@protonmail.com" + } + ], + "description": "TLE Framework written in PHP and client to NASA TLE API.", + "time": "2020-01-08T10:08:36+00:00" + }, { "name": "jdorn/sql-formatter", "version": "v1.2.17", @@ -1194,6 +1424,177 @@ ], "time": "2014-01-12T16:20:24+00:00" }, + { + "name": "laminas/laminas-code", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", + "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", + "shasum": "" + }, + "require": { + "laminas/laminas-eventmanager": "^2.6 || ^3.0", + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^7.1" + }, + "conflict": { + "phpspec/prophecy": "<1.9.0" + }, + "replace": { + "zendframework/zend-code": "self.version" + }, + "require-dev": { + "doctrine/annotations": "^1.7", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^1.0", + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "phpunit/phpunit": "^7.5.16 || ^8.4" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev", + "dev-develop": "3.5.x-dev", + "dev-dev-4.0": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas" + ], + "time": "2019-12-31T16:28:24+00:00" + }, + { + "name": "laminas/laminas-eventmanager", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-eventmanager.git", + "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "shasum": "" + }, + "require": { + "laminas/laminas-zendframework-bridge": "^1.0", + "php": "^5.6 || ^7.0" + }, + "replace": { + "zendframework/zend-eventmanager": "self.version" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev", + "dev-develop": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://laminas.dev", + "keywords": [ + "event", + "eventmanager", + "events", + "laminas" + ], + "time": "2019-12-31T16:44:52+00:00" + }, + { + "name": "laminas/laminas-zendframework-bridge", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-zendframework-bridge.git", + "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/0fb9675b84a1666ab45182b6c5b29956921e818d", + "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev", + "dev-develop": "1.1.x-dev" + }, + "laminas": { + "module": "Laminas\\ZendFrameworkBridge" + } + }, + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ZendFrameworkBridge\\": "src//" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Alias legacy ZF class names to Laminas Project equivalents.", + "keywords": [ + "ZendFramework", + "autoloading", + "laminas", + "zf" + ], + "time": "2020-01-07T22:58:31+00:00" + }, { "name": "myclabs/php-enum", "version": "1.7.2", @@ -1506,6 +1907,56 @@ ], "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/log", "version": "1.1.2", @@ -1553,6 +2004,46 @@ ], "time": "2019-11-01T11:05:21+00:00" }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -3594,119 +4085,6 @@ "description": "Symfony Yaml Component", "homepage": "https://symfony.com", "time": "2019-12-10T11:06:55+00:00" - }, - { - "name": "zendframework/zend-code", - "version": "3.4.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-code.git", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-code/zipball/268040548f92c2bfcba164421c1add2ba43abaaa", - "reference": "268040548f92c2bfcba164421c1add2ba43abaaa", - "shasum": "" - }, - "require": { - "php": "^7.1", - "zendframework/zend-eventmanager": "^2.6 || ^3.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" - }, - "require-dev": { - "doctrine/annotations": "^1.7", - "ext-phar": "*", - "phpunit/phpunit": "^7.5.16 || ^8.4", - "zendframework/zend-coding-standard": "^1.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "zendframework/zend-stdlib": "Zend\\Stdlib component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev", - "dev-develop": "3.5.x-dev", - "dev-dev-4.0": "4.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "keywords": [ - "ZendFramework", - "code", - "zf" - ], - "abandoned": "laminas/laminas-code", - "time": "2019-12-10T19:21:15+00:00" - }, - { - "name": "zendframework/zend-eventmanager", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd", - "reference": "a5e2583a211f73604691586b8406ff7296a946dd", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0" - }, - "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://github.com/zendframework/zend-eventmanager", - "keywords": [ - "event", - "eventmanager", - "events", - "zf2" - ], - "abandoned": "laminas/laminas-eventmanager", - "time": "2018-04-25T15:33:34+00:00" } ], "packages-dev": [ @@ -3840,6 +4218,226 @@ ], "time": "2019-11-13T15:46:58+00:00" }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", + "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "brightlocal/phpwhois": "<=4.2.5", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", + "drupal/drupal": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", + "endroid/qr-code-bundle": "<3.4.2", + "erusev/parsedown": "<1.7.2", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.4", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "firebase/php-jwt": "<2", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "fuel/core": "<1.8.1", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "onelogin/php-saml": "<2.10.4", + "openid/php-openid": "<2.3", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", + "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", + "phpoffice/phpexcel": "<=1.8.1", + "phpoffice/phpspreadsheet": "<=1.5", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/shopware": "<5.3.7", + "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": ">=3,<3.6.7|>=3.7,<3.7.3|>=4,<4.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.17.8", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", + "socalnick/scn-social-auth": "<1.15.2", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.48", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/sylius": ">=1,<1.1.18|>=1.2,<1.2.17|>=1.3,<1.3.12|>=1.4,<1.4.4", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", + "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "ua-parser/uap-php": "<3.8", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "time": "2020-01-06T19:16:46+00:00" + }, { "name": "symfony/phpunit-bridge", "version": "v5.0.2", @@ -3908,7 +4506,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..33601c5d3a953ee7707a2ed598f1beeed7d40588 GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYI*xFHzK9|FXbun>j?Nl6S# z)6)g#Cnhk@j*TJO)g{)J3tX#?f3R7$V6lM$J z`|KA2)6AN}LOi-5QuAVC8UBCx%CH}3#-(K|b{^>J4g;CFBqfEQ zUYLSuK|u_2qN14Q#l~=TIM_4R7~yj@OxM8DKraHr4v71KxE+X@85n-RFh2vs2OvIR T55)Bh3=e?#BTy{}!}I|F>1*+$ literal 0 HcmV?d00001 diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php index 95ea3bc..056abd8 100644 --- a/src/Command/DoctrineReloadCommand.php +++ b/src/Command/DoctrineReloadCommand.php @@ -48,7 +48,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $question = new ChoiceQuestion('All data will be lost. Do you wish to continue?', self::$choices, false); if (!\in_array($this->env, self::$envs, true)) { - $io->warning('This is intended only for use in dev environment.'); + $io->warning('This is intended only for use in dev or test environment.'); return 1; } diff --git a/symfony.lock b/symfony.lock index 412623f..8950aaf 100644 --- a/symfony.lock +++ b/symfony.lock @@ -90,6 +90,15 @@ "doctrine/reflection": { "version": "v1.0.0" }, + "guzzlehttp/guzzle": { + "version": "6.5.2" + }, + "guzzlehttp/promises": { + "version": "v1.3.1" + }, + "guzzlehttp/psr7": { + "version": "1.6.1" + }, "jdorn/sql-formatter": { "version": "v1.2.17" }, @@ -114,9 +123,15 @@ "psr/event-dispatcher": { "version": "1.0.0" }, + "psr/http-message": { + "version": "1.0.1" + }, "psr/log": { "version": "1.1.2" }, + "ralouphie/getallheaders": { + "version": "3.0.3" + }, "symfony/apache-pack": { "version": "1.0", "recipe": { From 840a78d0cabc5a2dfecf714c02f83ca96a1bae78 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 18:15:07 +0100 Subject: [PATCH 033/151] add test for not found tle record --- src/Command/ImportTleCommand.php | 4 +- src/Kernel.php | 3 + src/Migrations/Version20191217203053.php | 3 + src/Serializer/TleModelNormalizer.php | 2 +- src/Service/TleFile.php | 44 ----- src/ViewModel/Model/TleModel.php | 218 ----------------------- tests/DocumentationTest.php | 3 +- tests/ErrorPageTest.php | 8 +- tests/TleModelTest.php | 64 ------- tests/TleTest.php | 15 +- 10 files changed, 29 insertions(+), 335 deletions(-) delete mode 100644 src/Service/TleFile.php delete mode 100644 src/ViewModel/Model/TleModel.php delete mode 100644 tests/TleModelTest.php diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 4d099ff..4c5a1fc 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -4,10 +4,10 @@ use App\Entity\Tle; use App\Repository\TleRepository; -use App\Service\TleFile; use App\Service\Traits\FileSystemAwareTrait; -use App\ViewModel\Model\TleModel; +use Ivanstan\Tle\Model\Tle as TleModel; use Doctrine\ORM\EntityManagerInterface; +use Ivanstan\Tle\TleFile; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Table; diff --git a/src/Kernel.php b/src/Kernel.php index 65c5230..509a308 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -9,6 +9,9 @@ use Symfony\Component\HttpKernel\Kernel as BaseKernel; use Symfony\Component\Routing\RouteCollectionBuilder; +/** + * @codeCoverageIgnore + */ class Kernel extends BaseKernel { use MicroKernelTrait; diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index db9f18d..4fb03c7 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -7,6 +7,9 @@ use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; +/** + * @codeCoverageIgnore + */ final class Version20191217203053 extends AbstractMigration { /** @throws \Exception */ diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 57201d0..b07e6fc 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -3,7 +3,7 @@ namespace App\Serializer; use App\Entity\Tle; -use App\ViewModel\Model\TleModel; +use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; diff --git a/src/Service/TleFile.php b/src/Service/TleFile.php deleted file mode 100644 index 37c917e..0000000 --- a/src/Service/TleFile.php +++ /dev/null @@ -1,44 +0,0 @@ -content = $content; - } - - /** - * @return TleModel[] - */ - public function parse(): array - { - $data = explode("\n", $this->content); - $data = array_filter($data); - $raw = array_chunk($data, 3); - - $result = []; - foreach ($raw as $key => $item) { - if (!isset($item[0], $item[1], $item[2])) { - $result[$key] = null; - continue; - } - - $result[$key] = new TleModel($this->trim($item[1]), $this->trim($item[2]), $this->trim($item[0])); - } - - return $result; - } - - protected function trim(string $string): string - { - $string = str_replace(["/\r\n/", "/\r/", "/\n/"], '', $string); - - return trim($string); - } -} \ No newline at end of file diff --git a/src/ViewModel/Model/TleModel.php b/src/ViewModel/Model/TleModel.php deleted file mode 100644 index 4bbeda8..0000000 --- a/src/ViewModel/Model/TleModel.php +++ /dev/null @@ -1,218 +0,0 @@ -line1 = $line1; - $this->line2 = $line2; - $this->name = $name; - } - - public function getId(): int - { - return (int)substr($this->line1, 2, 6); - } - - public function getClassification(): string - { - return $this->line1[7]; - } - - public function getName(): string - { - return $this->name; - } - - public function launchYear(?bool $fourDigits = null): int - { - $year = (int)trim(substr($this->line1, 9, 2)); - - if ($fourDigits ?? true) { - $this->formatYear($year); - } - - return $year; - } - - public function launchNumberOfYear(): int - { - return (int)trim(substr($this->line1, 12, 2)); - } - - public function epoch(): string - { - return trim(substr($this->line1, 18, 14)); - } - - public function launchPiece(): string - { - return trim(substr($this->line1, 14, 2)); - } - - public function bstar(): string - { - return trim(substr($this->line1, 53, 8)); - } - - public function elementNumber(): int - { - return (int)trim(substr($this->line1, 64, 4)); - } - - public function inclination(): float - { - return (float)trim(substr($this->line2, 8, 8)); - } - - public function raan(): float - { - return (float)trim(substr($this->line2, 17, 8)); - } - - public function eccentricity(): float - { - return (float)('.' . trim(substr($this->line2, 26, 7))); - } - - public function meanAnomaly(): float - { - return (float)trim(substr($this->line2, 43, 8)); - } - - public function argumentOfPerigee(): float - { - return (float)trim(substr($this->line2, 34, 8)); - } - - public function meanMotion(): float - { - return (float)trim(substr($this->line2, 52, 11)); - } - - public function getDate(): string - { - $year = (int)trim(substr($this->line1, 18, 2)); - $year = $this->formatYear($year); - - $date = new \DateTime(); - $timezone = new \DateTimeZone('UTC'); - - $epoch = (float)trim(substr($this->line1, 20, 12)); - $days = (int)$epoch; - - $date - ->setTimezone($timezone) - ->setDate($year, 1, $days); - - $faction = round($epoch - $days, 8); - - $faction *= 24; // hours - $hours = round($faction); - $faction -= $hours; - - $faction *= 60; // minutes - $minutes = round($faction); - $faction -= $minutes; - - $faction *= 60; // seconds - $seconds = round($faction); - $faction -= $seconds; - - $faction *= 1000; // milliseconds - $milliseconds = round($faction); - - $date->setTime($hours, $minutes, $seconds, $milliseconds); - - return $date->format('c'); - } - - public function getChecksum(int $lineNumber): int - { - $line = $this->getLineByNumber($lineNumber); - - return (int)trim(substr($line, 68)); - } - - public function calculateChecksum(int $lineNumber): int - { - $line = $this->getLineByNumber($lineNumber); - - return $this->checksum($line); - } - - public function verify(): bool - { - if (self::LINE1 !== (int)$this->line1[0] || self::LINE2 !== (int)$this->line2[0]) { - return false; - } - - if ($this->getChecksum(self::LINE1) !== $this->calculateChecksum(self::LINE1)) { - return false; - } - - if ($this->getChecksum(self::LINE2) !== $this->calculateChecksum(self::LINE2)) { - return false; - } - - return true; - } - - private function formatYear(int $twoDigitYear): int - { - if ($twoDigitYear < 57) { - $twoDigitYear += 2000; - } else { - $twoDigitYear += 1900; - } - - return $twoDigitYear; - } - - private function getLineByNumber(int $lineNumber): string - { - if (self::LINE1 === $lineNumber) { - return $this->line1; - } - - if (self::LINE2 === $lineNumber) { - return $this->line2; - } - - throw new \InvalidArgumentException(\sprintf('Invalid line number %d', $lineNumber)); - } - - // refactor: TleValidator - private function checksum(string $line): int - { - $line = substr($line, 0, -1); // remove checksum - $length = \strlen($line); - $sum = 0; - for ($i = 0; $i < $length; $i++) { - if ($line[$i] === '-') { - ++$sum; - continue; - } - - if (is_numeric($line[$i])) { - $sum += $line[$i]; - } - } - return $sum % 10; - } -} diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index d2aaf3e..7ea6b5f 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -3,6 +3,7 @@ namespace App\Tests; use App\DataFixtures\TleFixtures; +use Symfony\Component\HttpFoundation\Response; final class DocumentationTest extends AbstractWebTestCase { @@ -10,7 +11,7 @@ public function testDocumentationIsCorrect(): void { $response = $this->get('/api/tle.json'); - self::assertEquals(200, $response->getStatusCode(), 'Assert json documentation is available'); + self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); $response = $this->toArray($response); diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index fc7d0de..6a6f186 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -2,13 +2,19 @@ namespace App\Tests; +use Symfony\Component\HttpFoundation\Response; + class ErrorPageTest extends AbstractWebTestCase { public function test404(): void { $response = $this->get('/noop'); - self::assertEquals($response->getStatusCode(), 404, 'Assert page not found returns HTTP 404'); + self::assertEquals( + $response->getStatusCode(), + Response::HTTP_NOT_FOUND, + 'Assert page not found returns HTTP 404' + ); $response = $this->toArray($response); diff --git a/tests/TleModelTest.php b/tests/TleModelTest.php deleted file mode 100644 index de2a94b..0000000 --- a/tests/TleModelTest.php +++ /dev/null @@ -1,64 +0,0 @@ -getLine1(), $entity->getLine2(), $entity->getName()); - - static::assertEquals( - TleFixtures::$date, - $tle->getDate(), - 'Failed asserting TLE returned correct date' - ); - - static::assertEquals( - 0, - $tle->getChecksum(TleModel::LINE1), - 'Failed asserting TLE checksum for line1 is correct' - ); - - static::assertEquals( - 4, - $tle->getChecksum(TleModel::LINE2), - 'Failed asserting TLE checksum for line2 is correct' - ); - - static::assertEquals( - 0, - $tle->calculateChecksum(TleModel::LINE1), - 'Failed asserting TLE calculated checksum for line1 is correct' - ); - - static::assertEquals( - 4, - $tle->calculateChecksum(TleModel::LINE2), - 'Failed asserting TLE calculated checksum for line2 is correct' - ); - - static::assertEquals( - true, - $tle->verify(), - 'Failed asserting that TLE is correct' - ); - - static::assertEquals( - 43550, - $tle->getId(), - 'Failed asserting that TLE Satellite/Catalog number is correct' - ); - - static::assertEquals( - 'U', - $tle->getClassification(), - 'Failed asserting that TLE classification is correct' - ); - } -} diff --git a/tests/TleTest.php b/tests/TleTest.php index 062b163..a557992 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -3,6 +3,7 @@ namespace App\Tests; use App\DataFixtures\TleFixtures; +use Symfony\Component\HttpFoundation\Response; final class TleTest extends AbstractWebTestCase { @@ -10,9 +11,9 @@ public function testTleSingleRecord(): void { $tle = TleFixtures::create(); - $response = $this->get('/api/tle/'.$tle->getId()); + $response = $this->get('/api/tle/' . $tle->getId()); - self::assertEquals(200, $response->getStatusCode()); + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response = $this->toArray($response); @@ -23,7 +24,7 @@ public function testTleSingleRecord(): void self::assertArrayHasKey('line1', $response); self::assertArrayHasKey('line2', $response); - self::assertEquals('http://localhost/api/tle/'.$tle->getId(), $response['@id']); + self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); self::assertEquals('TleModel', $response['@type']); self::assertEquals($tle->getName(), $response['name']); self::assertEquals(TleFixtures::$date, $response['date']); @@ -31,6 +32,12 @@ public function testTleSingleRecord(): void self::assertEquals($tle->getLine2(), $response['line2']); } + public function testTleRecordNotFound(): void + { + $response = $this->get('/api/tle/0'); + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + } + public function testTleCollectionRecord(): void { $pageSize = 2; @@ -42,7 +49,7 @@ public function testTleCollectionRecord(): void ] ); - self::assertEquals(200, $response->getStatusCode()); + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); $response = $this->toArray($response); From e7e627cb38fdee1a71b105e1d02cf3f0042771b4 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 19:43:43 +0100 Subject: [PATCH 034/151] add client libraries section --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index f4f03f1..b0613c4 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,9 @@ The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` Example query http://data.ivanstanojevic.me/api/tle + +# Client libraries + +* JavaScript https://github.com/ivanstan/tle.js +* PHP https://github.com/ivanstan/tle-php +* C# https://github.com/nichols-t/TLE.NET \ No newline at end of file From 8581362279180c7131b813e82e36e80921ea02ee Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 21:53:48 +0100 Subject: [PATCH 035/151] add coverage badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b0613c4..150ab31 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # TLE API [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) +![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) From 34bcef1caaae6d2cd98187b4aa9d5fea80273146 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 8 Jan 2020 21:55:07 +0100 Subject: [PATCH 036/151] add coverage badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 150ab31..874f46b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) ![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) +![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) From f7832b8de794ccb373a77637dbbb0d316eb5f3d7 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 21 Jan 2020 18:30:22 +0100 Subject: [PATCH 037/151] updated symfony 5.0.3 --- .coveralls.yml | 6 +- .travis.yml | 62 +-- README.md | 84 ++-- composer.json | 152 +++--- composer.lock | 440 ++++++++++-------- config/custom/source.yaml | 92 ++-- src/Controller/AbstractApiController.php | 260 +++++------ src/Controller/TleController.php | 168 +++---- src/Service/Validator/RequestValidator.php | 160 +++---- src/ViewModel/SortDirectionEnum.php | 20 +- .../TleCollectionSortableFieldsEnum.php | 20 +- symfony.lock | 3 + tests/CollectionTest.php | 244 +++++----- tests/DocumentationTest.php | 72 +-- tests/ErrorPageTest.php | 52 +-- 15 files changed, 946 insertions(+), 889 deletions(-) diff --git a/.coveralls.yml b/.coveralls.yml index 93f2685..c443d85 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1,4 +1,4 @@ -repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo -coverage_clover: tests/logs/clover.xml -json_path: tests/logs/coveralls-upload.json +repo_token: RTlXy2H8wGT3YFreCvVwE9FDSvoIzgvAo +coverage_clover: tests/logs/clover.xml +json_path: tests/logs/coveralls-upload.json service_name: travis-ci \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index b7cf21c..603c2b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,31 +1,31 @@ -language: php - -services: - - mysql - -cache: - directories: - - $HOME/.composer/cache - -branches: - only: - - master - -matrix: - include: - - php: 7.4 - -before_install: - - composer require satooshi/php-coveralls - -install: - - composer install - -script: - - php bin/phpunit --coverage-clover ./tests/logs/clover.xml - -after_script: - - export CI_BUILD_NUMBER="$TRAVIS_BUILD_NUMBER" - - export CI_PULL_REQUEST="$TRAVIS_PULL_REQUEST" - - export CI_BRANCH="$TRAVIS_BRANCH" - - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml +language: php + +services: + - mysql + +cache: + directories: + - $HOME/.composer/cache + +branches: + only: + - master + +matrix: + include: + - php: 7.4 + +before_install: + - composer require satooshi/php-coveralls + +install: + - composer install + +script: + - php bin/phpunit --coverage-clover ./tests/logs/clover.xml + +after_script: + - export CI_BUILD_NUMBER="$TRAVIS_BUILD_NUMBER" + - export CI_PULL_REQUEST="$TRAVIS_PULL_REQUEST" + - export CI_BRANCH="$TRAVIS_BRANCH" + - php vendor/satooshi/php-coveralls/bin/php-coveralls -vv --coverage_clover ./tests/logs/clover.xml diff --git a/README.md b/README.md index 874f46b..c398e5c 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,43 @@ -# TLE API - -[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) -![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) -![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) -![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) -![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) -![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) - -

- -

- -Code repository that powers TLE API backend, listed on NASA API catalog -https://api.nasa.gov/ - -API provides up to date two line element set records, the data is updated -daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) -is a data format encoding a list of orbital elements of an -Earth-orbiting object for a given point in time. -For more information on TLE data format visit [Definition of -Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). - -## Usage -Further documentation and response examples are available at: -http://data.ivanstanojevic.me/api/tle/docs - -###Available endpoints -The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` - -| Endpoint | Description | -|----------|:------:| -| `GET /api/tle?search={q}` | Perform search by satellite name | -| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | - -Example query -http://data.ivanstanojevic.me/api/tle - -# Client libraries - -* JavaScript https://github.com/ivanstan/tle.js -* PHP https://github.com/ivanstan/tle-php +# TLE API + +[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) +![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) +![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) +![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) +![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) +![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) + +

+ +

+ +Code repository that powers TLE API backend, listed on NASA API catalog +https://api.nasa.gov/ + +API provides up to date two line element set records, the data is updated +daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) +is a data format encoding a list of orbital elements of an +Earth-orbiting object for a given point in time. +For more information on TLE data format visit [Definition of +Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). + +## Usage +Further documentation and response examples are available at: +http://data.ivanstanojevic.me/api/tle/docs + +###Available endpoints +The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` + +| Endpoint | Description | +|----------|:------:| +| `GET /api/tle?search={q}` | Perform search by satellite name | +| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | + +Example query +http://data.ivanstanojevic.me/api/tle + +# Client libraries + +* JavaScript https://github.com/ivanstan/tle.js +* PHP https://github.com/ivanstan/tle-php * C# https://github.com/nichols-t/TLE.NET \ No newline at end of file diff --git a/composer.json b/composer.json index 4ac57ef..58f4eb1 100644 --- a/composer.json +++ b/composer.json @@ -1,76 +1,76 @@ -{ - "type": "project", - "license": "proprietary", - "require": { - "php": "^7.4", - "ext-ctype": "*", - "ext-iconv": "*", - "ext-json": "*", - "ivanstan/tle-php": "^1.0", - "myclabs/php-enum": "^1.7", - "symfony/apache-pack": "^1.0", - "symfony/asset": "5.0.*", - "symfony/browser-kit": "5.0.*", - "symfony/console": "5.0.*", - "symfony/dotenv": "5.0.*", - "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.0.*", - "symfony/orm-pack": "^1.0", - "symfony/serializer": "5.0.*", - "symfony/yaml": "5.0.*" - }, - "require-dev": { - "roave/security-advisories": "dev-master", - "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0" - }, - "config": { - "preferred-install": { - "*": "dist" - }, - "sort-packages": true, - "optimize-autoloader": true - }, - "autoload": { - "psr-4": { - "App\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "App\\Tests\\": "tests/" - } - }, - "replace": { - "paragonie/random_compat": "2.*", - "symfony/polyfill-ctype": "*", - "symfony/polyfill-iconv": "*", - "symfony/polyfill-php72": "*", - "symfony/polyfill-php71": "*", - "symfony/polyfill-php70": "*", - "symfony/polyfill-php56": "*" - }, - "scripts": { - "auto-scripts": { - "cache:clear": "symfony-cmd", - "cache:warmup": "symfony-cmd" - }, - "post-install-cmd": [ - "@auto-scripts" - ], - "post-update-cmd": [ - "@auto-scripts" - ], - "test": "@php bin/phpunit --coverage-text" - }, - "conflict": { - "symfony/symfony": "*" - }, - "extra": { - "public-dir": "./public", - "symfony": { - "allow-contrib": false, - "require": "5.0.*" - } - } -} +{ + "type": "project", + "license": "proprietary", + "require": { + "php": "^7.4", + "ext-ctype": "*", + "ext-iconv": "*", + "ext-json": "*", + "ivanstan/tle-php": "^1.0", + "myclabs/php-enum": "^1.7", + "symfony/apache-pack": "^1.0", + "symfony/asset": "5.0.*", + "symfony/browser-kit": "5.0.*", + "symfony/console": "5.0.*", + "symfony/dotenv": "5.0.*", + "symfony/flex": "^1.3.1", + "symfony/framework-bundle": "5.0.*", + "symfony/orm-pack": "^1.0", + "symfony/serializer": "5.0.*", + "symfony/yaml": "5.0.*" + }, + "require-dev": { + "roave/security-advisories": "dev-master", + "doctrine/doctrine-fixtures-bundle": "^3.1", + "symfony/phpunit-bridge": "^5.0" + }, + "config": { + "preferred-install": { + "*": "dist" + }, + "sort-packages": true, + "optimize-autoloader": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "paragonie/random_compat": "2.*", + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php71": "*", + "symfony/polyfill-php70": "*", + "symfony/polyfill-php56": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "cache:warmup": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ], + "test": "@php bin/phpunit --coverage-text" + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "public-dir": "./public", + "symfony": { + "allow-contrib": false, + "require": "5.0.*" + } + } +} diff --git a/composer.lock b/composer.lock index b2a1e5b..49a4264 100644 --- a/composer.lock +++ b/composer.lock @@ -228,16 +228,16 @@ }, { "name": "doctrine/common", - "version": "v2.11.0", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff" + "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", - "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", + "url": "https://api.github.com/repos/doctrine/common/zipball/2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", + "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", "shasum": "" }, "require": { @@ -307,20 +307,20 @@ "doctrine", "php" ], - "time": "2019-09-10T10:10:14+00:00" + "time": "2020-01-10T15:49:25+00:00" }, { "name": "doctrine/dbal", - "version": "v2.10.0", + "version": "v2.10.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934" + "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/0c9a646775ef549eb0a213a4f9bd4381d9b4d934", - "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", + "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", "shasum": "" }, "require": { @@ -399,20 +399,20 @@ "sqlserver", "sqlsrv" ], - "time": "2019-11-03T16:50:43+00:00" + "time": "2020-01-04T12:56:21+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.0.6", + "version": "2.0.7", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "0ef972d3b730f975c80db9fffa4b2a0258c91442" + "reference": "6926771140ee87a823c3b2c72602de9dda4490d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0ef972d3b730f975c80db9fffa4b2a0258c91442", - "reference": "0ef972d3b730f975c80db9fffa4b2a0258c91442", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/6926771140ee87a823c3b2c72602de9dda4490d3", + "reference": "6926771140ee87a823c3b2c72602de9dda4490d3", "shasum": "" }, "require": { @@ -439,6 +439,7 @@ "phpunit/phpunit": "^7.5", "symfony/phpunit-bridge": "^4.2", "symfony/property-info": "^4.3.3|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", "symfony/validator": "^3.4.30|^4.3.3|^5.0", "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", @@ -490,7 +491,7 @@ "orm", "persistence" ], - "time": "2019-12-19T13:47:07+00:00" + "time": "2020-01-18T11:56:15+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -823,16 +824,16 @@ }, { "name": "doctrine/migrations", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "8e124252d2f6be1124017d746d5994dd4095d66f" + "reference": "a3987131febeb0e9acb3c47ab0df0af004588934" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/8e124252d2f6be1124017d746d5994dd4095d66f", - "reference": "8e124252d2f6be1124017d746d5994dd4095d66f", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/a3987131febeb0e9acb3c47ab0df0af004588934", + "reference": "a3987131febeb0e9acb3c47ab0df0af004588934", "shasum": "" }, "require": { @@ -901,7 +902,7 @@ "migrations", "php" ], - "time": "2019-11-13T11:06:31+00:00" + "time": "2019-12-04T06:09:14+00:00" }, { "name": "doctrine/orm", @@ -988,16 +989,16 @@ }, { "name": "doctrine/persistence", - "version": "1.3.3", + "version": "1.3.6", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "99b196bbd4715a94fa100fac664a351ffa46d6a5" + "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/99b196bbd4715a94fa100fac664a351ffa46d6a5", - "reference": "99b196bbd4715a94fa100fac664a351ffa46d6a5", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/5dd3ac5eebef2d0b074daa4440bb18f93132dee4", + "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4", "shasum": "" }, "require": { @@ -1005,7 +1006,7 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.0", + "doctrine/reflection": "^1.1", "php": "^7.1" }, "conflict": { @@ -1067,20 +1068,20 @@ "orm", "persistence" ], - "time": "2019-12-13T10:43:02+00:00" + "time": "2020-01-16T22:06:23+00:00" }, { "name": "doctrine/reflection", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" + "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", - "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/bc420ead87fdfe08c03ecc3549db603a45b06d4c", + "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c", "shasum": "" }, "require": { @@ -1088,13 +1089,15 @@ "ext-tokenizer": "*", "php": "^7.1" }, + "conflict": { + "doctrine/common": "<2.9" + }, "require-dev": { - "doctrine/coding-standard": "^4.0", - "doctrine/common": "^2.8", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-phpunit": "^0.9.4", - "phpunit/phpunit": "^7.0", - "squizlabs/php_codesniffer": "^3.0" + "doctrine/coding-standard": "^5.0", + "doctrine/common": "^2.10", + "phpstan/phpstan": "^0.11.0", + "phpstan/phpstan-phpunit": "^0.11.0", + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { @@ -1112,6 +1115,10 @@ "MIT" ], "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, { "name": "Roman Borschel", "email": "roman@code-factory.org" @@ -1120,10 +1127,6 @@ "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" @@ -1137,12 +1140,13 @@ "email": "ocramius@gmail.com" } ], - "description": "Doctrine Reflection component", + "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", "homepage": "https://www.doctrine-project.org/projects/reflection.html", "keywords": [ - "reflection" + "reflection", + "static" ], - "time": "2018-06-14T14:45:07+00:00" + "time": "2020-01-08T19:53:19+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1693,45 +1697,46 @@ }, { "name": "ocramius/proxy-manager", - "version": "2.5.1", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "b7bac968eef945322d1e28d7e833b6a549a6da27" + "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/b7bac968eef945322d1e28d7e833b6a549a6da27", - "reference": "b7bac968eef945322d1e28d7e833b6a549a6da27", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/406ca12cabfb43e3b11c994bcbeea8e358c65af9", + "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9", "shasum": "" }, "require": { + "laminas/laminas-code": "^3.4.1", "ocramius/package-versions": "^1.5.1", - "php": "^7.4.0", - "zendframework/zend-code": "^3.3.1" + "php": "7.4.*", + "webimpress/safe-writer": "^2.0" }, "conflict": { "doctrine/annotations": "<1.6.1", + "laminas/laminas-stdlib": "<3.2.1", "zendframework/zend-stdlib": "<3.2.1" }, "require-dev": { - "couscous/couscous": "^1.7.2", "doctrine/coding-standard": "^6.0.0", "ext-phar": "*", - "infection/infection": "^0.13.4", - "nikic/php-parser": "^4.2.2", - "phpbench/phpbench": "^0.16.9", - "phpunit/phpunit": "^8.3.3", + "infection/infection": "^0.15.0", + "nikic/php-parser": "^4.3.0", + "phpbench/phpbench": "^0.16.10", + "phpunit/phpunit": "^8.5.1", "slevomat/coding-standard": "^5.0.4", - "squizlabs/php_codesniffer": "^3.4.2", - "symfony/console": "^4.3.3", - "vimeo/psalm": "3.4.11" + "squizlabs/php_codesniffer": "^3.5.3", + "symfony/console": "^4.4.2", + "vimeo/psalm": "3.7.0" }, "suggest": { - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects", - "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)", - "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)", - "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)" + "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", + "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", + "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", + "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" }, "type": "library", "extra": { @@ -1764,7 +1769,7 @@ "proxy pattern", "service proxies" ], - "time": "2019-12-17T09:22:43+00:00" + "time": "2020-01-07T08:10:36+00:00" }, { "name": "psr/cache", @@ -2068,16 +2073,16 @@ }, { "name": "symfony/asset", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "6b66969b9f5cd53c1ce69bdc651aa962f211b6b6" + "reference": "447190a24309da88f816313824d85c303035f86b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/6b66969b9f5cd53c1ce69bdc651aa962f211b6b6", - "reference": "6b66969b9f5cd53c1ce69bdc651aa962f211b6b6", + "url": "https://api.github.com/repos/symfony/asset/zipball/447190a24309da88f816313824d85c303035f86b", + "reference": "447190a24309da88f816313824d85c303035f86b", "shasum": "" }, "require": { @@ -2120,20 +2125,20 @@ ], "description": "Symfony Asset Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "a195f83b0ba20e622a5baa726af96826b8f5616b" + "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/a195f83b0ba20e622a5baa726af96826b8f5616b", - "reference": "a195f83b0ba20e622a5baa726af96826b8f5616b", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b0294489a7fbb4f3f39c39efe6f0328cb09731b9", + "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9", "shasum": "" }, "require": { @@ -2179,20 +2184,20 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/cache", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "6e8d978878ae5de705ec9fabbb6011cc18776bc9" + "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/6e8d978878ae5de705ec9fabbb6011cc18776bc9", - "reference": "6e8d978878ae5de705ec9fabbb6011cc18776bc9", + "url": "https://api.github.com/repos/symfony/cache/zipball/b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", + "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", "shasum": "" }, "require": { @@ -2258,7 +2263,7 @@ "caching", "psr6" ], - "time": "2019-12-12T13:03:32+00:00" + "time": "2020-01-10T21:57:37+00:00" }, { "name": "symfony/cache-contracts", @@ -2320,16 +2325,16 @@ }, { "name": "symfony/config", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7f930484966350906185ba0a604728f7898b7ba0" + "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7f930484966350906185ba0a604728f7898b7ba0", - "reference": "7f930484966350906185ba0a604728f7898b7ba0", + "url": "https://api.github.com/repos/symfony/config/zipball/7640c6704f56bf64045066bc5d93fd9d664baa63", + "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63", "shasum": "" }, "require": { @@ -2380,20 +2385,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2019-12-18T13:50:31+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/console", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fe6e3cd889ca64172d7a742a2eb058541404ef47" + "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fe6e3cd889ca64172d7a742a2eb058541404ef47", - "reference": "fe6e3cd889ca64172d7a742a2eb058541404ef47", + "url": "https://api.github.com/repos/symfony/console/zipball/345ab6ecb456b5147ea3b3271d7f1f00aadfd257", + "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257", "shasum": "" }, "require": { @@ -2456,20 +2461,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-12-17T13:20:22+00:00" + "time": "2020-01-19T11:13:19+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "f9dbfbf487d08f60b1c83220edcd16559d1e40a2" + "reference": "5a56807650c7258bbcc4a15a020904958c70247e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f9dbfbf487d08f60b1c83220edcd16559d1e40a2", - "reference": "f9dbfbf487d08f60b1c83220edcd16559d1e40a2", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a56807650c7258bbcc4a15a020904958c70247e", + "reference": "5a56807650c7258bbcc4a15a020904958c70247e", "shasum": "" }, "require": { @@ -2529,20 +2534,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2019-12-19T16:01:11+00:00" + "time": "2020-01-21T08:40:24+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "0bdb2d31741cacacb95130d28fbac939c4d574f2" + "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/0bdb2d31741cacacb95130d28fbac939c4d574f2", - "reference": "0bdb2d31741cacacb95130d28fbac939c4d574f2", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/1eda484039e4460101f945470d28ae6e8bdcf0e5", + "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5", "shasum": "" }, "require": { @@ -2625,20 +2630,20 @@ ], "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", - "time": "2019-12-19T12:10:29+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "0a0a73a0836926898b6fcd6817fe697487a73d97" + "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/0a0a73a0836926898b6fcd6817fe697487a73d97", - "reference": "0a0a73a0836926898b6fcd6817fe697487a73d97", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/439c3c7be4daa569deef0dd1e30cf3562108d062", + "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062", "shasum": "" }, "require": { @@ -2686,20 +2691,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/dotenv", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "7e1bc9024edd9157264e388080df2533306894d3" + "reference": "8331da80cc35fe903db0ff142376d518804ff1b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/7e1bc9024edd9157264e388080df2533306894d3", - "reference": "7e1bc9024edd9157264e388080df2533306894d3", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/8331da80cc35fe903db0ff142376d518804ff1b1", + "reference": "8331da80cc35fe903db0ff142376d518804ff1b1", "shasum": "" }, "require": { @@ -2743,20 +2748,20 @@ "env", "environment" ], - "time": "2019-12-19T16:01:11+00:00" + "time": "2020-01-08T17:33:29+00:00" }, { "name": "symfony/error-handler", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "460863313bd3212d7c38e1b40602cbcfeeeea4a5" + "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/460863313bd3212d7c38e1b40602cbcfeeeea4a5", - "reference": "460863313bd3212d7c38e1b40602cbcfeeeea4a5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/95f64c1d7dfb86a722dc9d278d0edf5176eff16e", + "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e", "shasum": "" }, "require": { @@ -2798,20 +2803,20 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", - "time": "2019-12-16T14:48:47+00:00" + "time": "2020-01-08T17:33:29+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "7b738a51645e10f864cc25c24d232fb03f37b475" + "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7b738a51645e10f864cc25c24d232fb03f37b475", - "reference": "7b738a51645e10f864cc25c24d232fb03f37b475", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4a7a8cdca1120c091b4797f0e5bba69c1e783224", + "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224", "shasum": "" }, "require": { @@ -2868,7 +2873,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-10T21:57:37+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2930,16 +2935,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6" + "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/1d71f670bc5a07b9ccc97dc44f932177a322d4e6", - "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3afadc0f57cd74f86379d073e694b0f2cda2a88c", + "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c", "shasum": "" }, "require": { @@ -2976,20 +2981,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2019-11-26T23:25:11+00:00" + "time": "2020-01-21T08:40:24+00:00" }, { "name": "symfony/finder", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "17874dd8ab9a19422028ad56172fb294287a701b" + "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/17874dd8ab9a19422028ad56172fb294287a701b", - "reference": "17874dd8ab9a19422028ad56172fb294287a701b", + "url": "https://api.github.com/repos/symfony/finder/zipball/4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", "shasum": "" }, "require": { @@ -3025,7 +3030,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/flex", @@ -3078,16 +3083,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "36e51776b231d8e224da4ce4c60079540acd1c55" + "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/36e51776b231d8e224da4ce4c60079540acd1c55", - "reference": "36e51776b231d8e224da4ce4c60079540acd1c55", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", + "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", "shasum": "" }, "require": { @@ -3204,20 +3209,20 @@ ], "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", - "time": "2019-12-17T10:33:13+00:00" + "time": "2020-01-21T08:40:24+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5dd7f6be6e62d86ba6f3154cf40e78936367978b" + "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5dd7f6be6e62d86ba6f3154cf40e78936367978b", - "reference": "5dd7f6be6e62d86ba6f3154cf40e78936367978b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5dc0db5026f2b611cb8910a1f465e95eafd84c2e", + "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e", "shasum": "" }, "require": { @@ -3259,20 +3264,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-12-19T16:01:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "00ce30602f3f690e66a63c327743d7b26c723b2e" + "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/00ce30602f3f690e66a63c327743d7b26c723b2e", - "reference": "00ce30602f3f690e66a63c327743d7b26c723b2e", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", + "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", "shasum": "" }, "require": { @@ -3355,20 +3360,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2019-12-19T18:35:03+00:00" + "time": "2020-01-21T13:29:58+00:00" }, { "name": "symfony/mime", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "0e6a4ced216e49d457eddcefb61132173a876d79" + "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/0e6a4ced216e49d457eddcefb61132173a876d79", - "reference": "0e6a4ced216e49d457eddcefb61132173a876d79", + "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59", + "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59", "shasum": "" }, "require": { @@ -3417,7 +3422,7 @@ "mime", "mime-type" ], - "time": "2019-11-30T14:12:50+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/orm-pack", @@ -3628,16 +3633,16 @@ }, { "name": "symfony/routing", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "120c5fa4f4ef5466cbb510ece8126e0007285301" + "reference": "7da33371d8ecfed6c9d93d87c73749661606f803" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/120c5fa4f4ef5466cbb510ece8126e0007285301", - "reference": "120c5fa4f4ef5466cbb510ece8126e0007285301", + "url": "https://api.github.com/repos/symfony/routing/zipball/7da33371d8ecfed6c9d93d87c73749661606f803", + "reference": "7da33371d8ecfed6c9d93d87c73749661606f803", "shasum": "" }, "require": { @@ -3700,20 +3705,20 @@ "uri", "url" ], - "time": "2019-12-12T13:03:32+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/serializer", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "3cfc478c102f2d3bcf60edd339cd9c3cb446a576" + "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/3cfc478c102f2d3bcf60edd339cd9c3cb446a576", - "reference": "3cfc478c102f2d3bcf60edd339cd9c3cb446a576", + "url": "https://api.github.com/repos/symfony/serializer/zipball/a76fc03e125719ef4ce18522b2347bf103b698d0", + "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0", "shasum": "" }, "require": { @@ -3782,7 +3787,7 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2019-12-16T11:08:25+00:00" + "time": "2020-01-08T17:33:29+00:00" }, { "name": "symfony/service-contracts", @@ -3844,16 +3849,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "d410282956706e0b08681a5527447a8e6b6f421e" + "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/d410282956706e0b08681a5527447a8e6b6f421e", - "reference": "d410282956706e0b08681a5527447a8e6b6f421e", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5d9add8034135b9a5f7b101d1e42c797e7f053e4", + "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4", "shasum": "" }, "require": { @@ -3890,20 +3895,20 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d7bc61d5d335fa9b1b91e14bb16861e8ca50f53a" + "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d7bc61d5d335fa9b1b91e14bb16861e8ca50f53a", - "reference": "d7bc61d5d335fa9b1b91e14bb16861e8ca50f53a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ccb1be566ae15f790020f917f06d1da0b04fe47b", + "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b", "shasum": "" }, "require": { @@ -3965,20 +3970,20 @@ "debug", "dump" ], - "time": "2019-12-18T13:50:31+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "1b9653e68d5b701bf6d9c91bdd3660078c9f4f28" + "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1b9653e68d5b701bf6d9c91bdd3660078c9f4f28", - "reference": "1b9653e68d5b701bf6d9c91bdd3660078c9f4f28", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/960f9ac0fdbd642461ed29d7717aeb2a94d428b9", + "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9", "shasum": "" }, "require": { @@ -4025,20 +4030,20 @@ "instantiate", "serialize" ], - "time": "2019-12-01T08:48:26+00:00" + "time": "2020-01-04T14:08:26+00:00" }, { "name": "symfony/yaml", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "847661e77afa48d99ecfa508e8b60f0b029a19c0" + "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/847661e77afa48d99ecfa508e8b60f0b029a19c0", - "reference": "847661e77afa48d99ecfa508e8b60f0b029a19c0", + "url": "https://api.github.com/repos/symfony/yaml/zipball/69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", + "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", "shasum": "" }, "require": { @@ -4084,26 +4089,75 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-12-10T11:06:55+00:00" + "time": "2020-01-21T11:12:28+00:00" + }, + { + "name": "webimpress/safe-writer", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/webimpress/safe-writer.git", + "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/d03bea3b98abe1d4c8b24cbebf524361ffaafee4", + "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.4.3", + "webimpress/coding-standard": "dev-develop" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev", + "dev-develop": "2.1.x-dev", + "dev-release-1.0": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Webimpress\\SafeWriter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "Tool to write files safely, to avoid race conditions", + "keywords": [ + "concurrent write", + "file writer", + "race condition", + "safe writer", + "webimpress" + ], + "time": "2019-11-27T19:40:53+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.4.0", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "608a35a3b5bcc4214d116603095f8b0c51091592" + "reference": "39e9777c9089351a468f780b01cffa3cb0a42907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/608a35a3b5bcc4214d116603095f8b0c51091592", - "reference": "608a35a3b5bcc4214d116603095f8b0c51091592", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/39e9777c9089351a468f780b01cffa3cb0a42907", + "reference": "39e9777c9089351a468f780b01cffa3cb0a42907", "shasum": "" }, "require": { "doctrine/common": "^2.11", + "doctrine/persistence": "^1.3.3", "php": "^7.2" }, "conflict": { @@ -4114,7 +4168,7 @@ "doctrine/coding-standard": "^6.0", "doctrine/dbal": "^2.5.4", "doctrine/mongodb-odm": "^1.3.0", - "doctrine/orm": "^2.5.4", + "doctrine/orm": "^2.7.0", "phpunit/phpunit": "^7.0" }, "suggest": { @@ -4149,7 +4203,7 @@ "keywords": [ "database" ], - "time": "2019-10-30T20:03:18+00:00" + "time": "2020-01-17T11:11:28+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -4224,12 +4278,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389" + "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", - "reference": "67ac6ea8f4a078c3c9b7aec5d7ae70f098c37389", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", + "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", "shasum": "" }, "conflict": { @@ -4342,7 +4396,7 @@ "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.48", + "studio-42/elfinder": "<2.1.49", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", @@ -4436,20 +4490,20 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2020-01-06T19:16:46+00:00" + "time": "2020-01-20T14:23:18+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.0.2", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7" + "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/010cf42a81e7bec744edfdef5f76d6394f4906a7", - "reference": "010cf42a81e7bec744edfdef5f76d6394f4906a7", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7f835941a01bea2d03776451c9e42c2a2da6c34c", + "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c", "shasum": "" }, "require": { @@ -4501,7 +4555,7 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2019-11-28T14:20:16+00:00" + "time": "2020-01-21T08:40:24+00:00" } ], "aliases": [], diff --git a/config/custom/source.yaml b/config/custom/source.yaml index c442556..085d101 100644 --- a/config/custom/source.yaml +++ b/config/custom/source.yaml @@ -1,47 +1,47 @@ -- https://www.celestrak.com/NORAD/elements/tle-new.txt -- https://www.celestrak.com/NORAD/elements/stations.txt -- https://www.celestrak.com/NORAD/elements/visual.txt -- https://www.celestrak.com/NORAD/elements/active.txt -- https://www.celestrak.com/NORAD/elements/analyst.txt -- https://www.celestrak.com/NORAD/elements/1999-025.txt -- https://www.celestrak.com/NORAD/elements/iridium-33-debris.txt -- https://www.celestrak.com/NORAD/elements/cosmos-2251-debris.txt -- https://www.celestrak.com/NORAD/elements/2012-044.txt -- https://www.celestrak.com/NORAD/elements/weather.txt -- https://www.celestrak.com/NORAD/elements/noaa.txt -- https://www.celestrak.com/NORAD/elements/goes.txt -- https://www.celestrak.com/NORAD/elements/resource.txt -- https://www.celestrak.com/NORAD/elements/sarsat.txt -- https://www.celestrak.com/NORAD/elements/dmc.txt -- https://www.celestrak.com/NORAD/elements/tdrss.txt -- https://www.celestrak.com/NORAD/elements/argos.txt -- https://www.celestrak.com/NORAD/elements/planet.txt -- https://www.celestrak.com/NORAD/elements/spire.txt -- https://www.celestrak.com/NORAD/elements/geo.txt -- https://www.celestrak.com/NORAD/elements/intelsat.txt -- https://www.celestrak.com/NORAD/elements/ses.txt -- https://www.celestrak.com/NORAD/elements/iridium.txt -- https://www.celestrak.com/NORAD/elements/iridium-NEXT.txt -- https://www.celestrak.com/NORAD/elements/orbcomm.txt -- https://www.celestrak.com/NORAD/elements/globalstar.txt -- https://www.celestrak.com/NORAD/elements/amateur.txt -- https://www.celestrak.com/NORAD/elements/x-comm.txt -- https://www.celestrak.com/NORAD/elements/other-comm.txt -- https://www.celestrak.com/NORAD/elements/gorizont.txt -- https://www.celestrak.com/NORAD/elements/raduga.txt -- https://www.celestrak.com/NORAD/elements/molniya.txt -- https://www.celestrak.com/NORAD/elements/gps-ops.txt -- https://www.celestrak.com/NORAD/elements/glo-ops.txt -- https://www.celestrak.com/NORAD/elements/galileo.txt -- https://www.celestrak.com/NORAD/elements/beidou.txt -- https://www.celestrak.com/NORAD/elements/sbas.txt -- https://www.celestrak.com/NORAD/elements/nnss.txt -- https://www.celestrak.com/NORAD/elements/musson.txt -- https://www.celestrak.com/NORAD/elements/science.txt -- https://www.celestrak.com/NORAD/elements/geodetic.txt -- https://www.celestrak.com/NORAD/elements/engineering.txt -- https://www.celestrak.com/NORAD/elements/education.txt -- https://www.celestrak.com/NORAD/elements/military.txt -- https://www.celestrak.com/NORAD/elements/radar.txt -- https://www.celestrak.com/NORAD/elements/cubesat.txt +- https://www.celestrak.com/NORAD/elements/tle-new.txt +- https://www.celestrak.com/NORAD/elements/stations.txt +- https://www.celestrak.com/NORAD/elements/visual.txt +- https://www.celestrak.com/NORAD/elements/active.txt +- https://www.celestrak.com/NORAD/elements/analyst.txt +- https://www.celestrak.com/NORAD/elements/1999-025.txt +- https://www.celestrak.com/NORAD/elements/iridium-33-debris.txt +- https://www.celestrak.com/NORAD/elements/cosmos-2251-debris.txt +- https://www.celestrak.com/NORAD/elements/2012-044.txt +- https://www.celestrak.com/NORAD/elements/weather.txt +- https://www.celestrak.com/NORAD/elements/noaa.txt +- https://www.celestrak.com/NORAD/elements/goes.txt +- https://www.celestrak.com/NORAD/elements/resource.txt +- https://www.celestrak.com/NORAD/elements/sarsat.txt +- https://www.celestrak.com/NORAD/elements/dmc.txt +- https://www.celestrak.com/NORAD/elements/tdrss.txt +- https://www.celestrak.com/NORAD/elements/argos.txt +- https://www.celestrak.com/NORAD/elements/planet.txt +- https://www.celestrak.com/NORAD/elements/spire.txt +- https://www.celestrak.com/NORAD/elements/geo.txt +- https://www.celestrak.com/NORAD/elements/intelsat.txt +- https://www.celestrak.com/NORAD/elements/ses.txt +- https://www.celestrak.com/NORAD/elements/iridium.txt +- https://www.celestrak.com/NORAD/elements/iridium-NEXT.txt +- https://www.celestrak.com/NORAD/elements/orbcomm.txt +- https://www.celestrak.com/NORAD/elements/globalstar.txt +- https://www.celestrak.com/NORAD/elements/amateur.txt +- https://www.celestrak.com/NORAD/elements/x-comm.txt +- https://www.celestrak.com/NORAD/elements/other-comm.txt +- https://www.celestrak.com/NORAD/elements/gorizont.txt +- https://www.celestrak.com/NORAD/elements/raduga.txt +- https://www.celestrak.com/NORAD/elements/molniya.txt +- https://www.celestrak.com/NORAD/elements/gps-ops.txt +- https://www.celestrak.com/NORAD/elements/glo-ops.txt +- https://www.celestrak.com/NORAD/elements/galileo.txt +- https://www.celestrak.com/NORAD/elements/beidou.txt +- https://www.celestrak.com/NORAD/elements/sbas.txt +- https://www.celestrak.com/NORAD/elements/nnss.txt +- https://www.celestrak.com/NORAD/elements/musson.txt +- https://www.celestrak.com/NORAD/elements/science.txt +- https://www.celestrak.com/NORAD/elements/geodetic.txt +- https://www.celestrak.com/NORAD/elements/engineering.txt +- https://www.celestrak.com/NORAD/elements/education.txt +- https://www.celestrak.com/NORAD/elements/military.txt +- https://www.celestrak.com/NORAD/elements/radar.txt +- https://www.celestrak.com/NORAD/elements/cubesat.txt - https://www.celestrak.com/NORAD/elements/other.txt \ No newline at end of file diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 1c29db5..7a269f6 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -1,130 +1,130 @@ -serializer = $serializer; - } - - /** - * @required - * - * @param RouterInterface $router - */ - public function setRouter(RouterInterface $router): void - { - $this->router = $router; - } - - public function getPage(Request $request): int - { - return (int)$request->get(self::PAGE_PARAM, 1); - } - - public function getPageOffset(int $page, int $pageSize): int - { - $offset = 0; - if ($page > 1) { - $offset = ($page - 1) * $pageSize; - } - - return $offset; - } - - public function getPagination(Request $request, int $total, int $pageSize): array - { - $params = $request->query->all(); - - $page = $this->getPage($request); - $pages = max(1, ceil($total / $pageSize)); - - $nextPage = $page; - if ($page < $pages) { - $nextPage = $page + 1; - } - - $previousPage = $page; - if ($page > 1) { - $previousPage = $page - 1; - } - - $result = [ - '@id' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $page]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - '@type' => 'PartialCollectionView', - 'first' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => 1]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'previous' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $previousPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'next' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $nextPage]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - 'last' => $this->router->generate( - $request->attributes->get('_route'), - array_merge($params, ['page' => $pages]), - UrlGeneratorInterface::ABSOLUTE_URL - ), - ]; - - if ($page === 1) { - unset($result['previous']); - } - - if ($page === $nextPage) { - unset($result['next']); - } - - return $result; - } - - public function response($response): Response - { - return new Response( - $this->serializer->serialize($response, 'json'), - Response::HTTP_OK, - [ - 'Content-type' => 'application/json', - 'Access-Control-Allow-Origin' => '*', - ] - ); - } -} +serializer = $serializer; + } + + /** + * @required + * + * @param RouterInterface $router + */ + public function setRouter(RouterInterface $router): void + { + $this->router = $router; + } + + public function getPage(Request $request): int + { + return (int)$request->get(self::PAGE_PARAM, 1); + } + + public function getPageOffset(int $page, int $pageSize): int + { + $offset = 0; + if ($page > 1) { + $offset = ($page - 1) * $pageSize; + } + + return $offset; + } + + public function getPagination(Request $request, int $total, int $pageSize): array + { + $params = $request->query->all(); + + $page = $this->getPage($request); + $pages = max(1, ceil($total / $pageSize)); + + $nextPage = $page; + if ($page < $pages) { + $nextPage = $page + 1; + } + + $previousPage = $page; + if ($page > 1) { + $previousPage = $page - 1; + } + + $result = [ + '@id' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $page]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + '@type' => 'PartialCollectionView', + 'first' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => 1]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'previous' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $previousPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'next' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $nextPage]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + 'last' => $this->router->generate( + $request->attributes->get('_route'), + array_merge($params, ['page' => $pages]), + UrlGeneratorInterface::ABSOLUTE_URL + ), + ]; + + if ($page === 1) { + unset($result['previous']); + } + + if ($page === $nextPage) { + unset($result['next']); + } + + return $result; + } + + public function response($response): Response + { + return new Response( + $this->serializer->serialize($response, 'json'), + Response::HTTP_OK, + [ + 'Content-type' => 'application/json', + 'Access-Control-Allow-Origin' => '*', + ] + ); + } +} diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index d9baea1..f08d331 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -1,84 +1,84 @@ -findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - return $this->response($tle); - } - - /** - * @Route(name="tle_collection") - */ - public function collection(Request $request, TleRepository $repository): Response - { - $this - ->assertParamIsInteger($request, self::PAGE_PARAM) - ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) - ->assertParamIsInteger($request, self::PAGE_SIZE_PARAM) - ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) - ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) - ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) - ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); - - $search = $request->get(self::SEARCH_PARAM); - $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); - $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); - $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); - - $collection = $repository->collection( - $search, - $sort, - $sortDir, - $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize) - ); - - return $this->response( - [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', - '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $collection->getTotal(), - 'member' => $collection->getCollection(), - 'parameters' => [ - self::SEARCH_PARAM => $search ?? '*', - self::SORT_PARAM => $sort, - self::SORT_DIR_PARAM => $sortDir, - self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $pageSize, - ], - 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), - ] - ); - } -} +findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $this->response($tle); + } + + /** + * @Route(name="tle_collection") + */ + public function collection(Request $request, TleRepository $repository): Response + { + $this + ->assertParamIsInteger($request, self::PAGE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) + ->assertParamIsInteger($request, self::PAGE_SIZE_PARAM) + ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) + ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) + ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) + ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + + $search = $request->get(self::SEARCH_PARAM); + $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); + + $collection = $repository->collection( + $search, + $sort, + $sortDir, + $pageSize, + $this->getPageOffset($this->getPage($request), $pageSize) + ); + + return $this->response( + [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => $collection->getTotal(), + 'member' => $collection->getCollection(), + 'parameters' => [ + self::SEARCH_PARAM => $search ?? '*', + self::SORT_PARAM => $sort, + self::SORT_DIR_PARAM => $sortDir, + self::PAGE_PARAM => $this->getPage($request), + self::PAGE_SIZE_PARAM => $pageSize, + ], + 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), + ] + ); + } +} diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index e99095b..b50bd63 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -1,81 +1,81 @@ -get($name); - - if ($param === null) { - return $this; - } - - if (!preg_match('/^\d+$/', $param)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be integer.', $name) - ); - } - - return $this; - } - - protected function assertParamIsGreaterThan(Request $request, string $name, float $value): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!($param > $value)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be greater than %d.', $name, $value) - ); - } - - return $this; - } - - protected function assertParamIsLessThan(Request $request, string $name, float $value): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!($param <= $value)) { - throw new BadRequestHttpException( - \sprintf('Parameter \'%s\' must be less than %d.', $name, $value) - ); - } - - return $this; - } - - protected function assertParamInEnum(Request $request, string $name, array $values): self - { - $param = $request->get($name); - - if ($param === null) { - return $this; - } - - if (!\in_array($param, $values, true)) { - throw new BadRequestHttpException( - \sprintf( - 'Parameter \'%s\' must be one of the following: %s', - $name, - '\'' . implode('\', \'', $values) . '\'', - ) - ); - } - - return $this; - } +get($name); + + if ($param === null) { + return $this; + } + + if (!preg_match('/^\d+$/', $param)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be integer.', $name) + ); + } + + return $this; + } + + protected function assertParamIsGreaterThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param > $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be greater than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamIsLessThan(Request $request, string $name, float $value): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!($param <= $value)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be less than %d.', $name, $value) + ); + } + + return $this; + } + + protected function assertParamInEnum(Request $request, string $name, array $values): self + { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!\in_array($param, $values, true)) { + throw new BadRequestHttpException( + \sprintf( + 'Parameter \'%s\' must be one of the following: %s', + $name, + '\'' . implode('\', \'', $values) . '\'', + ) + ); + } + + return $this; + } } \ No newline at end of file diff --git a/src/ViewModel/SortDirectionEnum.php b/src/ViewModel/SortDirectionEnum.php index 9c18548..33b65d1 100644 --- a/src/ViewModel/SortDirectionEnum.php +++ b/src/ViewModel/SortDirectionEnum.php @@ -1,11 +1,11 @@ - 1, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=1&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'next' => 'http://localhost/api/tle?page=2&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ], - [ - 'page' => 3, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=3&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=2&page-size=2', - 'next' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ], - [ - 'page' => 5, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=5&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ], - [ - 'page' => 7, - 'expected' => [ - '@id' => 'http://localhost/api/tle?page=7&page-size=2', - '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=6&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' - ] - ] - ]; - - public function testPaginationWorks(): void - { - foreach (self::TEST as $test) { - $response = $this->getCollectionContent($test['page'], 2); - - self::assertArrayHasKey('view', $response); - - $this->assertViewIsCorrect( - $test['expected'], - $response['view'] - ); - } - } - - public function testPaginationError(): void - { - $response = $this->getCollection(-1, 2); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page -1' - ); - - $response = $this->getCollection(0, 2); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page 0' - ); - - $response = $this->getCollection(1, -1); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page size -1' - ); - - $response = $this->getCollection(1, 0); - self::assertEquals( - Response::HTTP_BAD_REQUEST, - $response->getStatusCode(), - 'Assert HTTP 400 is returned for page size 0' - ); - } - - private function assertViewIsCorrect($expected, $actual): void - { - foreach ($actual as $key => $value) { - self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); - self::assertEquals($value, $expected[$key], \sprintf('Assert value of key %s is correct', $key)); - } - } - - private function getCollectionContent(int $page, int $pageSize): array - { - return $this->toArray( - $this->getCollection($page, $pageSize) - ); - } - - private function getCollection(int $page, int $pageSize): Response - { - return $this->get( - '/api/tle', - [ - 'page' => $page, - 'page-size' => $pageSize, - ] - ); - } + 1, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=1&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'next' => 'http://localhost/api/tle?page=2&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ], + [ + 'page' => 3, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=3&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle?page=2&page-size=2', + 'next' => 'http://localhost/api/tle?page=4&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ], + [ + 'page' => 5, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=5&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle?page=4&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ], + [ + 'page' => 7, + 'expected' => [ + '@id' => 'http://localhost/api/tle?page=7&page-size=2', + '@type' => 'PartialCollectionView', + 'first' => 'http://localhost/api/tle?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle?page=6&page-size=2', + 'last' => 'http://localhost/api/tle?page=5&page-size=2' + ] + ] + ]; + + public function testPaginationWorks(): void + { + foreach (self::TEST as $test) { + $response = $this->getCollectionContent($test['page'], 2); + + self::assertArrayHasKey('view', $response); + + $this->assertViewIsCorrect( + $test['expected'], + $response['view'] + ); + } + } + + public function testPaginationError(): void + { + $response = $this->getCollection(-1, 2); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page -1' + ); + + $response = $this->getCollection(0, 2); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page 0' + ); + + $response = $this->getCollection(1, -1); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page size -1' + ); + + $response = $this->getCollection(1, 0); + self::assertEquals( + Response::HTTP_BAD_REQUEST, + $response->getStatusCode(), + 'Assert HTTP 400 is returned for page size 0' + ); + } + + private function assertViewIsCorrect($expected, $actual): void + { + foreach ($actual as $key => $value) { + self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); + self::assertEquals($value, $expected[$key], \sprintf('Assert value of key %s is correct', $key)); + } + } + + private function getCollectionContent(int $page, int $pageSize): array + { + return $this->toArray( + $this->getCollection($page, $pageSize) + ); + } + + private function getCollection(int $page, int $pageSize): Response + { + return $this->get( + '/api/tle', + [ + 'page' => $page, + 'page-size' => $pageSize, + ] + ); + } } \ No newline at end of file diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index 7ea6b5f..64be291 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -1,37 +1,37 @@ -get('/api/tle.json'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); - - $response = $this->toArray($response); - - $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; - $paginationSchema = $response['components']['schemas']['Pagination']['properties']; - $tleSchema = $response['components']['schemas']['TLE']['allOf'][0]['properties']; - - $tle = TleFixtures::create(); - - $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); - - self::assertCount(\count($tleSchema), $response); - self::assertEquals(array_keys($tleSchema), array_keys($response)); - - $response = $this->toArray($this->get('/api/tle', ['page-size' => 2, 'page' => 2])); - - self::assertCount(\count($paginationSchema), $response['view']); - self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); - - self::assertCount(\count($response), $collectionSchema); - self::assertEquals(array_keys($response), array_keys($collectionSchema)); - } +get('/api/tle.json'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); + + $response = $this->toArray($response); + + $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; + $paginationSchema = $response['components']['schemas']['Pagination']['properties']; + $tleSchema = $response['components']['schemas']['TLE']['allOf'][0]['properties']; + + $tle = TleFixtures::create(); + + $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); + + self::assertCount(\count($tleSchema), $response); + self::assertEquals(array_keys($tleSchema), array_keys($response)); + + $response = $this->toArray($this->get('/api/tle', ['page-size' => 2, 'page' => 2])); + + self::assertCount(\count($paginationSchema), $response['view']); + self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); + + self::assertCount(\count($response), $collectionSchema); + self::assertEquals(array_keys($response), array_keys($collectionSchema)); + } } \ No newline at end of file diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index 6a6f186..6e53d75 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -1,27 +1,27 @@ -get('/noop'); - - self::assertEquals( - $response->getStatusCode(), - Response::HTTP_NOT_FOUND, - 'Assert page not found returns HTTP 404' - ); - - $response = $this->toArray($response); - - self::assertEquals( - 'No route found for "GET /noop"', - $response['response']['message'], - 'Assert correct response message' - ); - } +get('/noop'); + + self::assertEquals( + $response->getStatusCode(), + Response::HTTP_NOT_FOUND, + 'Assert page not found returns HTTP 404' + ); + + $response = $this->toArray($response); + + self::assertEquals( + 'No route found for "GET /noop"', + $response['response']['message'], + 'Assert correct response message' + ); + } } \ No newline at end of file From 7d1aa25676e2d13cb9b133bf893375989c522214 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Oct 2020 16:04:12 +0100 Subject: [PATCH 038/151] add docs --- composer.json | 24 +- composer.lock | 3303 ++++++++++++++++++++++++------ config/bundles.php | 2 + config/custom/tle.json | 4 +- config/packages/test/twig.yaml | 2 + config/packages/twig.yaml | 2 + deploy.php | 3 +- docs/logo192.png | Bin 12929 -> 0 bytes docs/logo512.png | Bin 36838 -> 0 bytes src/Controller/ApiController.php | 8 + symfony.lock | 50 + templates/docs.html.twig | 36 + 12 files changed, 2737 insertions(+), 697 deletions(-) create mode 100644 config/packages/test/twig.yaml create mode 100644 config/packages/twig.yaml delete mode 100644 docs/logo192.png delete mode 100644 docs/logo512.png create mode 100644 templates/docs.html.twig diff --git a/composer.json b/composer.json index 58f4eb1..c6b4974 100644 --- a/composer.json +++ b/composer.json @@ -9,20 +9,23 @@ "ivanstan/tle-php": "^1.0", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.0.*", - "symfony/browser-kit": "5.0.*", - "symfony/console": "5.0.*", - "symfony/dotenv": "5.0.*", + "symfony/asset": "5.1.*", + "symfony/browser-kit": "5.1.*", + "symfony/console": "5.1.*", + "symfony/dotenv": "5.1.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.0.*", + "symfony/framework-bundle": "5.1.*", "symfony/orm-pack": "^1.0", - "symfony/serializer": "5.0.*", - "symfony/yaml": "5.0.*" + "symfony/serializer": "5.1.*", + "symfony/twig-bundle": "5.1.*", + "symfony/yaml": "5.1.*", + "twig/extra-bundle": "^2.12|^3.0", + "twig/twig": "^2.12|^3.0" }, "require-dev": { "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0" + "symfony/phpunit-bridge": "^5.1" }, "config": { "preferred-install": { @@ -61,7 +64,8 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "@php bin/phpunit --coverage-text" + "test": "@php bin/phpunit --coverage-text", + "deploy": "dep deploy" }, "conflict": { "symfony/symfony": "*" @@ -70,7 +74,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.0.*" + "require": "5.1.*" } } } diff --git a/composer.lock b/composer.lock index 49a4264..5e152cc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,34 +4,110 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e147328d3b45617aa4be85dc153b6b38", + "content-hash": "bf6c5c44873f54ab888176739539d99b", "packages": [ + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", + "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/master" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-08-25T05:50:16+00:00" + }, { "name": "doctrine/annotations", - "version": "v1.8.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/88fb6fb1dae011de24dd6b632811c1ff5c2928f5", + "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": "^7.1" + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { @@ -66,30 +142,34 @@ } ], "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", "keywords": [ "annotations", "docblock", "parser" ], - "time": "2019-10-01T18:55:10+00:00" + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.11.0" + }, + "time": "2020-10-17T22:05:33+00:00" }, { "name": "doctrine/cache", - "version": "1.10.0", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62" + "reference": "13e3381b25847283a91948d04640543941309727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/382e7f4db9a12dc6c19431743a2b096041bcdd62", - "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62", + "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", + "reference": "13e3381b25847283a91948d04640543941309727", "shasum": "" }, "require": { - "php": "~7.1" + "php": "~7.1 || ^8.0" }, "conflict": { "doctrine/common": ">2.2,<2.4" @@ -154,37 +234,50 @@ "redis", "xcache" ], - "time": "2019-11-29T15:36:20+00:00" + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/1.10.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2020-07-07T18:54:01+00:00" }, { "name": "doctrine/collections", - "version": "1.6.4", + "version": "1.6.7", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7" + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", - "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", + "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": "^7.1.3 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", "phpstan/phpstan-shim": "^0.9.2", "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.2.2" + "vimeo/psalm": "^3.8.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" @@ -224,20 +317,24 @@ "iterators", "php" ], - "time": "2019-11-13T13:07:11+00:00" + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/1.6.7" + }, + "time": "2020-07-27T17:53:49+00:00" }, { "name": "doctrine/common", - "version": "2.12.0", + "version": "2.13.3", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6" + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", - "reference": "2053eafdf60c2172ee1373d1b9289ba1db7f1fc6", + "url": "https://api.github.com/repos/doctrine/common/zipball/f3812c026e557892c34ef37f6ab808a6b567da7f", + "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f", "shasum": "" }, "require": { @@ -247,9 +344,9 @@ "doctrine/event-manager": "^1.0", "doctrine/inflector": "^1.0", "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.1", + "doctrine/persistence": "^1.3.3", "doctrine/reflection": "^1.0", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^1.0", @@ -307,34 +404,54 @@ "doctrine", "php" ], - "time": "2020-01-10T15:49:25+00:00" + "support": { + "issues": "https://github.com/doctrine/common/issues", + "source": "https://github.com/doctrine/common/tree/2.13.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", + "type": "tidelift" + } + ], + "time": "2020-06-05T16:46:05+00:00" }, { "name": "doctrine/dbal", - "version": "v2.10.1", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8" + "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", - "reference": "c2b8e6e82732a64ecde1cddf9e1e06cb8556e3d8", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c6d37b4c42aaa3c3ee175f05eca68056f4185646", + "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646", "shasum": "" }, "require": { "doctrine/cache": "^1.0", "doctrine/event-manager": "^1.0", "ext-pdo": "*", - "php": "^7.2" + "php": "^7.3 || ^8" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.1", "jetbrains/phpstorm-stubs": "^2019.1", - "phpstan/phpstan": "^0.11.3", - "phpunit/phpunit": "^8.4.1", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0" + "phpstan/phpstan": "^0.12.40", + "phpunit/phpunit": "^9.4", + "psalm/plugin-phpunit": "^0.10.0", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "^3.17.2" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -345,8 +462,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.10.x-dev", - "dev-develop": "3.0.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -399,27 +515,45 @@ "sqlserver", "sqlsrv" ], - "time": "2020-01-04T12:56:21+00:00" + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.12.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2020-10-22T17:26:24+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.0.7", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "6926771140ee87a823c3b2c72602de9dda4490d3" + "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/6926771140ee87a823c3b2c72602de9dda4490d3", - "reference": "6926771140ee87a823c3b2c72602de9dda4490d3", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f5153089993e1230f5d8acbd8e126014d5a63e17", + "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17", "shasum": "" }, "require": { - "doctrine/dbal": "^2.9.0", - "doctrine/persistence": "^1.3.3", - "jdorn/sql-formatter": "^1.2.16", - "php": "^7.1", + "doctrine/dbal": "^2.9.0|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "doctrine/sql-formatter": "^1.0.1", + "php": "^7.1 || ^8.0", "symfony/cache": "^4.3.3|^5.0", "symfony/config": "^4.3.3|^5.0", "symfony/console": "^3.4.30|^4.3.3|^5.0", @@ -453,7 +587,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -491,20 +625,38 @@ "orm", "persistence" ], - "time": "2020-01-18T11:56:15+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineBundle/issues", + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.1.2" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", + "type": "tidelift" + } + ], + "time": "2020-08-25T10:57:15+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.1.2", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d" + "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/856437e8de96a70233e1f0cc2352fc8dd15a899d", - "reference": "856437e8de96a70233e1f0cc2352fc8dd15a899d", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5efa29df768abaafe29b34e73dac68efbedcaa4d", + "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d", "shasum": "" }, "require": { @@ -559,24 +711,42 @@ "migrations", "schema" ], - "time": "2019-11-13T12:57:41+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle", + "type": "tidelift" + } + ], + "time": "2020-06-25T19:36:08+00:00" }, { "name": "doctrine/event-manager", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/event-manager.git", - "reference": "629572819973f13486371cb611386eb17851e85c" + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", - "reference": "629572819973f13486371cb611386eb17851e85c", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9@dev" @@ -635,37 +805,60 @@ "event system", "events" ], - "time": "2019-11-10T09:48:07+00:00" + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2020-05-29T18:28:51+00:00" }, { "name": "doctrine/inflector", - "version": "1.3.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1" + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1", - "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", + "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -694,32 +887,56 @@ "email": "schmittjoh@gmail.com" } ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", "keywords": [ "inflection", - "pluralize", - "singularize", - "string" + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/1.4.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } ], - "time": "2019-10-30T19:59:35+00:00" + "time": "2020-05-29T07:19:59+00:00" }, { "name": "doctrine/instantiator", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", @@ -758,24 +975,42 @@ "constructor", "instantiate" ], - "time": "2019-10-21T16:45:58+00:00" + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-05-29T17:27:14+00:00" }, { "name": "doctrine/lexer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", - "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^6.0", @@ -820,7 +1055,25 @@ "parser", "php" ], - "time": "2019-10-30T14:39:59+00:00" + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" }, { "name": "doctrine/migrations", @@ -902,39 +1155,48 @@ "migrations", "php" ], + "support": { + "issues": "https://github.com/doctrine/migrations/issues", + "source": "https://github.com/doctrine/migrations/tree/2.2.x" + }, "time": "2019-12-04T06:09:14+00:00" }, { "name": "doctrine/orm", - "version": "v2.7.0", + "version": "2.7.4", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "4d763ca4c925f647b248b9fa01b5f47aa3685d62" + "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/4d763ca4c925f647b248b9fa01b5f47aa3685d62", - "reference": "4d763ca4c925f647b248b9fa01b5f47aa3685d62", + "url": "https://api.github.com/repos/doctrine/orm/zipball/7d84a4998091ece4d645253ac65de9f879eeed2f", + "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f", "shasum": "" }, "require": { + "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "^1.8", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", - "doctrine/common": "^2.11", + "doctrine/common": "^2.11 || ^3.0", "doctrine/dbal": "^2.9.3", "doctrine/event-manager": "^1.1", + "doctrine/inflector": "^1.0", "doctrine/instantiator": "^1.3", - "doctrine/persistence": "^1.2", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.3.3 || ^2.0", "ext-pdo": "*", "php": "^7.1", "symfony/console": "^3.0|^4.0|^5.0" }, "require-dev": { "doctrine/coding-standard": "^5.0", + "phpstan/phpstan": "^0.12.18", "phpunit/phpunit": "^7.5", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/yaml": "^3.4|^4.0|^5.0", + "vimeo/psalm": "^3.11" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" @@ -985,20 +1247,24 @@ "database", "orm" ], - "time": "2019-11-19T08:38:05+00:00" + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/2.7.4" + }, + "time": "2020-10-10T17:11:26+00:00" }, { "name": "doctrine/persistence", - "version": "1.3.6", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4" + "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/5dd3ac5eebef2d0b074daa4440bb18f93132dee4", - "reference": "5dd3ac5eebef2d0b074daa4440bb18f93132dee4", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/7a6eac9fb6f61bba91328f15aa7547f4806ca288", + "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288", "shasum": "" }, "require": { @@ -1006,8 +1272,8 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.1", - "php": "^7.1" + "doctrine/reflection": "^1.2", + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.10@dev" @@ -1015,7 +1281,8 @@ "require-dev": { "doctrine/coding-standard": "^6.0", "phpstan/phpstan": "^0.11", - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^3.11" }, "type": "library", "extra": { @@ -1068,20 +1335,38 @@ "orm", "persistence" ], - "time": "2020-01-16T22:06:23+00:00" + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/1.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2020-06-20T12:56:16+00:00" }, { "name": "doctrine/reflection", - "version": "v1.1.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c" + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/bc420ead87fdfe08c03ecc3549db603a45b06d4c", - "reference": "bc420ead87fdfe08c03ecc3549db603a45b06d4c", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", "shasum": "" }, "require": { @@ -1102,7 +1387,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -1146,27 +1431,89 @@ "reflection", "static" ], - "time": "2020-01-08T19:53:19+00:00" + "support": { + "issues": "https://github.com/doctrine/reflection/issues", + "source": "https://github.com/doctrine/reflection/tree/1.2.x" + }, + "time": "2020-03-27T11:06:43+00:00" + }, + { + "name": "doctrine/sql-formatter", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/sql-formatter.git", + "reference": "56070bebac6e77230ed7d306ad13528e60732871" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", + "reference": "56070bebac6e77230ed7d306ad13528e60732871", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "bin": [ + "bin/sql-formatter" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\SqlFormatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/doctrine/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "support": { + "issues": "https://github.com/doctrine/sql-formatter/issues", + "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" + }, + "time": "2020-07-30T16:57:33+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.5.2", + "version": "6.5.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5" + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" }, "require-dev": { "ext-curl": "*", @@ -1174,7 +1521,6 @@ "psr/log": "^1.1" }, "suggest": { - "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", @@ -1213,27 +1559,31 @@ "rest", "web service" ], - "time": "2019-12-23T11:57:10+00:00" + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, + "time": "2020-06-16T21:01:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "v1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "reference": "60d379c243457e073cff02bc323a2a86cb355631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", + "reference": "60d379c243457e073cff02bc323a2a86cb355631", "shasum": "" }, "require": { - "php": ">=5.5.0" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", "extra": { @@ -1264,20 +1614,24 @@ "keywords": [ "promise" ], - "time": "2016-12-20T10:07:11+00:00" + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.0" + }, + "time": "2020-09-30T07:37:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", "shasum": "" }, "require": { @@ -1290,15 +1644,15 @@ }, "require-dev": { "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" }, "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -1335,7 +1689,11 @@ "uri", "url" ], - "time": "2019-07-01T23:21:34+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.7.0" + }, + "time": "2020-09-30T07:37:11+00:00" }, { "name": "ivanstan/tle-php", @@ -1376,57 +1734,11 @@ } ], "description": "TLE Framework written in PHP and client to NASA TLE API.", - "time": "2020-01-08T10:08:36+00:00" - }, - { - "name": "jdorn/sql-formatter", - "version": "v1.2.17", - "source": { - "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", - "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" + "support": { + "issues": "https://github.com/ivanstan/tle-php/issues", + "source": "https://github.com/ivanstan/tle-php/tree/1.0" }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "lib" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "time": "2014-01-12T16:20:24+00:00" + "time": "2020-01-08T10:08:36+00:00" }, { "name": "laminas/laminas-code", @@ -1487,45 +1799,53 @@ "code", "laminas" ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, "time": "2019-12-31T16:28:24+00:00" }, { "name": "laminas/laminas-eventmanager", - "version": "3.2.1", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-eventmanager.git", - "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748" + "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", - "reference": "ce4dc0bdf3b14b7f9815775af9dfee80a63b4748", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1940ccf30e058b2fd66f5a9d696f1b5e0027b082", + "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082", "shasum": "" }, "require": { "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0" + "php": "^7.3 || ^8.0" }, "replace": { - "zendframework/zend-eventmanager": "self.version" + "zendframework/zend-eventmanager": "^3.2.1" }, "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", + "container-interop/container-interop": "^1.1", "laminas/laminas-coding-standard": "~1.0.0", "laminas/laminas-stdlib": "^2.7.3 || ^3.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" + "phpbench/phpbench": "^0.17.1", + "phpunit/phpunit": "^8.5.8" }, "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "container-interop/container-interop": "^1.1, to use the lazy listeners feature", "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev", - "dev-develop": "3.3-dev" + "dev-master": "3.3.x-dev", + "dev-develop": "3.4.x-dev" } }, "autoload": { @@ -1545,35 +1865,45 @@ "events", "laminas" ], - "time": "2019-12-31T16:44:52+00:00" - }, + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-eventmanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-eventmanager/issues", + "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", + "source": "https://github.com/laminas/laminas-eventmanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-08-25T11:10:44+00:00" + }, { "name": "laminas/laminas-zendframework-bridge", - "version": "1.0.1", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d" + "reference": "6ede70583e101030bcace4dcddd648f760ddf642" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/0fb9675b84a1666ab45182b6c5b29956921e818d", - "reference": "0fb9675b84a1666ab45182b6c5b29956921e818d", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", + "reference": "6ede70583e101030bcace4dcddd648f760ddf642", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^5.6 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev", - "dev-develop": "1.1.x-dev" - }, "laminas": { "module": "Laminas\\ZendFrameworkBridge" } @@ -1597,20 +1927,32 @@ "laminas", "zf" ], - "time": "2020-01-07T22:58:31+00:00" + "support": { + "forum": "https://discourse.laminas.dev/", + "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", + "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", + "source": "https://github.com/laminas/laminas-zendframework-bridge" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-09-14T14:23:00+00:00" }, { "name": "myclabs/php-enum", - "version": "1.7.2", + "version": "1.7.6", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "45f01adf6922df6082bcda36619deb466e826acf" + "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/45f01adf6922df6082bcda36619deb466e826acf", - "reference": "45f01adf6922df6082bcda36619deb466e826acf", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/5f36467c7a87e20fbdc51e524fd8f9d1de80187c", + "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c", "shasum": "" }, "require": { @@ -1618,8 +1960,9 @@ "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35|^5.7|^6.0", - "squizlabs/php_codesniffer": "1.*" + "phpunit/phpunit": "^7", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^3.8" }, "type": "library", "autoload": { @@ -1642,78 +1985,31 @@ "keywords": [ "enum" ], - "time": "2019-08-19T13:53:00+00:00" - }, - { - "name": "ocramius/package-versions", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/PackageVersions.git", - "reference": "1d32342b8c1eb27353c8887c366147b4c2da673c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/1d32342b8c1eb27353c8887c366147b4c2da673c", - "reference": "1d32342b8c1eb27353c8887c366147b4c2da673c", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0.0", - "php": "^7.3.0" - }, - "require-dev": { - "composer/composer": "^1.8.6", - "doctrine/coding-standard": "^6.0.0", - "ext-zip": "*", - "infection/infection": "^0.13.4", - "phpunit/phpunit": "^8.2.5", - "vimeo/psalm": "^3.4.9" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/master" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "time": "2019-07-17T15:49:50+00:00" + "time": "2020-02-14T08:15:52+00:00" }, { "name": "ocramius/proxy-manager", - "version": "2.6.0", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9" + "reference": "7452942d38ae36223b0f8408619181f69799eb5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/406ca12cabfb43e3b11c994bcbeea8e358c65af9", - "reference": "406ca12cabfb43e3b11c994bcbeea8e358c65af9", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/7452942d38ae36223b0f8408619181f69799eb5c", + "reference": "7452942d38ae36223b0f8408619181f69799eb5c", "shasum": "" }, "require": { + "composer-runtime-api": "^2.0.0", "laminas/laminas-code": "^3.4.1", - "ocramius/package-versions": "^1.5.1", - "php": "7.4.*", - "webimpress/safe-writer": "^2.0" + "php": "~7.4.1", + "webimpress/safe-writer": "^2.0.1" }, "conflict": { "doctrine/annotations": "<1.6.1", @@ -1721,16 +2017,16 @@ "zendframework/zend-stdlib": "<3.2.1" }, "require-dev": { - "doctrine/coding-standard": "^6.0.0", + "codelicia/xulieta": "^0.1.2", + "doctrine/coding-standard": "^8.1.0", "ext-phar": "*", - "infection/infection": "^0.15.0", - "nikic/php-parser": "^4.3.0", - "phpbench/phpbench": "^0.16.10", - "phpunit/phpunit": "^8.5.1", - "slevomat/coding-standard": "^5.0.4", - "squizlabs/php_codesniffer": "^3.5.3", - "symfony/console": "^4.4.2", - "vimeo/psalm": "3.7.0" + "infection/infection": "^0.16.4", + "nikic/php-parser": "^4.6.0", + "phpbench/phpbench": "^0.17.1", + "phpunit/phpunit": "^9.2.5", + "slevomat/coding-standard": "^6.3.10", + "squizlabs/php_codesniffer": "^3.5.5", + "vimeo/psalm": "^3.12.2" }, "suggest": { "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", @@ -1769,7 +2065,21 @@ "proxy pattern", "service proxies" ], - "time": "2020-01-07T08:10:36+00:00" + "support": { + "issues": "https://github.com/Ocramius/ProxyManager/issues", + "source": "https://github.com/Ocramius/ProxyManager/tree/2.9.1" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2020-08-26T16:19:12+00:00" }, { "name": "psr/cache", @@ -1815,6 +2125,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -1864,6 +2177,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/master" + }, "time": "2017-02-14T16:28:37+00:00" }, { @@ -1910,6 +2227,10 @@ "psr", "psr-14" ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, "time": "2019-01-08T18:20:26+00:00" }, { @@ -1960,20 +2281,23 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -2007,7 +2331,10 @@ "psr", "psr-3" ], - "time": "2019-11-01T11:05:21+00:00" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" }, { "name": "ralouphie/getallheaders", @@ -2047,6 +2374,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -2069,26 +2400,31 @@ "MIT" ], "description": "A pack for Apache support in Symfony", + "support": { + "issues": "https://github.com/symfony/apache-pack/issues", + "source": "https://github.com/symfony/apache-pack/tree/master" + }, "time": "2017-12-12T01:46:35+00:00" }, { "name": "symfony/asset", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "447190a24309da88f816313824d85c303035f86b" + "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/447190a24309da88f816313824d85c303035f86b", - "reference": "447190a24309da88f816313824d85c303035f86b", + "url": "https://api.github.com/repos/symfony/asset/zipball/ef0bcafce1c14bbf49838b01e990a8bfafd071eb", + "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5" }, "require-dev": { + "symfony/http-client": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0" }, @@ -2098,7 +2434,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2125,24 +2461,41 @@ ], "description": "Symfony Asset Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/asset/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9" + "reference": "8944cc83bb18f83f577225c695d999044e7c62b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b0294489a7fbb4f3f39c39efe6f0328cb09731b9", - "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8944cc83bb18f83f577225c695d999044e7c62b0", + "reference": "8944cc83bb18f83f577225c695d999044e7c62b0", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/dom-crawler": "^4.4|^5.0" }, "require-dev": { @@ -2157,7 +2510,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2184,27 +2537,45 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T08:49:02+00:00" }, { "name": "symfony/cache", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a" + "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", - "reference": "b503e72c8e2fa55eed9e2d3dd6a166f3eaaabb9a", + "url": "https://api.github.com/repos/symfony/cache/zipball/292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", + "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/cache": "~1.0", "psr/log": "~1.0", "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, @@ -2221,9 +2592,9 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "~1.6", - "doctrine/dbal": "~2.5", - "predis/predis": "~1.1", + "doctrine/cache": "^1.6", + "doctrine/dbal": "^2.5|^3.0", + "predis/predis": "^1.1", "psr/simple-cache": "^1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", @@ -2232,7 +2603,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2263,24 +2634,41 @@ "caching", "psr6" ], - "time": "2020-01-10T21:57:37+00:00" + "support": { + "source": "https://github.com/symfony/cache/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:02:37+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.0.1", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16" + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16", - "reference": "23ed8bfc1a4115feca942cb5f1aacdf3dcdf3c16", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/cache": "^1.0" }, "suggest": { @@ -2289,7 +2677,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2321,26 +2713,45 @@ "interoperability", "standards" ], - "time": "2019-11-18T17:27:11+00:00" + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/config", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63" + "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/7640c6704f56bf64045066bc5d93fd9d664baa63", - "reference": "7640c6704f56bf64045066bc5d93fd9d664baa63", + "url": "https://api.github.com/repos/symfony/config/zipball/6ad8be6e1280f6734150d8a04a9160dd34ceb191", + "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/finder": "<4.4" @@ -2358,7 +2769,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2385,30 +2796,50 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/config/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/console", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257" + "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/345ab6ecb456b5147ea3b3271d7f1f00aadfd257", - "reference": "345ab6ecb456b5147ea3b3271d7f1f00aadfd257", + "url": "https://api.github.com/repos/symfony/console/zipball/ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", + "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/service-contracts": "^1.1|^2" + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" }, "conflict": { "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" @@ -2434,7 +2865,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2461,29 +2892,48 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-01-19T11:13:19+00:00" + "support": { + "source": "https://github.com/symfony/console/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-07T15:23:00+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5a56807650c7258bbcc4a15a020904958c70247e" + "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a56807650c7258bbcc4a15a020904958c70247e", - "reference": "5a56807650c7258bbcc4a15a020904958c70247e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2dea4a3ef2eb79138354c1d49e9372cc921af20b", + "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.0", + "symfony/config": "<5.1", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -2493,7 +2943,7 @@ "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "^5.0", + "symfony/config": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -2507,7 +2957,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2534,34 +2984,119 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-01T12:14:45+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5" + "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/1eda484039e4460101f945470d28ae6e8bdcf0e5", - "reference": "1eda484039e4460101f945470d28ae6e8bdcf0e5", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b7369a435a64d06e9036e69ed1cd6ce240338583", + "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^1.3", - "php": "^7.2.5", + "doctrine/persistence": "^1.3|^2", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", - "symfony/form": "<5", + "symfony/form": "<5.1", "symfony/http-kernel": "<5", "symfony/messenger": "<4.4", "symfony/property-info": "<5", @@ -2570,17 +3105,20 @@ "symfony/validator": "<5.0.2" }, "require-dev": { + "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "~1.7", "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.4", + "doctrine/data-fixtures": "^1.1", + "doctrine/dbal": "~2.4|^3.0", "doctrine/orm": "^2.6.3", "doctrine/reflection": "~1.0", + "symfony/cache": "^5.1", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/doctrine-messenger": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.0", + "symfony/form": "^5.1.3", "symfony/http-kernel": "^5.0", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^4.4|^5.0", @@ -2603,7 +3141,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2630,26 +3168,44 @@ ], "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:14:57+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062" + "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/439c3c7be4daa569deef0dd1e30cf3562108d062", - "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6d6885e167aad0af4128b392f22d8f2a33dd88ec", + "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "masterminds/html5": "<2.6" @@ -2664,7 +3220,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2691,24 +3247,42 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/dotenv", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "8331da80cc35fe903db0ff142376d518804ff1b1" + "reference": "f406eaad1231415bf753fbef5aef267a787af4e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/8331da80cc35fe903db0ff142376d518804ff1b1", - "reference": "8331da80cc35fe903db0ff142376d518804ff1b1", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/f406eaad1231415bf753fbef5aef267a787af4e5", + "reference": "f406eaad1231415bf753fbef5aef267a787af4e5", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" }, "require-dev": { "symfony/process": "^4.4|^5.0" @@ -2716,7 +3290,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2748,35 +3322,54 @@ "env", "environment" ], - "time": "2020-01-08T17:33:29+00:00" + "support": { + "source": "https://github.com/symfony/dotenv/tree/5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/error-handler", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e" + "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/95f64c1d7dfb86a722dc9d278d0edf5176eff16e", - "reference": "95f64c1d7dfb86a722dc9d278d0edf5176eff16e", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/5e4d8ef8d71822922d1eebd130219ae3491a5ca9", + "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/log": "^1.0", + "symfony/polyfill-php80": "^1.15", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { + "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2803,25 +3396,44 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", - "time": "2020-01-08T17:33:29+00:00" + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T08:49:02+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224" + "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4a7a8cdca1120c091b4797f0e5bba69c1e783224", - "reference": "4a7a8cdca1120c091b4797f0e5bba69c1e783224", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d5de97d6af175a9e8131c546db054ca32842dd0f", + "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/event-dispatcher-contracts": "^2" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -2834,6 +3446,7 @@ "psr/log": "~1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -2846,7 +3459,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2873,24 +3486,41 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-01-10T21:57:37+00:00" + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-18T14:27:32+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.0.1", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "af23c2584d4577d54661c434446fb8fbed6025dd" + "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/af23c2584d4577d54661c434446fb8fbed6025dd", - "reference": "af23c2584d4577d54661c434446fb8fbed6025dd", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", + "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/event-dispatcher": "^1" }, "suggest": { @@ -2899,7 +3529,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -2931,30 +3565,47 @@ "interoperability", "standards" ], - "time": "2019-11-18T17:27:11+00:00" + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/filesystem", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c" + "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3afadc0f57cd74f86379d073e694b0f2cda2a88c", - "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/1a8697545a8d87b9f2f6b1d32414199cc5e20aae", + "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2981,29 +3632,46 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:02:37+00:00" }, { "name": "symfony/finder", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb" + "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "url": "https://api.github.com/repos/symfony/finder/zipball/2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", + "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3030,36 +3698,53 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/finder/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-02T16:23:27+00:00" }, { "name": "symfony/flex", - "version": "v1.6.0", + "version": "v1.9.10", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "952f45d1c5077e658cb16a61d11603bee873f968" + "reference": "7335ec033995aa34133e621627333368f260b626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/952f45d1c5077e658cb16a61d11603bee873f968", - "reference": "952f45d1c5077e658cb16a61d11603bee873f968", + "url": "https://api.github.com/repos/symfony/flex/zipball/7335ec033995aa34133e621627333368f260b626", + "reference": "7335ec033995aa34133e621627333368f260b626", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0", - "php": "^7.0" + "composer-plugin-api": "^1.0|^2.0", + "php": ">=7.1" }, "require-dev": { - "composer/composer": "^1.0.2", - "symfony/dotenv": "^3.4|^4.0|^5.0", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0", - "symfony/process": "^2.7|^3.0|^4.0|^5.0" + "composer/composer": "^1.0.2|^2.0", + "symfony/dotenv": "^4.4|^5.0", + "symfony/phpunit-bridge": "^4.4|^5.0", + "symfony/process": "^3.4|^4.4|^5.0" }, "type": "composer-plugin", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-main": "1.9-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -3079,46 +3764,66 @@ } ], "description": "Composer plugin for Symfony", - "time": "2019-12-13T18:05:11+00:00" + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v1.9.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-14T17:41:54+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63" + "reference": "023ca658526278c0e74542079f1984e042aa6c1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", - "reference": "cc59bc797b77c6ecccd6c87d9052f6b3eb6a8d63", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/023ca658526278c0e74542079f1984e042aa6c1d", + "reference": "023ca658526278c0e74542079f1984e042aa6c1d", "shasum": "" }, "require": { "ext-xml": "*", - "php": "^7.2.5", + "php": ">=7.2.5", "symfony/cache": "^4.4|^5.0", "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.0.1", + "symfony/dependency-injection": "^5.1", "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^5.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^5.0" + "symfony/polyfill-php80": "^1.15", + "symfony/routing": "^5.1" }, "conflict": { "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.0", "phpdocumentor/type-resolver": "<0.2.1", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<4.4", + "symfony/asset": "<5.1", "symfony/browser-kit": "<4.4", "symfony/console": "<4.4", "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<4.4", + "symfony/dotenv": "<5.1", "symfony/form": "<4.4", "symfony/http-client": "<4.4", "symfony/lock": "<4.4", @@ -3140,12 +3845,12 @@ "doctrine/cache": "~1.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^4.4|^5.0", + "symfony/asset": "^5.1", "symfony/browser-kit": "^4.4|^5.0", "symfony/console": "^4.4|^5.0", "symfony/css-selector": "^4.4|^5.0", "symfony/dom-crawler": "^4.4|^5.0", - "symfony/dotenv": "^4.4|^5.0", + "symfony/dotenv": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/form": "^4.4|^5.0", "symfony/http-client": "^4.4|^5.0", @@ -3156,11 +3861,12 @@ "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", + "symfony/security-bundle": "^5.1", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0", "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "~5.0.0", + "symfony/string": "^5.0", "symfony/translation": "^5.0", "symfony/twig-bundle": "^4.4|^5.0", "symfony/validator": "^4.4|^5.0", @@ -3182,7 +3888,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3209,35 +3915,137 @@ ], "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v5.0.3", - "source": { - "type": "git", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-30T05:27:28+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-version": "2.3", + "branch-alias": { + "dev-main": "2.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-14T17:08:19+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.1.7", + "source": { + "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e" + "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5dc0db5026f2b611cb8910a1f465e95eafd84c2e", - "reference": "5dc0db5026f2b611cb8910a1f465e95eafd84c2e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/353b42e7b4fd1c898aab09a059466c9cea74039b", + "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-mbstring": "~1.1" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { "predis/predis": "~1.0", - "symfony/expression-language": "^4.4|^5.0" + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3264,35 +4072,56 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T14:14:57+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259" + "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", - "reference": "9e31e5e11cbe038cbb853beb3e3bb6e4f2500259", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1764b87d2f10d5c9ce6e4850fe27934116d89708", + "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", "symfony/http-foundation": "^4.4|^5.0", "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9" + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/browser-kit": "<4.4", "symfony/cache": "<5.0", "symfony/config": "<5.0", + "symfony/console": "<4.4", "symfony/dependency-injection": "<4.4", "symfony/doctrine-bridge": "<5.0", "symfony/form": "<5.0", @@ -3333,7 +4162,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3360,46 +4189,108 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-01-21T13:29:58+00:00" + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-04T07:57:28+00:00" }, { - "name": "symfony/mime", - "version": "v5.0.3", + "name": "symfony/orm-pack", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59" + "url": "https://github.com/symfony/orm-pack.git", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "composer/package-versions-deprecated": "*", + "doctrine/common": "^2", + "doctrine/doctrine-bundle": "^2", + "doctrine/doctrine-migrations-bundle": "^2", + "doctrine/orm": "^2" }, - "conflict": { - "symfony/mailer": "<4.4" + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Doctrine ORM", + "support": { + "issues": "https://github.com/symfony/orm-pack/issues", + "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-08-31T10:20:18+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", + "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3408,68 +4299,146 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ - "mime", - "mime-type" + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2020-01-04T14:08:26+00:00" + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/orm-pack", - "version": "v1.0.7", + "name": "symfony/polyfill-intl-idn", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/orm-pack.git", - "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/c57f5e05232ca40626eb9fa52a32bc8565e9231c", - "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "^1.6.10|^2.0", - "doctrine/doctrine-migrations-bundle": "^1.3|^2.0", - "doctrine/orm": "^2.5.11", - "php": "^7.0" + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] }, - "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A pack for the Doctrine ORM", - "time": "2019-10-18T05:41:09+00:00" + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/polyfill-intl-idn", - "version": "v1.13.1", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "727d1096295d807c309fb01a851577302394c897" }, "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-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", + "reference": "727d1096295d807c309fb01a851577302394c897", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" @@ -3477,15 +4446,22 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, "files": [ "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3494,42 +4470,59 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "idn", "intl", + "normalizer", "polyfill", "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" }, "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/39d483bdf39be819deabf04ec872eb0b2410b531", + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-mbstring": "For best performance" @@ -3537,7 +4530,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -3571,29 +4568,50 @@ "portable", "shim" ], - "time": "2019-11-27T14:18:11+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.13.1", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", - "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", + "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -3629,34 +4647,136 @@ "portable", "shim" ], - "time": "2019-11-27T16:25:15+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { - "name": "symfony/routing", - "version": "v5.0.3", + "name": "symfony/polyfill-php80", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "7da33371d8ecfed6c9d93d87c73749661606f803" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7da33371d8ecfed6c9d93d87c73749661606f803", - "reference": "7da33371d8ecfed6c9d93d87c73749661606f803", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", "shasum": "" }, "require": { - "php": "^7.2.5" - }, - "conflict": { - "symfony/config": "<5.0", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "php": ">=7.1" }, - "require-dev": { - "doctrine/annotations": "~1.2", - "psr/log": "~1.0", - "symfony/config": "^5.0", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/720348c2ae011f8c56964c0fc3e992840cb60ccf", + "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/config": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", @@ -3672,7 +4792,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3705,25 +4825,43 @@ "uri", "url" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/routing/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T13:05:43+00:00" }, { "name": "symfony/serializer", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0" + "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/a76fc03e125719ef4ce18522b2347bf103b698d0", - "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6b673b802dabd2bcf7cab05d04d2d8ef8891b952", + "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", @@ -3760,7 +4898,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3781,45 +4919,426 @@ "email": "fabien@symfony.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Serializer Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-03T13:58:17+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/string", + "version": "v5.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", + "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony String component", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-15T12:23:47+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony Serializer Component", - "homepage": "https://symfony.com", - "time": "2020-01-08T17:33:29+00:00" + "time": "2020-09-28T13:05:58+00:00" }, { - "name": "symfony/service-contracts", - "version": "v2.0.1", + "name": "symfony/twig-bridge", + "version": "v5.1.7", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "144c5e51266b281231e947b51223ba14acf1a749" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749", - "reference": "144c5e51266b281231e947b51223ba14acf1a749", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ad3c3e89353749dcead9ee25388177ebbb4569a1", + "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1", "shasum": "" }, "require": { - "php": "^7.2.5", - "psr/container": "^1.0" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.10|^3.0" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/form": "<5.1", + "symfony/http-foundation": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/translation": "<5.0", + "symfony/workflow": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/asset": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^5.1", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "^4.4|^5.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/security-csrf": "^4.4|^5.0", + "symfony/security-http": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0", + "twig/cssinliner-extra": "^2.12", + "twig/inky-extra": "^2.12", + "twig/markdown-extra": "^2.12" }, "suggest": { - "symfony/service-implementation": "" + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security-core": "For using the SecurityExtension", + "symfony/security-csrf": "For using the CsrfExtension", + "symfony/security-http": "For using the LogoutUrlExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" }, - "type": "library", + "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3827,53 +5346,87 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } ], - "time": "2019-11-18T17:27:11+00:00" + "time": "2020-09-02T16:23:27+00:00" }, { - "name": "symfony/stopwatch", - "version": "v5.0.3", + "name": "symfony/twig-bundle", + "version": "v5.1.7", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4" + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5d9add8034135b9a5f7b101d1e42c797e7f053e4", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/8898ef8aea8fa48638e15ce00c7c6318ce570ce1", + "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/service-contracts": "^1.0|^2" + "php": ">=7.2.5", + "symfony/config": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^5.0", + "twig/twig": "^2.10|^3.0" }, - "type": "library", + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/framework-bundle": "<5.0", + "symfony/translation": "<5.0" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "symfony/asset": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/framework-bundle": "^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Bundle\\TwigBundle\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3893,27 +5446,45 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Symfony TwigBundle", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-05-20T17:43:50+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b" + "reference": "c976c115a0d788808f7e71834c8eb0844f678d02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ccb1be566ae15f790020f917f06d1da0b04fe47b", - "reference": "ccb1be566ae15f790020f917f06d1da0b04fe47b", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c976c115a0d788808f7e71834c8eb0844f678d02", + "reference": "c976c115a0d788808f7e71834c8eb0844f678d02", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "phpunit/phpunit": "<5.4.3", @@ -3936,7 +5507,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3970,32 +5541,50 @@ "debug", "dump" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-18T14:27:32+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9" + "reference": "8b858508e49beb257fd635104c3d449a8113e8fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/960f9ac0fdbd642461ed29d7717aeb2a94d428b9", - "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8b858508e49beb257fd635104c3d449a8113e8fe", + "reference": "8b858508e49beb257fd635104c3d449a8113e8fe", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { - "symfony/var-dumper": "^4.4|^5.0" + "symfony/var-dumper": "^4.4.9|^5.0.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -4030,24 +5619,42 @@ "instantiate", "serialize" ], - "time": "2020-01-04T14:08:26+00:00" + "support": { + "source": "https://github.com/symfony/var-exporter/tree/5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-08T14:19:54+00:00" }, { "name": "symfony/yaml", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a" + "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", - "reference": "69b44e3b8f90949aee2eb3aa9b86ceeb01cbf62a", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", + "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -4059,10 +5666,13 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -4089,34 +5699,200 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-21T11:12:28+00:00" + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-27T03:44:28+00:00" + }, + { + "name": "twig/extra-bundle", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/twig-extra-bundle.git", + "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a7c5799cf742ab0827f5d32df37528ee8bf5a233", + "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233", + "shasum": "" + }, + "require": { + "php": "^7.1.3|^8.0", + "symfony/framework-bundle": "^4.3|^5.0", + "symfony/twig-bundle": "^4.3|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "require-dev": { + "twig/cssinliner-extra": "^2.12|^3.0", + "twig/html-extra": "^2.12|^3.0", + "twig/inky-extra": "^2.12|^3.0", + "twig/intl-extra": "^2.12|^3.0", + "twig/markdown-extra": "^2.12|^3.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\Extra\\TwigExtraBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + } + ], + "description": "A Symfony bundle for extra Twig extensions", + "homepage": "https://twig.symfony.com", + "keywords": [ + "bundle", + "extra", + "twig" + ], + "support": { + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2020-05-21T09:56:39+00:00" + }, + { + "name": "twig/twig", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/9a29e1fa7b5431969f96878b8662e3fcb18601b7", + "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2020-10-21T12:45:34+00:00" }, { "name": "webimpress/safe-writer", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/webimpress/safe-writer.git", - "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4" + "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/d03bea3b98abe1d4c8b24cbebf524361ffaafee4", - "reference": "d03bea3b98abe1d4c8b24cbebf524361ffaafee4", + "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/5cfafdec5873c389036f14bf832a5efc9390dcdd", + "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd", "shasum": "" }, "require": { - "php": "^7.2" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.4.3", - "webimpress/coding-standard": "dev-develop" + "phpunit/phpunit": "^8.5.8 || ^9.3.7", + "vimeo/psalm": "^3.14.2", + "webimpress/coding-standard": "^1.1.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev", - "dev-develop": "2.1.x-dev", + "dev-master": "2.1.x-dev", + "dev-develop": "2.2.x-dev", "dev-release-1.0": "1.0.x-dev" } }, @@ -4137,42 +5913,51 @@ "safe writer", "webimpress" ], - "time": "2019-11-27T19:40:53+00:00" + "support": { + "issues": "https://github.com/webimpress/safe-writer/issues", + "source": "https://github.com/webimpress/safe-writer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/michalbundyra", + "type": "github" + } + ], + "time": "2020-08-25T07:21:11+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.4.2", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "39e9777c9089351a468f780b01cffa3cb0a42907" + "reference": "16a03fadb5473f49aad70384002dfd5012fe680e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/39e9777c9089351a468f780b01cffa3cb0a42907", - "reference": "39e9777c9089351a468f780b01cffa3cb0a42907", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/16a03fadb5473f49aad70384002dfd5012fe680e", + "reference": "16a03fadb5473f49aad70384002dfd5012fe680e", "shasum": "" }, "require": { - "doctrine/common": "^2.11", - "doctrine/persistence": "^1.3.3", - "php": "^7.2" + "doctrine/common": "^2.13|^3.0", + "doctrine/persistence": "^1.3.3|^2.0", + "php": "^7.2 || ^8.0" }, "conflict": { "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", "doctrine/coding-standard": "^6.0", "doctrine/dbal": "^2.5.4", - "doctrine/mongodb-odm": "^1.3.0", + "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.7.0", "phpunit/phpunit": "^7.0" }, "suggest": { - "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", + "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", "doctrine/orm": "For loading ORM fixtures", "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" @@ -4203,27 +5988,46 @@ "keywords": [ "database" ], - "time": "2020-01-17T11:11:28+00:00" + "support": { + "issues": "https://github.com/doctrine/data-fixtures/issues", + "source": "https://github.com/doctrine/data-fixtures/tree/1.4.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures", + "type": "tidelift" + } + ], + "time": "2020-09-01T07:13:28+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.3.0", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70" + "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", - "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/a2179f447425d9e784fb9bc224e533a0ab083b98", + "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98", "shasum": "" }, "require": { "doctrine/data-fixtures": "^1.3", "doctrine/doctrine-bundle": "^1.11|^2.0", "doctrine/orm": "^2.6.0", - "php": "^7.1", + "doctrine/persistence": "^1.3|^2.0", + "php": "^7.1 || ^8.0", "symfony/config": "^3.4|^4.3|^5.0", "symfony/console": "^3.4|^4.3|^5.0", "symfony/dependency-injection": "^3.4|^4.3|^5.0", @@ -4232,7 +6036,7 @@ }, "require-dev": { "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.4", + "phpunit/phpunit": "^7.4 || ^9.2", "symfony/phpunit-bridge": "^4.1|^5.0" }, "type": "symfony-bundle", @@ -4270,7 +6074,25 @@ "Fixture", "persistence" ], - "time": "2019-11-13T15:46:58+00:00" + "support": { + "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-fixtures-bundle", + "type": "tidelift" + } + ], + "time": "2020-09-01T07:06:14+00:00" }, { "name": "roave/security-advisories", @@ -4278,12 +6100,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e" + "reference": "327370943772f9917bc2dc2aa4263db2d572a112" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", - "reference": "5e2ebc8340c8b7dcdc3f938dcbb9e2b99b72fd8e", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/327370943772f9917bc2dc2aa4263db2d572a112", + "reference": "327370943772f9917bc2dc2aa4263db2d572a112", "shasum": "" }, "conflict": { @@ -4292,22 +6114,32 @@ "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": ">=4,<=4.3.6", + "bolt/bolt": "<3.7.1", "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeigniter/framework": "<=3.0.6", "composer/composer": "<=1-alpha.11", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -4317,46 +6149,78 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dolibarr/dolibarr": "<11.0.4", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", - "drupal/drupal": ">=7,<7.69|>=8,<8.7.11|>=8.8,<8.8.1", + "drupal/core": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", + "drupal/drupal": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.4", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", "firebase/php-jwt": "<2", "fooman/tcpdf": "<6.2.22", "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "fuel/core": "<1.8.1", + "getgrav/grav": "<1.7-beta.8", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29|>=5.5,<=5.5.44|>=6,<6.18.34|>=7,<7.23.2", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", "ivankristianto/phpwhois": "<=4.3", "james-heinrich/getid3": "<1.9.9", "joomla/session": "<1.3.1", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", + "kitodo/presentation": "<3.1.2", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.34|>=7,<7.23.2", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "league/commonmark": "<0.18.3", + "librenms/librenms": "<1.53", + "livewire/livewire": ">2.2.4,<2.2.6", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mediawiki/core": ">=1.31,<1.31.4|>=1.32,<1.32.4|>=1.33,<1.33.1", + "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", "namshi/jose": "<2.2", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": ">=1.0.319,<1.0.467", + "october/cms": ">=1.0.319,<1.0.466", + "october/october": ">=1.0.319,<1.0.466", + "october/rain": ">=1.0.319,<1.0.468", "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "openid/php-openid": "<2.3", + "openmage/magento-lts": "<19.4.6|>=20,<20.0.2", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", @@ -4364,50 +6228,77 @@ "paragonie/random_compat": "<2", "paypal/merchant-sdk-php": "<3.12", "pear/archive_tar": "<1.4.4", - "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", - "phpoffice/phpexcel": "<=1.8.1", - "phpoffice/phpspreadsheet": "<=1.5", + "personnummer/personnummer": "<3.0.2", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.2", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.8", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.3", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", "pusher/pusher-php-server": "<2.2.1", - "robrichards/xmlseclibs": ">=1,<3.0.4", + "rainlab/debugbar-plugin": "<3.1", + "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", + "shopware/core": "<=6.3.1", + "shopware/platform": "<=6.3.1", "shopware/shopware": "<5.3.7", - "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": ">=3,<3.6.7|>=3.7,<3.7.3|>=4,<4.4", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", "silverstripe/userforms": "<3", "simple-updates/phpwhois": "<=1", "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.17.8", + "simplesamlphp/simplesamlphp": "<1.18.6", "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", "smarty/smarty": "<3.1.33", "socalnick/scn-social-auth": "<1.15.2", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.49", + "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/sylius": ">=1,<1.1.18|>=1.2,<1.2.17|>=1.3,<1.3.12|>=1.4,<1.4.4", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/mime": ">=4.3,<4.3.8", "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", @@ -4415,19 +6306,20 @@ "symfony/polyfill-php55": ">=1,<1.10", "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", "tecnickcom/tcpdf": "<6.2.22", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", @@ -4435,22 +6327,27 @@ "titon/framework": ">=0,<9.9.99", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", - "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", + "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3fluid/fluid": ">=2,<2.0.5|>=2.1,<2.1.4|>=2.2,<2.2.1|>=2.3,<2.3.5|>=2.4,<2.4.1|>=2.5,<2.5.5|>=2.6,<2.6.1", "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "wallabag/tcpdf": "<6.2.22", "willdurand/js-translation-bundle": "<2.1.1", + "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2": "<2.0.38", "yiisoft/yii2-bootstrap": "<2.0.4", "yiisoft/yii2-dev": "<2.0.15", "yiisoft/yii2-elasticsearch": "<2.0.5", "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", + "yourls/yourls": "<1.7.4", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -4487,30 +6384,52 @@ "name": "Marco Pivetta", "email": "ocramius@gmail.com", "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2020-01-20T14:23:18+00:00" + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2020-10-19T07:02:45+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.0.3", + "version": "v5.1.7", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c" + "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7f835941a01bea2d03776451c9e42c2a2da6c34c", - "reference": "7f835941a01bea2d03776451c9e42c2a2da6c34c", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/150aeb91dd9dafe13ec8416abd62e435330ca12d", + "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d", "shasum": "" }, "require": { "php": ">=5.5.9" }, "conflict": { - "phpunit/phpunit": "<5.4.3" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -4521,7 +6440,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "5.1-dev" }, "thanks": { "name": "phpunit/phpunit", @@ -4555,7 +6474,24 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.1.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-02T12:57:56+00:00" } ], "aliases": [], @@ -4571,5 +6507,6 @@ "ext-iconv": "*", "ext-json": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.0.0" } diff --git a/config/bundles.php b/config/bundles.php index 8c7b01e..a8152b0 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,4 +5,6 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], ]; diff --git a/config/custom/tle.json b/config/custom/tle.json index fe47e27..b58e6bb 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -89,7 +89,7 @@ }, "@id": { "type": "string", - "example": "https://ivanstanojevic.me/api/tle" + "example": "https://tle.ivanstanojevic.me/api/tle" }, "@type": { "type": "string", @@ -188,7 +188,7 @@ "properties": { "@id": { "type": "string", - "example": "https://ivanstanojevic.me/api/tle/43630" + "example": "https://tle.ivanstanojevic.me/api/tle/43630" }, "@type": { "type": "string", diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml new file mode 100644 index 0000000..8c6e0b4 --- /dev/null +++ b/config/packages/test/twig.yaml @@ -0,0 +1,2 @@ +twig: + strict_variables: true diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 index 0000000..b3cdf30 --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,2 @@ +twig: + default_path: '%kernel.project_dir%/templates' diff --git a/deploy.php b/deploy.php index 2e0c7f2..0b65a08 100644 --- a/deploy.php +++ b/deploy.php @@ -9,7 +9,7 @@ set('bin_dir', 'bin'); set('http_user', 'glutenfr'); set('writable_mode', 'chmod'); - +set('default_stage', 'production'); add('shared_files', ['.env']); add('shared_dirs', ['var']); add('writable_dirs', []); @@ -25,7 +25,6 @@ runLocally('bin/phpunit'); }); - task('dump-autoload', function () { run('composer dump-env prod'); }); diff --git a/docs/logo192.png b/docs/logo192.png deleted file mode 100644 index 027c5f3301ecd3a9cbbc63ed5f71c47895c445bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12929 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 NPs>=dR^283e*vEsT>k(7 diff --git a/docs/logo512.png b/docs/logo512.png deleted file mode 100644 index 2a06d5e7e8ba9f7eb8bbec665675b07c115fceac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36838 zcmce-cQo8z*Ec){A(4d9OO%*|h~A@RMlgDaUW4debb=YFdN0vMFF~|O2qTFa(Fq|+ z1`#bX2!k=-_bb2ay6^X1>%HDTp7lHrYmJ%lJ?HGR&pu~=_Gj-Ct$$nn!a4SH5D4Ug zriQ8k1Of%$LLt;=z(0Gz6Gz}5Hh(oUe?xC4{~$YGM~Je6_dQ1*O;0;#M*~MYhmiaI zj*1WnIiIVMnZKE?j=a6Mr-;;x|Oa zZitFY3X99gONq%#NbvmYhZh{p*TG5NKo#|`vA|DCye|I!KJucXK|w(xL6RcgzRsfJ za&mH_ViKYf62jmU!hRuM{&vB_UViX@_n_+NXYcFkGNORdiniJO`yU=gYA4o#YMzUr}Xa!b#?#$ANBP7uc!U|4IKYl-v7^z{ft6<97PQr z{k#Kw?ZJg}f}alMBd_A?Xy@Iy?g!S)h=igVz>Gp>}#Qwfw z{yqdb|M!FK-`D@;CY}E@|3B6J|Cq%8e(C>5_y0pj|67#vpS%AbOYnbnxfbb9SL}aT zmD9-FHxwKL40>U-EbqBo6-k)h-e4m<^>2bR7rMLn(KFgiYD`X!X!x4S8)|SAAr%Ru zf**JomqPHBECf3DS!^%%cW{O}YbNNTHi3tfwv7?8Kr!3elqd}S;(4!g2$3NXy?mcF zlLi8@g>()kMx9WF5ZP#h(t6W>6XINLl9j@-v1+Q^BL%!z*xPS~tp;n%>uZU>5A zOZd^ND4xfObf-&)^hgG0-S$n0p~->znHp3163#ZyD%E zb=vX6lX{ovPLH}X5F|0a4{KsdSGMYS z0VnxDBJ@zWYvJeB#YPF?6iUJY!R_xXXVdAqY?kUR56(7pENt%@M!|tJMt&Nfu?q^p z>Q{Eq{ZYgdlD-i>GmpCTj{Zr4aM0i~HqY8_v;3uN*QIsnqr}qrI)-b(NJg zL(IdM)JS(w=Ves!7>qR@2o-|WM*Z4+nJBM7<>KO!Vj;3WR=c&*gtiebEe+{grO_9A zKJ6MwiATT9O2~Utk#WK%2>HT{Hoq7=FdsV8(VYG5Hvgni#+{AQ+s2)&j-|*F=EY3H zCkP~o3?i$LvJad|q?&?vrrgS;KH6DPmOs*>2|sQV9UrK(vK7C0RSN!!^-wm45Y~PNlf09wJDIN3SrI;FQD}NZFCDB@$LHX+n-N-r`X66T`5{ysn$yE z2locIFO`~3Q&W7gqga-c&;#gW0sNG77lP4%GP32@Tr&^p#mJ5l*%iUdchH*mFR!dR z*&J*OzDe(8`7I5Fc%Z~6Aw_B=n<*wVj7asF5AhM6>c3;8AZ`8Ac+C$MWDVz0VT-I) zX6MSsP5pc^ry%GGkl3|!?^oYb&Z|6K>r%C7?C>q(igfqAiAf`alh^Xb&2KW^Jey8) zaCRE0-3r(n!>6YG(6!!hlne=r>ovs(Ku`BvP9(iTGM0KD+(jc>EuN(lMzkv{j{0}* z$ZXA8s(9yh=nQ<*(e>PXiPHt}ga2}kf${49GZ-fqg zlj_jM+L&#w!8udD$2P6+F4wldd}Y%c%(H<{)R*&(tFdfx4YIJ6s=|@ zTO5&cjucO)sdYx*I>|uWuCH~HEPU};%?Arp^Dc&U9J<7h+Fig138nQXxTza)YveOj z8yv!-QgaWO+hIikvr`EF!ko^!Fq=ga<^I*?mCdgFr$2!AlU} zu#>?aWU*INT`zpF?OLc8K@^$6miGwpO$<}3R>RHM54jofdgfSyXs(Jz17xkq&;7#S zp!y)x;WvT0BNPI0fON)xK)vU#e7mo)%&mvFaiyRzhU;IIhO$jeo7Jq7m)MSMXNrVh ztcmMf$LVPiY3J@49rtPzjhT6x-tZ#fG(I$TYT&%tAU=b;qGKMKw;SCYhndQ` zHE96%8TLBr>ity~{-7#zQ`%OYs3|;LU3uMjgBah0<~^^Ic`X6!4<7# zQB~JzJUCBhWiQEnd48sTQi3LFXi4QCcio9nC0T5RJ0^sOh9-C^ z>8n$Df4wCj@QZ_wGyp#oI|UA+?cYkyM{<&jZSUS0f3p90poaDQvyaN9YKPZpZ12x` z!HY#fQNS~cLzHA_xZC9IEj$;nDv};SOYu;aq@A6snmJQ9Dw;1>+6sJ?p;bin@>f)s z>s2o;hEi8_K(dPhi5v>a zXjNiqY3)l-z29kXGYBm~R>kE74ETZsO(M&aEEkV314ptHhFr>|3ABmR8PB?ElRR4C z1_&UUi2ZTrNuAKCJYA1OcZ2JO$V*#*_m(XqDhIL#`B7*ezbN1;Gf>z`ZR=UulS9B@*l!J_ghpBLTkhhE{A zq2Y0I@QO(2;pZ#%WO%oCQ)m@GTLvRYNPy=6D}*kV0KCrQ?|UlWkToP*pr{4xe_WEf zA*C!*4*$;k)}*9EY!xAHFF?8#pmuidH8wIPcBitc=rb?PVlj*dD(|-a19y^@310-%eppx9hwf)ut>DQg3?|QdKMt(0pWhVWV&_AH;(2fop_DI%m0*^-uKjUCC%St(dGMy`qjV#S~4pg6Bo{ zbp>Vh^_n-IP4A1CbyN4P99yRm?m$TQKkHJfM3= zmaDEl!Eu*{0%Czr$4yEq=&GE33!a%N-~+AZ{H0``7(>w`Lh z-DJi;euc(~mb($c5{PYC9XN*lFWBuudpZbMxN2T3_3iQ~Z(AsWQCG$x2cFzL`Vw@v zh#T0vz|Lh}083g8u=-W*oUfp3za*KFMG3q8)$3rfV=iqS|8i#5hQita-*9HZ&X`6_ zTr+QOV*q-C^I~>>){CimMeRA$qe(f{HZBsz|C~mMpqY58StNX$&h%11RDGff1(bvITv zF~`WkY4oj)=^F`p^#pDf{A%BV7BRd70-~pp2qr{oviKqC=O}qfa*Bp`S^sC z&v6)?3w_KVZC3Ekica?*Kp-!D!tk*+UB=VM{Lrcp6%ZkqbYY+V!nP#)`i=K*1>P}t z6`7ne)ep5e7ayln5Bptt=$5B(mkWN2|DNbWzV<`4&XSwRuE7o6`rP9LMxxTmrmH7@ zc<57M&_YK+gQP^$*nWe6UiOpfpQ|3 z9MaM)HqCzk?`cQgY_Fd6>HPWgIu%>7_I(w73`aFLIVFe0 zAnak2354xA!|E;szk+UaMY_iLnob!ABGWT|=!2vMNmlg21-;6?o6I0glvb2iTg`dk z5*++69(5*mb{)k-e~2jkLHrYXEQm*R;R>=|2#@)ONys94e>esEdrbPJ6!cH@El)^I znq*d1g)89D-)aed%h=K~jb^HhVddLb?-_MbZ+;s>b#j-ye}DE|w-d!D?;&@Ih$C+D22(-1X9^ zUe)TS1|;VREIH-!Lq1SqMa|Xh*2#jWu-`)O5)^As8eoU~2E@#B&9c%@X4*oF9mqTuCGhTG&)SsQ^nby+BfxoV; zu13S2m+;t3El*28LBa}$zr)2fPW^f5A_WNH&Mf|rgxE|n18fCa$FT&CwxcISW$(c= zWCD37(vG5`@mo{jk9EHrt9 zV(!!ggPA*x5CcZJ-o(lpkwl9d*LoEPacEv%k|sN@U;qd7MO3ZyAy}!^q;cI`(F~Vgf?&i|)b8D%(GhtKhs}tJ z`@SV}XWpA$9ibN{K~6L|fZ4qrI1@Gk5itu{*g>dwbT_Rue0m zj@&f%Z^c|b_~KpuG|$r5w96$KO&g0&c|sVNxD}DFN_tA5f?l>>#~`YZ9aE-ry0C-NV{vJV7!uVM%wf5l6BaKM_3PSC|;Z^9Q#K0qsB z6(uiq>ay9N8+Jbo#WBG8G~zq2#ZJE)t`jB&bt@C$z2ALrxCTb#KNV_#H12j7H$q@| z#1L))H14mrh>y~Gae!GI4l4xj?8WH@jK3BxZSu6NJo4bOQU{!<_F_px+~#{#GzJ6-+G4APlRGk>bk;RQAkzOd(Z{u9{V5KHNDm!(lkC(4Ub? zZlRrCDwm_puKG^GfR`^p%W*yxYW3b8Wrfkeei3K6)UIp0f5_Lp$JDP%PHZ0Rex}FU z9G`S;YP?^tSHJii$89wgq8dZF!p_X>P&sURGxou+DpNyBiFO9~q$25I+$0n`{PBt9 z#nZ) zKJ?Ww&R4ZnVS~JgW_8T4`c_`M6vEp-#7~ntW15=v^gT zfZLV;k`e}M)-BtG!(lr&TaV}3jGo$Zg1p~l51o3mx$8yx$O3%!|*XX86{5tuod~g}^aqM7Zc29M!pTXZ)r(Z&sP!;y(Fe z9=SZ3mxyX!N0A`OprR$*Qs5L%e(KjWeBvDaaxIR!@e_4$d>ry5!Pm_liz>ezG_tt( zM(fWk3tIDdyIANdDOw?-AL>zAYa5Auw@!S^D1UV0XnXyaVa|p2kXB75qWNGm6>}E= znKWXm+V6<2t%(m~zDFT3*8YiFN@ijt%P)^;-ZZ|v{O!a2*@}giABCw;*#_}~C#s}^ z$&gns88Q7lUq7RSf0|jf<(I@^gg9R=7}r{mb1Otdo;kzs@s7E2p7ixB zGg{86WkAhx{d#4)Vbz*xVp?fX=kzk8((Z?9x5L78!oY^cc(LXF6yBYsG4l5~O5~-v z6NQAq&mo1tk@=qM^5L&j=jHvf;yYhvw~lnh&eCCmEr`{bTF3yl}GtJUjn?6qfH z3ZIkFrK+Te*3tM})lGHv^0jA(@Vr_pPGjN6Te#ihwXqd0;~SYjg)mm4=A*Ct+;t~} zkW#nG2n!*{7h4~}(P$oIPU(vbtDA|vnl+wNKUekgij-v>xLQ_pY*-QzE29aP^rur3 zCpNz(97ByPa#gmI`>^Xhr6;B_0BbCeXhy7SASk4yUNbpiCKr=bXt@k)7+5P=k1=T0 z!&rZ3#;Hl`#l zyw|-<0;$9IdbjmKj`>S2_T|SG`hD$8*;;0#2}N2abIQl>6A=lQu>K$$`laSNd2!pF zv7Q*fvg)FW3Q?i|n*7OCFU?b?q(^^n$;5i}G6`+$c-he@)HUL!E$IU`8CT%(`4CtR zXbtt8@XgB2eI#`#7q-orW?x@ju*o#?C7&RKVa@2TWRnkht)@UuCznrC)4n&zZ&Nam zNB$$`Szia0tUl3vQ}ng9u^)+CWvMDU`6&UuMSE%mw%3D~zeaD)-w25&;W@BHOZ*n* zZ=B3kQ@x^ovf>bxUD)lJsC^nv;y^ z;yyKt_ZqC+O}iA$9CH(wPIkI?_u{?VHR{^us{+esHQA<@X;!!ZBWwIa7|j*Zu?zE-{w?WRxHjuBz;9mk?| zBP+FJ0iPvOQW?A{n7goZbin2IChTd(2OBj@2Zpk*@b7w-O3m_r8qJOkjn++5hn?hz zUW3~@P-q0z1bN_ww-qGh9aTx;@PWVqOKqZGgT&geSx4=K&rhNj*8Io5v|gW-x@N(Q zlvz%;zyyDhkGeK|Oz!_;OTyY?J1#(Q&Nv=9oPJpb+PjtmlCplf)=~4hHv@~HM6q8L|dhYiqcAY*s$-p63|{fE29Tp>a9E7 z>|bjINbr<>#EYtvnl2mOlg-WZt+Cw*LHom8EYTWdY+POM*nlds^4Pvp$3%N#ghOnX zXT)ay+&eU>sf_LW^`P~kP$G5)Q5N&N1HZ+xCd3i>*1X^-MDdiIhijiaeag2Lh2TYl zL~!Q?)v6)XDSgWQ`)Bl@C%Lz&bca7z$92kfbfXrVW2J81RJkm9p?#ibiVhGsdarjE zWV@I@GqyaN51)-_en0F6y>5=#VmF6WQa;bmvkYRky+c$mBZ|63V=v`wzT{7AcBbGJ zyi#VQJddb{-3aPPbpn$yl~b09Fta$~G2u^hH+GH@D1P$?0vU+tMgMo~Ah%;$NuIQZ zLF2^x?FAF#`nE&cc=_GOWlyCWaZ_--I-wutsC{pv51WWpDR*%(vm~M!aI`WC z>IoA|yq%DD#pjU}S@gkKy)A<_(<_QGUmPjq!K9W0yp#9(09EO3-p8jfGo53Ot?;~7 z9NGnu&d6fck$9bFnd%Si#p?Vc_vrPmWybWKjncA`Y48}#+Lh%6B(;deHd_7JC5;5^ z#{QOD-+FAG!l#Pb*JhsQrNqUn6?KJBwt-*tYFLhqX68NF$(~(+^Yqs8qGjkMy2Yf5 zu97l&NZP+T<7Pz{&4eUi=Vn2MGMYj^X^O6gp_d_vzs#+ zFK!{Mel8B&fi|Tla_b2H*}%!b!y|I>xK1#tl2(&akR0xHWVA+Q2(Gh5mQaF_SGvZt z4A%F%${joA!G_y5bJ>Bn9V-*bPQ$O@2OOAE)S{phibn*6jX($&3SdOL#m>iH$B)R^ArXu zU$;g%m4)|6=)`nWU)c@eKq0^E4Dj8|BF^-e!Sr#%1@G0sY~!nl8DN(V4LU+wh*t#p zD+!RyN5)X@_WzjZ1gVLUtNqkXe=2XaefF=TFX)y7U{@7QKCIz`e~K^z5;@7h4t3@r z6^%8}InxZ;X-!QXH!?9{l&0Ys{!`tD{fJr?J%bATW0}9-!h4TmJ;=DCoy^Ipi~4ir zd2JySQUWT>q63<9L2_~xFOV=mUNwUbcFVIUT4@1<<#pgnN3a;~<2V+iMnq+iJK4GCF_2S&?L5ZCfX8e`b8H83{$BY(d-pMDB zUh=uIneNSMc+T$Auy*;UPtf&k?&AD;J5GFN={ddM1omHIK9W17qT$pmWM?2}c+S9o z_bRgAlZGaj$;uD9WvG#~h#wgfw}(pyl=gbo_|8#4-5tn2xW(L(VN6k?G&u(bCpnf^ zcf2PPiQCi4Eeo&bzD;_cu!ggwOrFu~O|U5(xYT|;ZPw*P!P`db=18wfL>KfT7Jos- zAe~>fg{>auWN+`@=v-P-yuI_BKd0>{>n_l5fh#ELLfcq%+f-BvmB#HgNvn-bKjv3m zwVch|n$K+VAF^qgu~8%8nb1qkA3baz8W}xT;|>G1_M#IP)Mi^UzoQ4N2ry>|MMU(FO#Wc%2Zp8XPo zU>DF(MtGJ^Sh(-34ulnS9nMY^ zR|@#LZHqUIIkJim-YEUZMH9Qx;xziGEM{{|QWhm0F%qM745rabu59$#uphsRg#!u~ zYrKbSfL1nCVac_en|qP7YpL8|!VMYyiMmhj40J;RYX8p&X7L5P!Owf`e=OKbKpV6= zb5e?A_M?Ml(33))U)-9BViwGWE#AmK7hSwOW#Qj~g0>ZR)6Bq=6S>&|)(Rg3d!arj~^;9d)+p|X&;8|bWQCA z0mg)o5qH02`z@e^kA{K#s)YsT_8x=8SOzSqM}CRH@VaAuRQOiiF!aj!uPw`BC$i<$ zamhvtKhlnT+lHVy@jztnH#WIXI&C2M&kSpx(v;fxxL?MA$Q1G%(DATN`gBcy?!;ul zf<+SxQtoKH=DVGlYB3`+PFQyMtg!P{O$O*6?oV*L@zPZ2v9WCX)4BA$pWjcK*i2eK zi4TZhxTrfKIh=RrOy@>G-RjlSr3KUEvk=fJKol-X>UI{OB*}P>Qpd+9=KPF}zgeoy z;gP(=IfeC!GjjDhazZg^CZ(OQ6^wlcP=eCnV#03mv3>~4rI(h0~fLRabISJ z{F?|%^Xs6>nvhhPYc%=>R$y++{B?ltc@?m%08~>GTeg*O6u=V;G?uT0`L($HaSw1Y zU@r_I7D(zsemR~R*N9U>FJkw3LN?{|?6RTx>Z-Y4C`U5(ATN00Y^gAAN9^l2mxX+b z(7oSejV|{Y)JVgPgqA&hRA|+TTr{C=uHU00w@Ug|*;#^u!#}cJL=P_gsW68y?>`$moDHq$uXh{od$d*Iw?Hl*vLF{gM(c^`+!l!HSkJ9Bo4+$11ebUk85*Rw>+arA_wESMWQ&|}tK`?EewV-A?c4=$-+JzU?S_E^N;dTCy9x zC3Svuz~SZX;QTn@m{Z4Yo4VVg$UgN6O8vt2xk#YDL7<6z$TS_r(sRnFD0I-av3&TK z4uWVl=1Oz;ug@cE(oosiB-xXifNTg=qTVh68_c+21?39LT9QfxI+w0_2}5M~E65;V zCCzG)5;A6U28?y4yBw?r1~X!?{)fAiQwzZwahTpEg8_)%yNKit{Ia(H-U{FP7N=9> zAN<=J_dGu^SQDR}5`B8(Z_7k#+|V$8kT_|txixqgOAz%OWfU_6+72?STOo(Nn7g_d z9jdTyM!Z?y3f`K_W}Fd7-(11NC0@V$o1xJiT1ZlxF=>Dp&|UKk;Jj}Jqk{pUuQoL! zp1il6C{x)nD?k+Hg(qdE@S-ZsZ`8(h#(tvS+dD4+UksG{(%zsv^nOL`2Urr9lieyH z`O%&2aNu2s?4;VUIWb7)6=9fQx;0!;6rrB-iQ*aqolHcT-3MN6iY=!jEnSs2^SU#Q zy5y0A^JF0O%E{$kcOVn#7NB`0u|w+uR;t7{Z@$XJ-LG~-&lz=mqJ9$}*ICUEhEJ;% z5>PO+|KrCr^&3ucw(M>jEGabK1QpI4FF<)mlpDj9z-R`SH zAIpS55>bfFZ>N)5i5%;Klk#BI5(}8?ow)tL&yPfzJjLMgOahu`{b<7f zg}P_xm8ZAds3rp2?b`Vi2eOGmpARiri2XAWw6VaKr}S0dvh_%ZJaW>XpI!26fJcA2 z?t4wTTQ^+Eewmgczzw>OPrCKcrf)zsBsc5_(6{vJPyOQwe8uq9{syH+A+|K=_+7zA zXXmpn$r&WZf>@0F)!8@59+MBv?h&qLFHxwTiiV=cV`B!M9GECGRbG%qp_9JA4Fgb< zvuN(vCUxV3?QeH_&U7jJ2`$!hMAC6YUUu{PWsE}VV0757!IAD9k)^s3`4RJGs|A%H zR(wVetZzM$lKj}qMVEJ;$6d^C2ZD zBq;alT|{|T`NxqW9bkN;y~T3bQb-$hYv}U1N{5$Ml71N0-8nyNNDh``pUSV<0O38; z{e)8J=8-wXcy1US_-AiakpIfg6bqn!QPk@N2ldl5!qgY$dRT?N-|yWH2&Gw^gO?4L z^8)pGeM9ZKYzsODo^j|?n1+Qhanb+*19pW-S*^*~N3W&WaR`L7(ec1|7lnquC?&d@ za-5gso1k|1HEpO&yVl$|AYVRXC_%Y{Ylg4z9uvbNZ?WxfzdOYd9Y1*YLMXGE8tYSD zZ(T3msZtCOS}GoQvrt*e*5>0u_VgHmR4a(*AZKhDoX8TAM)w?zmorJff3g~9r0ciJ z8Y?)8?2HKDfYvg?t{*!`TzvR>Jgw+qkiFNp6)l;#&VAnm4Nk32$B3{%5gE8oRy@*A z8?1oJb?e6H$W_>{97usBbiesegCG{X|AXA7n)Q_Tyo-cciz_nq*3UsI~4n%m%ij(Oj@DPORiVd@3NVp2A)phwcFLqjc?8!`@px{ zUKW1NmAWqUxy(}`{w`&>68!1eS9h)N*B#FP_p~JJ(kbcg&?$=uGz>w7R7vem3EDFY zFD{cBstY{U+Q768A}|_O0fXz8@w%epP@RtKkqJX&Zmw&_hUa(q3{;=52UPEO4BsqA ztcnWwiPHxBQ8Q|(cF7{tNs&dMH5@N}6ZuFHMHtxmaE}@AU`A){CMrf$o~66OP$>fI9blc^Smtf>xBBjB0X{iGz(S zq96o~Y%d3Mi5u&Ctoq_$Faem+%-R8YdfAp zJ8aVqq|)?-@ihFErD!i1xLSx1$vhTJPT^q;`qm8MWGY%o(mEKa@FQ!k7Q-|qXvz-l zPQ_OP)dR(*oCd#fm#1|f$J|+EV)+ECb|#grH#m%i<5rIC?pJP0N|N>3LTyiR$@$J7 z_rAqVj1{Z3yzq(A`cgp&!UXkfBH=`clu!X?jOxqlXEcu8V}Ny3r>5ol6}Y|~d!+4W z6f)sZYk@lNre79Hy`0&C#xfe4t8*b1c&$|GH2H4wIGX;cv0dKB?SL`lFoE#ZXxJRayQ~c9&dB>wjXd?KX*+~F#V`5 zVRSQ2PnXKf>W2m&gb&;h9%4VqAw_t5F5NrEkKq&h1463aGL$ zUhgg=P-u=U-}-D$9DnC3ROoe;G^%Pu@{ABEqyXlrf~qd}4d2_Us9+a4d}ySftM+WZ zJ+Hxc%xuJz1^t$>;qmwY-<9!=l4rErg}n>d#D)e#W6me2kiG&uf#H_BFIe}8JY#Ek zS)pxCZ`6&<$e~S<2K0$Tzix&e{%JAmDvCurOd-MVkFs5uS2XcEUORp#EF9oGU0k3&yaiYD~rz&}5W5>qdNlC66PW3GLnq@=a42xot zWc^iQViH&HSrS*lfEMV0Kd30;vr*fv&KKm)d91s*V+2Hh|gX@sK)4CB>%mo~8qPm8&8ZzXpdQBw_!Vrgk*uCH_Oft~n%h^{v z`b~Btr2s=4-fYj#rcb3GfGZU`+9qY z>K5;BWI?T3fuh5TKH^@@tIH+&0}>2U{i-BL@B{Bxx<0m4bF#2v z7&CCp?OLLhKr9#TLO4eg>J-P-7?SQyQK+6Hw*&VM5~_RwGV-0@p}wZNWI}E4nR;(! zarM;C-{k@%>B%R1^Su|V9@eXRjJGlG+#QS73%u|S=$PB`o6H2)=VfbyOH+0E}(45-p_yFy<6z;@&29H5xSk|6@0J59#}MWg_>~=Vol;m zRB`Z6v9wkV&Q%=OQGwgLz0FN0Xs@?}?94on|0peM#keQ{E*6K3>i(=o`>id*x1>#jk;sqnM6JfJK8)U-a0*s>xN7>h|OIHos5Sfe2bkm z#_QXNW4xu*rz!Oe5eo+>=`(S6ID~Nj7|hH<-rUb!zOOh#UQ$2Y9CW^7!s$yraD>4)=Ii>o}V0X5EXL-{{T*7`%Pe!$ZKlM-Z0hBtSe zHLGLL?gP?Ccx+ygV7omtPVXs!#Q`i9etiLNBSyCL^lb2E`|&k}-Y@GI#4Wy4`}bKo zq~TH;<>IM^qy%(fW4ZyQ76X&OnKC*c>iMUJo(}ioz2bs*x50}2uT_OC!WrzCJ*JY5>yrjfNg0tsMJa^iKhxH|Q0H#h!oCoA-&b)k2*X50@D5bs{APhzK9U z80_Y+gFQcQHV&do(;=wYx`5HN=a5E&h;|&h{Ves!UYNcbP$O(=4l0EeR_6-skw649qulXkT6$oE!*hoaB@;!H>g^2t89Ge@C-cwD5KOuDGtSEgB5k|jE%VkKxp=-f1bZ!#aW)RWA&+T-=I^}{bLnj--d}(LeKNySXj!O{NwWI9RN{ndd6kpQoy;e>ZH>*iVF(fIPRR%5BKeJhre0c^*uVa1^Ap*$89F?S~l zdLY1x9gJgTTU=rR!0IvyMvCwC-g*8i)MjmTVM;*gI&D;>F$Hst?fVXIZnH zzGvtl^G7K(B^eg=UD4(A082qL%i%)Z7>RO}hNMaypIg=qsMRCtk{1e+1|-SeF0X9A zA6YD!d4{ab>gGC=tb=K)%Kzxi>hKS$>k&ht&MD?R+Y6oa682;zTYU&~>F`l2jVKL& z^&C<+)jnc_$j2eT+W?cKP@HI9AZg~-DMX81gM6fjOVAk=qY1umF5>8>L&b^{O$IRZ zfO3S_Q>SG#00*m(F2T^xLI(q)5!f#;jgCPjmGTun)O9`s6#s2xL6H(w|A=~<9a0sX6rJPxs1{17KJ`Ms{86MpQxA7Uv1*(T&jK0*C=pgm;)VEuZLKEvNEgDpgc&h;Q5*)WAR8}K!XIQM1Kiy{!WN%(I$@T4 zg^H$s)XiL>CMc2$n3z+(!#r2sg|N{hUftrhz!HX!wNVVm=PtMNWOoL+OfVK>zrB9FgOKamXimaTq%aD=mr{h1z-; ztJQP%zJWn~raz;92{Ju)-3SXA9ndZ?&xCa`<5FagVx`Hx`)Du`0|NKPV~2BPyAX!h z_PQuw85M&q=mudS;!OnJCe+j68OpTk(WPHkvRU&=zq)cu{A=JvzCr3P@Qw<6WKzjR zCRMX+b5p9h$hH&~<-f>)NAvNL?j{b+o?v>tyYa+7l4LN3&RaGn`Ra0ST_+;&*VRe; zT?m6MZe3!YX7WY!eMaCu+NvAgKi5oeP_Nxzrb_h&t zlvSXPU%pFRYW{rgC%%he;iH;Z31$fD0(uCzsNJuUH z3-^T2P4moz>P_-xK{FD}U2 z=rSPh6wj36MB9$kn1J8s@U*>_#H9z3s>D^6(|dOXVROymI>=T#=AOm=Iq-@F+UL=*u}kF?}Aw-ehyBO(K7d&`yeD~%+L8_7;*oM z<4U=pAN>k3aOXE}9}3#Ww@au+cd#-)2u!qcX}<+?Y7yXVl1ZIT=U}V&t2=eC+;$ke z@db&hq!*8)fLsuo#=Oi(`hYZ7hB-Q`!O*l`f~UndgC8eS;*ed`gnMB%8q1;)MHm?$e(UJJ2Qcs_2th{-gOs5?7 z;*ZbNVb^-%K(va$Mt3bJ_v|#$n#BOQqq6`>eXtMB8$;mF!WH1mY?{$yMTA5?Eu#6m zNAGzq#B1q23$etBuCDCgaP{!d?s?|SJfvjN0BM2!?RS_u?0FohHt9G_6d>B?veTH= z1)SvqJ`#_!aoduodF$$ct_9t-yQ>d1dW1-t(JTN2`>V6>xfZ}b%ZS#CG4%8f`@YB2 z!MAHN>@AK}_>0L?;Y@pIy@6Ot@;hBNW278MPJ#ixC62f|SsQ_Rzwk5$D~dn$TN4v6 z4?9A)VKBgz8OTU&m-2Ufn9?V4giuE@pM|`l*aNSeQo(t`DN0_990yM%iL(hkMb31R z5VFMtFmpU@by^yng=Yrvs^urWt|{FMRjcpUaR@zK{<;y{1(5a8X}F1URaSa9O9{fq z-}_QfuwI;#OF@U6r~9F^%&2$_0eHZLcKw5Ny)TpuoT%>`sOffO5S+V|iKTPDJRB-* zpj`|7I8o0>ROZC;d-Ukc7-G)t{SmNqU~ExCh3J^xo%2TR)Cj%3%VgF>k2RLP1xSsO zyJ@MJ$_I#@eR}jW&?Rm#0!~*+OQ>U;c6%ZN7v~#k$Q!N+@U~@es%O?di-TOQ?3_x_ zd`oK8`nh=!ky6(a61%eZZQ_Vjo6*2j2$9uB`Sfb$BI=tB7Ob&#ygfO-(UFey z0pp;Yvj=ilt!juACc-ixQ?}Y}F~wCPqdc-xe9aT#xAjr5f|Wt|k7Qh?uLgc{UV)Ly zWMQuE=dx1$3>M&}Boy*7I+t-inzktm5TAYrQxF1^L~z)Ohu6;Pg~0ew4o&biF*;_VEaFHk7k zAD%Z->E?ftwm71?BsgZBf#As9i-Nf&!i{}U%RwpgHs{mf`q-ORrBC?wkXF5fkWicj zXPZuRv|#GR;O3(+@)pY02}cTGObKwlz0wL^{MiT0zR%l=IgfPMQX~o{+0Kb}cU4|C z*cag@nZ&{O3#AGAwkCu4a8UuQM@roh|triMW(4pe2}43B^Yh01`vV5$cm z;@lY)7hpVi2B}0O4vK=;%+bNCOE4oesilj2C<&wvd;rJUD#}?nvT3+v?7B!s*ehCGG;N=@i(? z(f$PQ9gvz&{!5GD00GcNJE19BVm;qlD*@09D&#WS3emjC{&z;gw2ljrz0V9!jEB#k z_by9<){T(?a8xhM(Pv9Zio?4ZritH3eu_W5mw=nS4iDQ4>kd|xmo3Og`1_|_Vdds& zqRVLH^gTc`J|18L25KVmum{SVRy$loc)H4}u+3K;A+=3FyKo$!!j~S{H%W&j!8A9? z7p4t*;ljaaf2Cyu4zbzf!DV$^wZO*PCefr%jV4xFFY5f#nzRMfbk#f|Fu2t>!VO?O zUrlcu8R-X~)|L_|yuvz}TbO{D<@jVZ<#fa$=QKNO{YQz7m+3L99*$QpdPV|YQHvX> z!u{1r!vF$yyq~ICHTqvOt1E03WJxn0v6i~GL!ilnTnI?Xp?+HgZe=+AwT@}CD+dlSRn_?sR^C8@X zyxq>|hc-NY4(s^lm^nZbf#SyR2_Gu-F1y~sXKLdbH-TVSFt2=gK_n}ss%a*N4Z@&F zg@uMY>8~n?B0$0MjaYNGHg0OFbNf8u=HS@(58Am^Pi+$iw5GOZI+Z& z{Y=5WX6}Q-YBF0lNFS`^90_#S6yW&!gz+1$#e``RG_6en9BquIt$mj$sUkNnz@18i zbXQo@5$IuVlHoAye5G^i2_8Q1=KJs^4 zdc(@8c#p4Pd&5E;5#?478cG*^pdf&*4pdRXozU0miK6Rw5^E{ea7 zjmwnng}+J!nk9mAufyp_ek7U?#gY$J^6vXedO>#c5$8|u<84Hdj7O@xd*i6m^nYdm zc)~pr=2lRe+IIbvP68kaV1D~UJ3oE~YrS?9x8o6k z_+X4%4Gp9L`pMGT>Ku%d*)E!j0f7xJBv2T{RLK`x$!Je_z?s5S1t+-q}J4ws&K>iH=4_UgqrH-2=OlW8V)g9cflHuOY#}9vA+1m<5?bgEZv8esSlO@byQ6#i2FX{!Nl?D&idF ziQ@QG)#)vXe<=T83>*8asP7JoDL%WrU6;*$Fv0BLW$TAqZ8blix@J{XZT$RrKT0Wj z!b%>z5R&yHPBq$4jQJP~WZ$16kJy+5R_txk;mtR(ngAyw)nThYKihh5<8})-<<%wm ztEkE9fhRo!_sF3>GAutDI~w+Co~TykgB`;MUEC!A6pH#B#7@|5x`SVt;dr0mFF*If zXP;3FOAHw{$n?Gby#Tx0_yjMfr}k@6e6FxS{VqIydpmKHh^sq>BB@DFO)j-zYI}*D z7lj1WYwp(Z1mi@?qqh|wdbV#@GOeTr{Qp$IczN}FJRue8`^^^O6H_pyjt`oMdUBvg z9u8zC+#2W*jT!7nPB+jG2aulmd#>n)isu=+6eQ}kE8|rp!K!1rh@j&m&2`-6vzPI3$6^$haXP`w%YWNKP$YIh z@$k&}^1TLNz!RHeb}=HAK)z|`49NfruZg$tI)&s~^yPU7T2UErjys(cIBw7qT9$uW zx-kf(+YT?p&<@&n?P;=^tlYqXfHTY0LD7E%Lm+=9;iwq6b++u4X7rJU`G`${9y&sr z(cZp}+TT(id90P@JnWG?)`;zbZz~C@eZlPhRzIQKtd@sax5w-oahmmdo=-dyu=L2@ zf1|5rcPr}P&9%Kekmv4^oOJN@CPsMavcLI-!Y}QMhEd31BI3N*#$4s>hL$|)vUU2u zv!R1S>dUu}LK#-1D2N=Cf)h&c*m(iRd%dt${2hSG)e)QhN&9{VE0G9qO9bvOf~x?c z!60N=s1VFmSsj*z8ELlOiE^vjsHys_<_bxk23rfLofBnQUy5gy(2#_+1&we%`3}@@ zX5G2#z`{C7?{ooo0z6p@+kf{?0{q$KrvC(S=lQ2R#FJUQYg##KpAYp~F{%CKE8~pt zYG4i5D~wf=kOfCAbcDW*jQM3pKYLdChopVybnaDArXvC?FSydb_E7OJ{yCAgmjup@ z(hEOiW%?(XDYMeJ6FMvU57ka_wdfC^sQ-m#gr>_4Lbd?++$}k}Ax`2cm-ULA4^zb9Wn1cZG1h{W}OdYQIBhP8;A;$^cA+ z;uigAsq1dg-JBOi{n%g=G`5iVn91;|nA@B>t zCpcieC!rU8-rNV=i#xRM><`@e@z^{0!b{=<+b;ALN}T84Ipt~_LDoLM7t$-y8(!zbU46ApX6XD&jJO%~S_}A`uB^2b4 z-v)L97JDbUGxa&oMgI&K%}hvm$a=G|BF)OkUlVuFZT_lZx1pDibI8&Q^SlelF9;tz zA?ly?5I>1=^Kt&=iNm(m??ZoRWji%AWU%c()1MI=R&*DS@i;h17kNUpu1KOOcb4mqB za0EGH%xRB5VyfLMeyGH;)dbr}WoNlg+0p(q33KJtv&sjh-s^keU$R-YD$!)<=*0Xb zG?8#$7sbVdwjhD03&1A&9LPx3vrN+T!yfei3o-Ay%uR&b>*pjU0y-sa21&&sfgXP+ z2xbfFQ}tcpWU6l_y7^nV{`$S&Av$`M)^%LEX&4E9C7Bn&{tY&tU#tjMpfS{(&{i>^ zAsocUi+`YqD(y$Xm;b1kc2wrA-$~5<+L-Z)T^`(FCgAAxRgr<)_r-Y0ZiUOIByJd7 zMZobcPO#d;G66Qn1fO0Y*dizXq`q!Aa!4Fmt?2$vzwO5++rE4!^MnV^M0iKFUw}fk zlasyog8bbwHjz?Qyf=xZF8i(NzJ5=&y4#zm|9cdA(LId1@mA^dtM_t$_4Jy< zLvN%m547;z+1q#`p{ok8wO!813Koj@X>93L~C01ztxn5$oMJE)0 zSLSf}%_QDCfgsJWq96k<5Ky~60;uc#H|RK`*4e2o^FVKgQg7jTKgPpg=97O_ICyJU z4C2iIqZ8tnn_q9{(@08#4{ZcFQOMAL73ajGn6I*uw*ljnL4s|=yqzQy+M(c@yKOebT#IB;&rIrDP;C#Xj{jLL?GIs3jjau23f7e^$$wSXx zNOPp=WE$xr=+gyj$Ue6u>Gd>v7b4;@saL*pcX7p{r%QYHg3@EGKW{wU9>XF>SF4J7sAH0%0P2et2 zP<1>e&&!*T2CEdul5ZjvKaUc>9n30)$$z9l=MEAkC7X+O%{Zv~s5~C04{#lZDx_8i z=^~c7Uay;|$Sx|?^e+E-{Hs0MyX$itEE8zZ4aZuH1%0ecEuv8YEZokF02_@5K@wJo z8R{X(;F;QQm!g!SenFvYyh<$5Ut}Q!H4U`z6%P4T_I$t{PU6?y2oGWBta5osZ4?w24V&BVcA>)c;KdG!9CBih|5hg4NR zac-Menp)rMl*lS}#dT<*cO^wPcSY|}i&eIddk3s{6#{ZL_O({NC0qRvQ60%cmE$wD6_k!jL za!qtV$zP}Z(M4aK@b)Y{!HS8{4kVXP_x);xCH@%Iexmm_c)&L?SM@mth=0s*m+Y_k z0!)M|^Jyb#jfzmSU>Y3I(Zcz4j~WPqmTaEa2}2&VbXH?f-Rfo- z_1AXHoXS3vZ*o>Km#P@-?O8yx*b{43{O{rnPT#hZ0=)pxjW>0;!aPK(O(8-u%y?0F z;W4hyO@_g7oLC5LAax}_J2huR!A4Ny=~q17yLUl{SX`5Lgji+hqV~!gS1{@IAIt#0 zd}QV$bk98ZUBhFebbr=of?+tsz>C(gtE*&|SBD@x%ed_rzbGo7ZF6L%sWkmpke$b& zrvX|1N?%|FJVmT)T?nF&uj}FsT5leal~UBH@$}nEzMo;WC*et`G66aSJDgwPEM&l} z`9PHtg9C>HOn$z&D}-UMUtEVb-=#;E9doCNBBto0 z8W4?Q%*;6w{RTJ=QJk;vd1@xmEeP2cbm>Dp0*pxaXs#v`ho7~9YHFAZ-x#ct?_PQS zSf@aqQ}Kf%WcZ0$DX6ZCi0A8{Kt+#7js*q3cgsJfd%mZBnK3$uEaW9rWp+iXg74wp zw*h8*MkxcY@I>M*PXK#2~wDVaBMp41F<2{h|+g-h+m+Wxr+I~$M+fZ zfDb9xmn*{uP<+Ln^*z~uoLa)yPw!$riyS7|P=Fp7W}q0!?Puj%d6p-M`D%34uBRLu zd?Md;WsrO$-)*H+$b*7c+EL(rk_gPQeefD`jF2ZI>9BIQgDXVbu<;JZ2f)07N8JRl zt0WXC0;W=>g>Txofqm+rk_3;nc5acK%tem;dojJn513XQx;&hU+w-aJjKw4+>}>Cu zOd!YiQ-$$|mt^RW`e^q%Q5d2SLtj1mu~7`5QQBWak1I!yu14c1fT+7toX7~0*Dw*v zFZ@2LZ|1$4tKq_9t--`iFHlyZEpjNUr}haTe+Cu0W63Rr@nadM2JbKp--w&u0bQ!` z1d(wClZd(~G$1bA>4QCgM7(V#h7j~}Kz#XQ)GjaChOL&UKk%a zy3mq6;iBnRei`AtrIN~CMhicnsjU|-+alq0Oj71d&HNZ?C=EILV{x^E_hla~!2@Ii zu9uIFo`~BV3O?!iq>1Z2rXr|BxBNf_A?DbF-jnHF4*U*#XoKUmLICVbvv3d4 zAnW0oR71+gg9ln^9HLgK^z;pYTT!2hpvn2$AV0rm`0d{{*U6H8ukif{nn_L71M%AH zypk%+b@XY;J;;Ka&mzzwfGi9VLh&%?OwD+*_Bj+HB_mUvlQp;Gp`pZZ@WZdRUc^{w z=YdMEmVl#U;`ids*PO48IU+~5@}aU49fw_WI`6A5OsT(-Ccw6n z>k!tDf~iVXRB42@*vJ{t7`ac|5y33!1$Aa_>Mr#JqqyUS+a6m7;UP7xW1I~D#=J(Q= zfjd3a^{Fa{(){bLp9b|4R7oo{^MQ)34JFc6xO=Q9E-X()by!U;;D0A!XFhHtHk>=_ z<=1uJY^~1=Nm@5<-!@wDh#%je(Yw4A?;J~oUT*8kdiD4(pehVpBE9>EE*-{bxFMne zuv*2!!$&pMA$j^GUe%vpdH)T(GxYu}Uo(yMndaax+SRk6O>rR=5(q{Pd`17uQPQ21 zzNrl7C*nr_c=Acc)Rc*quTN}iKWQu~=sbny#?77k1%XA<>l+YRr9B&r)u(mVu&QZB zLhkj)#RCBOVEUTtqb!)cuN%GnKry5?vwxr}r80U5=%UcH0T|R3`v?@$qx-ojvMaVd zy#BFl*ZFZ0&d1rSpgp|dFv2WvO3bLYG_|9_!2#C?`bUR`b(W6bGJBsDAKcZ;J}9;J ziGJ|AKA@-5Q~~7cW0|>|#u2c##m^~fim6Iri`xC9R?fuTB)kWwL?*x~Pc}UrdyqoG zzt*myZ5F*XjMQOr^obM}_ip7Si7?(gMNPSTI{TPgbTa#U9mze4f9zFN!vMwW=poDp z)D)6tMvs-Lsb3Y^(VX-;0L7(2*c70ydFxP+TPyOeo#?t;^JlhnEGu)U5iV{MQz+jH zx2ciZ@V|whjWQUsgZ7ch{V81oNo0ki-gl88L;NYPP#X`%U*wtx`;dPe_nsoNbXp^#lgZT;CR0P zVW>drp%)(d{$f+pOm>?im*laNtzBy&3LbIY(F2094@~wo^%11RR{`~;%J27Z*^CIv z{h4%~Y9_=@V-rM~rYt4ef9G#Lyi)nyP!k3o&>@N`{2>0TF}a7rlQ?i|7TIJoL-uZr zUPEoMnyy4aUym67Dr<_1HVMtAstVkY@ou*T{eLnr;Xmx|an2OScng#nhB)dXdGiqC@lhUt*MOb@XxW1&9Wge2_`i!^MsC38R}A`%I|PoQy{R?`BJp<||B+ z=dFoggx|cd7@E2~rocCCNC=ObyAWQc^%71u*mE@;jai=Y&D*x;lw3}7p3mo==?Owq z#f6(rn}#Zm$5!}@N)yo47_w)8lehJs%-!K*x4*XcXP-VnR8i^UGpV2d4eXJ8dU`A( z7L2{O{E|K`y~{4)GBw(=G9LNlZpO?`MG!_Qfcf8LnHPj++y>{GS!yhGM4O6{5iRPA z!7^?HZ3SCqK|%Xuc>x+dO&AM6OvgTX1HKlaH*t7l==c|JVfL?OF0utZb1z~@BE4mf zR%NH`LFLl%$;O$9rx8s`s@|YI@vWYkp8X7CS+c7c)UMC?tz7uP%_Dif;9`x+&LZt6 z?a?24iRO?qLwA3e9x2Xv(dzGpsL)hzsXLx4pNU{3)h*T!&l}jO=Ubzz$P7XMZX{nJ zdKrE56J{fD*MaqOKH(iB_pN7#GxY+6b}*9G;BR^i&k)v+Ju_3Df3HRP%h18w8el5< z(U)5n9@tNOZ6vbS57tuaG#s&qd`^C!wuW9TY*jLIR%Lu;Ka6oB{?vz&R#m?mta)hC zd_dP67GsGh*lvIHvBCcF{X)V^ZIi_lZ4K#XnOYElK8ANmk4j3OnQWBV8r>3+UT6^GXiBe_F(j^ zG2->}$iO?t<5n!}oK^kn^4RW>x8A^Bb{GX5{oE8>-&+g7xjdWhBMh2#wUeu(&INu;Q04{alu1=2a(^FE_VOj4zvmh3C>;Y9|td zo!QUAHl*a&8NR}JVoGTb|3DNt6$&rjqD+f#pb1Z=K^~pF{ZJ{Iw84A+N)v>$5cSu`WJ7#&Si!wRfDO{>Sht^AP8w(C@XEgAkDM zG(s}fY1Pp+zHvxIN9Q2slC(?_fcoxI#3)YCuZUOrN6>Q_ddjz+2D za>ZEDT%2xbq?$!-VRp_$IhW55ykjzPoJQbOsFa(eyege(8&;Z@zb#(m(?#Q zL*)0vp_+ik+P7F))%}B3S+FP$48=*g&0n1V%qPIDoX_$?#Bt?Ld@^#CC7%_}l7ITO zm_)eKHYa>Ry=!&_>*uJV0nlPO%+%DR??52)u zKD#GKq9%4#A~2#HZ^f=;idF2U&+?m#Wue^ec27VLX;P*fmj~a~Lk=x1RF@1i>Z*1~ zBezEhC5-S_i+1AGKD*y+paYSsQys#71{PjkDp`Fb&xR7{4Zs=KQJzuuG-k8yVwIq} zmz%K5-tP~1@i_mq5KvJ=&=fZ5-w;OxV?8a1b-Dxy85_3!}yB-q4nI~xy|=vTH2 z<3ryoT5oS0FOTtiFpE26iiM?E|NFl4!dPXprS?45XY-Ny;2rsf2LEacdziYQf!T;( zgmPxdfb|8g580XXioJtpzvg$&11LV2%~$-l)`9}_L~Zhotn4=9J7B5Xw3!LVRKS7x z@Jp|!<)^IUtreB?<%&v+gEIvn0>^LvzW8kXr(YTC&VI@4Z*5RBG<0`0ib+z{Gu2?t zB_O4js<5wg;Ue1Hh`)O_ZLNXpNYBuH15}KE7i+H)l%{VO3tabJVvc%Wh7ONS7=YP>ubC~s&2=YwsYK$4-cReglo&F(bar_UfAk6J zB(+8pYiIYuG`hPa`moU?2=nIX=M-BQucQesm9xVKXuax%i=IcOSk+BJl}1b{5ZzZp zxUZtTgngM+a)B!kh9-}XQAe~=|7%E}EIBJ-B;;A43>t%t9N!10`O!B_dR`4@(pdRMSxf&RW{K8S2&a8e5{cT+8A_2X`MxDLJcrOf}?#}DR?8u=@JHK&1rbrVs0a^TDL_DZ#uPV{# z{PPfuX%FouSoOKGvPcTz-9m01K53LZ@=n)S$%u=_ne>qzOoAwbZtEuV;K9OmZ{P3^ zG|*iLcj&Lyc%mhM{i2=t=whcQ`Qm+-!(9H&tis0m&Ep=;bcks52WmQyw+6zS2yc~~ z+BazUAW{&zLFU8g(#BHvbKvNCK$q}&q~rJlso}m&`fnn!aPr^0CaCcPRzMfE&^HP% zrpp~FtNwu=N-ToN%D0$khS1*GpmWKGP(`?kf!Ih3$Cv^gKyx!8LCN29>|W!)+yy?J z8lbp~+KKeqhcs$%Yp_1UN6SN~O>JfYs18V~IM_T~HEJ0T4DGLl@c+FT5f<}leSF+$ zcJBGG`Z#&-`fFP&F zQ)gUJ*3_Bp_IQ>~6gwsE?K$}N*MjQkJ>$M6%o9_9@u$BLpATE+?BexkW_0w`&ne1& zf>X{FI@&#%r&d_2AIdO#Dij5_9My=yl;U!dVoTtvfOUw&`V zSQII5Ir%y-25Oz%ZCjFRxco~!K)>4P|F^NIm5gNaf*M?;A1T8RoSyNWkp*qapK<{% z2E9-XlMl`nW$Szlj5dJ|pF%yN}$(qvJ{ zprkJq{ck?|bu$4G_ZwH8dHiR9xu!)TGzG{oO=RpM=c+^lOFRC#G&Dx= zS?A`8DLHOeTu*RT9>{&cmE9M&x0dVBZ)d5diYa4N0E^zhGegHRsQTdQ@#xQ!U(@;= z=*3=#<|b)Gx%`|`pljlSjlaAgC3UR~SC1_6i+W~$AUKQb&`U(#izj5ZxZ%Gv8Q4Um zriK^;$n?tp<>h^5YMSt&oi!K1QD#cvI1VVew&n)NuEDdi&^JojZg5bG9{w*E1>e2j z-1+AtDQf(0gPk6&Hkx+ta>YAPkzLw%Yj*~+jLd?`0- zH=k0cPO;1C3cn*}lcRM5g~eRt(-S(w5(%S>+%Sd0#T2pdW)QhEjug7!afz9*Qg#IF zV;r*y(0(qK@n6-CsF1!IyD%=ayCv>AY846-Tqu)3?3s(H(Pc_*o4MgR?3RXo7Ck=m z)f4hx^ve)dG}NqEwe%BnJ$o!lA`m6f&djd$+Rd%9WupgeJ^qg#C2wypY7ET5+GX)ZH*NwrC?O#NS zqtC+H=A=(s=DuD;12?XIlq$<#B1+z`F(85hG1O9 z)TFCHnO{sm^(1M6B>K98;o!D)czwqFnkrld#ie6VbAkKDkN=Xa_F58BL>756LOYr1 zu=w!i7W7t#Oy@n^6Z5GTXTH=ryKp7j+n~XrA#seJ*OgUp&X==|ITsq@}i~z zCnNC2)_t`In6oK*Sz-J+>>Fdxezn=n5znqR#uaaj(SMW5ywv_$v^Rz~OjX)kqJTDp zg8KrpSpibsX{ZmFsuuiiR6YM^Tz7XI1zVOQ7^Z+6xX!4B#N2ofxK;R5)Dr*Y^e>dg zQG>V^8~x8d#}`QPljNBiBjl{IL;;q^H*ZyIi*ltmmEr2wgkwyT=N;igJTl6t%9&IB zJF6x8=r%XERv+2c{FIVED?7DEvOpah`DuDw3&#=M#)Q13{t-ESGtyX{-FLpJV5VV2 zRt$x^E;wC$t@9+%3v5qZ4HB8kooc_@0HuO!vbq350mWbco`^30O~kIQyu)UF^`Zk_ zanb{-X6*d@AJe@?F~98RNRC^+CrQLUph%Qlpwh~d4X=}ey+v#@3W@*XbSV3qYJ`5s z%>+?2o$uAsUj{|!=z(o9>Hkd_ElgmIxVMeOlxz$^SG+zG%xY7{i0}rrLR9RlnR;~J zaJ-s@o&92J9x~W{O-D#b0GZjot$rg|pLnyYnXI&f?p0`)>5eC#AI`f}gl(aoNKWN8$Ixga{5L(Fgv9m# zHnIQ-nKflkqx(P5uOC5~q;VQN;>w?xdMbZHdi(C&6ACVTeR-k%H@!o@I*L9X*$O<_ z%Box(bncVlQ_a4;YxfYWQ8Tl|$M7;n3yj%ZpU%J86tHA{xV2A)d0qhN{i8_%lrZTy zA~l9@?%xeiEH+*KrCYqzl{52xqY&~~tf!*VWDnA`|BUArerIScQ1m)lur?&*M+a9? zE)+4xKz(8i(0Jgm=&$OX%#mV|4tJ72?l5yJnlTtAazTM2liKlPt>nWMs2Y`C@Q`TSHno*D%bG`}wfcch=8+28ecyP)ueyaccO;WAnwFEH z>plC3RIGi<7@?>S=E1SLOs^(MICS03&TSas=YFw2FhElMXMp_bcc`@Xh0gj=ti-R3 zWF{vdI;&b(j?noG%P`b{7xn@TOb~s^SG4^4X@y^5=QB&DR>8FrHjDb;CN6POo z#9VmT)?$c8{cQzD4ZWoy@{}6Rw|5FksECX){tnd#p7__00D@NVK{E%dO z<`sT&;$muVWN>-;?eIgP)=jV;ZmDw}j_G`WUe-@YAV1_&tM6P+E9KSANnk81=YO{k zpwlGa`)a)p4+Jw&aP4HSM5$OV{;S0dssg#TLlH2we^utJEUYv(6lE2Z3_;tr{LN2K zUsf(7s;orIUfi=+3`Ple1#Yr%zye~zFJ96g7!-K%`sm>vCK8n5Qrz*@g)7N7MmEd4 zlqxXZ&f|m*QMnij`E{LpbfP3HycymqV^e#v-)`Y;BMhIu&-re{Kwy&U7SZ61lf+2< zH}mckWe$`pkJG9@X3s0Of8{9?#fv(Y+O_I(*r^v}v8*dTtMX%vf zi{)9SMNLbHmU-*=*;CyCd`a*v{Dxiv%wc@^*wuL*Y0{6EaX&v~j}2wM@oqfZQ|$vI zqM@y&^a9c}$n@n89bshpsWEPEy$@-XynO3Lea2Ps{{tqhn92)mDeM1J!DzW>rPCM$ zRaD>A&oBF}s->mEFX?X|uLmdwYzv>9S}8yx^#aETL<}EcP`ziCIIj5) zJF-aiA9E^5&fF1bDnTzfRYn*5OD!e?(tGHA<1E!%Nw{HVP^<(nLw86*(?>sIy7oEO zA^K*B6BxVl!fTQE17n+T|E2R^5(bWc_n8k2h9UAyLL$@=vS^r{J#=9{;~{#PU`W3A zyD|u~YPB<8L^W^w$(;52`yPY3q84ZER?e~$H!iyxzbdI^;>t?C!72rf>HPvsq4kkP zpF`56dp&mNOJhL&vA^d|Q6m9TSSq#Ls%s3Ss$yM3xOt4~OnAZOE><`!N?=FA5=StT zM8mEy=3OlSEEpx`%}*6pm`sc{j#U-z{ro-c3nejhCV+}R@!{`ZJIw{adawpUSy|{i zG!x<9c`T&TT8%J{32ihKPCztksfkmY{+#gkXRpqzu5(QR`9~Fr0NG9bSspXo*d5N>$sHivTu%Tm8&S}j^o^`LBUvdF$JaP z6`+r@>qq1+au0R_XY;PZ|9!CB@vCUOVRon@1;tZW^y0a8RLICdz{9j^L8}a_8yZlx zk+IN*@j3<99G&I=J|WydTCF)n&oi?#&fF^%tBA5ZZfjfYV#=SWRb}~c1%BI>JOJxzbdnQ&neI6&G*%y zpF50~9sz2|c$19Gs}Q&r+>I^L9h_y|_{-?ntV{nq|5kTDr#@IYqzYu+41cdVii@FN zjqs8>9VmbS&}@ZsRZi;F4!O%av7B0Om7h~el67M5^?XGl+TTqE?E>0rFGWnuUSJZJ z1kot7Co!tHDN0AR>#F<3mL+M_tR)$d9rQ&vu*dV-+0k;>8&i6MWGA`LYfR`PRUx5J z2M`-|YG_UO#|Pj4HG8L+C9#C9k1vR0JBi=K>IieH@6rOOt<^o>&;-hj^&wVi=nw2 zYnv_2hz9ptL&^ZX8z^MRER%I{TcEuR;f@JHt`3^u4SsGbLU}Q24Pt^%_9EYD7h?;r z!xgOJFRywl9Ji`Kf&luujtcs=q@@ydc{mIBB@Bx{yp@;$;C>S2BLWTx@BvQDgoVDW z)qP)^!_AltT3{)%hVMIeYao!~{CA!K)R$=TgV@U7WB`8rTR|*5-&7)iV`vBP7Qg<=w4I%o!0XX>2v6?Z{u~;6X4(a z2^nN8gByM(^YiJ3CRRy{7?c3pCKOL@*PnQ?brby#Yf}CWK z{%&63;E)r+Kc)L`*2qYiUvAAn^6qH48`ong(aTwS*I>vO8BEVG-ZI$p^WgA{F6lcL z3LO+Z4YLw%>$dyA$CEHmy`XARrHr@#D0Iqa$`F=cV7>u^LvS{1SAyK!K4d z`Q@Te0^P-bqj+FX|E6!4S+{0qr%)$wGvP%dCRGB0-iRhCwj(;8>2Q^m{3~bQE&28z z*GbCMNjqud&c9pV&VYxXUNy=i+J#rHqWRC!w21TSqT% z{GHq`ilB1~ucC4<7A29&6@2IEt2Hw(aO=(=^`DS~J5-S>A~KV%sUS+Kc=RWh(v?za z;9!6(*W%2LL34s-5o!7*-TEj0^jX>11UtmcUv=={Q5V5vXhNUT#@jmY9{|}lpl)o; zvo~+eQ@8)(%lOy0L)(Uv`?4e}8*W@*ZN$B|mH!6a9*u^c1!5SC3zV)TM4%5;vydXW z3r8l)k~!7pjxLFon7?VedF2o-aR!{>?cYU!i>f1J{y^DbzEtJA&VW?fo( zudi?>fRpa{sXnHSsVrNACkx^+JF*vLF!CY_;nB|u2Pcjz6uo0V) zOAN!)QJNtQ8LTcy1l zhABNFaj$;Fm6~cSk^xueb7aVHOQE6)Zk_Xv{w_z_#BjvL0 zT_PdmKd1+y^9#MXa^&3k79TG3^FAV%RNPE%vaW%vk``89(O)Hg`09M!m-z3fLn1t1 z60DB%?MICZ66G-ZmNk2uF9RY@I)~h)TNmh^e`E(2LsLI_Oc2;6()Q-{hCX~%#06~~ zD)ko^fNnuN5K8J&Cd?hFZqa^vDbjoL5cLBQiLeTK%qD{qF{_fRx4pge3bGL*A?Se` zM+qZI0a_EGO<3k4JtW|0VZ#$v)PIis+PPv0KbgYR92NGVyI&}TcVSJtJ>#Z z#*&~3F7f}(nJ8nY(u$N+w{ZUiz+EIs3PL8y*cCOn;MNaIfVWTB54F*9F2wA?mGcDV z{lt7gUjFVQMyZ%aSj^I(Fa~op3K!l?P%{bKu?x7{9YFD8QJ8k^V*x}9o%$yqE>m30 z1UDInpyPn-3DMDi%~`pY^;sIjGaHSvXVC}4)yJnwYo;bs+C)UW+FZ}B%;e#-++8Q9 zciK)R-0@NZy-2N5oQ^!;E3P-*dlYDH^64&xq~iJ;uOujfG29I2x=V|`b_K+RWFgi( z2hcGWPwrd4AD)!Zgs%z;ZWVvK5v0coZb-&*d?oWZ9MmD%Q$L1__aaT0aQTJUC%ee^ ztv!Y~_ey{${xHUwb|c;Ua~2*uM}5;)1>nOh%RKs+uJ5Z+Ob zlX>_UpF@au=0kLFh0{^^JS@@CuK-E_cz=!9ZZ$~uPe8}BSj`AXC(?gdsDAsoJH=~z zesHac@=uX$k!RztquEawe=%}99M-$F8Z-+roo#&~j|W)2)~)V6{*a>IA$3Ekc~}cm zD`5EKy$&v&u+3!^4=;X->#O=;qj{CdIYlv}nzGyD(3kqr!2q7wk|W&x@2v_@519~k z3{Ap>$0Op<85K!cz%cOlhkpEB6HsBwXGVXD0*HqIVu6Ki&$4HftLJKW6>F@t^oH8Y zL0rOV|Lt(`gqS21We@cB-ar0oxhMma!veKu^YR!8F#g@6t5XG%Op>Xkzy11*yTsR_ z!8eU0G(FY?)S(Ne@F-zpkwp`fI>$g)A!~gdnK)5%hWO(oAt(EJ&=mm?U#(2sE`5iF zxg7t!00IK(K7O9X32BG+$N}LSxZFbvZ44i)j6oqR zCZK4VLNRky!Irb)B3UuK?JbPS=+!G7Akb)OrrQ;D$--6$7Xu|Bm;93QQN{)iD>O)(v3w|gEWv@58q-szkV2~>sh5(@WVFU1hec{y;D)Nz579uXaz#@i$f`gp;k0>0e6{s8Ew=wR z?ggFow|PF6-*}sL^#6asYY^wT^aKODlsP#(SIxJbn#{DeyMBAmUuS{;_1)Xq4glTd zkn(e##NI0Y55T*IzE;h(*>_!ob%yNk_$Bl1F+$Q`gX=7&DUwSW_SEJVR2*^mGxame zEvukK z)K>9Nux847m6EvN^2-I^{8G=_x6HJk^#`mXLdB$`Fv6U*qf?RpJFCPuE#v>2CM4CL z`E#%-`M567h}eHVJ?cjz1VfJgog7m4k&BmyH#q+P1mIFM_YQjp;EDeX-R7(n@%F3= zz;XK1YwPyBzrW;1@z($5h1K9Rp%WJ;mhAAJv9M5YvvK`?tIzIRAwG2NJFdZMz}fwu z-vE;HHnapW2tTUt*zgQo#we^RnCuwOAiKl!fMC$A-+m9nm_T0Y*e8-;!1D2bNY8!2 zWQpwp2Y_M@Uk+|%cpv4#81bjS>*MVtlZW5HO~{USA_*sem72GqRN-yV+zEq=IdC{L zc>+^L_P_mW?c~5g&`}g|=O^$ywPs*Vzn^_OH^{^Tml|9D-cE{HbTjntpV$0`pV==m zoCA8c;X)9@yJz8w$GDT8bUze*yhp-bXfgM84v3zoT@v-WZibrCe|~&lyhB$(s$=FX zCx0%Wc@N^4fmccZ0mu=+UL}|WCvVW9K_GAdOoHrender('docs.html.twig'); + } + /** * @Route("/api/{name}.json", name="app_api_docs_json") */ diff --git a/symfony.lock b/symfony.lock index 0704968..a2954bc 100644 --- a/symfony.lock +++ b/symfony.lock @@ -90,6 +90,9 @@ "doctrine/reflection": { "version": "v1.0.0" }, + "doctrine/sql-formatter": { + "version": "1.1.1" + }, "guzzlehttp/guzzle": { "version": "6.5.2" }, @@ -175,6 +178,9 @@ "symfony/dependency-injection": { "version": "v5.0.1" }, + "symfony/deprecation-contracts": { + "version": "v2.2.0" + }, "symfony/doctrine-bridge": { "version": "v5.0.1" }, @@ -231,6 +237,9 @@ "src/Kernel.php" ] }, + "symfony/http-client-contracts": { + "version": "v2.3.1" + }, "symfony/http-foundation": { "version": "v5.0.1" }, @@ -259,15 +268,24 @@ "tests/.gitignore" ] }, + "symfony/polyfill-intl-grapheme": { + "version": "v1.20.0" + }, "symfony/polyfill-intl-idn": { "version": "v1.13.1" }, + "symfony/polyfill-intl-normalizer": { + "version": "v1.20.0" + }, "symfony/polyfill-mbstring": { "version": "v1.13.1" }, "symfony/polyfill-php73": { "version": "v1.13.1" }, + "symfony/polyfill-php80": { + "version": "v1.20.0" + }, "symfony/routing": { "version": "4.2", "recipe": { @@ -291,6 +309,32 @@ "symfony/stopwatch": { "version": "v5.0.1" }, + "symfony/string": { + "version": "v5.1.7" + }, + "symfony/translation-contracts": { + "version": "v2.3.0" + }, + "symfony/twig-bridge": { + "version": "v5.1.7" + }, + "symfony/twig-bundle": { + "version": "5.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.0", + "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" + }, + "files": [ + "config/packages/test/twig.yaml", + "config/packages/twig.yaml", + "templates/base.html.twig" + ] + }, + "symfony/twig-pack": { + "version": "v1.0.2" + }, "symfony/var-dumper": { "version": "v5.0.1" }, @@ -300,6 +344,12 @@ "symfony/yaml": { "version": "v5.0.1" }, + "twig/extra-bundle": { + "version": "v3.1.0" + }, + "twig/twig": { + "version": "v3.1.0" + }, "webimpress/safe-writer": { "version": "2.0.0" }, diff --git a/templates/docs.html.twig b/templates/docs.html.twig new file mode 100644 index 0000000..7addae3 --- /dev/null +++ b/templates/docs.html.twig @@ -0,0 +1,36 @@ + + + + + + API Documentation | TLE API + + +
+ + + + + + + + From d7203fc6c3edefbb1321a601c21c0f6b99018888 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Oct 2020 16:55:27 +0100 Subject: [PATCH 039/151] add coverage badge --- config/bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/bootstrap.php b/config/bootstrap.php index d40335e..452a4fb 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -19,7 +19,7 @@ } } elseif (class_exists(Dotenv::class)) { // load all the .env files - (new Dotenv(false))->loadEnv(dirname(__DIR__) . '/.env'); + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); } else { throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); } From c7a996cfec7305b447f36135d96bb1f8f1f492aa Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Oct 2020 17:06:29 +0100 Subject: [PATCH 040/151] no message --- src/Controller/ApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index d8e47c1..b42abf8 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -13,7 +13,7 @@ class ApiController extends AbstractController use FileSystemAwareTrait; /** - * @Route("/", name="app_api_docs") + * @Route("/api/tle/docs", name="app_api_docs") */ public function docs(): Response { From 8cd09654381d30862321dac2f77462bf2ce76ce5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:38:37 +0100 Subject: [PATCH 041/151] composer install --- composer.lock | 12 ++++++------ symfony.lock | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 5e152cc..28f2c63 100644 --- a/composer.lock +++ b/composer.lock @@ -81,16 +81,16 @@ }, { "name": "doctrine/annotations", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5" + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/88fb6fb1dae011de24dd6b632811c1ff5c2928f5", - "reference": "88fb6fb1dae011de24dd6b632811c1ff5c2928f5", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", "shasum": "" }, "require": { @@ -150,9 +150,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.11.0" + "source": "https://github.com/doctrine/annotations/tree/1.11.1" }, - "time": "2020-10-17T22:05:33+00:00" + "time": "2020-10-26T10:28:16+00:00" }, { "name": "doctrine/cache", diff --git a/symfony.lock b/symfony.lock index a2954bc..54a84ad 100644 --- a/symfony.lock +++ b/symfony.lock @@ -102,9 +102,21 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, + "ivanstan/tle-php": { + "version": "1.0" + }, "jdorn/sql-formatter": { "version": "v1.2.17" }, + "laminas/laminas-code": { + "version": "3.4.1" + }, + "laminas/laminas-eventmanager": { + "version": "3.3.0" + }, + "laminas/laminas-zendframework-bridge": { + "version": "1.1.1" + }, "myclabs/php-enum": { "version": "1.7.2" }, @@ -135,6 +147,9 @@ "ralouphie/getallheaders": { "version": "3.0.3" }, + "roave/security-advisories": { + "version": "dev-master" + }, "symfony/apache-pack": { "version": "1.0", "recipe": { From ef057ac65de2af1c7342445df49078b20d4a7dd3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:43:10 +0100 Subject: [PATCH 042/151] no message --- composer.json | 21 +- composer.lock | 1107 ++++++++++++------------------------------------- 2 files changed, 269 insertions(+), 859 deletions(-) diff --git a/composer.json b/composer.json index c6b4974..fadc745 100644 --- a/composer.json +++ b/composer.json @@ -9,23 +9,22 @@ "ivanstan/tle-php": "^1.0", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.1.*", - "symfony/browser-kit": "5.1.*", - "symfony/console": "5.1.*", - "symfony/dotenv": "5.1.*", + "symfony/asset": "5.0.*", + "symfony/browser-kit": "5.0.*", + "symfony/console": "5.0.*", + "symfony/dotenv": "5.0.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.1.*", + "symfony/framework-bundle": "5.0.*", "symfony/orm-pack": "^1.0", - "symfony/serializer": "5.1.*", - "symfony/twig-bundle": "5.1.*", - "symfony/yaml": "5.1.*", + "symfony/serializer": "5.0.*", + "symfony/twig-bundle": "5.0.*", + "symfony/yaml": "5.0.*", "twig/extra-bundle": "^2.12|^3.0", "twig/twig": "^2.12|^3.0" }, "require-dev": { - "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.1" + "symfony/phpunit-bridge": "^5.0" }, "config": { "preferred-install": { @@ -74,7 +73,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.1.*" + "require": "5.0.*" } } } diff --git a/composer.lock b/composer.lock index 28f2c63..6cc702f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bf6c5c44873f54ab888176739539d99b", + "content-hash": "6fe69db5c92e38f91a659fedc9bd30c6", "packages": [ { "name": "composer/package-versions-deprecated", @@ -2408,23 +2408,22 @@ }, { "name": "symfony/asset", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb" + "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/ef0bcafce1c14bbf49838b01e990a8bfafd071eb", - "reference": "ef0bcafce1c14bbf49838b01e990a8bfafd071eb", + "url": "https://api.github.com/repos/symfony/asset/zipball/aaf4ba865c02f6df999166a0148d56f2b11b11fb", + "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb", "shasum": "" }, "require": { "php": ">=7.2.5" }, "require-dev": { - "symfony/http-client": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0" }, @@ -2434,7 +2433,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2462,7 +2461,7 @@ "description": "Symfony Asset Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.1.7" + "source": "https://github.com/symfony/asset/tree/5.0" }, "funding": [ { @@ -2478,20 +2477,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-05-30T20:12:43+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "8944cc83bb18f83f577225c695d999044e7c62b0" + "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/8944cc83bb18f83f577225c695d999044e7c62b0", - "reference": "8944cc83bb18f83f577225c695d999044e7c62b0", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c46b676a993cc437bafe6fe0f30f074857cde2a6", + "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6", "shasum": "" }, "require": { @@ -2510,7 +2509,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2538,7 +2537,7 @@ "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.1.7" + "source": "https://github.com/symfony/browser-kit/tree/v5.0.11" }, "funding": [ { @@ -2554,20 +2553,20 @@ "type": "tidelift" } ], - "time": "2020-10-02T08:49:02+00:00" + "time": "2020-06-12T09:22:24+00:00" }, { "name": "symfony/cache", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd" + "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", - "reference": "292cd57b7c2e3c37aa2f0a2fa42dacae567dd5cd", + "url": "https://api.github.com/repos/symfony/cache/zipball/5da40a385c8182d18f4cca960bce7191c8f24e07", + "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07", "shasum": "" }, "require": { @@ -2575,7 +2574,6 @@ "psr/cache": "~1.0", "psr/log": "~1.0", "symfony/cache-contracts": "^1.1.7|^2", - "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, @@ -2603,7 +2601,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2635,7 +2633,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.1.7" + "source": "https://github.com/symfony/cache/tree/v5.0.11" }, "funding": [ { @@ -2651,7 +2649,7 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:02:37+00:00" + "time": "2020-07-23T17:20:42+00:00" }, { "name": "symfony/cache-contracts", @@ -2734,24 +2732,22 @@ }, { "name": "symfony/config", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191" + "reference": "2306321ef6a21a0de51a139774b6b7b38804815b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6ad8be6e1280f6734150d8a04a9160dd34ceb191", - "reference": "6ad8be6e1280f6734150d8a04a9160dd34ceb191", + "url": "https://api.github.com/repos/symfony/config/zipball/2306321ef6a21a0de51a139774b6b7b38804815b", + "reference": "2306321ef6a21a0de51a139774b6b7b38804815b", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/finder": "<4.4" @@ -2769,7 +2765,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2797,7 +2793,7 @@ "description": "Symfony Config Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.1.7" + "source": "https://github.com/symfony/config/tree/v5.0.11" }, "funding": [ { @@ -2813,20 +2809,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-07-15T10:53:08+00:00" }, { "name": "symfony/console", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8" + "reference": "95794074741645473221fb126d5cb4057ad25bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", - "reference": "ae789a8a2ad189ce7e8216942cdb9b77319f5eb8", + "url": "https://api.github.com/repos/symfony/console/zipball/95794074741645473221fb126d5cb4057ad25bf1", + "reference": "95794074741645473221fb126d5cb4057ad25bf1", "shasum": "" }, "require": { @@ -2834,12 +2830,10 @@ "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^1.1|^2" }, "conflict": { "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" @@ -2865,7 +2859,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2893,7 +2887,7 @@ "description": "Symfony Console Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/console/tree/v5.1.7" + "source": "https://github.com/symfony/console/tree/v5.0.11" }, "funding": [ { @@ -2909,31 +2903,29 @@ "type": "tidelift" } ], - "time": "2020-10-07T15:23:00+00:00" + "time": "2020-07-06T13:22:03+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b" + "reference": "9263d52372205c57823bf983bc4f413378830757" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2dea4a3ef2eb79138354c1d49e9372cc921af20b", - "reference": "2dea4a3ef2eb79138354c1d49e9372cc921af20b", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9263d52372205c57823bf983bc4f413378830757", + "reference": "9263d52372205c57823bf983bc4f413378830757", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.1", + "symfony/config": "<5.0", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -2943,7 +2935,7 @@ "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "^5.1", + "symfony/config": "^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -2957,7 +2949,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2985,7 +2977,7 @@ "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.1.7" + "source": "https://github.com/symfony/dependency-injection/tree/5.0" }, "funding": [ { @@ -3001,87 +2993,20 @@ "type": "tidelift" } ], - "time": "2020-10-01T12:14:45+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583" + "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b7369a435a64d06e9036e69ed1cd6ce240338583", - "reference": "b7369a435a64d06e9036e69ed1cd6ce240338583", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/e2ab3fe26133c5d997684f1b961acbd6b04e2805", + "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805", "shasum": "" }, "require": { @@ -3090,13 +3015,12 @@ "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", - "symfony/form": "<5.1", + "symfony/form": "<5", "symfony/http-kernel": "<5", "symfony/messenger": "<4.4", "symfony/property-info": "<5", @@ -3110,15 +3034,13 @@ "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "~2.4|^3.0", + "doctrine/dbal": "~2.4", "doctrine/orm": "^2.6.3", "doctrine/reflection": "~1.0", - "symfony/cache": "^5.1", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", - "symfony/doctrine-messenger": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.1.3", + "symfony/form": "^5.0", "symfony/http-kernel": "^5.0", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^4.4|^5.0", @@ -3141,7 +3063,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3169,7 +3091,7 @@ "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.1.7" + "source": "https://github.com/symfony/doctrine-bridge/tree/5.0" }, "funding": [ { @@ -3185,27 +3107,26 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:14:57+00:00" + "time": "2020-07-23T16:54:02+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec" + "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6d6885e167aad0af4128b392f22d8f2a33dd88ec", - "reference": "6d6885e167aad0af4128b392f22d8f2a33dd88ec", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/bbc756c0895d08a1e69a59d8541a647b47f5a732", + "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "masterminds/html5": "<2.6" @@ -3220,7 +3141,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3248,7 +3169,7 @@ "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.1.7" + "source": "https://github.com/symfony/dom-crawler/tree/5.0" }, "funding": [ { @@ -3264,25 +3185,24 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/dotenv", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "f406eaad1231415bf753fbef5aef267a787af4e5" + "reference": "efd887f012127acad22325d109fe8ddf635f1f97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/f406eaad1231415bf753fbef5aef267a787af4e5", - "reference": "f406eaad1231415bf753fbef5aef267a787af4e5", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/efd887f012127acad22325d109fe8ddf635f1f97", + "reference": "efd887f012127acad22325d109fe8ddf635f1f97", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1" + "php": ">=7.2.5" }, "require-dev": { "symfony/process": "^4.4|^5.0" @@ -3290,7 +3210,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3323,7 +3243,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/5.1" + "source": "https://github.com/symfony/dotenv/tree/5.0" }, "funding": [ { @@ -3339,20 +3259,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-05-28T08:20:26+00:00" }, { "name": "symfony/error-handler", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9" + "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/5e4d8ef8d71822922d1eebd130219ae3491a5ca9", - "reference": "5e4d8ef8d71822922d1eebd130219ae3491a5ca9", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d01fba9a55614a1addb0d52d6a9566560b2a2af8", + "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8", "shasum": "" }, "require": { @@ -3362,14 +3282,13 @@ "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3397,7 +3316,7 @@ "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.1.7" + "source": "https://github.com/symfony/error-handler/tree/5.0" }, "funding": [ { @@ -3413,27 +3332,25 @@ "type": "tidelift" } ], - "time": "2020-10-02T08:49:02+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f" + "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d5de97d6af175a9e8131c546db054ca32842dd0f", - "reference": "d5de97d6af175a9e8131c546db054ca32842dd0f", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", + "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "symfony/event-dispatcher-contracts": "^2" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -3446,7 +3363,6 @@ "psr/log": "~1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -3459,7 +3375,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3487,7 +3403,7 @@ "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.1.7" + "source": "https://github.com/symfony/event-dispatcher/tree/5.0" }, "funding": [ { @@ -3503,7 +3419,7 @@ "type": "tidelift" } ], - "time": "2020-09-18T14:27:32+00:00" + "time": "2020-06-18T18:18:56+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3586,16 +3502,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae" + "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/1a8697545a8d87b9f2f6b1d32414199cc5e20aae", - "reference": "1a8697545a8d87b9f2f6b1d32414199cc5e20aae", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", + "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", "shasum": "" }, "require": { @@ -3605,7 +3521,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3633,7 +3549,7 @@ "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.1.7" + "source": "https://github.com/symfony/filesystem/tree/v5.0.9" }, "funding": [ { @@ -3649,20 +3565,20 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:02:37+00:00" + "time": "2020-05-30T20:12:43+00:00" }, { "name": "symfony/finder", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8" + "reference": "127bccabf3c854625af9c0162779cf06bc1dd352" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", - "reference": "2c3ba7ad6884e6c4451ce2340e2dc23f6fa3e0d8", + "url": "https://api.github.com/repos/symfony/finder/zipball/127bccabf3c854625af9c0162779cf06bc1dd352", + "reference": "127bccabf3c854625af9c0162779cf06bc1dd352", "shasum": "" }, "require": { @@ -3671,7 +3587,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3699,7 +3615,7 @@ "description": "Symfony Finder Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.1.7" + "source": "https://github.com/symfony/finder/tree/5.0" }, "funding": [ { @@ -3715,7 +3631,7 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "symfony/flex", @@ -3786,16 +3702,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "023ca658526278c0e74542079f1984e042aa6c1d" + "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/023ca658526278c0e74542079f1984e042aa6c1d", - "reference": "023ca658526278c0e74542079f1984e042aa6c1d", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/0fc0a93f8bbe465d0b483e21b087d432baa92c16", + "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16", "shasum": "" }, "require": { @@ -3803,27 +3719,25 @@ "php": ">=7.2.5", "symfony/cache": "^4.4|^5.0", "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.1", + "symfony/dependency-injection": "^5.0.1", "symfony/error-handler": "^4.4.1|^5.0.1", - "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^5.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/routing": "^5.1" + "symfony/routing": "^5.0" }, "conflict": { "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.0", "phpdocumentor/type-resolver": "<0.2.1", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<5.1", + "symfony/asset": "<4.4", "symfony/browser-kit": "<4.4", "symfony/console": "<4.4", "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<5.1", + "symfony/dotenv": "<4.4", "symfony/form": "<4.4", "symfony/http-client": "<4.4", "symfony/lock": "<4.4", @@ -3845,12 +3759,12 @@ "doctrine/cache": "~1.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^5.1", + "symfony/asset": "^4.4|^5.0", "symfony/browser-kit": "^4.4|^5.0", "symfony/console": "^4.4|^5.0", "symfony/css-selector": "^4.4|^5.0", "symfony/dom-crawler": "^4.4|^5.0", - "symfony/dotenv": "^5.1", + "symfony/dotenv": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/form": "^4.4|^5.0", "symfony/http-client": "^4.4|^5.0", @@ -3861,12 +3775,11 @@ "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", - "symfony/security-bundle": "^5.1", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0", "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "^5.0", + "symfony/string": "~5.0.0", "symfony/translation": "^5.0", "symfony/twig-bundle": "^4.4|^5.0", "symfony/validator": "^4.4|^5.0", @@ -3888,7 +3801,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -3916,7 +3829,7 @@ "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.1.7" + "source": "https://github.com/symfony/framework-bundle/tree/v5.0.11" }, "funding": [ { @@ -3932,120 +3845,35 @@ "type": "tidelift" } ], - "time": "2020-09-30T05:27:28+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-version": "2.3", - "branch-alias": { - "dev-main": "2.3-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b" + "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/353b42e7b4fd1c898aab09a059466c9cea74039b", - "reference": "353b42e7b4fd1c898aab09a059466c9cea74039b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", + "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" + "symfony/expression-language": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4073,7 +3901,7 @@ "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.1.7" + "source": "https://github.com/symfony/http-foundation/tree/v5.0.11" }, "funding": [ { @@ -4089,29 +3917,27 @@ "type": "tidelift" } ], - "time": "2020-09-27T14:14:57+00:00" + "time": "2020-07-23T10:04:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708" + "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1764b87d2f10d5c9ce6e4850fe27934116d89708", - "reference": "1764b87d2f10d5c9ce6e4850fe27934116d89708", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", + "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/log": "~1.0", - "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", - "symfony/http-client-contracts": "^1.1|^2", "symfony/http-foundation": "^4.4|^5.0", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", @@ -4162,7 +3988,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4190,7 +4016,7 @@ "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.1.7" + "source": "https://github.com/symfony/http-kernel/tree/v5.0.11" }, "funding": [ { @@ -4206,38 +4032,70 @@ "type": "tidelift" } ], - "time": "2020-10-04T07:57:28+00:00" + "time": "2020-07-24T04:14:59+00:00" }, { - "name": "symfony/orm-pack", - "version": "v1.2.0", + "name": "symfony/mime", + "version": "v5.0.11", "source": { "type": "git", - "url": "https://github.com/symfony/orm-pack.git", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" + "url": "https://github.com/symfony/mime.git", + "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", + "url": "https://api.github.com/repos/symfony/mime/zipball/aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", + "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "*", - "doctrine/common": "^2", - "doctrine/doctrine-bundle": "^2", - "doctrine/doctrine-migrations-bundle": "^2", - "doctrine/orm": "^2" + "php": ">=7.2.5", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, - "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A pack for the Doctrine ORM", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], "support": { - "issues": "https://github.com/symfony/orm-pack/issues", - "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" + "source": "https://github.com/symfony/mime/tree/5.0" }, "funding": [ { @@ -4253,72 +4111,38 @@ "type": "tidelift" } ], - "time": "2020-08-31T10:20:18+00:00" + "time": "2020-07-23T10:04:24+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.20.0", + "name": "symfony/orm-pack", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c" + "url": "https://github.com/symfony/orm-pack.git", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", + "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] + "composer/package-versions-deprecated": "*", + "doctrine/common": "^2", + "doctrine/doctrine-bundle": "^2", + "doctrine/doctrine-migrations-bundle": "^2", + "doctrine/orm": "^2" }, + "type": "symfony-pack", "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], + "description": "A pack for the Doctrine ORM", "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0" + "issues": "https://github.com/symfony/orm-pack/issues", + "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" }, "funding": [ { @@ -4334,7 +4158,7 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2020-08-31T10:20:18+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -4751,22 +4575,20 @@ }, { "name": "symfony/routing", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf" + "reference": "1369ee6823074c406815b65a40d47fd5ee48e517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/720348c2ae011f8c56964c0fc3e992840cb60ccf", - "reference": "720348c2ae011f8c56964c0fc3e992840cb60ccf", + "url": "https://api.github.com/repos/symfony/routing/zipball/1369ee6823074c406815b65a40d47fd5ee48e517", + "reference": "1369ee6823074c406815b65a40d47fd5ee48e517", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" + "php": ">=7.2.5" }, "conflict": { "symfony/config": "<5.0", @@ -4792,7 +4614,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4826,7 +4648,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.1.7" + "source": "https://github.com/symfony/routing/tree/v5.0.11" }, "funding": [ { @@ -4842,26 +4664,25 @@ "type": "tidelift" } ], - "time": "2020-10-02T13:05:43+00:00" + "time": "2020-06-18T18:18:56+00:00" }, { "name": "symfony/serializer", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952" + "reference": "825b66f545da95e9bb1626d5655be6693376d52a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/6b673b802dabd2bcf7cab05d04d2d8ef8891b952", - "reference": "6b673b802dabd2bcf7cab05d04d2d8ef8891b952", + "url": "https://api.github.com/repos/symfony/serializer/zipball/825b66f545da95e9bb1626d5655be6693376d52a", + "reference": "825b66f545da95e9bb1626d5655be6693376d52a", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", @@ -4898,7 +4719,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -4926,7 +4747,7 @@ "description": "Symfony Serializer Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.1.7" + "source": "https://github.com/symfony/serializer/tree/5.0" }, "funding": [ { @@ -4942,7 +4763,7 @@ "type": "tidelift" } ], - "time": "2020-10-03T13:58:17+00:00" + "time": "2020-07-23T08:36:09+00:00" }, { "name": "symfony/service-contracts", @@ -5025,16 +4846,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323" + "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/0f7c58cf81dbb5dd67d423a89d577524a2ec0323", - "reference": "0f7c58cf81dbb5dd67d423a89d577524a2ec0323", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fbc3084469450c6f6616f5436a00e180ea9ff118", + "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118", "shasum": "" }, "require": { @@ -5044,7 +4865,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5072,95 +4893,7 @@ "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.1.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/string", - "version": "v5.1.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", - "reference": "4a9afe9d07bac506f75bcee8ed3ce76da5a9343e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony String component", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.1.7" + "source": "https://github.com/symfony/stopwatch/tree/5.0" }, "funding": [ { @@ -5176,7 +4909,7 @@ "type": "tidelift" } ], - "time": "2020-09-15T12:23:47+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "symfony/translation-contracts", @@ -5258,27 +4991,26 @@ }, { "name": "symfony/twig-bridge", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1" + "reference": "293e5f04eee4da963686beab20960b45e4db68ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ad3c3e89353749dcead9ee25388177ebbb4569a1", - "reference": "ad3c3e89353749dcead9ee25388177ebbb4569a1", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/293e5f04eee4da963686beab20960b45e4db68ad", + "reference": "293e5f04eee4da963686beab20960b45e4db68ad", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15", "symfony/translation-contracts": "^1.1|^2", "twig/twig": "^2.10|^3.0" }, "conflict": { "symfony/console": "<4.4", - "symfony/form": "<5.1", + "symfony/form": "<5.0", "symfony/http-foundation": "<4.4", "symfony/http-kernel": "<4.4", "symfony/translation": "<5.0", @@ -5291,7 +5023,7 @@ "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.1", + "symfony/form": "^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", @@ -5329,7 +5061,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5357,7 +5089,7 @@ "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/5.1" + "source": "https://github.com/symfony/twig-bridge/tree/5.0" }, "funding": [ { @@ -5373,20 +5105,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:23:27+00:00" + "time": "2020-06-30T17:59:45+00:00" }, { "name": "symfony/twig-bundle", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1" + "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/8898ef8aea8fa48638e15ce00c7c6318ce570ce1", - "reference": "8898ef8aea8fa48638e15ce00c7c6318ce570ce1", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/348863cd784b10ea7e1485dc3003c738c6cdf547", + "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547", "shasum": "" }, "require": { @@ -5421,7 +5153,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5449,7 +5181,7 @@ "description": "Symfony TwigBundle", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.1.7" + "source": "https://github.com/symfony/twig-bundle/tree/v5.0.9" }, "funding": [ { @@ -5465,20 +5197,20 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:43:50+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c976c115a0d788808f7e71834c8eb0844f678d02" + "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c976c115a0d788808f7e71834c8eb0844f678d02", - "reference": "c976c115a0d788808f7e71834c8eb0844f678d02", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/36d19dbb4b377273dddb820adcdf0cc9dcf57731", + "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731", "shasum": "" }, "require": { @@ -5507,7 +5239,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5542,7 +5274,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.1.7" + "source": "https://github.com/symfony/var-dumper/tree/5.0" }, "funding": [ { @@ -5558,25 +5290,24 @@ "type": "tidelift" } ], - "time": "2020-09-18T14:27:32+00:00" + "time": "2020-06-24T13:36:01+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "8b858508e49beb257fd635104c3d449a8113e8fe" + "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8b858508e49beb257fd635104c3d449a8113e8fe", - "reference": "8b858508e49beb257fd635104c3d449a8113e8fe", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b87e3aeedb74ee2694932d04153df9d804954cc3", + "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "php": ">=7.2.5" }, "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9" @@ -5584,7 +5315,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5620,7 +5351,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/5.1" + "source": "https://github.com/symfony/var-exporter/tree/5.0" }, "funding": [ { @@ -5636,25 +5367,24 @@ "type": "tidelift" } ], - "time": "2020-09-08T14:19:54+00:00" + "time": "2020-06-07T15:38:39+00:00" }, { "name": "symfony/yaml", - "version": "v5.1.7", + "version": "v5.0.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a" + "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", - "reference": "e147a68cb66a8b510f4b7481fe4da5b2ab65ec6a", + "url": "https://api.github.com/repos/symfony/yaml/zipball/29b60e88ff11a45b708115004fdeacab1ee3dd5d", + "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -5666,13 +5396,10 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -5700,7 +5427,7 @@ "description": "Symfony Yaml Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.1.7" + "source": "https://github.com/symfony/yaml/tree/5.0" }, "funding": [ { @@ -5716,7 +5443,7 @@ "type": "tidelift" } ], - "time": "2020-09-27T03:44:28+00:00" + "time": "2020-05-20T17:38:26+00:00" }, { "name": "twig/extra-bundle", @@ -6094,320 +5821,6 @@ ], "time": "2020-09-01T07:06:14+00:00" }, - { - "name": "roave/security-advisories", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "327370943772f9917bc2dc2aa4263db2d572a112" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/327370943772f9917bc2dc2aa4263db2d572a112", - "reference": "327370943772f9917bc2dc2aa4263db2d572a112", - "shasum": "" - }, - "conflict": { - "3f/pygmentize": "<1.2", - "adodb/adodb-php": "<5.20.12", - "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", - "amphp/artax": "<1.0.6|>=2,<2.0.6", - "amphp/http": "<1.0.1", - "amphp/http-client": ">=4,<4.4", - "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", - "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", - "aws/aws-sdk-php": ">=3,<3.2.1", - "bagisto/bagisto": "<0.1.5", - "barrelstrength/sprout-base-email": "<1.2.7", - "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": ">=4,<=4.3.6", - "bolt/bolt": "<3.7.1", - "brightlocal/phpwhois": "<=4.2.5", - "buddypress/buddypress": "<5.1.2", - "bugsnag/bugsnag-laravel": ">=2,<2.0.2", - "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", - "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<18.10.8|>=19,<19.4.5", - "cesnet/simplesamlphp-module-proxystatistics": "<3.1", - "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1-alpha.11", - "contao-components/mediaelement": ">=2.14.2,<2.21.1", - "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", - "contao/listing-bundle": ">=4,<4.4.8", - "datadog/dd-trace": ">=0.30,<0.30.2", - "david-garcia/phpwhois": "<=4.3.1", - "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", - "doctrine/annotations": ">=1,<1.2.7", - "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", - "doctrine/doctrine-bundle": "<1.5.2", - "doctrine/doctrine-module": "<=0.7.1", - "doctrine/mongodb-odm": ">=1,<1.0.2", - "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", - "dolibarr/dolibarr": "<11.0.4", - "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", - "drupal/drupal": ">=7,<7.73|>=8,<8.8.10|>=8.9,<8.9.6|>=9,<9.0.6", - "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.13.1", - "erusev/parsedown": "<1.7.2", - "ezsystems/demobundle": ">=5.4,<5.4.6.1", - "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", - "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", - "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", - "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", - "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1", - "ezyang/htmlpurifier": "<4.1.1", - "firebase/php-jwt": "<2", - "fooman/tcpdf": "<6.2.22", - "fossar/tcpdf-parser": "<6.2.22", - "friendsofsymfony/oauth2-php": "<1.3", - "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", - "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", - "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", - "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7-beta.8", - "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", - "gree/jose": "<=2.2", - "gregwar/rst": "<1.0.3", - "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", - "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29|>=5.5,<=5.5.44|>=6,<6.18.34|>=7,<7.23.2", - "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": ">=7,<7.1.2", - "ivankristianto/phpwhois": "<=4.3", - "james-heinrich/getid3": "<1.9.9", - "joomla/session": "<1.3.1", - "jsmitty12/phpwhois": "<5.1", - "kazist/phpwhois": "<=4.2.6", - "kitodo/presentation": "<3.1.2", - "kreait/firebase-php": ">=3.2,<3.8.1", - "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.34|>=7,<7.23.2", - "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", - "league/commonmark": "<0.18.3", - "librenms/librenms": "<1.53", - "livewire/livewire": ">2.2.4,<2.2.6", - "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", - "magento/magento1ce": "<1.9.4.3", - "magento/magento1ee": ">=1,<1.14.4.3", - "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", - "marcwillmann/turn": "<0.3.3", - "mediawiki/core": ">=1.31,<1.31.4|>=1.32,<1.32.4|>=1.33,<1.33.1", - "mittwald/typo3_forum": "<1.2.1", - "monolog/monolog": ">=1.8,<1.12", - "namshi/jose": "<2.2", - "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", - "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", - "nystudio107/craft-seomatic": "<3.3", - "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "october/backend": ">=1.0.319,<1.0.467", - "october/cms": ">=1.0.319,<1.0.466", - "october/october": ">=1.0.319,<1.0.466", - "october/rain": ">=1.0.319,<1.0.468", - "onelogin/php-saml": "<2.10.4", - "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", - "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.6|>=20,<20.0.2", - "oro/crm": ">=1.7,<1.7.4", - "oro/platform": ">=1.7,<1.7.4", - "padraic/humbug_get_contents": "<1.1.2", - "pagarme/pagarme-php": ">=0,<3", - "paragonie/random_compat": "<2", - "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.4", - "personnummer/personnummer": "<3.0.2", - "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6", - "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<4.9.2", - "phpoffice/phpexcel": "<1.8.2", - "phpoffice/phpspreadsheet": "<1.8", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", - "phpwhois/phpwhois": "<=4.2.5", - "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<6.3", - "prestashop/autoupgrade": ">=4,<4.10.1", - "prestashop/contactform": ">1.0.1,<4.3", - "prestashop/gamification": "<2.3.2", - "prestashop/ps_facetedsearch": "<3.4.1", - "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", - "propel/propel": ">=2-alpha.1,<=2-alpha.7", - "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", - "pusher/pusher-php-server": "<2.2.1", - "rainlab/debugbar-plugin": "<3.1", - "robrichards/xmlseclibs": "<3.0.4", - "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", - "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", - "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", - "sensiolabs/connect": "<4.2.3", - "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.1", - "shopware/platform": "<=6.3.1", - "shopware/shopware": "<5.3.7", - "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", - "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", - "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", - "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", - "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", - "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", - "silverstripe/subsites": ">=2,<2.1.1", - "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", - "silverstripe/userforms": "<3", - "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.18.6", - "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", - "simplito/elliptic-php": "<1.0.6", - "slim/slim": "<2.6", - "smarty/smarty": "<3.1.33", - "socalnick/scn-social-auth": "<1.15.2", - "spoonity/tcpdf": "<6.2.22", - "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.29.2", - "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.49", - "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", - "swiftmailer/swiftmailer": ">=4,<5.4.5", - "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", - "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", - "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", - "symbiote/silverstripe-versionedfiles": "<=2.0.3", - "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", - "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", - "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", - "symfony/mime": ">=4.3,<4.3.8", - "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/polyfill": ">=1,<1.10", - "symfony/polyfill-php55": ">=1,<1.10", - "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", - "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", - "symfony/translation": ">=2,<2.0.17", - "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", - "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", - "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", - "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", - "t3g/svg-sanitizer": "<1.0.3", - "tecnickcom/tcpdf": "<6.2.22", - "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1-beta.1,<2.1.3", - "theonedemon/phpwhois": "<=4.2.5", - "titon/framework": ">=0,<9.9.99", - "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", - "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", - "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", - "typo3fluid/fluid": ">=2,<2.0.5|>=2.1,<2.1.4|>=2.2,<2.2.1|>=2.3,<2.3.5|>=2.4,<2.4.1|>=2.5,<2.5.5|>=2.6,<2.6.1", - "ua-parser/uap-php": "<3.8", - "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", - "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", - "wallabag/tcpdf": "<6.2.22", - "willdurand/js-translation-bundle": "<2.1.1", - "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.38", - "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.15", - "yiisoft/yii2-elasticsearch": "<2.0.5", - "yiisoft/yii2-gii": "<2.0.4", - "yiisoft/yii2-jui": "<2.0.4", - "yiisoft/yii2-redis": "<2.0.8", - "yourls/yourls": "<1.7.4", - "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", - "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", - "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": ">=1,<1.8.4", - "zendframework/zend-feed": ">=1,<2.10.3", - "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": ">=1,<2.8.1", - "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", - "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", - "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", - "zendframework/zend-validator": ">=2.3,<2.3.6", - "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<2.5.1", - "zendframework/zendframework1": "<1.12.20", - "zendframework/zendopenid": ">=2,<2.0.2", - "zendframework/zendxml": ">=1,<1.0.1", - "zetacomponents/mail": "<1.8.2", - "zf-commons/zfc-user": "<1.2.2", - "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "role": "maintainer" - }, - { - "name": "Ilya Tribusean", - "email": "slash3b@gmail.com", - "role": "maintainer" - } - ], - "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "support": { - "issues": "https://github.com/Roave/SecurityAdvisories/issues", - "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", - "type": "tidelift" - } - ], - "time": "2020-10-19T07:02:45+00:00" - }, { "name": "symfony/phpunit-bridge", "version": "v5.1.7", @@ -6496,9 +5909,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "roave/security-advisories": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From d3d306926d1505e3e832a0f99fdf78b12f30d23e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:44:36 +0100 Subject: [PATCH 043/151] no message --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index fadc745..f06f81d 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,7 @@ }, "config": { "preferred-install": { - "*": "dist" + "*": "auto" }, "sort-packages": true, "optimize-autoloader": true From 7797934b5cfcbf02b24c5d3750cb2bd7bf94addf Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 11:46:35 +0100 Subject: [PATCH 044/151] no message --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index f06f81d..2022977 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "symfony/dotenv": "5.0.*", "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.0.*", - "symfony/orm-pack": "^1.0", + "symfony/orm-pack": "^1.1", "symfony/serializer": "5.0.*", "symfony/twig-bundle": "5.0.*", "symfony/yaml": "5.0.*", diff --git a/composer.lock b/composer.lock index 6cc702f..3842608 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6fe69db5c92e38f91a659fedc9bd30c6", + "content-hash": "4a238766474d3b61207b60a7715b673b", "packages": [ { "name": "composer/package-versions-deprecated", From 7336542269b4164951d96eecd97f3b647a3dd516 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Oct 2020 12:42:46 +0100 Subject: [PATCH 045/151] add coverage badge --- deploy.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/deploy.php b/deploy.php index 0b65a08..7bf727f 100644 --- a/deploy.php +++ b/deploy.php @@ -10,6 +10,7 @@ set('http_user', 'glutenfr'); set('writable_mode', 'chmod'); set('default_stage', 'production'); +set('bin/composer', '~/bin/composer.phar'); add('shared_files', ['.env']); add('shared_dirs', ['var']); add('writable_dirs', []); @@ -39,16 +40,16 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'dump-autoload', +// 'deploy:vendors', +// 'deploy:cache:clear', +// 'deploy:cache:warmup', +// 'dump-autoload', 'deploy:writable', - 'database:migrate', +// 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', ]); -before('deploy', 'test'); +//before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); From dcaabed22f6227d32a5387c1f31cdbe011b494f6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 09:37:22 +0100 Subject: [PATCH 046/151] add coverage badge --- .../{ApiController.php => DocsController.php} | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) rename src/Controller/{ApiController.php => DocsController.php} (91%) diff --git a/src/Controller/ApiController.php b/src/Controller/DocsController.php similarity index 91% rename from src/Controller/ApiController.php rename to src/Controller/DocsController.php index b42abf8..81780a9 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/DocsController.php @@ -1,34 +1,35 @@ -render('docs.html.twig'); - } - - /** - * @Route("/api/{name}.json", name="app_api_docs_json") - */ - public function getJson(string $name): JsonResponse - { - $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; - - $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - - return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); - } -} +render('docs.html.twig'); + } + + /** + * @Route("/api/{name}.json", name="app_api_docs_json") + */ + public function getJson(string $name): JsonResponse + { + $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; + + $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + + return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); + } +} From a4c1910e534fb110431481a92930472e7bd69150 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 09:42:10 +0100 Subject: [PATCH 047/151] add coverage badge --- deploy.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/deploy.php b/deploy.php index 7bf727f..cf2b70e 100644 --- a/deploy.php +++ b/deploy.php @@ -15,7 +15,7 @@ add('shared_dirs', ['var']); add('writable_dirs', []); -host('data.ivanstanojevic.me') +host('ivanstanojevic.me') ->user('glutenfr') ->port(2233) ->stage('production') @@ -40,12 +40,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', -// 'deploy:vendors', -// 'deploy:cache:clear', -// 'deploy:cache:warmup', -// 'dump-autoload', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'dump-autoload', 'deploy:writable', -// 'database:migrate', + 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', From 0137d02a72a4e9f6aa1371c586a66a6fc38b010d Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 10:11:30 +0100 Subject: [PATCH 048/151] update ivanstan/tle-php --- composer.lock | 15 ++++++++------- src/Command/ImportTleCommand.php | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index 3842608..bf11778 100644 --- a/composer.lock +++ b/composer.lock @@ -1697,22 +1697,23 @@ }, { "name": "ivanstan/tle-php", - "version": "1.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33" + "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/5bd7487aa242248ad255b041f5fe99a8f5daca33", - "reference": "5bd7487aa242248ad255b041f5fe99a8f5daca33", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/15c7e46644237df8c5997a6d7875b0f2b9a62cd1", + "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.5", - "myclabs/php-enum": "^1.7" + "myclabs/php-enum": "^1.7", + "php": "^7.4" }, "require-dev": { "phpunit/phpunit": "^8" @@ -1736,9 +1737,9 @@ "description": "TLE Framework written in PHP and client to NASA TLE API.", "support": { "issues": "https://github.com/ivanstan/tle-php/issues", - "source": "https://github.com/ivanstan/tle-php/tree/1.0" + "source": "https://github.com/ivanstan/tle-php/tree/1.0.1" }, - "time": "2020-01-08T10:08:36+00:00" + "time": "2020-12-09T09:04:57+00:00" }, { "name": "laminas/laminas-code", diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 4c5a1fc..1f241c6 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -7,7 +7,7 @@ use App\Service\Traits\FileSystemAwareTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Doctrine\ORM\EntityManagerInterface; -use Ivanstan\Tle\TleFile; +use Ivanstan\Tle\Model\TleFile; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Table; From 270a7fb2db4e2d6ac0755954545359999e152524 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 9 Dec 2020 15:59:30 +0100 Subject: [PATCH 049/151] upgrade --- composer.lock | 299 ++++++++++++++++--------------- deploy.php | 47 ++--- src/Command/ImportTleCommand.php | 23 ++- 3 files changed, 199 insertions(+), 170 deletions(-) diff --git a/composer.lock b/composer.lock index bf11778..6d2b426 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "composer/package-versions-deprecated", - "version": "1.11.99", + "version": "1.11.99.1", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855" + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", - "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", "shasum": "" }, "require": { @@ -61,7 +61,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/master" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" }, "funding": [ { @@ -77,7 +77,7 @@ "type": "tidelift" } ], - "time": "2020-08-25T05:50:16+00:00" + "time": "2020-11-11T10:22:58+00:00" }, { "name": "doctrine/annotations", @@ -426,16 +426,16 @@ }, { "name": "doctrine/dbal", - "version": "2.12.0", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646" + "reference": "adce7a954a1c2f14f85e94aed90c8489af204086" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/c6d37b4c42aaa3c3ee175f05eca68056f4185646", - "reference": "c6d37b4c42aaa3c3ee175f05eca68056f4185646", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/adce7a954a1c2f14f85e94aed90c8489af204086", + "reference": "adce7a954a1c2f14f85e94aed90c8489af204086", "shasum": "" }, "require": { @@ -517,7 +517,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.12.0" + "source": "https://github.com/doctrine/dbal/tree/2.12.1" }, "funding": [ { @@ -533,20 +533,20 @@ "type": "tidelift" } ], - "time": "2020-10-22T17:26:24+00:00" + "time": "2020-11-14T20:26:58+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.1.2", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17" + "reference": "044d33eeffdb236d5013b6b4af99f87519e10751" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f5153089993e1230f5d8acbd8e126014d5a63e17", - "reference": "f5153089993e1230f5d8acbd8e126014d5a63e17", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/044d33eeffdb236d5013b6b4af99f87519e10751", + "reference": "044d33eeffdb236d5013b6b4af99f87519e10751", "shasum": "" }, "require": { @@ -567,10 +567,10 @@ "twig/twig": "<1.34|>=2.0,<2.4" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "doctrine/orm": "^2.6", "ocramius/proxy-manager": "^2.1", - "phpunit/phpunit": "^7.5", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", "symfony/phpunit-bridge": "^4.2", "symfony/property-info": "^4.3.3|^5.0", "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", @@ -578,7 +578,7 @@ "symfony/validator": "^3.4.30|^4.3.3|^5.0", "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12" + "twig/twig": "^1.34|^2.12|^3.0" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -587,7 +587,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { @@ -627,7 +627,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.1.2" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.2" }, "funding": [ { @@ -643,20 +643,20 @@ "type": "tidelift" } ], - "time": "2020-08-25T10:57:15+00:00" + "time": "2020-12-05T15:07:10+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d" + "reference": "955077b68c377310cf9538fc982be11d36ab75d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5efa29df768abaafe29b34e73dac68efbedcaa4d", - "reference": "5efa29df768abaafe29b34e73dac68efbedcaa4d", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/955077b68c377310cf9538fc982be11d36ab75d4", + "reference": "955077b68c377310cf9538fc982be11d36ab75d4", "shasum": "" }, "require": { @@ -713,7 +713,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.0" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.1" }, "funding": [ { @@ -729,7 +729,7 @@ "type": "tidelift" } ], - "time": "2020-06-25T19:36:08+00:00" + "time": "2020-11-11T09:59:06+00:00" }, { "name": "doctrine/event-manager", @@ -923,36 +923,31 @@ }, { "name": "doctrine/instantiator", - "version": "1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -966,7 +961,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -977,7 +972,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.3.x" + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" }, "funding": [ { @@ -993,7 +988,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T17:27:14+00:00" + "time": "2020-11-10T18:47:58+00:00" }, { "name": "doctrine/lexer", @@ -1077,24 +1072,24 @@ }, { "name": "doctrine/migrations", - "version": "2.2.1", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934" + "reference": "af915024d41669600354efe78664ee86dfca62e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/a3987131febeb0e9acb3c47ab0df0af004588934", - "reference": "a3987131febeb0e9acb3c47ab0df0af004588934", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/af915024d41669600354efe78664ee86dfca62e1", + "reference": "af915024d41669600354efe78664ee86dfca62e1", "shasum": "" }, "require": { + "composer/package-versions-deprecated": "^1.8", "doctrine/dbal": "^2.9", - "ocramius/package-versions": "^1.3", "ocramius/proxy-manager": "^2.0.2", "php": "^7.1", - "symfony/console": "^3.4||^4.0||^5.0", + "symfony/console": "^3.4||^4.4.16||^5.0", "symfony/stopwatch": "^3.4||^4.0||^5.0" }, "require-dev": { @@ -1107,7 +1102,7 @@ "phpstan/phpstan-deprecation-rules": "^0.10", "phpstan/phpstan-phpunit": "^0.10", "phpstan/phpstan-strict-rules": "^0.10", - "phpunit/phpunit": "^7.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "symfony/process": "^3.4||^4.0||^5.0", "symfony/yaml": "^3.4||^4.0||^5.0" }, @@ -1157,27 +1152,41 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/2.2.x" + "source": "https://github.com/doctrine/migrations/tree/2.3.1" }, - "time": "2019-12-04T06:09:14+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", + "type": "tidelift" + } + ], + "time": "2020-12-05T19:13:58+00:00" }, { "name": "doctrine/orm", - "version": "2.7.4", + "version": "2.7.5", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f" + "reference": "01187c9260cd085529ddd1273665217cae659640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/7d84a4998091ece4d645253ac65de9f879eeed2f", - "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f", + "url": "https://api.github.com/repos/doctrine/orm/zipball/01187c9260cd085529ddd1273665217cae659640", + "reference": "01187c9260cd085529ddd1273665217cae659640", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.8", + "doctrine/annotations": "^1.11.1", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", "doctrine/common": "^2.11 || ^3.0", @@ -1192,9 +1201,9 @@ "symfony/console": "^3.0|^4.0|^5.0" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^6.0", "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^7.5", + "phpunit/phpunit": "^8.0", "symfony/yaml": "^3.4|^4.0|^5.0", "vimeo/psalm": "^3.11" }, @@ -1249,9 +1258,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.7.4" + "source": "https://github.com/doctrine/orm/tree/2.7.5" }, - "time": "2020-10-10T17:11:26+00:00" + "time": "2020-12-03T08:52:14+00:00" }, { "name": "doctrine/persistence", @@ -1357,32 +1366,32 @@ }, { "name": "doctrine/reflection", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/reflection.git", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79" + "reference": "fa587178be682efe90d005e3a322590d6ebb59a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/55e71912dfcd824b2fdd16f2d9afe15684cfce79", - "reference": "55e71912dfcd824b2fdd16f2d9afe15684cfce79", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/fa587178be682efe90d005e3a322590d6ebb59a5", + "reference": "fa587178be682efe90d005e3a322590d6ebb59a5", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", "ext-tokenizer": "*", - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.9" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^6.0 || ^8.2.0", "doctrine/common": "^2.10", - "phpstan/phpstan": "^0.11.0", - "phpstan/phpstan-phpunit": "^0.11.0", - "phpunit/phpunit": "^7.0" + "phpstan/phpstan": "^0.11.0 || ^0.12.20", + "phpstan/phpstan-phpunit": "^0.11.0 || ^0.12.16", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", "extra": { @@ -1433,9 +1442,10 @@ ], "support": { "issues": "https://github.com/doctrine/reflection/issues", - "source": "https://github.com/doctrine/reflection/tree/1.2.x" + "source": "https://github.com/doctrine/reflection/tree/1.2.2" }, - "time": "2020-03-27T11:06:43+00:00" + "abandoned": "roave/better-reflection", + "time": "2020-10-27T21:46:55+00:00" }, { "name": "doctrine/sql-formatter", @@ -1743,48 +1753,41 @@ }, { "name": "laminas/laminas-code", - "version": "3.4.1", + "version": "3.5.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766" + "reference": "b549b70c0bb6e935d497f84f750c82653326ac77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1cb8f203389ab1482bf89c0e70a04849bacd7766", - "reference": "1cb8f203389ab1482bf89c0e70a04849bacd7766", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/b549b70c0bb6e935d497f84f750c82653326ac77", + "reference": "b549b70c0bb6e935d497f84f750c82653326ac77", "shasum": "" }, "require": { - "laminas/laminas-eventmanager": "^2.6 || ^3.0", - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.1" + "laminas/laminas-eventmanager": "^3.3", + "laminas/laminas-zendframework-bridge": "^1.1", + "php": "^7.3 || ~8.0.0" }, "conflict": { "phpspec/prophecy": "<1.9.0" }, "replace": { - "zendframework/zend-code": "self.version" + "zendframework/zend-code": "^3.4.1" }, "require-dev": { - "doctrine/annotations": "^1.7", + "doctrine/annotations": "^1.10.4", "ext-phar": "*", - "laminas/laminas-coding-standard": "^1.0", - "laminas/laminas-stdlib": "^2.7 || ^3.0", - "phpunit/phpunit": "^7.5.16 || ^8.4" + "laminas/laminas-coding-standard": "^1.0.0", + "laminas/laminas-stdlib": "^3.3.0", + "phpunit/phpunit": "^9.4.2" }, "suggest": { "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", "laminas/laminas-stdlib": "Laminas\\Stdlib component" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4.x-dev", - "dev-develop": "3.5.x-dev", - "dev-dev-4.0": "4.0.x-dev" - } - }, "autoload": { "psr-4": { "Laminas\\Code\\": "src/" @@ -1808,7 +1811,13 @@ "rss": "https://github.com/laminas/laminas-code/releases.atom", "source": "https://github.com/laminas/laminas-code" }, - "time": "2019-12-31T16:28:24+00:00" + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2020-11-30T20:16:31+00:00" }, { "name": "laminas/laminas-eventmanager", @@ -1944,16 +1953,16 @@ }, { "name": "myclabs/php-enum", - "version": "1.7.6", + "version": "1.7.7", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c" + "reference": "d178027d1e679832db9f38248fcc7200647dc2b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/5f36467c7a87e20fbdc51e524fd8f9d1de80187c", - "reference": "5f36467c7a87e20fbdc51e524fd8f9d1de80187c", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/d178027d1e679832db9f38248fcc7200647dc2b7", + "reference": "d178027d1e679832db9f38248fcc7200647dc2b7", "shasum": "" }, "require": { @@ -1988,22 +1997,32 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/master" + "source": "https://github.com/myclabs/php-enum/tree/1.7.7" }, - "time": "2020-02-14T08:15:52+00:00" + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2020-11-14T18:14:52+00:00" }, { "name": "ocramius/proxy-manager", - "version": "2.9.1", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "7452942d38ae36223b0f8408619181f69799eb5c" + "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/7452942d38ae36223b0f8408619181f69799eb5c", - "reference": "7452942d38ae36223b0f8408619181f69799eb5c", + "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", + "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", "shasum": "" }, "require": { @@ -2068,7 +2087,7 @@ ], "support": { "issues": "https://github.com/Ocramius/ProxyManager/issues", - "source": "https://github.com/Ocramius/ProxyManager/tree/2.9.1" + "source": "https://github.com/Ocramius/ProxyManager/tree/2.10.0" }, "funding": [ { @@ -2080,7 +2099,7 @@ "type": "tidelift" } ], - "time": "2020-08-26T16:19:12+00:00" + "time": "2020-11-12T17:04:46+00:00" }, { "name": "psr/cache", @@ -3636,16 +3655,16 @@ }, { "name": "symfony/flex", - "version": "v1.9.10", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "7335ec033995aa34133e621627333368f260b626" + "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/7335ec033995aa34133e621627333368f260b626", - "reference": "7335ec033995aa34133e621627333368f260b626", + "url": "https://api.github.com/repos/symfony/flex/zipball/ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", + "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", "shasum": "" }, "require": { @@ -3655,6 +3674,7 @@ "require-dev": { "composer/composer": "^1.0.2|^2.0", "symfony/dotenv": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", "symfony/phpunit-bridge": "^4.4|^5.0", "symfony/process": "^3.4|^4.4|^5.0" }, @@ -3683,7 +3703,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.9.10" + "source": "https://github.com/symfony/flex/tree/v1.11.0" }, "funding": [ { @@ -3699,7 +3719,7 @@ "type": "tidelift" } ], - "time": "2020-10-14T17:41:54+00:00" + "time": "2020-12-03T10:57:35+00:00" }, { "name": "symfony/framework-bundle", @@ -5448,7 +5468,7 @@ }, { "name": "twig/extra-bundle", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/twigphp/twig-extra-bundle.git", @@ -5504,7 +5524,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.0" + "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.1" }, "funding": [ { @@ -5520,16 +5540,16 @@ }, { "name": "twig/twig", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7" + "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9a29e1fa7b5431969f96878b8662e3fcb18601b7", - "reference": "9a29e1fa7b5431969f96878b8662e3fcb18601b7", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/b02fa41f3783a2616eccef7b92fbc2343ffed737", + "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737", "shasum": "" }, "require": { @@ -5580,7 +5600,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.1.0" + "source": "https://github.com/twigphp/Twig/tree/v3.1.1" }, "funding": [ { @@ -5592,7 +5612,7 @@ "type": "tidelift" } ], - "time": "2020-10-21T12:45:34+00:00" + "time": "2020-10-27T19:28:23+00:00" }, { "name": "webimpress/safe-writer", @@ -5738,23 +5758,23 @@ }, { "name": "doctrine/doctrine-fixtures-bundle", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", - "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98" + "reference": "870189619a7770f468ffb0b80925302e065a3b34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/a2179f447425d9e784fb9bc224e533a0ab083b98", - "reference": "a2179f447425d9e784fb9bc224e533a0ab083b98", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/870189619a7770f468ffb0b80925302e065a3b34", + "reference": "870189619a7770f468ffb0b80925302e065a3b34", "shasum": "" }, "require": { "doctrine/data-fixtures": "^1.3", "doctrine/doctrine-bundle": "^1.11|^2.0", "doctrine/orm": "^2.6.0", - "doctrine/persistence": "^1.3|^2.0", + "doctrine/persistence": "^1.3.7|^2.0", "php": "^7.1 || ^8.0", "symfony/config": "^3.4|^4.3|^5.0", "symfony/console": "^3.4|^4.3|^5.0", @@ -5764,15 +5784,10 @@ }, "require-dev": { "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.4 || ^9.2", + "phpunit/phpunit": "^7.4 || ^8.0 || ^9.2", "symfony/phpunit-bridge": "^4.1|^5.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\FixturesBundle\\": "" @@ -5804,7 +5819,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues", - "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.3.x" + "source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.0" }, "funding": [ { @@ -5820,20 +5835,20 @@ "type": "tidelift" } ], - "time": "2020-09-01T07:06:14+00:00" + "time": "2020-11-14T09:36:49+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.1.7", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d" + "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/150aeb91dd9dafe13ec8416abd62e435330ca12d", - "reference": "150aeb91dd9dafe13ec8416abd62e435330ca12d", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/92a76ca5e64effd41ce111b8f476144dfa29f1f0", + "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0", "shasum": "" }, "require": { @@ -5843,7 +5858,8 @@ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -5853,9 +5869,6 @@ ], "type": "symfony-bridge", "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - }, "thanks": { "name": "phpunit/phpunit", "url": "https://github.com/sebastianbergmann/phpunit" @@ -5889,7 +5902,7 @@ "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.1.7" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.0" }, "funding": [ { @@ -5905,7 +5918,7 @@ "type": "tidelift" } ], - "time": "2020-10-02T12:57:56+00:00" + "time": "2020-11-27T00:39:34+00:00" } ], "aliases": [], diff --git a/deploy.php b/deploy.php index cf2b70e..4a9663a 100644 --- a/deploy.php +++ b/deploy.php @@ -13,7 +13,7 @@ set('bin/composer', '~/bin/composer.phar'); add('shared_files', ['.env']); add('shared_dirs', ['var']); -add('writable_dirs', []); +add('writable_dirs', ['var']); host('ivanstanojevic.me') ->user('glutenfr') @@ -27,29 +27,32 @@ }); task('dump-autoload', function () { - run('composer dump-env prod'); + run('{{bin/composer}} dump-env prod'); }); -task('deploy', [ - 'deploy:info', - 'deploy:prepare', - 'deploy:lock', - 'deploy:release', - 'deploy:update_code', - 'deploy:clear_paths', - 'deploy:create_cache_dir', - 'deploy:shared', - 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'dump-autoload', - 'deploy:writable', - 'database:migrate', - 'deploy:symlink', - 'deploy:unlock', - 'cleanup', -]); +task( + 'deploy', + [ + 'deploy:info', + 'deploy:prepare', + 'deploy:lock', + 'deploy:release', + 'deploy:update_code', + 'deploy:clear_paths', + 'deploy:create_cache_dir', + 'deploy:shared', + 'deploy:assets', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'dump-autoload', + 'deploy:writable', + 'database:migrate', + 'deploy:symlink', + 'deploy:unlock', + 'cleanup', + ] +); //before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 1f241c6..c573872 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -24,7 +24,6 @@ final class ImportTleCommand extends Command private EntityManagerInterface $em; private TleRepository $repository; - private OutputInterface $output; private array $satellites = []; @@ -44,7 +43,6 @@ protected function configure(): void /** @noinspection PhpMissingParentCallCommonInspection */ protected function execute(InputInterface $input, OutputInterface $output): int { - $this->output = $output; $this->satellites = $this->repository->fetchAllIndexed(); $totalInsert = 0; @@ -72,7 +70,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int foreach ($file->parse() as $tle) { if (\array_key_exists($tle->getId(), $this->satellites)) { - $update[$tle->getId()] = $tle; + $existing = new \Ivanstan\Tle\Model\Tle( + $this->satellites[$tle->getId()]->getLine1(), + $this->satellites[$tle->getId()]->getLine2(), + $this->satellites[$tle->getId()]->getName(), + ); + + if ($tle->getDate() > $existing->getDate()) { + $update[$tle->getId()] = $tle; + } } else { $insert[$tle->getId()] = $tle; } @@ -127,11 +133,18 @@ protected function toPersistent(TleModel $model): Tle protected function flush(array $queue, $persistNew = null): void { $counter = 0; + /** @var TleModel $model */ foreach ($queue as $model) { - $tle = $this->toPersistent($model); - $this->satellites[$model->getId()] = $tle; + /** @var Tle $existing */ + $existing = $this->satellites[$model->getId()]; + $existing->setName($model->getName()); + $existing->setId($model->getId()); + $existing->setLine1($model->getLine1()); + $existing->setLine2($model->getLine2()); if ($persistNew) { + $tle = $this->toPersistent($model); + $this->satellites[$model->getId()] = $tle; $this->em->persist($tle); } From 11cfe1cd6bd3420d8a6f5122e6bec1962b9f10bb Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 18 Dec 2020 09:30:02 +0100 Subject: [PATCH 050/151] fix bug with guzzle --- composer.json | 2 +- composer.lock | 804 +++++++++++++----------------- deploy.php | 10 +- src/Command/ImportTleCommand.php | 34 +- src/Controller/DocsController.php | 70 +-- symfony.lock | 6 - 6 files changed, 419 insertions(+), 507 deletions(-) diff --git a/composer.json b/composer.json index 2022977..e6fca39 100644 --- a/composer.json +++ b/composer.json @@ -73,7 +73,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.0.*" + "require": "5.2.*" } } } diff --git a/composer.lock b/composer.lock index 6d2b426..b996145 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4a238766474d3b61207b60a7715b673b", + "content-hash": "623796bd13aa29d141dca80c543db4c9", "packages": [ { "name": "composer/package-versions-deprecated", @@ -325,43 +325,31 @@ }, { "name": "doctrine/common", - "version": "2.13.3", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f" + "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/f3812c026e557892c34ef37f6ab808a6b567da7f", - "reference": "f3812c026e557892c34ef37f6ab808a6b567da7f", + "url": "https://api.github.com/repos/doctrine/common/zipball/9f3e3f3cc5399604c0325d5ffa92609d694d950d", + "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d", "shasum": "" }, "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "doctrine/inflector": "^1.0", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.3.3", - "doctrine/reflection": "^1.0", + "doctrine/persistence": "^2.0", "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpunit/phpunit": "^7.0", + "doctrine/coding-standard": "^6.0 || ^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "squizlabs/php_codesniffer": "^3.0", "symfony/phpunit-bridge": "^4.0.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.11.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\": "lib/Doctrine/Common" @@ -397,7 +385,7 @@ "email": "ocramius@gmail.com" } ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.", "homepage": "https://www.doctrine-project.org/projects/common.html", "keywords": [ "common", @@ -406,7 +394,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/2.13.x" + "source": "https://github.com/doctrine/common/tree/3.1.0" }, "funding": [ { @@ -422,7 +410,7 @@ "type": "tidelift" } ], - "time": "2020-06-05T16:46:05+00:00" + "time": "2020-12-03T21:02:31+00:00" }, { "name": "doctrine/dbal", @@ -827,16 +815,16 @@ }, { "name": "doctrine/inflector", - "version": "1.4.3", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "shasum": "" }, "require": { @@ -857,7 +845,6 @@ }, "autoload": { "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" } }, @@ -903,7 +890,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/1.4.x" + "source": "https://github.com/doctrine/inflector/tree/2.0.x" }, "funding": [ { @@ -919,7 +906,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T07:19:59+00:00" + "time": "2020-05-29T15:13:26+00:00" }, { "name": "doctrine/instantiator", @@ -1172,16 +1159,16 @@ }, { "name": "doctrine/orm", - "version": "2.7.5", + "version": "2.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "01187c9260cd085529ddd1273665217cae659640" + "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/01187c9260cd085529ddd1273665217cae659640", - "reference": "01187c9260cd085529ddd1273665217cae659640", + "url": "https://api.github.com/repos/doctrine/orm/zipball/242cf1a33df1b8bc5e1b86c3ebd01db07851c833", + "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833", "shasum": "" }, "require": { @@ -1189,23 +1176,23 @@ "doctrine/annotations": "^1.11.1", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", - "doctrine/common": "^2.11 || ^3.0", - "doctrine/dbal": "^2.9.3", + "doctrine/common": "^3.0", + "doctrine/dbal": "^2.10.0", "doctrine/event-manager": "^1.1", - "doctrine/inflector": "^1.0", + "doctrine/inflector": "^1.4|^2.0", "doctrine/instantiator": "^1.3", "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.3.3 || ^2.0", + "doctrine/persistence": "^2.0", "ext-pdo": "*", - "php": "^7.1", + "php": "^7.2|^8.0", "symfony/console": "^3.0|^4.0|^5.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^8.0", + "phpunit/phpunit": "^8.5|^9.4", "symfony/yaml": "^3.4|^4.0|^5.0", - "vimeo/psalm": "^3.11" + "vimeo/psalm": "4.1.1" }, "suggest": { "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" @@ -1258,22 +1245,22 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.7.5" + "source": "https://github.com/doctrine/orm/tree/2.8.1" }, - "time": "2020-12-03T08:52:14+00:00" + "time": "2020-12-04T19:53:07+00:00" }, { "name": "doctrine/persistence", - "version": "1.3.8", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288" + "reference": "9899c16934053880876b920a3b8b02ed2337ac1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/7a6eac9fb6f61bba91328f15aa7547f4806ca288", - "reference": "7a6eac9fb6f61bba91328f15aa7547f4806ca288", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/9899c16934053880876b920a3b8b02ed2337ac1d", + "reference": "9899c16934053880876b920a3b8b02ed2337ac1d", "shasum": "" }, "require": { @@ -1281,24 +1268,20 @@ "doctrine/cache": "^1.0", "doctrine/collections": "^1.0", "doctrine/event-manager": "^1.0", - "doctrine/reflection": "^1.2", "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/common": "<2.10@dev" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "composer/package-versions-deprecated": "^1.11", + "doctrine/coding-standard": "^6.0 || ^8.0", + "doctrine/common": "^3.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", "vimeo/psalm": "^3.11" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\": "lib/Doctrine/Common", @@ -1346,106 +1329,9 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/1.3.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence", - "type": "tidelift" - } - ], - "time": "2020-06-20T12:56:16+00:00" - }, - { - "name": "doctrine/reflection", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/reflection.git", - "reference": "fa587178be682efe90d005e3a322590d6ebb59a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/reflection/zipball/fa587178be682efe90d005e3a322590d6ebb59a5", - "reference": "fa587178be682efe90d005e3a322590d6ebb59a5", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0 || ^8.2.0", - "doctrine/common": "^2.10", - "phpstan/phpstan": "^0.11.0 || ^0.12.20", - "phpstan/phpstan-phpunit": "^0.11.0 || ^0.12.16", - "phpunit/phpunit": "^7.5 || ^9.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } + "source": "https://github.com/doctrine/persistence/tree/2.1.0" }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Reflection project is a simple library used by the various Doctrine projects which adds some additional functionality on top of the reflection functionality that comes with PHP. It allows you to get the reflection information about classes, methods and properties statically.", - "homepage": "https://www.doctrine-project.org/projects/reflection.html", - "keywords": [ - "reflection", - "static" - ], - "support": { - "issues": "https://github.com/doctrine/reflection/issues", - "source": "https://github.com/doctrine/reflection/tree/1.2.2" - }, - "abandoned": "roave/better-reflection", - "time": "2020-10-27T21:46:55+00:00" + "time": "2020-10-24T22:13:54+00:00" }, { "name": "doctrine/sql-formatter", @@ -2577,28 +2463,29 @@ }, { "name": "symfony/cache", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07" + "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5da40a385c8182d18f4cca960bce7191c8f24e07", - "reference": "5da40a385c8182d18f4cca960bce7191c8f24e07", + "url": "https://api.github.com/repos/symfony/cache/zipball/c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", + "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/cache": "~1.0", - "psr/log": "~1.0", + "psr/log": "^1.1", "symfony/cache-contracts": "^1.1.7|^2", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, "conflict": { - "doctrine/dbal": "<2.5", + "doctrine/dbal": "<2.10", "symfony/dependency-injection": "<4.4", "symfony/http-kernel": "<4.4", "symfony/var-dumper": "<4.4" @@ -2611,19 +2498,17 @@ "require-dev": { "cache/integration-tests": "dev-master", "doctrine/cache": "^1.6", - "doctrine/dbal": "^2.5|^3.0", + "doctrine/dbal": "^2.10|^3.0", "predis/predis": "^1.1", "psr/simple-cache": "^1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", "symfony/var-dumper": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Cache\\": "" @@ -2653,7 +2538,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.0.11" + "source": "https://github.com/symfony/cache/tree/v5.2.0" }, "funding": [ { @@ -2669,7 +2554,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T17:20:42+00:00" + "time": "2020-11-21T09:39:55+00:00" }, { "name": "symfony/cache-contracts", @@ -2752,22 +2637,24 @@ }, { "name": "symfony/config", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "2306321ef6a21a0de51a139774b6b7b38804815b" + "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2306321ef6a21a0de51a139774b6b7b38804815b", - "reference": "2306321ef6a21a0de51a139774b6b7b38804815b", + "url": "https://api.github.com/repos/symfony/config/zipball/fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", + "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/finder": "<4.4" @@ -2783,11 +2670,6 @@ "symfony/yaml": "To use the yaml reference dumper" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Config\\": "" @@ -2813,7 +2695,7 @@ "description": "Symfony Config Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.0.11" + "source": "https://github.com/symfony/config/tree/v5.2.0" }, "funding": [ { @@ -2829,7 +2711,7 @@ "type": "tidelift" } ], - "time": "2020-07-15T10:53:08+00:00" + "time": "2020-11-16T18:02:40+00:00" }, { "name": "symfony/console", @@ -2927,25 +2809,27 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "9263d52372205c57823bf983bc4f413378830757" + "reference": "98cec9b9f410a4832e239949a41d47182862c3a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9263d52372205c57823bf983bc4f413378830757", - "reference": "9263d52372205c57823bf983bc4f413378830757", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98cec9b9f410a4832e239949a41d47182862c3a4", + "reference": "98cec9b9f410a4832e239949a41d47182862c3a4", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.0", + "symfony/config": "<5.1", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -2955,7 +2839,7 @@ "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "^5.0", + "symfony/config": "^5.1", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -2967,11 +2851,6 @@ "symfony/yaml": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" @@ -2997,7 +2876,7 @@ "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/5.0" + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.0" }, "funding": [ { @@ -3013,40 +2892,109 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2020-11-28T11:24:18+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805" + "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/e2ab3fe26133c5d997684f1b961acbd6b04e2805", - "reference": "e2ab3fe26133c5d997684f1b961acbd6b04e2805", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b3ea1749ef47c3d2ad6018d05837758bae91f5cf", + "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^1.3|^2", + "doctrine/persistence": "^2", "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { + "doctrine/dbal": "<2.10", "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", - "symfony/form": "<5", + "symfony/form": "<5.1", "symfony/http-kernel": "<5", "symfony/messenger": "<4.4", "symfony/property-info": "<5", "symfony/security-bundle": "<5", "symfony/security-core": "<5", - "symfony/validator": "<5.0.2" + "symfony/validator": "<5.2" }, "require-dev": { "composer/package-versions-deprecated": "^1.8", @@ -3054,13 +3002,14 @@ "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "~2.4", - "doctrine/orm": "^2.6.3", - "doctrine/reflection": "~1.0", + "doctrine/dbal": "^2.10|^3.0", + "doctrine/orm": "^2.7.3", + "symfony/cache": "^5.1", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/doctrine-messenger": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.0", + "symfony/form": "^5.1.3", "symfony/http-kernel": "^5.0", "symfony/messenger": "^4.4|^5.0", "symfony/property-access": "^4.4|^5.0", @@ -3069,7 +3018,8 @@ "symfony/security-core": "^5.0", "symfony/stopwatch": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", - "symfony/validator": "^5.0.2", + "symfony/uid": "^5.1", + "symfony/validator": "^5.2", "symfony/var-dumper": "^4.4|^5.0" }, "suggest": { @@ -3081,11 +3031,6 @@ "symfony/validator": "" }, "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bridge\\Doctrine\\": "" @@ -3111,7 +3056,7 @@ "description": "Symfony Doctrine Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/5.0" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.0" }, "funding": [ { @@ -3127,26 +3072,27 @@ "type": "tidelift" } ], - "time": "2020-07-23T16:54:02+00:00" + "time": "2020-11-28T13:40:09+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732" + "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/bbc756c0895d08a1e69a59d8541a647b47f5a732", - "reference": "bbc756c0895d08a1e69a59d8541a647b47f5a732", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/0969122fe144dd8ab2e8c98c7e03eedc621b368c", + "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "masterminds/html5": "<2.6" @@ -3159,11 +3105,6 @@ "symfony/css-selector": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\DomCrawler\\": "" @@ -3189,7 +3130,7 @@ "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/5.0" + "source": "https://github.com/symfony/dom-crawler/tree/v5.2.0" }, "funding": [ { @@ -3205,7 +3146,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2020-10-24T12:01:57+00:00" }, { "name": "symfony/dotenv", @@ -3283,16 +3224,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8" + "reference": "289008c5be039e39908d33ae0a8ac99be1210bba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d01fba9a55614a1addb0d52d6a9566560b2a2af8", - "reference": "d01fba9a55614a1addb0d52d6a9566560b2a2af8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/289008c5be039e39908d33ae0a8ac99be1210bba", + "reference": "289008c5be039e39908d33ae0a8ac99be1210bba", "shasum": "" }, "require": { @@ -3302,15 +3243,11 @@ "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { + "symfony/deprecation-contracts": "^2.1", "symfony/http-kernel": "^4.4|^5.0", "symfony/serializer": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" @@ -3336,7 +3273,7 @@ "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/5.0" + "source": "https://github.com/symfony/error-handler/tree/v5.2.0" }, "funding": [ { @@ -3352,25 +3289,27 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2020-10-28T21:46:03+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d" + "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", - "reference": "5c5dd86c7a7962d28c48351c7dd83c9266e4d19d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", + "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/event-dispatcher-contracts": "^2" + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -3383,6 +3322,7 @@ "psr/log": "~1.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -3393,11 +3333,6 @@ "symfony/http-kernel": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" @@ -3423,7 +3358,7 @@ "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/5.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.0" }, "funding": [ { @@ -3439,7 +3374,7 @@ "type": "tidelift" } ], - "time": "2020-06-18T18:18:56+00:00" + "time": "2020-11-01T16:14:45+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3522,16 +3457,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214" + "reference": "bb92ba7f38b037e531908590a858a04d85c0e238" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", - "reference": "6edf8b9e64e662fcde20ee3ee2ec46fdcc8c3214", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/bb92ba7f38b037e531908590a858a04d85c0e238", + "reference": "bb92ba7f38b037e531908590a858a04d85c0e238", "shasum": "" }, "require": { @@ -3539,11 +3474,6 @@ "symfony/polyfill-ctype": "~1.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" @@ -3569,7 +3499,7 @@ "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.0.9" + "source": "https://github.com/symfony/filesystem/tree/v5.2.0" }, "funding": [ { @@ -3585,31 +3515,26 @@ "type": "tidelift" } ], - "time": "2020-05-30T20:12:43+00:00" + "time": "2020-11-12T09:58:18+00:00" }, { "name": "symfony/finder", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "127bccabf3c854625af9c0162779cf06bc1dd352" + "reference": "fd8305521692f27eae3263895d1ef1571c71a78d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/127bccabf3c854625af9c0162779cf06bc1dd352", - "reference": "127bccabf3c854625af9c0162779cf06bc1dd352", + "url": "https://api.github.com/repos/symfony/finder/zipball/fd8305521692f27eae3263895d1ef1571c71a78d", + "reference": "fd8305521692f27eae3263895d1ef1571c71a78d", "shasum": "" }, "require": { "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" @@ -3635,7 +3560,7 @@ "description": "Symfony Finder Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/5.0" + "source": "https://github.com/symfony/finder/tree/v5.2.0" }, "funding": [ { @@ -3651,7 +3576,7 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2020-11-18T09:42:36+00:00" }, { "name": "symfony/flex", @@ -3869,41 +3794,40 @@ "time": "2020-07-23T08:36:09+00:00" }, { - "name": "symfony/http-foundation", - "version": "v5.0.11", + "name": "symfony/http-client-contracts", + "version": "v2.3.1", "source": { "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706" + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", - "reference": "7ad89bbacd90f7bee1a57e61ed5ecaeaba430706", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", + "reference": "41db680a15018f9c1d4b23516059633ce280ca33", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-mbstring": "~1.1" + "php": ">=7.2.5" }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/expression-language": "^4.4|^5.0" + "suggest": { + "symfony/http-client-implementation": "" }, "type": "library", "extra": { + "branch-version": "2.3", "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "2.3-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Contracts\\HttpClient\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3911,18 +3835,26 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Generic abstractions related to HTTP clients", "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.0.11" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" }, "funding": [ { @@ -3938,83 +3870,41 @@ "type": "tidelift" } ], - "time": "2020-07-23T10:04:24+00:00" + "time": "2020-10-14T17:08:19+00:00" }, { - "name": "symfony/http-kernel", - "version": "v5.0.11", + "name": "symfony/http-foundation", + "version": "v5.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2" + "url": "https://github.com/symfony/http-foundation.git", + "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", - "reference": "410ce82fbbb06fb926ecaacea8b0af86bc3e7ef2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e4576271ee99123aa59a40564c7b5405f0ebd1e6", + "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "~1.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php80": "^1.15" }, - "conflict": { - "symfony/browser-kit": "<4.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<4.4", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", - "twig/twig": "<2.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4|^5.0", + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.4|^3.0" + "symfony/mime": "^4.4|^5.0" }, "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" + "symfony/mime": "To use the file extension guesser" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" + "Symfony\\Component\\HttpFoundation\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4034,10 +3924,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.0.11" + "source": "https://github.com/symfony/http-foundation/tree/v5.2.0" }, "funding": [ { @@ -4053,43 +3943,80 @@ "type": "tidelift" } ], - "time": "2020-07-24T04:14:59+00:00" + "time": "2020-11-27T06:13:25+00:00" }, { - "name": "symfony/mime", - "version": "v5.0.11", + "name": "symfony/http-kernel", + "version": "v5.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920" + "url": "https://github.com/symfony/http-kernel.git", + "reference": "38907e5ccb2d9d371191a946734afc83c7a03160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", - "reference": "aa2b2013a8d380e3980a29a79cc0fbcfb02fb920", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/38907e5ccb2d9d371191a946734afc83c7a03160", + "reference": "38907e5ccb2d9d371191a946734afc83c7a03160", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "symfony/mailer": "<4.4" + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.1.8", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.4" + }, + "provide": { + "psr/log-implementation": "1.0" }, "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.1.8", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.4|^3.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" }, + "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Component\\HttpKernel\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4109,14 +4036,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], "support": { - "source": "https://github.com/symfony/mime/tree/5.0" + "source": "https://github.com/symfony/http-kernel/tree/v5.2.0" }, "funding": [ { @@ -4132,25 +4055,24 @@ "type": "tidelift" } ], - "time": "2020-07-23T10:04:24+00:00" + "time": "2020-11-30T05:54:18+00:00" }, { "name": "symfony/orm-pack", - "version": "v1.2.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/symfony/orm-pack.git", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775" + "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/21ac491414b5815e5ebb7425908c1d1568d2e775", - "reference": "21ac491414b5815e5ebb7425908c1d1568d2e775", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/7dd2ed9ba6d7af79f90bdc77522605d40463e533", + "reference": "7dd2ed9ba6d7af79f90bdc77522605d40463e533", "shasum": "" }, "require": { "composer/package-versions-deprecated": "*", - "doctrine/common": "^2", "doctrine/doctrine-bundle": "^2", "doctrine/doctrine-migrations-bundle": "^2", "doctrine/orm": "^2" @@ -4163,7 +4085,7 @@ "description": "A pack for the Doctrine ORM", "support": { "issues": "https://github.com/symfony/orm-pack/issues", - "source": "https://github.com/symfony/orm-pack/tree/v1.2.0" + "source": "https://github.com/symfony/orm-pack/tree/master" }, "funding": [ { @@ -4179,7 +4101,7 @@ "type": "tidelift" } ], - "time": "2020-08-31T10:20:18+00:00" + "time": "2020-07-08T14:31:54+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -4596,20 +4518,22 @@ }, { "name": "symfony/routing", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "1369ee6823074c406815b65a40d47fd5ee48e517" + "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/1369ee6823074c406815b65a40d47fd5ee48e517", - "reference": "1369ee6823074c406815b65a40d47fd5ee48e517", + "url": "https://api.github.com/repos/symfony/routing/zipball/130ac5175ad2fd417978baebd8062e2e6b2bc28b", + "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" }, "conflict": { "symfony/config": "<5.0", @@ -4617,7 +4541,7 @@ "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "~1.2", + "doctrine/annotations": "^1.7", "psr/log": "~1.0", "symfony/config": "^5.0", "symfony/dependency-injection": "^4.4|^5.0", @@ -4633,11 +4557,6 @@ "symfony/yaml": "For using the YAML loader" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Routing\\": "" @@ -4669,7 +4588,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.0.11" + "source": "https://github.com/symfony/routing/tree/v5.2.0" }, "funding": [ { @@ -4685,7 +4604,7 @@ "type": "tidelift" } ], - "time": "2020-06-18T18:18:56+00:00" + "time": "2020-11-27T00:39:34+00:00" }, { "name": "symfony/serializer", @@ -4867,16 +4786,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118" + "reference": "2b105c0354f39a63038a1d8bf776ee92852813af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fbc3084469450c6f6616f5436a00e180ea9ff118", - "reference": "fbc3084469450c6f6616f5436a00e180ea9ff118", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2b105c0354f39a63038a1d8bf776ee92852813af", + "reference": "2b105c0354f39a63038a1d8bf776ee92852813af", "shasum": "" }, "require": { @@ -4884,11 +4803,6 @@ "symfony/service-contracts": "^1.0|^2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Stopwatch\\": "" @@ -4914,7 +4828,7 @@ "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/5.0" + "source": "https://github.com/symfony/stopwatch/tree/v5.2.0" }, "funding": [ { @@ -4930,7 +4844,7 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2020-11-01T16:14:45+00:00" }, { "name": "symfony/translation-contracts", @@ -5012,52 +4926,56 @@ }, { "name": "symfony/twig-bridge", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "293e5f04eee4da963686beab20960b45e4db68ad" + "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/293e5f04eee4da963686beab20960b45e4db68ad", - "reference": "293e5f04eee4da963686beab20960b45e4db68ad", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/909d736d0413a072ebd5db8e0f87b8808efd4849", + "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15", "symfony/translation-contracts": "^1.1|^2", "twig/twig": "^2.10|^3.0" }, "conflict": { "symfony/console": "<4.4", - "symfony/form": "<5.0", + "symfony/form": "<5.1", "symfony/http-foundation": "<4.4", "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.0", - "symfony/workflow": "<4.4" + "symfony/translation": "<5.2", + "symfony/workflow": "<5.2" }, "require-dev": { "egulias/email-validator": "^2.1.10", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/asset": "^4.4|^5.0", "symfony/console": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.0", + "symfony/form": "^5.1.9", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", + "symfony/mime": "^5.2", "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^4.4|^5.1", "symfony/routing": "^4.4|^5.0", "symfony/security-acl": "^2.8|^3.0", "symfony/security-core": "^4.4|^5.0", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", + "symfony/serializer": "^5.2", "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", + "symfony/translation": "^5.2", "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", + "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", "twig/cssinliner-extra": "^2.12", "twig/inky-extra": "^2.12", @@ -5080,11 +4998,6 @@ "symfony/yaml": "For using the YamlExtension" }, "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bridge\\Twig\\": "" @@ -5110,7 +5023,7 @@ "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/5.0" + "source": "https://github.com/symfony/twig-bridge/tree/v5.2.0" }, "funding": [ { @@ -5126,7 +5039,7 @@ "type": "tidelift" } ], - "time": "2020-06-30T17:59:45+00:00" + "time": "2020-11-28T11:24:18+00:00" }, { "name": "symfony/twig-bundle", @@ -5222,16 +5135,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731" + "reference": "173a79c462b1c81e1fa26129f71e41333d846b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/36d19dbb4b377273dddb820adcdf0cc9dcf57731", - "reference": "36d19dbb4b377273dddb820adcdf0cc9dcf57731", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/173a79c462b1c81e1fa26129f71e41333d846b26", + "reference": "173a79c462b1c81e1fa26129f71e41333d846b26", "shasum": "" }, "require": { @@ -5258,11 +5171,6 @@ "Resources/bin/var-dump-server" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "files": [ "Resources/functions/dump.php" @@ -5295,7 +5203,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/5.0" + "source": "https://github.com/symfony/var-dumper/tree/v5.2.0" }, "funding": [ { @@ -5311,34 +5219,30 @@ "type": "tidelift" } ], - "time": "2020-06-24T13:36:01+00:00" + "time": "2020-11-27T00:39:34+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.11", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3" + "reference": "fbc3507f23d263d75417e09a12d77c009f39676c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b87e3aeedb74ee2694932d04153df9d804954cc3", - "reference": "b87e3aeedb74ee2694932d04153df9d804954cc3", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fbc3507f23d263d75417e09a12d77c009f39676c", + "reference": "fbc3507f23d263d75417e09a12d77c009f39676c", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\VarExporter\\": "" @@ -5372,7 +5276,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/5.0" + "source": "https://github.com/symfony/var-exporter/tree/v5.2.0" }, "funding": [ { @@ -5388,7 +5292,7 @@ "type": "tidelift" } ], - "time": "2020-06-07T15:38:39+00:00" + "time": "2020-10-28T21:31:18+00:00" }, { "name": "symfony/yaml", diff --git a/deploy.php b/deploy.php index 4a9663a..ff5f6ae 100644 --- a/deploy.php +++ b/deploy.php @@ -42,12 +42,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', - 'deploy:vendors', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'dump-autoload', +// 'deploy:vendors', +// 'deploy:cache:clear', +// 'deploy:cache:warmup', +// 'dump-autoload', 'deploy:writable', - 'database:migrate', +// 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index c573872..13319c7 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -5,8 +5,9 @@ use App\Entity\Tle; use App\Repository\TleRepository; use App\Service\Traits\FileSystemAwareTrait; -use Ivanstan\Tle\Model\Tle as TleModel; use Doctrine\ORM\EntityManagerInterface; +use GuzzleHttp\Client; +use Ivanstan\Tle\Model\Tle as TleModel; use Ivanstan\Tle\Model\TleFile; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; @@ -57,13 +58,24 @@ protected function execute(InputInterface $input, OutputInterface $output): int /** @noinspection DisconnectedForeachInstructionInspection */ $progressBar->advance(); - $content = file_get_contents($uri); + try { + $response = (new Client())->request('GET', $uri); + } catch (\Exception $exception) { + $output->writeln( + \sprintf( + 'Unable to fetch resource "%s" with exception message "%s"', + $uri, + $exception->getMessage() + ) + ); + continue; + } - if (!$content) { + if (!$response->getBody()) { continue; } - $file = new TleFile($content); + $file = new TleFile($response->getBody()); $insert = []; $update = []; @@ -135,12 +147,14 @@ protected function flush(array $queue, $persistNew = null): void $counter = 0; /** @var TleModel $model */ foreach ($queue as $model) { - /** @var Tle $existing */ - $existing = $this->satellites[$model->getId()]; - $existing->setName($model->getName()); - $existing->setId($model->getId()); - $existing->setLine1($model->getLine1()); - $existing->setLine2($model->getLine2()); + if (!$persistNew) { + /** @var Tle $existing */ + $existing = $this->satellites[$model->getId()]; + $existing->setName($model->getName()); + $existing->setId($model->getId()); + $existing->setLine1($model->getLine1()); + $existing->setLine2($model->getLine2()); + } if ($persistNew) { $tle = $this->toPersistent($model); diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 81780a9..8c97f70 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -1,35 +1,35 @@ -render('docs.html.twig'); - } - - /** - * @Route("/api/{name}.json", name="app_api_docs_json") - */ - public function getJson(string $name): JsonResponse - { - $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; - - $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - - return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); - } -} +render('docs.html.twig'); + } + + /** + * @Route("/api/{name}.json", name="app_api_docs_json") + */ + public function getJson(string $name): JsonResponse + { + $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; + + $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + + return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); + } +} diff --git a/symfony.lock b/symfony.lock index 54a84ad..2be3183 100644 --- a/symfony.lock +++ b/symfony.lock @@ -87,9 +87,6 @@ "doctrine/persistence": { "version": "1.3.3" }, - "doctrine/reflection": { - "version": "v1.0.0" - }, "doctrine/sql-formatter": { "version": "1.1.1" }, @@ -261,9 +258,6 @@ "symfony/http-kernel": { "version": "v5.0.1" }, - "symfony/mime": { - "version": "v5.0.1" - }, "symfony/orm-pack": { "version": "v1.0.7" }, From 73dde3d4fb24fef6eef41298b3a67718dad4db3e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 20 Dec 2020 19:11:32 +0100 Subject: [PATCH 051/151] add satelliteId field --- src/Command/ImportTleCommand.php | 10 +--------- src/Serializer/TleModelNormalizer.php | 1 + 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 13319c7..c8ad83d 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -82,15 +82,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int foreach ($file->parse() as $tle) { if (\array_key_exists($tle->getId(), $this->satellites)) { - $existing = new \Ivanstan\Tle\Model\Tle( - $this->satellites[$tle->getId()]->getLine1(), - $this->satellites[$tle->getId()]->getLine2(), - $this->satellites[$tle->getId()]->getName(), - ); - - if ($tle->getDate() > $existing->getDate()) { - $update[$tle->getId()] = $tle; - } + $update[$tle->getId()] = $tle; } else { $insert[$tle->getId()] = $tle; } diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index b07e6fc..6cb79c1 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -32,6 +32,7 @@ public function normalize($entity, string $format = null, array $context = []) return [ '@id' => $id, '@type' => 'TleModel', + 'satelliteId' => $model->getId(), 'name' => $model->getName(), 'date' => $model->getDate(), 'line1' => $model->getLine1(), From 912c7eb51328c3efd813adb50b35bde72eabe5d0 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 27 Dec 2020 19:15:15 +0100 Subject: [PATCH 052/151] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index c398e5c..eadcee5 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,6 @@ ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) -

- -

- Code repository that powers TLE API backend, listed on NASA API catalog https://api.nasa.gov/ @@ -40,4 +36,4 @@ http://data.ivanstanojevic.me/api/tle * JavaScript https://github.com/ivanstan/tle.js * PHP https://github.com/ivanstan/tle-php -* C# https://github.com/nichols-t/TLE.NET \ No newline at end of file +* C# https://github.com/nichols-t/TLE.NET From ec817823b3094cebb1d7d842fbc14087896fe0d8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 27 Dec 2020 20:05:24 +0100 Subject: [PATCH 053/151] add suplemental source --- config/custom/source.yaml | 106 +++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/config/custom/source.yaml b/config/custom/source.yaml index 085d101..0f3b493 100644 --- a/config/custom/source.yaml +++ b/config/custom/source.yaml @@ -1,47 +1,59 @@ -- https://www.celestrak.com/NORAD/elements/tle-new.txt -- https://www.celestrak.com/NORAD/elements/stations.txt -- https://www.celestrak.com/NORAD/elements/visual.txt -- https://www.celestrak.com/NORAD/elements/active.txt -- https://www.celestrak.com/NORAD/elements/analyst.txt -- https://www.celestrak.com/NORAD/elements/1999-025.txt -- https://www.celestrak.com/NORAD/elements/iridium-33-debris.txt -- https://www.celestrak.com/NORAD/elements/cosmos-2251-debris.txt -- https://www.celestrak.com/NORAD/elements/2012-044.txt -- https://www.celestrak.com/NORAD/elements/weather.txt -- https://www.celestrak.com/NORAD/elements/noaa.txt -- https://www.celestrak.com/NORAD/elements/goes.txt -- https://www.celestrak.com/NORAD/elements/resource.txt -- https://www.celestrak.com/NORAD/elements/sarsat.txt -- https://www.celestrak.com/NORAD/elements/dmc.txt -- https://www.celestrak.com/NORAD/elements/tdrss.txt -- https://www.celestrak.com/NORAD/elements/argos.txt -- https://www.celestrak.com/NORAD/elements/planet.txt -- https://www.celestrak.com/NORAD/elements/spire.txt -- https://www.celestrak.com/NORAD/elements/geo.txt -- https://www.celestrak.com/NORAD/elements/intelsat.txt -- https://www.celestrak.com/NORAD/elements/ses.txt -- https://www.celestrak.com/NORAD/elements/iridium.txt -- https://www.celestrak.com/NORAD/elements/iridium-NEXT.txt -- https://www.celestrak.com/NORAD/elements/orbcomm.txt -- https://www.celestrak.com/NORAD/elements/globalstar.txt -- https://www.celestrak.com/NORAD/elements/amateur.txt -- https://www.celestrak.com/NORAD/elements/x-comm.txt -- https://www.celestrak.com/NORAD/elements/other-comm.txt -- https://www.celestrak.com/NORAD/elements/gorizont.txt -- https://www.celestrak.com/NORAD/elements/raduga.txt -- https://www.celestrak.com/NORAD/elements/molniya.txt -- https://www.celestrak.com/NORAD/elements/gps-ops.txt -- https://www.celestrak.com/NORAD/elements/glo-ops.txt -- https://www.celestrak.com/NORAD/elements/galileo.txt -- https://www.celestrak.com/NORAD/elements/beidou.txt -- https://www.celestrak.com/NORAD/elements/sbas.txt -- https://www.celestrak.com/NORAD/elements/nnss.txt -- https://www.celestrak.com/NORAD/elements/musson.txt -- https://www.celestrak.com/NORAD/elements/science.txt -- https://www.celestrak.com/NORAD/elements/geodetic.txt -- https://www.celestrak.com/NORAD/elements/engineering.txt -- https://www.celestrak.com/NORAD/elements/education.txt -- https://www.celestrak.com/NORAD/elements/military.txt -- https://www.celestrak.com/NORAD/elements/radar.txt -- https://www.celestrak.com/NORAD/elements/cubesat.txt -- https://www.celestrak.com/NORAD/elements/other.txt \ No newline at end of file +- https://celestrak.com/NORAD/elements/tle-new.txt +- https://celestrak.com/NORAD/elements/stations.txt +- https://celestrak.com/NORAD/elements/visual.txt +- https://celestrak.com/NORAD/elements/active.txt +- https://celestrak.com/NORAD/elements/analyst.txt +- https://celestrak.com/NORAD/elements/1999-025.txt +- https://celestrak.com/NORAD/elements/iridium-33-debris.txt +- https://celestrak.com/NORAD/elements/cosmos-2251-debris.txt +- https://celestrak.com/NORAD/elements/2012-044.txt +- https://celestrak.com/NORAD/elements/weather.txt +- https://celestrak.com/NORAD/elements/noaa.txt +- https://celestrak.com/NORAD/elements/goes.txt +- https://celestrak.com/NORAD/elements/resource.txt +- https://celestrak.com/NORAD/elements/sarsat.txt +- https://celestrak.com/NORAD/elements/dmc.txt +- https://celestrak.com/NORAD/elements/tdrss.txt +- https://celestrak.com/NORAD/elements/argos.txt +- https://celestrak.com/NORAD/elements/planet.txt +- https://celestrak.com/NORAD/elements/spire.txt +- https://celestrak.com/NORAD/elements/geo.txt +- https://celestrak.com/NORAD/elements/intelsat.txt +- https://celestrak.com/NORAD/elements/ses.txt +- https://celestrak.com/NORAD/elements/iridium.txt +- https://celestrak.com/NORAD/elements/iridium-NEXT.txt +- https://celestrak.com/NORAD/elements/orbcomm.txt +- https://celestrak.com/NORAD/elements/globalstar.txt +- https://celestrak.com/NORAD/elements/amateur.txt +- https://celestrak.com/NORAD/elements/x-comm.txt +- https://celestrak.com/NORAD/elements/other-comm.txt +- https://celestrak.com/NORAD/elements/gorizont.txt +- https://celestrak.com/NORAD/elements/raduga.txt +- https://celestrak.com/NORAD/elements/molniya.txt +- https://celestrak.com/NORAD/elements/gps-ops.txt +- https://celestrak.com/NORAD/elements/glo-ops.txt +- https://celestrak.com/NORAD/elements/galileo.txt +- https://celestrak.com/NORAD/elements/beidou.txt +- https://celestrak.com/NORAD/elements/sbas.txt +- https://celestrak.com/NORAD/elements/nnss.txt +- https://celestrak.com/NORAD/elements/musson.txt +- https://celestrak.com/NORAD/elements/science.txt +- https://celestrak.com/NORAD/elements/geodetic.txt +- https://celestrak.com/NORAD/elements/engineering.txt +- https://celestrak.com/NORAD/elements/education.txt +- https://celestrak.com/NORAD/elements/military.txt +- https://celestrak.com/NORAD/elements/radar.txt +- https://celestrak.com/NORAD/elements/cubesat.txt +- https://celestrak.com/NORAD/elements/other.txt +- https://celestrak.com/NORAD/elements/supplemental/starlink.txt +- https://celestrak.com/NORAD/elements/supplemental/oneweb.txt +- https://celestrak.com/NORAD/elements/supplemental/gps.txt +- https://celestrak.com/NORAD/elements/supplemental/glonass.txt +- https://celestrak.com/NORAD/elements/supplemental/meteosat.txt +- https://celestrak.com/NORAD/elements/supplemental/intelsat.txt +- https://celestrak.com/NORAD/elements/supplemental/ses.txt +- https://celestrak.com/NORAD/elements/supplemental/orbcomm.txt +- https://celestrak.com/NORAD/elements/supplemental/cpf.txt +- https://celestrak.com/NORAD/elements/swarm.txt +- https://celestrak.com/satcat/gpz.php +- https://celestrak.com/NORAD/elements/supplemental/planet.txt \ No newline at end of file From fc06e2742976f13f84e30eb72d02bd9d2e4771b2 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 25 Feb 2021 12:04:14 +0100 Subject: [PATCH 054/151] upgrade --- config/custom/tle.json | 12 ++++++------ deploy.php | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index b58e6bb..f84e61f 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -188,7 +188,7 @@ "properties": { "@id": { "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/43630" + "example": "https://tle.ivanstanojevic.me/api/tle/43638" }, "@type": { "type": "string", @@ -196,19 +196,19 @@ }, "name": { "type": "string", - "example": "HTV-7 (KOUNOTORI 7)" + "example": "1998-067PN" }, "date": { "type": "string", - "example": "2018-10-21T11:40:23+00:00" + "example": "2021-02-16T06:41:41+00:00" }, "line1": { "type": "string", - "example": "1 43630U 18073A 18285.64337553 .00002296 00000-0 42374-4 0 9998" + "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" }, "line2": { "type": "string", - "example": "2 43630 51.6412 153.3949 0003517 275.8456 137.9883 15.53813372136786" + "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" } }, "type": "object" @@ -294,4 +294,4 @@ } } } -} \ No newline at end of file +} diff --git a/deploy.php b/deploy.php index ff5f6ae..fde8dbd 100644 --- a/deploy.php +++ b/deploy.php @@ -11,8 +11,19 @@ set('writable_mode', 'chmod'); set('default_stage', 'production'); set('bin/composer', '~/bin/composer.phar'); -add('shared_files', ['.env']); -add('shared_dirs', ['var']); +add('shared_files', [ + '.env', + 'public/robots.txt', + 'public/manifest.json', + 'public/asset-manifest.json', + 'public/favicon.ico', + 'public/index.html', +]); +add('shared_dirs', [ + 'var', + 'public/static', + 'public/images', +]); add('writable_dirs', ['var']); host('ivanstanojevic.me') From b9b028181058e6aee6b0e8a625fef88619035416 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 25 Feb 2021 12:19:02 +0100 Subject: [PATCH 055/151] upgrade --- composer.json | 22 +- composer.lock | 1094 ++++++++++++++++++++++++++----------------------- deploy.php | 10 +- symfony.lock | 4 +- 4 files changed, 607 insertions(+), 523 deletions(-) diff --git a/composer.json b/composer.json index e6fca39..ad831ef 100644 --- a/composer.json +++ b/composer.json @@ -2,29 +2,29 @@ "type": "project", "license": "proprietary", "require": { - "php": "^7.4", + "php": "^8.0", "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*", - "ivanstan/tle-php": "^1.0", + "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.0.*", - "symfony/browser-kit": "5.0.*", - "symfony/console": "5.0.*", - "symfony/dotenv": "5.0.*", + "symfony/asset": "5.2.*", + "symfony/browser-kit": "5.2.*", + "symfony/console": "5.2.*", + "symfony/dotenv": "5.2.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.0.*", + "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", - "symfony/serializer": "5.0.*", - "symfony/twig-bundle": "5.0.*", - "symfony/yaml": "5.0.*", + "symfony/serializer": "5.2.*", + "symfony/twig-bundle": "5.2.*", + "symfony/yaml": "5.2.*", "twig/extra-bundle": "^2.12|^3.0", "twig/twig": "^2.12|^3.0" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.0" + "symfony/phpunit-bridge": "^5.2" }, "config": { "preferred-install": { diff --git a/composer.lock b/composer.lock index b996145..775e5f3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "623796bd13aa29d141dca80c543db4c9", + "content-hash": "86856225c36f705ce4978b2de2e986f2", "packages": [ { "name": "composer/package-versions-deprecated", @@ -81,16 +81,16 @@ }, { "name": "doctrine/annotations", - "version": "1.11.1", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/b17c5014ef81d212ac539f07a1001832df1b6d3b", + "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b", "shasum": "" }, "require": { @@ -105,11 +105,6 @@ "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" @@ -150,9 +145,9 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.11.1" + "source": "https://github.com/doctrine/annotations/tree/1.12.1" }, - "time": "2020-10-26T10:28:16+00:00" + "time": "2021-02-21T21:00:45+00:00" }, { "name": "doctrine/cache", @@ -325,16 +320,16 @@ }, { "name": "doctrine/common", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d" + "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/9f3e3f3cc5399604c0325d5ffa92609d694d950d", - "reference": "9f3e3f3cc5399604c0325d5ffa92609d694d950d", + "url": "https://api.github.com/repos/doctrine/common/zipball/2afde5a9844126bc311cd5f548b5475e75f800d3", + "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3", "shasum": "" }, "require": { @@ -394,7 +389,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.1.0" + "source": "https://github.com/doctrine/common/tree/3.1.1" }, "funding": [ { @@ -410,7 +405,7 @@ "type": "tidelift" } ], - "time": "2020-12-03T21:02:31+00:00" + "time": "2021-01-20T19:58:05+00:00" }, { "name": "doctrine/dbal", @@ -525,16 +520,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.2.2", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "044d33eeffdb236d5013b6b4af99f87519e10751" + "reference": "015fdd490074d4daa891e2d1df998dc35ba54924" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/044d33eeffdb236d5013b6b4af99f87519e10751", - "reference": "044d33eeffdb236d5013b6b4af99f87519e10751", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/015fdd490074d4daa891e2d1df998dc35ba54924", + "reference": "015fdd490074d4daa891e2d1df998dc35ba54924", "shasum": "" }, "require": { @@ -557,7 +552,7 @@ "require-dev": { "doctrine/coding-standard": "^8.0", "doctrine/orm": "^2.6", - "ocramius/proxy-manager": "^2.1", + "friendsofphp/proxy-manager-lts": "^1.0", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", "symfony/phpunit-bridge": "^4.2", "symfony/property-info": "^4.3.3|^5.0", @@ -615,7 +610,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.2" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.3" }, "funding": [ { @@ -631,34 +626,34 @@ "type": "tidelift" } ], - "time": "2020-12-05T15:07:10+00:00" + "time": "2021-01-19T20:29:53+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", - "version": "2.2.1", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "955077b68c377310cf9538fc982be11d36ab75d4" + "reference": "85f0b847174daf243362c7da80efe1539be64f47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/955077b68c377310cf9538fc982be11d36ab75d4", - "reference": "955077b68c377310cf9538fc982be11d36ab75d4", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/85f0b847174daf243362c7da80efe1539be64f47", + "reference": "85f0b847174daf243362c7da80efe1539be64f47", "shasum": "" }, "require": { "doctrine/doctrine-bundle": "~1.0|~2.0", "doctrine/migrations": "^2.2", - "php": "^7.1", + "php": "^7.1|^8.0", "symfony/framework-bundle": "~3.4|~4.0|~5.0" }, "require-dev": { - "doctrine/coding-standard": "^5.0", + "doctrine/coding-standard": "^8.0", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.9.2", - "phpstan/phpstan-strict-rules": "^0.9", - "phpunit/phpunit": "^6.4|^7.0" + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "symfony-bundle", "extra": { @@ -701,7 +696,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.1" + "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/2.2.2" }, "funding": [ { @@ -717,7 +712,7 @@ "type": "tidelift" } ], - "time": "2020-11-11T09:59:06+00:00" + "time": "2020-12-23T15:06:17+00:00" }, { "name": "doctrine/event-manager", @@ -1059,36 +1054,36 @@ }, { "name": "doctrine/migrations", - "version": "2.3.1", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "af915024d41669600354efe78664ee86dfca62e1" + "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/af915024d41669600354efe78664ee86dfca62e1", - "reference": "af915024d41669600354efe78664ee86dfca62e1", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/39520699043d9bfaaebeb81fa026bf2b02a8f735", + "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.8", "doctrine/dbal": "^2.9", - "ocramius/proxy-manager": "^2.0.2", - "php": "^7.1", + "friendsofphp/proxy-manager-lts": "^1.0", + "php": "^7.1 || ^8.0", "symfony/console": "^3.4||^4.4.16||^5.0", "symfony/stopwatch": "^3.4||^4.0||^5.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.2", "doctrine/orm": "^2.6", "ext-pdo_sqlite": "*", "jdorn/sql-formatter": "^1.1", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.10", - "phpstan/phpstan-deprecation-rules": "^0.10", - "phpstan/phpstan-phpunit": "^0.10", - "phpstan/phpstan-strict-rules": "^0.10", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", "symfony/process": "^3.4||^4.0||^5.0", "symfony/yaml": "^3.4||^4.0||^5.0" @@ -1139,7 +1134,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/2.3.1" + "source": "https://github.com/doctrine/migrations/tree/2.3.2" }, "funding": [ { @@ -1155,20 +1150,20 @@ "type": "tidelift" } ], - "time": "2020-12-05T19:13:58+00:00" + "time": "2020-12-23T14:06:04+00:00" }, { "name": "doctrine/orm", - "version": "2.8.1", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833" + "reference": "ebae57eb9637acd8252b398df3121b120688ed5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/242cf1a33df1b8bc5e1b86c3ebd01db07851c833", - "reference": "242cf1a33df1b8bc5e1b86c3ebd01db07851c833", + "url": "https://api.github.com/repos/doctrine/orm/zipball/ebae57eb9637acd8252b398df3121b120688ed5c", + "reference": "ebae57eb9637acd8252b398df3121b120688ed5c", "shasum": "" }, "require": { @@ -1176,7 +1171,7 @@ "doctrine/annotations": "^1.11.1", "doctrine/cache": "^1.9.1", "doctrine/collections": "^1.5", - "doctrine/common": "^3.0", + "doctrine/common": "^3.0.3", "doctrine/dbal": "^2.10.0", "doctrine/event-manager": "^1.1", "doctrine/inflector": "^1.4|^2.0", @@ -1245,9 +1240,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.8.1" + "source": "https://github.com/doctrine/orm/tree/2.8.2" }, - "time": "2020-12-04T19:53:07+00:00" + "time": "2021-02-16T22:10:18+00:00" }, { "name": "doctrine/persistence", @@ -1390,6 +1385,88 @@ }, "time": "2020-07-30T16:57:33+00:00" }, + { + "name": "friendsofphp/proxy-manager-lts", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "~3.4.1|^4.0", + "php": ">=7.1", + "symfony/filesystem": "^4.4.17|^5.0" + }, + "conflict": { + "laminas/laminas-stdlib": "<3.2.1", + "zendframework/zend-stdlib": "<3.2.1" + }, + "replace": { + "ocramius/proxy-manager": "^2.1" + }, + "require-dev": { + "ext-phar": "*", + "symfony/phpunit-bridge": "^5.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "ocramius/proxy-manager", + "url": "https://github.com/Ocramius/ProxyManager" + } + }, + "autoload": { + "psr-4": { + "ProxyManager\\": "src/ProxyManager" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + } + ], + "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager", + "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts", + "keywords": [ + "aop", + "lazy loading", + "proxy", + "proxy pattern", + "service proxies" + ], + "support": { + "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", + "type": "tidelift" + } + ], + "time": "2021-01-14T21:52:44+00:00" + }, { "name": "guzzlehttp/guzzle", "version": "6.5.5", @@ -1593,23 +1670,23 @@ }, { "name": "ivanstan/tle-php", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1" + "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/15c7e46644237df8c5997a6d7875b0f2b9a62cd1", - "reference": "15c7e46644237df8c5997a6d7875b0f2b9a62cd1", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/4ae1dbd53cba8de3d89328b8d20c701ee96558c0", + "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.5", "myclabs/php-enum": "^1.7", - "php": "^7.4" + "php": "^7.4|^8.0" }, "require-dev": { "phpunit/phpunit": "^8" @@ -1633,45 +1710,47 @@ "description": "TLE Framework written in PHP and client to NASA TLE API.", "support": { "issues": "https://github.com/ivanstan/tle-php/issues", - "source": "https://github.com/ivanstan/tle-php/tree/1.0.1" + "source": "https://github.com/ivanstan/tle-php/tree/1.0.3" }, - "time": "2020-12-09T09:04:57+00:00" + "time": "2021-02-25T11:17:02+00:00" }, { "name": "laminas/laminas-code", - "version": "3.5.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "b549b70c0bb6e935d497f84f750c82653326ac77" + "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/b549b70c0bb6e935d497f84f750c82653326ac77", - "reference": "b549b70c0bb6e935d497f84f750c82653326ac77", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/28a6d70ea8b8bca687d7163300e611ae33baf82a", + "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a", "shasum": "" }, "require": { "laminas/laminas-eventmanager": "^3.3", - "laminas/laminas-zendframework-bridge": "^1.1", - "php": "^7.3 || ~8.0.0" + "php": "^7.4 || ~8.0.0" }, "conflict": { "phpspec/prophecy": "<1.9.0" }, "replace": { - "zendframework/zend-code": "^3.4.1" + "zendframework/zend-code": "self.version" }, "require-dev": { "doctrine/annotations": "^1.10.4", "ext-phar": "*", - "laminas/laminas-coding-standard": "^1.0.0", + "laminas/laminas-coding-standard": "^2.1.4", "laminas/laminas-stdlib": "^3.3.0", - "phpunit/phpunit": "^9.4.2" + "phpunit/phpunit": "^9.4.2", + "psalm/plugin-phpunit": "^0.14.0", + "vimeo/psalm": "^4.3.1" }, "suggest": { "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" + "laminas/laminas-stdlib": "Laminas\\Stdlib component", + "laminas/laminas-zendframework-bridge": "A bridge with Zend Framework" }, "type": "library", "autoload": { @@ -1687,7 +1766,8 @@ "homepage": "https://laminas.dev", "keywords": [ "code", - "laminas" + "laminas", + "laminasframework" ], "support": { "chat": "https://laminas.dev/chat", @@ -1703,7 +1783,7 @@ "type": "community_bridge" } ], - "time": "2020-11-30T20:16:31+00:00" + "time": "2020-12-30T16:16:14+00:00" }, { "name": "laminas/laminas-eventmanager", @@ -1839,26 +1919,26 @@ }, { "name": "myclabs/php-enum", - "version": "1.7.7", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7" + "reference": "46cf3d8498b095bd33727b13fd5707263af99421" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/d178027d1e679832db9f38248fcc7200647dc2b7", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/46cf3d8498b095bd33727b13fd5707263af99421", + "reference": "46cf3d8498b095bd33727b13fd5707263af99421", "shasum": "" }, "require": { "ext-json": "*", - "php": ">=7.1" + "php": "^7.3 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^7", + "phpunit/phpunit": "^9.5", "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^3.8" + "vimeo/psalm": "^4.5.1" }, "type": "library", "autoload": { @@ -1883,7 +1963,7 @@ ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.7.7" + "source": "https://github.com/myclabs/php-enum/tree/1.8.0" }, "funding": [ { @@ -1895,97 +1975,7 @@ "type": "tidelift" } ], - "time": "2020-11-14T18:14:52+00:00" - }, - { - "name": "ocramius/proxy-manager", - "version": "2.10.0", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", - "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0.0", - "laminas/laminas-code": "^3.4.1", - "php": "~7.4.1", - "webimpress/safe-writer": "^2.0.1" - }, - "conflict": { - "doctrine/annotations": "<1.6.1", - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" - }, - "require-dev": { - "codelicia/xulieta": "^0.1.2", - "doctrine/coding-standard": "^8.1.0", - "ext-phar": "*", - "infection/infection": "^0.16.4", - "nikic/php-parser": "^4.6.0", - "phpbench/phpbench": "^0.17.1", - "phpunit/phpunit": "^9.2.5", - "slevomat/coding-standard": "^6.3.10", - "squizlabs/php_codesniffer": "^3.5.5", - "vimeo/psalm": "^3.12.2" - }, - "suggest": { - "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", - "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", - "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.io/" - } - ], - "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", - "homepage": "https://github.com/Ocramius/ProxyManager", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "support": { - "issues": "https://github.com/Ocramius/ProxyManager/issues", - "source": "https://github.com/Ocramius/ProxyManager/tree/2.10.0" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2020-11-12T17:04:46+00:00" + "time": "2021-02-15T16:11:48+00:00" }, { "name": "psr/cache", @@ -2314,22 +2304,23 @@ }, { "name": "symfony/asset", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb" + "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/aaf4ba865c02f6df999166a0148d56f2b11b11fb", - "reference": "aaf4ba865c02f6df999166a0148d56f2b11b11fb", + "url": "https://api.github.com/repos/symfony/asset/zipball/54a42aa50f9359d1184bf7e954521b45ca3d5828", + "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828", "shasum": "" }, "require": { "php": ">=7.2.5" }, "require-dev": { + "symfony/http-client": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/http-kernel": "^4.4|^5.0" }, @@ -2337,11 +2328,6 @@ "symfony/http-foundation": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Asset\\": "" @@ -2364,10 +2350,10 @@ "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", "support": { - "source": "https://github.com/symfony/asset/tree/5.0" + "source": "https://github.com/symfony/asset/tree/v5.2.3" }, "funding": [ { @@ -2383,20 +2369,20 @@ "type": "tidelift" } ], - "time": "2020-05-30T20:12:43+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6" + "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c46b676a993cc437bafe6fe0f30f074857cde2a6", - "reference": "c46b676a993cc437bafe6fe0f30f074857cde2a6", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", + "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", "shasum": "" }, "require": { @@ -2413,11 +2399,6 @@ "symfony/process": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\BrowserKit\\": "" @@ -2440,10 +2421,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony BrowserKit Component", + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.0.11" + "source": "https://github.com/symfony/browser-kit/tree/v5.2.3" }, "funding": [ { @@ -2459,20 +2440,20 @@ "type": "tidelift" } ], - "time": "2020-06-12T09:22:24+00:00" + "time": "2021-01-27T12:56:27+00:00" }, { "name": "symfony/cache", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b" + "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", - "reference": "c15fd2b3dcf2bd7d5ee3265874870d6cc694306b", + "url": "https://api.github.com/repos/symfony/cache/zipball/d6aed6c1bbf6f59e521f46437475a0ff4878d388", + "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388", "shasum": "" }, "require": { @@ -2531,14 +2512,14 @@ "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", "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.2.0" + "source": "https://github.com/symfony/cache/tree/v5.2.3" }, "funding": [ { @@ -2554,7 +2535,7 @@ "type": "tidelift" } ], - "time": "2020-11-21T09:39:55+00:00" + "time": "2021-01-27T11:24:50+00:00" }, { "name": "symfony/cache-contracts", @@ -2637,16 +2618,16 @@ }, { "name": "symfony/config", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea" + "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", - "reference": "fa1219ecbf96bb5db59f2599cba0960a0d9c3aea", + "url": "https://api.github.com/repos/symfony/config/zipball/50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", + "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", "shasum": "" }, "require": { @@ -2692,10 +2673,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Config Component", + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.2.0" + "source": "https://github.com/symfony/config/tree/v5.2.3" }, "funding": [ { @@ -2711,20 +2692,20 @@ "type": "tidelift" } ], - "time": "2020-11-16T18:02:40+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/console", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "95794074741645473221fb126d5cb4057ad25bf1" + "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/95794074741645473221fb126d5cb4057ad25bf1", - "reference": "95794074741645473221fb126d5cb4057ad25bf1", + "url": "https://api.github.com/repos/symfony/console/zipball/89d4b176d12a2946a1ae4e34906a025b7b6b135a", + "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a", "shasum": "" }, "require": { @@ -2732,10 +2713,12 @@ "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" }, "conflict": { "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", "symfony/process": "<4.4" @@ -2759,11 +2742,6 @@ "symfony/process": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" @@ -2786,10 +2764,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v5.0.11" + "source": "https://github.com/symfony/console/tree/v5.2.3" }, "funding": [ { @@ -2805,20 +2789,20 @@ "type": "tidelift" } ], - "time": "2020-07-06T13:22:03+00:00" + "time": "2021-01-28T22:06:19+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "98cec9b9f410a4832e239949a41d47182862c3a4" + "reference": "62f72187be689540385dce6c68a5d4c16f034139" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98cec9b9f410a4832e239949a41d47182862c3a4", - "reference": "98cec9b9f410a4832e239949a41d47182862c3a4", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/62f72187be689540385dce6c68a5d4c16f034139", + "reference": "62f72187be689540385dce6c68a5d4c16f034139", "shasum": "" }, "require": { @@ -2873,10 +2857,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DependencyInjection Component", + "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.2.0" + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.3" }, "funding": [ { @@ -2892,7 +2876,7 @@ "type": "tidelift" } ], - "time": "2020-11-28T11:24:18+00:00" + "time": "2021-01-27T12:56:27+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2963,22 +2947,23 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf" + "reference": "c348e596f49df406a7c0a51443864038b3137cac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b3ea1749ef47c3d2ad6018d05837758bae91f5cf", - "reference": "b3ea1749ef47c3d2ad6018d05837758bae91f5cf", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c348e596f49df406a7c0a51443864038b3137cac", + "reference": "c348e596f49df406a7c0a51443864038b3137cac", "shasum": "" }, "require": { "doctrine/event-manager": "~1.0", "doctrine/persistence": "^2", "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.15", @@ -2998,7 +2983,7 @@ }, "require-dev": { "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", @@ -3053,10 +3038,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Doctrine Bridge", + "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.0" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.3" }, "funding": [ { @@ -3072,7 +3057,7 @@ "type": "tidelift" } ], - "time": "2020-11-28T13:40:09+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "symfony/dom-crawler", @@ -3150,30 +3135,26 @@ }, { "name": "symfony/dotenv", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "efd887f012127acad22325d109fe8ddf635f1f97" + "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/efd887f012127acad22325d109fe8ddf635f1f97", - "reference": "efd887f012127acad22325d109fe8ddf635f1f97", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/783f12027c6b40ab0e93d6136d9f642d1d67cd6b", + "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" }, "require-dev": { "symfony/process": "^4.4|^5.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Dotenv\\": "" @@ -3204,7 +3185,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/5.0" + "source": "https://github.com/symfony/dotenv/tree/v5.2.3" }, "funding": [ { @@ -3220,20 +3201,20 @@ "type": "tidelift" } ], - "time": "2020-05-28T08:20:26+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/error-handler", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "289008c5be039e39908d33ae0a8ac99be1210bba" + "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/289008c5be039e39908d33ae0a8ac99be1210bba", - "reference": "289008c5be039e39908d33ae0a8ac99be1210bba", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/48f18b3609e120ea66d59142c23dc53e9562c26d", + "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d", "shasum": "" }, "require": { @@ -3270,10 +3251,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony ErrorHandler Component", + "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.2.0" + "source": "https://github.com/symfony/error-handler/tree/v5.2.3" }, "funding": [ { @@ -3289,20 +3270,20 @@ "type": "tidelift" } ], - "time": "2020-10-28T21:46:03+00:00" + "time": "2021-01-28T22:06:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c" + "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", - "reference": "aa13a09811e6d2ad43f8fb336bebdb7691d85d3c", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4f9760f8074978ad82e2ce854dff79a71fe45367", + "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367", "shasum": "" }, "require": { @@ -3355,10 +3336,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.3" }, "funding": [ { @@ -3374,7 +3355,7 @@ "type": "tidelift" } ], - "time": "2020-11-01T16:14:45+00:00" + "time": "2021-01-27T10:36:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3457,16 +3438,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "bb92ba7f38b037e531908590a858a04d85c0e238" + "reference": "262d033b57c73e8b59cd6e68a45c528318b15038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/bb92ba7f38b037e531908590a858a04d85c0e238", - "reference": "bb92ba7f38b037e531908590a858a04d85c0e238", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038", + "reference": "262d033b57c73e8b59cd6e68a45c528318b15038", "shasum": "" }, "require": { @@ -3496,10 +3477,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Filesystem Component", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.0" + "source": "https://github.com/symfony/filesystem/tree/v5.2.3" }, "funding": [ { @@ -3515,20 +3496,20 @@ "type": "tidelift" } ], - "time": "2020-11-12T09:58:18+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/finder", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "fd8305521692f27eae3263895d1ef1571c71a78d" + "reference": "4adc8d172d602008c204c2e16956f99257248e03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/fd8305521692f27eae3263895d1ef1571c71a78d", - "reference": "fd8305521692f27eae3263895d1ef1571c71a78d", + "url": "https://api.github.com/repos/symfony/finder/zipball/4adc8d172d602008c204c2e16956f99257248e03", + "reference": "4adc8d172d602008c204c2e16956f99257248e03", "shasum": "" }, "require": { @@ -3557,10 +3538,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.0" + "source": "https://github.com/symfony/finder/tree/v5.2.3" }, "funding": [ { @@ -3576,7 +3557,7 @@ "type": "tidelift" } ], - "time": "2020-11-18T09:42:36+00:00" + "time": "2021-01-28T22:06:19+00:00" }, { "name": "symfony/flex", @@ -3648,89 +3629,95 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16" + "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/0fc0a93f8bbe465d0b483e21b087d432baa92c16", - "reference": "0fc0a93f8bbe465d0b483e21b087d432baa92c16", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ff455b2afd3f98237d4131ffebe190e59cc0f011", + "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011", "shasum": "" }, "require": { "ext-xml": "*", "php": ">=7.2.5", - "symfony/cache": "^4.4|^5.0", + "symfony/cache": "^5.2", "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.0.1", + "symfony/dependency-injection": "^5.2", + "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", + "symfony/http-foundation": "^5.2.1", + "symfony/http-kernel": "^5.2.1", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^5.0" + "symfony/polyfill-php80": "^1.15", + "symfony/routing": "^5.2" }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.1", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<4.4", + "symfony/asset": "<5.1", "symfony/browser-kit": "<4.4", - "symfony/console": "<4.4", + "symfony/console": "<5.2", "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<4.4", - "symfony/form": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/form": "<5.2", "symfony/http-client": "<4.4", "symfony/lock": "<4.4", - "symfony/mailer": "<4.4", + "symfony/mailer": "<5.2", "symfony/messenger": "<4.4", "symfony/mime": "<4.4", + "symfony/property-access": "<5.2", "symfony/property-info": "<4.4", - "symfony/serializer": "<4.4", + "symfony/serializer": "<5.2", "symfony/stopwatch": "<4.4", "symfony/translation": "<5.0", "symfony/twig-bridge": "<4.4", "symfony/twig-bundle": "<4.4", - "symfony/validator": "<4.4", + "symfony/validator": "<5.2", "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<4.4" + "symfony/workflow": "<5.2" }, "require-dev": { - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", + "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^4.4|^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^5.1", "symfony/browser-kit": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", + "symfony/console": "^5.2", "symfony/css-selector": "^4.4|^5.0", "symfony/dom-crawler": "^4.4|^5.0", - "symfony/dotenv": "^4.4|^5.0", + "symfony/dotenv": "^5.1", "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", + "symfony/form": "^5.2", "symfony/http-client": "^4.4|^5.0", "symfony/lock": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", + "symfony/mailer": "^5.2", + "symfony/messenger": "^5.2", "symfony/mime": "^4.4|^5.0", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", + "symfony/security-bundle": "^5.1", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0", + "symfony/serializer": "^5.2", "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "~5.0.0", + "symfony/string": "^5.0", "symfony/translation": "^5.0", "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0", + "symfony/validator": "^5.2", "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", + "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", "twig/twig": "^2.10|^3.0" }, @@ -3745,11 +3732,6 @@ "symfony/yaml": "For using the debug:config and lint:yaml commands" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bundle\\FrameworkBundle\\": "" @@ -3772,10 +3754,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony FrameworkBundle", + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.0.11" + "source": "https://github.com/symfony/framework-bundle/tree/v5.2.3" }, "funding": [ { @@ -3791,7 +3773,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2021-01-27T11:19:04+00:00" }, { "name": "symfony/http-client-contracts", @@ -3874,16 +3856,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6" + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e4576271ee99123aa59a40564c7b5405f0ebd1e6", - "reference": "e4576271ee99123aa59a40564c7b5405f0ebd1e6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36", + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36", "shasum": "" }, "require": { @@ -3924,10 +3906,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.2.0" + "source": "https://github.com/symfony/http-foundation/tree/v5.2.3" }, "funding": [ { @@ -3943,20 +3925,20 @@ "type": "tidelift" } ], - "time": "2020-11-27T06:13:25+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "38907e5ccb2d9d371191a946734afc83c7a03160" + "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/38907e5ccb2d9d371191a946734afc83c7a03160", - "reference": "38907e5ccb2d9d371191a946734afc83c7a03160", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", + "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", "shasum": "" }, "require": { @@ -3985,7 +3967,7 @@ "symfony/translation": "<5.0", "symfony/twig-bridge": "<5.0", "symfony/validator": "<5.0", - "twig/twig": "<2.4" + "twig/twig": "<2.13" }, "provide": { "psr/log-implementation": "1.0" @@ -4005,7 +3987,7 @@ "symfony/stopwatch": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.4|^3.0" + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "symfony/browser-kit": "", @@ -4036,10 +4018,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.2.0" + "source": "https://github.com/symfony/http-kernel/tree/v5.2.3" }, "funding": [ { @@ -4055,7 +4037,7 @@ "type": "tidelift" } ], - "time": "2020-11-30T05:54:18+00:00" + "time": "2021-02-03T04:51:58+00:00" }, { "name": "symfony/orm-pack", @@ -4103,18 +4085,99 @@ ], "time": "2020-07-08T14:31:54+00:00" }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170", + "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", + "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", "shasum": "" }, "require": { @@ -4128,7 +4191,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4172,7 +4235,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" }, "funding": [ { @@ -4188,20 +4251,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "727d1096295d807c309fb01a851577302394c897" + "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", - "reference": "727d1096295d807c309fb01a851577302394c897", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", + "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", "shasum": "" }, "require": { @@ -4213,7 +4276,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4256,7 +4319,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" }, "funding": [ { @@ -4272,20 +4335,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", "shasum": "" }, "require": { @@ -4297,7 +4360,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4336,7 +4399,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" }, "funding": [ { @@ -4352,20 +4415,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", "shasum": "" }, "require": { @@ -4374,7 +4437,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4415,7 +4478,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" }, "funding": [ { @@ -4431,20 +4494,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", "shasum": "" }, "require": { @@ -4453,7 +4516,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4498,7 +4561,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" }, "funding": [ { @@ -4514,20 +4577,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/routing", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b" + "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/130ac5175ad2fd417978baebd8062e2e6b2bc28b", - "reference": "130ac5175ad2fd417978baebd8062e2e6b2bc28b", + "url": "https://api.github.com/repos/symfony/routing/zipball/348b5917e56546c6d96adbf21d7f92c9ef563661", + "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661", "shasum": "" }, "require": { @@ -4541,7 +4604,7 @@ "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.7", + "doctrine/annotations": "^1.10.4", "psr/log": "~1.0", "symfony/config": "^5.0", "symfony/dependency-injection": "^4.4|^5.0", @@ -4579,7 +4642,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", @@ -4588,7 +4651,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.2.0" + "source": "https://github.com/symfony/routing/tree/v5.2.3" }, "funding": [ { @@ -4604,46 +4667,53 @@ "type": "tidelift" } ], - "time": "2020-11-27T00:39:34+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/serializer", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "825b66f545da95e9bb1626d5655be6693376d52a" + "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/825b66f545da95e9bb1626d5655be6693376d52a", - "reference": "825b66f545da95e9bb1626d5655be6693376d52a", + "url": "https://api.github.com/repos/symfony/serializer/zipball/70c5aa59ab0642033391a5591c9771ee417e7cef", + "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.15" }, "conflict": { - "phpdocumentor/type-resolver": "<0.2.1", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", "symfony/dependency-injection": "<4.4", "symfony/property-access": "<4.4", "symfony/property-info": "<4.4", "symfony/yaml": "<4.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": "^4.4|^5.0", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", + "symfony/filesystem": "^4.4|^5.0", + "symfony/form": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", + "symfony/property-access": "^4.4.9|^5.0.9", "symfony/property-info": "^4.4|^5.0", + "symfony/uid": "^5.1", "symfony/validator": "^4.4|^5.0", + "symfony/var-exporter": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, "suggest": { @@ -4654,14 +4724,10 @@ "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", "symfony/property-access": "For using the ObjectNormalizer.", "symfony/property-info": "To deserialize relations.", + "symfony/var-exporter": "For using the metadata compiler.", "symfony/yaml": "For using the default YAML mapping loader." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Serializer\\": "" @@ -4684,10 +4750,10 @@ "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", "support": { - "source": "https://github.com/symfony/serializer/tree/5.0" + "source": "https://github.com/symfony/serializer/tree/v5.2.3" }, "funding": [ { @@ -4703,7 +4769,7 @@ "type": "tidelift" } ], - "time": "2020-07-23T08:36:09+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "symfony/service-contracts", @@ -4786,16 +4852,16 @@ }, { "name": "symfony/stopwatch", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "2b105c0354f39a63038a1d8bf776ee92852813af" + "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2b105c0354f39a63038a1d8bf776ee92852813af", - "reference": "2b105c0354f39a63038a1d8bf776ee92852813af", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b12274acfab9d9850c52583d136a24398cdf1a0c", + "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c", "shasum": "" }, "require": { @@ -4825,10 +4891,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.2.0" + "source": "https://github.com/symfony/stopwatch/tree/v5.2.3" }, "funding": [ { @@ -4844,7 +4910,90 @@ "type": "tidelift" } ], - "time": "2020-11-01T16:14:45+00:00" + "time": "2021-01-27T10:15:41+00:00" + }, + { + "name": "symfony/string", + "version": "v5.2.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "c95468897f408dd0aca2ff582074423dd0455122" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122", + "reference": "c95468897f408dd0aca2ff582074423dd0455122", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "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", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.2.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-25T15:14:59+00:00" }, { "name": "symfony/translation-contracts", @@ -5043,16 +5192,16 @@ }, { "name": "symfony/twig-bundle", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547" + "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/348863cd784b10ea7e1485dc3003c738c6cdf547", - "reference": "348863cd784b10ea7e1485dc3003c738c6cdf547", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", + "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", "shasum": "" }, "require": { @@ -5062,18 +5211,18 @@ "symfony/http-kernel": "^5.0", "symfony/polyfill-ctype": "~1.8", "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.10|^3.0" + "twig/twig": "^2.13|^3.0.4" }, "conflict": { - "symfony/dependency-injection": "<4.4", + "symfony/dependency-injection": "<5.2", "symfony/framework-bundle": "<5.0", "symfony/translation": "<5.0" }, "require-dev": { - "doctrine/annotations": "~1.7", + "doctrine/annotations": "^1.10.4", "doctrine/cache": "~1.0", "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", + "symfony/dependency-injection": "^5.2", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", "symfony/form": "^4.4|^5.0", @@ -5085,11 +5234,6 @@ "symfony/yaml": "^4.4|^5.0" }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Bundle\\TwigBundle\\": "" @@ -5112,10 +5256,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony TwigBundle", + "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.0.9" + "source": "https://github.com/symfony/twig-bundle/tree/v5.2.3" }, "funding": [ { @@ -5131,20 +5275,20 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.0", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "173a79c462b1c81e1fa26129f71e41333d846b26" + "reference": "72ca213014a92223a5d18651ce79ef441c12b694" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/173a79c462b1c81e1fa26129f71e41333d846b26", - "reference": "173a79c462b1c81e1fa26129f71e41333d846b26", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72ca213014a92223a5d18651ce79ef441c12b694", + "reference": "72ca213014a92223a5d18651ce79ef441c12b694", "shasum": "" }, "require": { @@ -5160,7 +5304,7 @@ "ext-iconv": "*", "symfony/console": "^4.4|^5.0", "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" + "twig/twig": "^2.13|^3.0.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -5196,14 +5340,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony mechanism for exploring and dumping PHP variables", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ "debug", "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.0" + "source": "https://github.com/symfony/var-dumper/tree/v5.2.3" }, "funding": [ { @@ -5219,20 +5363,20 @@ "type": "tidelift" } ], - "time": "2020-11-27T00:39:34+00:00" + "time": "2021-01-27T10:15:41+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.2.0", + "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": { @@ -5265,7 +5409,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", @@ -5276,7 +5420,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.2.0" + "source": "https://github.com/symfony/var-exporter/tree/v5.2.3" }, "funding": [ { @@ -5292,24 +5436,25 @@ "type": "tidelift" } ], - "time": "2020-10-28T21:31:18+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/yaml", - "version": "v5.0.11", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d" + "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/29b60e88ff11a45b708115004fdeacab1ee3dd5d", - "reference": "29b60e88ff11a45b708115004fdeacab1ee3dd5d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/338cddc6d74929f6adf19ca5682ac4b8e109cdb0", + "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -5321,12 +5466,10 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" @@ -5349,10 +5492,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/5.0" + "source": "https://github.com/symfony/yaml/tree/v5.2.3" }, "funding": [ { @@ -5368,7 +5511,7 @@ "type": "tidelift" } ], - "time": "2020-05-20T17:38:26+00:00" + "time": "2021-02-03T04:42:09+00:00" }, { "name": "twig/extra-bundle", @@ -5517,65 +5660,6 @@ } ], "time": "2020-10-27T19:28:23+00:00" - }, - { - "name": "webimpress/safe-writer", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/webimpress/safe-writer.git", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/5cfafdec5873c389036f14bf832a5efc9390dcdd", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.8 || ^9.3.7", - "vimeo/psalm": "^3.14.2", - "webimpress/coding-standard": "^1.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev", - "dev-develop": "2.2.x-dev", - "dev-release-1.0": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Webimpress\\SafeWriter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "description": "Tool to write files safely, to avoid race conditions", - "keywords": [ - "concurrent write", - "file writer", - "race condition", - "safe writer", - "webimpress" - ], - "support": { - "issues": "https://github.com/webimpress/safe-writer/issues", - "source": "https://github.com/webimpress/safe-writer/tree/master" - }, - "funding": [ - { - "url": "https://github.com/michalbundyra", - "type": "github" - } - ], - "time": "2020-08-25T07:21:11+00:00" } ], "packages-dev": [ @@ -5831,7 +5915,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.4", + "php": "^8.0", "ext-ctype": "*", "ext-iconv": "*", "ext-json": "*" diff --git a/deploy.php b/deploy.php index fde8dbd..8c77b96 100644 --- a/deploy.php +++ b/deploy.php @@ -53,12 +53,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', -// 'deploy:vendors', -// 'deploy:cache:clear', -// 'deploy:cache:warmup', -// 'dump-autoload', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'dump-autoload', 'deploy:writable', -// 'database:migrate', + 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', diff --git a/symfony.lock b/symfony.lock index 2be3183..c14ffcd 100644 --- a/symfony.lock +++ b/symfony.lock @@ -278,7 +278,7 @@ ] }, "symfony/polyfill-intl-grapheme": { - "version": "v1.20.0" + "version": "v1.22.1" }, "symfony/polyfill-intl-idn": { "version": "v1.13.1" @@ -319,7 +319,7 @@ "version": "v5.0.1" }, "symfony/string": { - "version": "v5.1.7" + "version": "v5.2.3" }, "symfony/translation-contracts": { "version": "v2.3.0" From 93cdda4f37b623428ed42e67c22adb759370b300 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 25 Feb 2021 14:17:21 +0100 Subject: [PATCH 056/151] frontend integration --- composer.json | 6 +- composer.lock | 432 +----------------------------- config/bundles.php | 2 - config/packages/test/twig.yaml | 2 - config/packages/twig.yaml | 2 - deploy.php | 6 +- src/Controller/DocsController.php | 2 +- symfony.lock | 26 -- templates/docs.html.twig | 36 --- 9 files changed, 7 insertions(+), 507 deletions(-) delete mode 100644 config/packages/test/twig.yaml delete mode 100644 config/packages/twig.yaml delete mode 100644 templates/docs.html.twig diff --git a/composer.json b/composer.json index ad831ef..01d15b4 100644 --- a/composer.json +++ b/composer.json @@ -17,12 +17,10 @@ "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", - "symfony/twig-bundle": "5.2.*", - "symfony/yaml": "5.2.*", - "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" + "symfony/yaml": "5.2.*" }, "require-dev": { + "roave/security-advisories": "dev-master", "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/phpunit-bridge": "^5.2" }, diff --git a/composer.lock b/composer.lock index 775e5f3..d0b4f86 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "86856225c36f705ce4978b2de2e986f2", + "content-hash": "f9959688789889158a520e3f2d8b40bd", "packages": [ { "name": "composer/package-versions-deprecated", @@ -4995,288 +4995,6 @@ ], "time": "2021-01-25T15:14:59+00:00" }, - { - "name": "symfony/translation-contracts", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-28T13:05:58+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v5.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/909d736d0413a072ebd5db8e0f87b8808efd4849", - "reference": "909d736d0413a072ebd5db8e0f87b8808efd4849", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/form": "<5.1", - "symfony/http-foundation": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.2", - "symfony/workflow": "<5.2" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.1.9", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^5.2", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^4.4|^5.1", - "symfony/routing": "^4.4|^5.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/serializer": "^5.2", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.2", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^5.2", - "symfony/yaml": "^4.4|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-11-28T11:24:18+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v5.2.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", - "reference": "5ebbb5f0e8bfaa0b4b37cb25ff97f83b18caf221", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.13|^3.0.4" - }, - "conflict": { - "symfony/dependency-injection": "<5.2", - "symfony/framework-bundle": "<5.0", - "symfony/translation": "<5.0" - }, - "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", - "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^5.2", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/framework-bundle": "^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a tight integration of Twig into the Symfony full-stack framework", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.2.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-27T10:15:41+00:00" - }, { "name": "symfony/var-dumper", "version": "v5.2.3", @@ -5512,154 +5230,6 @@ } ], "time": "2021-02-03T04:42:09+00:00" - }, - { - "name": "twig/extra-bundle", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a7c5799cf742ab0827f5d32df37528ee8bf5a233", - "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233", - "shasum": "" - }, - "require": { - "php": "^7.1.3|^8.0", - "symfony/framework-bundle": "^4.3|^5.0", - "symfony/twig-bundle": "^4.3|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "require-dev": { - "twig/cssinliner-extra": "^2.12|^3.0", - "twig/html-extra": "^2.12|^3.0", - "twig/inky-extra": "^2.12|^3.0", - "twig/intl-extra": "^2.12|^3.0", - "twig/markdown-extra": "^2.12|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\Extra\\TwigExtraBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Symfony bundle for extra Twig extensions", - "homepage": "https://twig.symfony.com", - "keywords": [ - "bundle", - "extra", - "twig" - ], - "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2020-05-21T09:56:39+00:00" - }, - { - "name": "twig/twig", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/b02fa41f3783a2616eccef7b92fbc2343ffed737", - "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2020-10-27T19:28:23+00:00" } ], "packages-dev": [ diff --git a/config/bundles.php b/config/bundles.php index a8152b0..8c7b01e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,6 +5,4 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], - Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], ]; diff --git a/config/packages/test/twig.yaml b/config/packages/test/twig.yaml deleted file mode 100644 index 8c6e0b4..0000000 --- a/config/packages/test/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - strict_variables: true diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml deleted file mode 100644 index b3cdf30..0000000 --- a/config/packages/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - default_path: '%kernel.project_dir%/templates' diff --git a/deploy.php b/deploy.php index 8c77b96..debfba5 100644 --- a/deploy.php +++ b/deploy.php @@ -37,8 +37,8 @@ runLocally('bin/phpunit'); }); -task('dump-autoload', function () { - run('{{bin/composer}} dump-env prod'); +task('deploy:dump-env', function () { + run('cd {{release_path}} && {{bin/composer}} dump-env prod'); }); task( @@ -56,7 +56,7 @@ 'deploy:vendors', 'deploy:cache:clear', 'deploy:cache:warmup', - 'dump-autoload', + 'deploy:dump-env', 'deploy:writable', 'database:migrate', 'deploy:symlink', diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 8c97f70..4d4eed3 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -18,7 +18,7 @@ class DocsController extends AbstractController */ public function docs(): Response { - return $this->render('docs.html.twig'); + return new Response(file_get_contents($this->getProjectDir() . '/public/index.html')); } /** diff --git a/symfony.lock b/symfony.lock index c14ffcd..7649aa8 100644 --- a/symfony.lock +++ b/symfony.lock @@ -321,26 +321,6 @@ "symfony/string": { "version": "v5.2.3" }, - "symfony/translation-contracts": { - "version": "v2.3.0" - }, - "symfony/twig-bridge": { - "version": "v5.1.7" - }, - "symfony/twig-bundle": { - "version": "5.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "5.0", - "ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" - }, - "files": [ - "config/packages/test/twig.yaml", - "config/packages/twig.yaml", - "templates/base.html.twig" - ] - }, "symfony/twig-pack": { "version": "v1.0.2" }, @@ -353,12 +333,6 @@ "symfony/yaml": { "version": "v5.0.1" }, - "twig/extra-bundle": { - "version": "v3.1.0" - }, - "twig/twig": { - "version": "v3.1.0" - }, "webimpress/safe-writer": { "version": "2.0.0" }, diff --git a/templates/docs.html.twig b/templates/docs.html.twig deleted file mode 100644 index 7addae3..0000000 --- a/templates/docs.html.twig +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - API Documentation | TLE API - - -
- - - - - - - - From fff02ea2cab74445e77a3a10f3b5fe853c05890e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 8 Mar 2021 21:04:55 +0100 Subject: [PATCH 057/151] statistics --- src/Entity/Statistic.php | 48 +++++++++++++++++++++++ src/Event/StatisticSubscriber.php | 39 +++++++++++++++++++ src/Migrations/Version20191217203053.php | 5 +++ src/Migrations/Version20210308195105.php | 49 ++++++++++++++++++++++++ src/Repository/StatisticRepository.php | 40 +++++++++++++++++++ 5 files changed, 181 insertions(+) create mode 100644 src/Entity/Statistic.php create mode 100644 src/Event/StatisticSubscriber.php create mode 100644 src/Migrations/Version20210308195105.php create mode 100644 src/Repository/StatisticRepository.php diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php new file mode 100644 index 0000000..ba4c3d5 --- /dev/null +++ b/src/Entity/Statistic.php @@ -0,0 +1,48 @@ +tle = $tle; + } + + public function getHits(): int + { + return $this->hits; + } + + public function setHits(int $hits): void + { + $this->hits = $hits; + } + + public function incrementHits(): void + { + $this->hits++; + } + + public function getTle(): Tle + { + return $this->tle; + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php new file mode 100644 index 0000000..7b96450 --- /dev/null +++ b/src/Event/StatisticSubscriber.php @@ -0,0 +1,39 @@ + 'onKernelTerminate', + ]; + } + + public function onKernelTerminate($event): void + { + if ($event->getRequest()->get('_route') !== 'tle_record') { + return; + } + + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); + + if ($statistics === null) { + return; + } + + $statistics->incrementHits(); + + $this->em->flush(); + } +} diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index 4fb03c7..f68c4e8 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -12,6 +12,11 @@ */ final class Version20191217203053 extends AbstractMigration { + public function isTransactional(): bool + { + return false; + } + /** @throws \Exception */ public function up(Schema $schema): void { diff --git a/src/Migrations/Version20210308195105.php b/src/Migrations/Version20210308195105.php new file mode 100644 index 0000000..49feca7 --- /dev/null +++ b/src/Migrations/Version20210308195105.php @@ -0,0 +1,49 @@ +abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); + + $this->addSql('DROP TABLE statistic'); + } + + public function getDescription(): string + { + return ''; + } + + public function isTransactional(): bool + { + return false; + } + + public function up(Schema $schema): void + { + // this up() migration is auto-generated, please modify it to your needs + $this->abortIf( + $this->connection->getDatabasePlatform()->getName() !== 'mysql', + 'Migration can only be executed safely on \'mysql\'.' + ); + + $this->addSql( + 'CREATE TABLE statistic (tle_id INT NOT NULL, hits BIGINT NOT NULL, PRIMARY KEY(tle_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB' + ); + $this->addSql('ALTER TABLE statistic ADD CONSTRAINT FK_649B469CE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); + } +} diff --git a/src/Repository/StatisticRepository.php b/src/Repository/StatisticRepository.php new file mode 100644 index 0000000..4c39959 --- /dev/null +++ b/src/Repository/StatisticRepository.php @@ -0,0 +1,40 @@ +getEntityManager()->getRepository(Tle::class)->find($id); + + if ($tle === null) { + return null; + } + + $statistic = new Statistic($tle); + $statistic->setHits(1); + + $this->_em->persist($statistic); + + return $statistic; + } +} From 2bb9d4ab795784072cb6212b5c2a629a69a19c3c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 9 Mar 2021 19:43:38 +0100 Subject: [PATCH 058/151] sort by popularity --- src/Controller/TleController.php | 14 ++++---------- src/Event/StatisticSubscriber.php | 2 +- src/Repository/TleRepository.php | 11 ++++++++++- src/ViewModel/TleCollectionSortableFieldsEnum.php | 3 ++- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index f08d331..6ed6718 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -12,18 +12,14 @@ use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -/** - * @Route("/api/tle") - */ +#[Route("/api/tle")] class TleController extends AbstractApiController { protected const MAX_PAGE_SIZE = 100; protected const PAGE_SIZE = 20; - /** - * @Route("/{id}", name="tle_record", requirements={"id"="\d+"}) - */ + #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record(int $id, TleRepository $repository): Response { /** @var Tle $tle */ @@ -36,9 +32,7 @@ public function record(int $id, TleRepository $repository): Response return $this->response($tle); } - /** - * @Route(name="tle_collection") - */ + #[Route("/", name: "tle_collection")] public function collection(Request $request, TleRepository $repository): Response { $this @@ -51,7 +45,7 @@ public function collection(Request $request, TleRepository $repository): Respons ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); $search = $request->get(self::SEARCH_PARAM); - $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::NAME); + $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 7b96450..60aaf11 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -16,7 +16,7 @@ public function __construct(private StatisticRepository $statisticRepository, pr public static function getSubscribedEvents(): array { return [ - KernelEvents::RESPONSE => 'onKernelTerminate', + KernelEvents::TERMINATE => 'onKernelTerminate', ]; } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 478d10a..7dae0b2 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -2,10 +2,13 @@ namespace App\Repository; +use App\Entity\Statistic; use App\Entity\Tle; use App\ViewModel\Model\PaginationCollection; +use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; @@ -50,7 +53,12 @@ public function collection( $total = $this->getCount($builder); // sort - $builder->orderBy('tle.' . $sort, $sortDir); + if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { + $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); + $builder->addOrderBy('s.hits', $sortDir); + } else { + $builder->addOrderBy('tle.' . $sort, $sortDir); + } // limit $builder->setMaxResults($pageSize); @@ -69,6 +77,7 @@ private function getCount(QueryBuilder $builder): int $builder = clone $builder; $builder->select('count(tle.id)'); + return $builder->getQuery()->getSingleScalarResult(); } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index 51a4f2b..6ba0f01 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -8,4 +8,5 @@ class TleCollectionSortableFieldsEnum extends Enum { public const ID = 'id'; public const NAME = 'name'; -} \ No newline at end of file + public const POPULARITY = 'popularity'; +} From 38a2b720870fa75e7d27876e41dce51c25a5a068 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 9 Mar 2021 19:58:43 +0100 Subject: [PATCH 059/151] sort by popularity --- src/Controller/TleController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 6ed6718..8890ad8 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -46,7 +46,7 @@ public function collection(Request $request, TleRepository $repository): Respons $search = $request->get(self::SEARCH_PARAM); $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); - $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::ASCENDING); + $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); $collection = $repository->collection( From a842aeda3febd2f7bfa7b5116b06fc81a4760e2b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 10 Mar 2021 19:53:18 +0100 Subject: [PATCH 060/151] cors headers --- src/Controller/AbstractApiController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 7a269f6..36f55de 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -124,6 +124,10 @@ public function response($response): Response [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', + 'Access-Control-Max-Age' => 1728000, ] ); } From 04e87c5ae056a227ed8ad484c3a3a644430375c8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 15:09:01 +0100 Subject: [PATCH 061/151] update sources command --- .env | 2 +- composer.json | 4 +- composer.lock | 401 +++++++++++++++++++++++++- config/custom/source.yaml | 129 +++++---- src/Command/DoctrineReloadCommand.php | 4 +- src/Command/ImportTleCommand.php | 4 +- src/Command/UpdateImportSources.php | 143 +++++++++ symfony.lock | 3 + 8 files changed, 623 insertions(+), 67 deletions(-) create mode 100644 src/Command/UpdateImportSources.php diff --git a/.env b/.env index 5582050..cf87e81 100644 --- a/.env +++ b/.env @@ -25,5 +25,5 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" # For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -DATABASE_URL=mysql://root@127.0.0.1:3306/tle?serverVersion=5.7 +DATABASE_URL=mysql://root@localhost:3306/tle?serverVersion=5.7 ###< doctrine/doctrine-bundle ### diff --git a/composer.json b/composer.json index 01d15b4..5711fe3 100644 --- a/composer.json +++ b/composer.json @@ -12,12 +12,14 @@ "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", "symfony/console": "5.2.*", + "symfony/css-selector": "5.2.*", "symfony/dotenv": "5.2.*", "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", - "symfony/yaml": "5.2.*" + "symfony/yaml": "5.2.*", + "ext-dom": "*" }, "require-dev": { "roave/security-advisories": "dev-master", diff --git a/composer.lock b/composer.lock index d0b4f86..c5f3b9d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f9959688789889158a520e3f2d8b40bd", + "content-hash": "497fdffd9e1bb11b9dc94bcd04b9fbd5", "packages": [ { "name": "composer/package-versions-deprecated", @@ -2791,6 +2791,71 @@ ], "time": "2021-01-28T22:06:19+00:00" }, + { + "name": "symfony/css-selector", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/f65f217b3314504a1ec99c2d6ef69016bb13490f", + "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:01:46+00:00" + }, { "name": "symfony/dependency-injection", "version": "v5.2.3", @@ -5395,6 +5460,336 @@ ], "time": "2020-11-14T09:36:49+00:00" }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", + "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", + "bolt/bolt": "<3.7.1", + "bolt/core": "<4.1.13", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dolibarr/dolibarr": "<11.0.4", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<=6.13.8|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<=7.5.15", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<=2.5.1,>=2.0|<=1.16.13", + "firebase/php-jwt": "<2", + "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", + "flarum/tags": "<=0.1-beta.13", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "fuel/core": "<1.8.1", + "getgrav/grav": "<1.7-beta.8", + "getkirby/cms": ">=3,<3.4.5", + "getkirby/panel": "<2.5.14", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/archive": "<1.1.10", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kitodo/presentation": "<3.1.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "librenms/librenms": "<1.53", + "livewire/livewire": ">2.2.4,<2.2.6", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mautic/core": "<2.16.5|>=3,<3.2.4|= 2.13.1", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mittwald/typo3_forum": "<1.2.1", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "= 1.0.469|>=1.0.319,<1.0.469", + "october/october": ">=1.0.319,<1.0.466", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<19.4.8|>=20,<20.0.4", + "orchid/platform": ">=9,<9.4.4", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.12", + "personnummer/personnummer": "<3.0.2", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.16", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.8.8", + "pocketmine/pocketmine-mp": "<3.15.4", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", + "pusher/pusher-php-server": "<2.2.1", + "rainlab/debugbar-plugin": "<3.1", + "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/core": "<=6.3.4", + "shopware/platform": "<=6.3.5", + "shopware/shopware": "<5.6.9", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.39", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.49", + "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vrana/adminer": "<4.7.9", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yourls/yourls": "<1.7.4", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2021-03-11T18:09:51+00:00" + }, { "name": "symfony/phpunit-bridge", "version": "v5.2.0", @@ -5481,7 +5876,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/config/custom/source.yaml b/config/custom/source.yaml index 0f3b493..79c1987 100644 --- a/config/custom/source.yaml +++ b/config/custom/source.yaml @@ -1,59 +1,70 @@ -- https://celestrak.com/NORAD/elements/tle-new.txt -- https://celestrak.com/NORAD/elements/stations.txt -- https://celestrak.com/NORAD/elements/visual.txt -- https://celestrak.com/NORAD/elements/active.txt -- https://celestrak.com/NORAD/elements/analyst.txt -- https://celestrak.com/NORAD/elements/1999-025.txt -- https://celestrak.com/NORAD/elements/iridium-33-debris.txt -- https://celestrak.com/NORAD/elements/cosmos-2251-debris.txt -- https://celestrak.com/NORAD/elements/2012-044.txt -- https://celestrak.com/NORAD/elements/weather.txt -- https://celestrak.com/NORAD/elements/noaa.txt -- https://celestrak.com/NORAD/elements/goes.txt -- https://celestrak.com/NORAD/elements/resource.txt -- https://celestrak.com/NORAD/elements/sarsat.txt -- https://celestrak.com/NORAD/elements/dmc.txt -- https://celestrak.com/NORAD/elements/tdrss.txt -- https://celestrak.com/NORAD/elements/argos.txt -- https://celestrak.com/NORAD/elements/planet.txt -- https://celestrak.com/NORAD/elements/spire.txt -- https://celestrak.com/NORAD/elements/geo.txt -- https://celestrak.com/NORAD/elements/intelsat.txt -- https://celestrak.com/NORAD/elements/ses.txt -- https://celestrak.com/NORAD/elements/iridium.txt -- https://celestrak.com/NORAD/elements/iridium-NEXT.txt -- https://celestrak.com/NORAD/elements/orbcomm.txt -- https://celestrak.com/NORAD/elements/globalstar.txt -- https://celestrak.com/NORAD/elements/amateur.txt -- https://celestrak.com/NORAD/elements/x-comm.txt -- https://celestrak.com/NORAD/elements/other-comm.txt -- https://celestrak.com/NORAD/elements/gorizont.txt -- https://celestrak.com/NORAD/elements/raduga.txt -- https://celestrak.com/NORAD/elements/molniya.txt -- https://celestrak.com/NORAD/elements/gps-ops.txt -- https://celestrak.com/NORAD/elements/glo-ops.txt -- https://celestrak.com/NORAD/elements/galileo.txt -- https://celestrak.com/NORAD/elements/beidou.txt -- https://celestrak.com/NORAD/elements/sbas.txt -- https://celestrak.com/NORAD/elements/nnss.txt -- https://celestrak.com/NORAD/elements/musson.txt -- https://celestrak.com/NORAD/elements/science.txt -- https://celestrak.com/NORAD/elements/geodetic.txt -- https://celestrak.com/NORAD/elements/engineering.txt -- https://celestrak.com/NORAD/elements/education.txt -- https://celestrak.com/NORAD/elements/military.txt -- https://celestrak.com/NORAD/elements/radar.txt -- https://celestrak.com/NORAD/elements/cubesat.txt -- https://celestrak.com/NORAD/elements/other.txt -- https://celestrak.com/NORAD/elements/supplemental/starlink.txt -- https://celestrak.com/NORAD/elements/supplemental/oneweb.txt -- https://celestrak.com/NORAD/elements/supplemental/gps.txt -- https://celestrak.com/NORAD/elements/supplemental/glonass.txt -- https://celestrak.com/NORAD/elements/supplemental/meteosat.txt -- https://celestrak.com/NORAD/elements/supplemental/intelsat.txt -- https://celestrak.com/NORAD/elements/supplemental/ses.txt -- https://celestrak.com/NORAD/elements/supplemental/orbcomm.txt -- https://celestrak.com/NORAD/elements/supplemental/cpf.txt -- https://celestrak.com/NORAD/elements/swarm.txt -- https://celestrak.com/satcat/gpz.php -- https://celestrak.com/NORAD/elements/supplemental/planet.txt \ No newline at end of file +- 'https://celestrak.com/NORAD/elements/1999-025.txt' +- 'https://celestrak.com/NORAD/elements/2012-044.txt' +- 'https://celestrak.com/NORAD/elements/2019-006.txt' +- 'https://celestrak.com/NORAD/elements/active.txt' +- 'https://celestrak.com/NORAD/elements/amateur.txt' +- 'https://celestrak.com/NORAD/elements/analyst.txt' +- 'https://celestrak.com/NORAD/elements/argos.txt' +- 'https://celestrak.com/NORAD/elements/beidou.txt' +- 'https://celestrak.com/NORAD/elements/cosmos-2251-debris.txt' +- 'https://celestrak.com/NORAD/elements/cubesat.txt' +- 'https://celestrak.com/NORAD/elements/dmc.txt' +- 'https://celestrak.com/NORAD/elements/education.txt' +- 'https://celestrak.com/NORAD/elements/engineering.txt' +- 'https://celestrak.com/NORAD/elements/galileo.txt' +- 'https://celestrak.com/NORAD/elements/geo.txt' +- 'https://celestrak.com/NORAD/elements/geodetic.txt' +- 'https://celestrak.com/NORAD/elements/glo-ops.txt' +- 'https://celestrak.com/NORAD/elements/globalstar.txt' +- 'https://celestrak.com/NORAD/elements/gnss.txt' +- 'https://celestrak.com/NORAD/elements/goes.txt' +- 'https://celestrak.com/NORAD/elements/gorizont.txt' +- 'https://celestrak.com/NORAD/elements/gps-ops.txt' +- 'https://celestrak.com/NORAD/elements/intelsat.txt' +- 'https://celestrak.com/NORAD/elements/iridium-33-debris.txt' +- 'https://celestrak.com/NORAD/elements/iridium-NEXT.txt' +- 'https://celestrak.com/NORAD/elements/iridium.txt' +- 'https://celestrak.com/NORAD/elements/military.txt' +- 'https://celestrak.com/NORAD/elements/molniya.txt' +- 'https://celestrak.com/NORAD/elements/musson.txt' +- 'https://celestrak.com/NORAD/elements/nnss.txt' +- 'https://celestrak.com/NORAD/elements/noaa.txt' +- 'https://celestrak.com/NORAD/elements/oneweb.txt' +- 'https://celestrak.com/NORAD/elements/orbcomm.txt' +- 'https://celestrak.com/NORAD/elements/other-comm.txt' +- 'https://celestrak.com/NORAD/elements/other.txt' +- 'https://celestrak.com/NORAD/elements/planet.txt' +- 'https://celestrak.com/NORAD/elements/radar.txt' +- 'https://celestrak.com/NORAD/elements/raduga.txt' +- 'https://celestrak.com/NORAD/elements/resource.txt' +- 'https://celestrak.com/NORAD/elements/sarsat.txt' +- 'https://celestrak.com/NORAD/elements/satnogs.txt' +- 'https://celestrak.com/NORAD/elements/sbas.txt' +- 'https://celestrak.com/NORAD/elements/science.txt' +- 'https://celestrak.com/NORAD/elements/ses.txt' +- 'https://celestrak.com/NORAD/elements/spire.txt' +- 'https://celestrak.com/NORAD/elements/starlink.txt' +- 'https://celestrak.com/NORAD/elements/stations.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/cpf.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/glonass.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/gps.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/intelsat.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/iss.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/meteosat.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/oneweb.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/orbcomm.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/planet.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/ses.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/starlink-V1.0-20.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/starlink.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/telesat.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/testcase/glonass.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/testcase/glonass_2008_01_25_1300.txt' +- 'https://celestrak.com/NORAD/elements/supplemental/testcase/gps.txt' +- 'https://celestrak.com/NORAD/elements/swarm.txt' +- 'https://celestrak.com/NORAD/elements/tdrss.txt' +- 'https://celestrak.com/NORAD/elements/tle-new.txt' +- 'https://celestrak.com/NORAD/elements/visual.txt' +- 'https://celestrak.com/NORAD/elements/weather.txt' +- 'https://celestrak.com/NORAD/elements/x-comm.txt' +- 'https://celestrak.com/satcat/gpz.php' diff --git a/src/Command/DoctrineReloadCommand.php b/src/Command/DoctrineReloadCommand.php index 056abd8..3529bfe 100644 --- a/src/Command/DoctrineReloadCommand.php +++ b/src/Command/DoctrineReloadCommand.php @@ -50,7 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (!\in_array($this->env, self::$envs, true)) { $io->warning('This is intended only for use in dev or test environment.'); - return 1; + return Command::FAILURE; } $application = $this->getApplication(); @@ -79,6 +79,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int $application->run(new ArrayInput($options)); } - return 0; + return Command::SUCCESS; } } diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index c8ad83d..5ff15c0 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -21,7 +21,7 @@ final class ImportTleCommand extends Command use FileSystemAwareTrait; private const BATCH_SIZE = 50; - private const SOURCE = '/config/custom/source.yaml'; + public const SOURCE = '/config/custom/source.yaml'; private EntityManagerInterface $em; private TleRepository $repository; @@ -120,7 +120,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int ); $table->render(); - return 0; + return Command::SUCCESS; } protected function toPersistent(TleModel $model): Tle diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php new file mode 100644 index 0000000..451b329 --- /dev/null +++ b/src/Command/UpdateImportSources.php @@ -0,0 +1,143 @@ +setName('tle:source'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->io = new SymfonyStyle($input, $output); + + $sourceFile = $this->getProjectDir() . ImportTleCommand::SOURCE; + + $this->sources = Yaml::parseFile($sourceFile); + + $newSources = $this->getSources(); + + $diff = array_diff($newSources, $this->sources); + + if (empty($diff)) { + $this->io->success('No new tle sources found'); + + return Command::SUCCESS; + } + + $this->io->writeln(""); + $this->io->writeln(\sprintf("Following new tle sources found and written to %s", $sourceFile)); + $this->io->writeln(""); + foreach ($diff as $url) { + $this->io->writeln($url); + } + + $this->io->writeln(""); + + $sources = array_merge($this->sources, $diff); + sort($sources); + + $yaml = Yaml::dump($sources); + + file_put_contents($sourceFile, $yaml); + + return Command::SUCCESS; + } + + protected function getSources(): array + { + $result = []; + + foreach (self::CATALOG as $catalog) { + $response = (new Client())->request('GET', $catalog); + + $crawler = new Crawler($response->getBody()->getContents()); + + /** @var DOMElement $anchor */ + foreach ($crawler->filter('a') as $anchor) { + $href = $anchor->getAttribute('href'); + $path = parse_url($href, PHP_URL_PATH); + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ($extension === 'txt') { + if (parse_url($href, PHP_URL_HOST) === null) { + if ($path[0] === '/') { + $scheme = parse_url($catalog, PHP_URL_SCHEME); + $host = parse_url($catalog, PHP_URL_HOST); + $href = $scheme . '://' . $host . $href; + } else { + $href = $catalog . trim($href, '/'); + } + } + + if (!$this->isIgnored($href)) { + $this->io->writeln(\sprintf('Verifying url: %s', $href)); + if ($this->isHealthy($href)) { + $result[] = $href; + } + } + } + } + } + + return $result; + } + + protected function isIgnored(string $url): bool + { + return in_array($url, self::IGNORED, false) || in_array($this->sources, self::IGNORED, false); + } + + protected function isHealthy(string $url): bool + { + try { + $response = (new Client())->request('GET', $url); + + return $response->getStatusCode() === 200; + } catch (\Exception) { + return false; + } + } +} diff --git a/symfony.lock b/symfony.lock index 7649aa8..4aca444 100644 --- a/symfony.lock +++ b/symfony.lock @@ -187,6 +187,9 @@ "config/bootstrap.php" ] }, + "symfony/css-selector": { + "version": "v5.2.4" + }, "symfony/dependency-injection": { "version": "v5.0.1" }, From 584e33c84d3ecab78be2a15596e4840f894f241a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 15:47:11 +0100 Subject: [PATCH 062/151] update sources command --- .env | 2 +- .env.test | 2 +- .gitignore | 2 + README.md | 6 +- composer.json | 4 +- composer.lock | 433 +++++++++++------------ docs/tle.html | 56 --- phpunit.xml.dist | 33 -- public/index.html | 0 src/Controller/AbstractApiController.php | 18 +- src/Controller/TleController.php | 19 +- src/Serializer/TleModelNormalizer.php | 13 +- symfony.lock | 12 + tests/TleTest.php | 16 +- 14 files changed, 272 insertions(+), 344 deletions(-) delete mode 100644 docs/tle.html delete mode 100644 phpunit.xml.dist create mode 100644 public/index.html diff --git a/.env b/.env index cf87e81..5f55762 100644 --- a/.env +++ b/.env @@ -25,5 +25,5 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" # For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml -DATABASE_URL=mysql://root@localhost:3306/tle?serverVersion=5.7 +DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### diff --git a/.env.test b/.env.test index 8f679b3..a68eadb 100644 --- a/.env.test +++ b/.env.test @@ -3,4 +3,4 @@ KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 PANTHER_APP_ENV=panther -DATABASE_URL=mysql://root@127.0.0.1:3306/tle?serverVersion=5.7 \ No newline at end of file +DATABASE_URL=mysql://root:root@127.0.0.1:3306/tle?serverVersion=5.7 diff --git a/.gitignore b/.gitignore index e56d049..4ea500f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ .phpunit.result.cache /phpunit.xml ###< symfony/phpunit-bridge ### + +public/index.html diff --git a/README.md b/README.md index eadcee5..7f82184 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/si ## Usage Further documentation and response examples are available at: -http://data.ivanstanojevic.me/api/tle/docs +http://tle.ivanstanojevic.me/api/tle/docs ###Available endpoints -The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` +The TLE API consists of two endpoints `GET http://tle.ivanstanojevic.me` | Endpoint | Description | |----------|:------:| @@ -30,7 +30,7 @@ The TLE API consists of two endpoints `GET http://data.ivanstanojevic.me` | `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | Example query -http://data.ivanstanojevic.me/api/tle +http://tle.ivanstanojevic.me/api/tle # Client libraries diff --git a/composer.json b/composer.json index 5711fe3..325f044 100644 --- a/composer.json +++ b/composer.json @@ -4,6 +4,7 @@ "require": { "php": "^8.0", "ext-ctype": "*", + "ext-dom": "*", "ext-iconv": "*", "ext-json": "*", "ivanstan/tle-php": "^1.0.2", @@ -18,8 +19,7 @@ "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", - "symfony/yaml": "5.2.*", - "ext-dom": "*" + "symfony/yaml": "5.2.*" }, "require-dev": { "roave/security-advisories": "dev-master", diff --git a/composer.lock b/composer.lock index c5f3b9d..314a685 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "497fdffd9e1bb11b9dc94bcd04b9fbd5", + "content-hash": "e6d04bc24eedc3ec7826c480308b3b26", "packages": [ { "name": "composer/package-versions-deprecated", @@ -520,16 +520,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.2.3", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "015fdd490074d4daa891e2d1df998dc35ba54924" + "reference": "8b922578bdee2243a26202b13df795e170efaef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/015fdd490074d4daa891e2d1df998dc35ba54924", - "reference": "015fdd490074d4daa891e2d1df998dc35ba54924", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/8b922578bdee2243a26202b13df795e170efaef8", + "reference": "8b922578bdee2243a26202b13df795e170efaef8", "shasum": "" }, "require": { @@ -610,7 +610,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.3" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.0" }, "funding": [ { @@ -626,7 +626,7 @@ "type": "tidelift" } ], - "time": "2021-01-19T20:29:53+00:00" + "time": "2021-03-16T16:24:04+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1054,16 +1054,16 @@ }, { "name": "doctrine/migrations", - "version": "2.3.2", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735" + "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/39520699043d9bfaaebeb81fa026bf2b02a8f735", - "reference": "39520699043d9bfaaebeb81fa026bf2b02a8f735", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/c4c46f7064f6e7795bd7f26549579918b46790fa", + "reference": "c4c46f7064f6e7795bd7f26549579918b46790fa", "shasum": "" }, "require": { @@ -1134,7 +1134,7 @@ ], "support": { "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/2.3.2" + "source": "https://github.com/doctrine/migrations/tree/2.3.3" }, "funding": [ { @@ -1150,7 +1150,7 @@ "type": "tidelift" } ], - "time": "2020-12-23T14:06:04+00:00" + "time": "2021-03-14T10:22:48+00:00" }, { "name": "doctrine/orm", @@ -1540,16 +1540,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "60d379c243457e073cff02bc323a2a86cb355631" + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", - "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "shasum": "" }, "require": { @@ -1589,22 +1589,22 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.0" + "source": "https://github.com/guzzle/promises/tree/1.4.1" }, - "time": "2020-09-30T07:37:28+00:00" + "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.7.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1", + "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1", "shasum": "" }, "require": { @@ -1664,9 +1664,9 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.7.0" + "source": "https://github.com/guzzle/psr7/tree/1.8.1" }, - "time": "2020-09-30T07:37:11+00:00" + "time": "2021-03-21T16:25:00+00:00" }, { "name": "ivanstan/tle-php", @@ -1787,16 +1787,16 @@ }, { "name": "laminas/laminas-eventmanager", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/laminas/laminas-eventmanager.git", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082" + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1940ccf30e058b2fd66f5a9d696f1b5e0027b082", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/966c859b67867b179fde1eff0cd38df51472ce4a", + "reference": "966c859b67867b179fde1eff0cd38df51472ce4a", "shasum": "" }, "require": { @@ -1818,12 +1818,6 @@ "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev", - "dev-develop": "3.4.x-dev" - } - }, "autoload": { "psr-4": { "Laminas\\EventManager\\": "src/" @@ -1855,28 +1849,30 @@ "type": "community_bridge" } ], - "time": "2020-08-25T11:10:44+00:00" + "time": "2021-03-08T15:24:29+00:00" }, { "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6cccbddfcfc742eb02158d6137ca5687d92cee32", + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": "^7.3 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" + "psalm/plugin-phpunit": "^0.15.1", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.6" }, "type": "library", "extra": { @@ -1915,7 +1911,7 @@ "type": "community_bridge" } ], - "time": "2020-09-14T14:23:00+00:00" + "time": "2021-02-25T21:54:58+00:00" }, { "name": "myclabs/php-enum", @@ -2028,27 +2024,22 @@ }, { "name": "psr/container", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -2061,7 +2052,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -2075,9 +2066,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2017-02-14T16:28:37+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/event-dispatcher", @@ -2304,7 +2295,7 @@ }, { "name": "symfony/asset", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", @@ -2353,7 +2344,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.2.3" + "source": "https://github.com/symfony/asset/tree/v5.2.4" }, "funding": [ { @@ -2373,16 +2364,16 @@ }, { "name": "symfony/browser-kit", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd" + "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", - "reference": "b03b2057ed53ee4eab2e8f372084d7722b7b8ffd", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3ca3a57ce9860318b20a924fec5daf5c6db44d93", + "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93", "shasum": "" }, "require": { @@ -2424,7 +2415,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.2.3" + "source": "https://github.com/symfony/browser-kit/tree/v5.2.4" }, "funding": [ { @@ -2440,25 +2431,25 @@ "type": "tidelift" } ], - "time": "2021-01-27T12:56:27+00:00" + "time": "2021-02-22T06:48:33+00:00" }, { "name": "symfony/cache", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388" + "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d6aed6c1bbf6f59e521f46437475a0ff4878d388", - "reference": "d6aed6c1bbf6f59e521f46437475a0ff4878d388", + "url": "https://api.github.com/repos/symfony/cache/zipball/d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", + "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/cache": "~1.0", + "psr/cache": "^1.0|^2.0", "psr/log": "^1.1", "symfony/cache-contracts": "^1.1.7|^2", "symfony/polyfill-php80": "^1.15", @@ -2472,9 +2463,9 @@ "symfony/var-dumper": "<4.4" }, "provide": { - "psr/cache-implementation": "1.0", + "psr/cache-implementation": "1.0|2.0", "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0" + "symfony/cache-implementation": "1.0|2.0" }, "require-dev": { "cache/integration-tests": "dev-master", @@ -2519,7 +2510,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.2.3" + "source": "https://github.com/symfony/cache/tree/v5.2.4" }, "funding": [ { @@ -2535,7 +2526,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T11:24:50+00:00" + "time": "2021-02-25T23:54:56+00:00" }, { "name": "symfony/cache-contracts", @@ -2618,16 +2609,16 @@ }, { "name": "symfony/config", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab" + "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", - "reference": "50e0e1314a3b2609d32b6a5a0d0fb5342494c4ab", + "url": "https://api.github.com/repos/symfony/config/zipball/212d54675bf203ff8aef7d8cee8eecfb72f4a263", + "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263", "shasum": "" }, "require": { @@ -2676,7 +2667,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.2.3" + "source": "https://github.com/symfony/config/tree/v5.2.4" }, "funding": [ { @@ -2692,20 +2683,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-02-23T23:58:19+00:00" }, { "name": "symfony/console", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a" + "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/89d4b176d12a2946a1ae4e34906a025b7b6b135a", - "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a", + "url": "https://api.github.com/repos/symfony/console/zipball/938ebbadae1b0a9c9d1ec313f87f9708609f1b79", + "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79", "shasum": "" }, "require": { @@ -2773,7 +2764,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.2.3" + "source": "https://github.com/symfony/console/tree/v5.2.5" }, "funding": [ { @@ -2789,7 +2780,7 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-03-06T13:42:15+00:00" }, { "name": "symfony/css-selector", @@ -2858,16 +2849,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "62f72187be689540385dce6c68a5d4c16f034139" + "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/62f72187be689540385dce6c68a5d4c16f034139", - "reference": "62f72187be689540385dce6c68a5d4c16f034139", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/be0c7926f5729b15e4e79fd2bf917cac584b1970", + "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970", "shasum": "" }, "require": { @@ -2885,7 +2876,7 @@ }, "provide": { "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0" + "symfony/service-implementation": "1.0|2.0" }, "require-dev": { "symfony/config": "^5.1", @@ -2925,7 +2916,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.2.3" + "source": "https://github.com/symfony/dependency-injection/tree/v5.2.5" }, "funding": [ { @@ -2941,7 +2932,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T12:56:27+00:00" + "time": "2021-03-05T20:13:41+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3012,16 +3003,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "c348e596f49df406a7c0a51443864038b3137cac" + "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c348e596f49df406a7c0a51443864038b3137cac", - "reference": "c348e596f49df406a7c0a51443864038b3137cac", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", + "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", "shasum": "" }, "require": { @@ -3106,7 +3097,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.3" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.5" }, "funding": [ { @@ -3122,20 +3113,20 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-03-06T13:35:24+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.2.0", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c" + "reference": "400e265163f65aceee7e904ef532e15228de674b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/0969122fe144dd8ab2e8c98c7e03eedc621b368c", - "reference": "0969122fe144dd8ab2e8c98c7e03eedc621b368c", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/400e265163f65aceee7e904ef532e15228de674b", + "reference": "400e265163f65aceee7e904ef532e15228de674b", "shasum": "" }, "require": { @@ -3177,10 +3168,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DomCrawler Component", + "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.2.0" + "source": "https://github.com/symfony/dom-crawler/tree/v5.2.4" }, "funding": [ { @@ -3196,11 +3187,11 @@ "type": "tidelift" } ], - "time": "2020-10-24T12:01:57+00:00" + "time": "2021-02-15T18:55:04+00:00" }, { "name": "symfony/dotenv", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", @@ -3250,7 +3241,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.2.3" + "source": "https://github.com/symfony/dotenv/tree/v5.2.4" }, "funding": [ { @@ -3270,16 +3261,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d" + "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/48f18b3609e120ea66d59142c23dc53e9562c26d", - "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/b547d3babcab5c31e01de59ee33e9d9c1421d7d0", + "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0", "shasum": "" }, "require": { @@ -3319,7 +3310,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.2.3" + "source": "https://github.com/symfony/error-handler/tree/v5.2.4" }, "funding": [ { @@ -3335,20 +3326,20 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-02-11T08:21:20+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367" + "reference": "d08d6ec121a425897951900ab692b612a61d6240" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4f9760f8074978ad82e2ce854dff79a71fe45367", - "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d08d6ec121a425897951900ab692b612a61d6240", + "reference": "d08d6ec121a425897951900ab692b612a61d6240", "shasum": "" }, "require": { @@ -3404,7 +3395,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.4" }, "funding": [ { @@ -3420,7 +3411,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:36:42+00:00" + "time": "2021-02-18T17:12:37+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3503,16 +3494,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "262d033b57c73e8b59cd6e68a45c528318b15038" + "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038", - "reference": "262d033b57c73e8b59cd6e68a45c528318b15038", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/710d364200997a5afde34d9fe57bd52f3cc1e108", + "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108", "shasum": "" }, "require": { @@ -3545,7 +3536,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.3" + "source": "https://github.com/symfony/filesystem/tree/v5.2.4" }, "funding": [ { @@ -3561,20 +3552,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-02-12T10:38:38+00:00" }, { "name": "symfony/finder", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4adc8d172d602008c204c2e16956f99257248e03" + "reference": "0d639a0943822626290d169965804f79400e6a04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4adc8d172d602008c204c2e16956f99257248e03", - "reference": "4adc8d172d602008c204c2e16956f99257248e03", + "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04", + "reference": "0d639a0943822626290d169965804f79400e6a04", "shasum": "" }, "require": { @@ -3606,7 +3597,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.3" + "source": "https://github.com/symfony/finder/tree/v5.2.4" }, "funding": [ { @@ -3622,20 +3613,20 @@ "type": "tidelift" } ], - "time": "2021-01-28T22:06:19+00:00" + "time": "2021-02-15T18:55:04+00:00" }, { "name": "symfony/flex", - "version": "v1.11.0", + "version": "v1.12.2", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48" + "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", - "reference": "ceb2b4e612bd0b4bb36a4d7fb2e800c861652f48", + "url": "https://api.github.com/repos/symfony/flex/zipball/e472606b4b3173564f0edbca8f5d32b52fc4f2c9", + "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9", "shasum": "" }, "require": { @@ -3652,7 +3643,7 @@ "type": "composer-plugin", "extra": { "branch-alias": { - "dev-main": "1.9-dev" + "dev-main": "1.12-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -3674,7 +3665,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.11.0" + "source": "https://github.com/symfony/flex/tree/v1.12.2" }, "funding": [ { @@ -3690,20 +3681,20 @@ "type": "tidelift" } ], - "time": "2020-12-03T10:57:35+00:00" + "time": "2021-02-16T14:05:05+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011" + "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ff455b2afd3f98237d4131ffebe190e59cc0f011", - "reference": "ff455b2afd3f98237d4131ffebe190e59cc0f011", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4dae531503072a57cf26f7f4beb4c3ef8a061f8f", + "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f", "shasum": "" }, "require": { @@ -3730,7 +3721,7 @@ "phpunit/phpunit": "<5.4.3", "symfony/asset": "<5.1", "symfony/browser-kit": "<4.4", - "symfony/console": "<5.2", + "symfony/console": "<5.2.5", "symfony/dom-crawler": "<4.4", "symfony/dotenv": "<5.1", "symfony/form": "<5.2", @@ -3773,6 +3764,7 @@ "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", "symfony/security-bundle": "^5.1", + "symfony/security-core": "^4.4|^5.2", "symfony/security-csrf": "^4.4|^5.0", "symfony/security-http": "^4.4|^5.0", "symfony/serializer": "^5.2", @@ -3822,7 +3814,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.2.3" + "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" }, "funding": [ { @@ -3838,7 +3830,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T11:19:04+00:00" + "time": "2021-03-09T08:47:49+00:00" }, { "name": "symfony/http-client-contracts", @@ -3921,16 +3913,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36" + "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36", - "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf", + "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf", "shasum": "" }, "require": { @@ -3974,7 +3966,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.2.3" + "source": "https://github.com/symfony/http-foundation/tree/v5.2.4" }, "funding": [ { @@ -3990,20 +3982,20 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-02-25T17:16:57+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05" + "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", - "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", + "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", "shasum": "" }, "require": { @@ -4038,7 +4030,7 @@ "psr/log-implementation": "1.0" }, "require-dev": { - "psr/cache": "~1.0", + "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^4.4|^5.0", "symfony/config": "^5.0", "symfony/console": "^4.4|^5.0", @@ -4086,7 +4078,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.2.3" + "source": "https://github.com/symfony/http-kernel/tree/v5.2.5" }, "funding": [ { @@ -4102,7 +4094,7 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:51:58+00:00" + "time": "2021-03-10T17:07:35+00:00" }, { "name": "symfony/orm-pack", @@ -4646,16 +4638,16 @@ }, { "name": "symfony/routing", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661" + "reference": "cafa138128dfd6ab6be1abf6279169957b34f662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/348b5917e56546c6d96adbf21d7f92c9ef563661", - "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661", + "url": "https://api.github.com/repos/symfony/routing/zipball/cafa138128dfd6ab6be1abf6279169957b34f662", + "reference": "cafa138128dfd6ab6be1abf6279169957b34f662", "shasum": "" }, "require": { @@ -4716,7 +4708,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.2.3" + "source": "https://github.com/symfony/routing/tree/v5.2.4" }, "funding": [ { @@ -4732,20 +4724,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-02-22T15:48:39+00:00" }, { "name": "symfony/serializer", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef" + "reference": "a285f474a72397ccbd384900abc968ffcb511dda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/70c5aa59ab0642033391a5591c9771ee417e7cef", - "reference": "70c5aa59ab0642033391a5591c9771ee417e7cef", + "url": "https://api.github.com/repos/symfony/serializer/zipball/a285f474a72397ccbd384900abc968ffcb511dda", + "reference": "a285f474a72397ccbd384900abc968ffcb511dda", "shasum": "" }, "require": { @@ -4818,7 +4810,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.2.3" + "source": "https://github.com/symfony/serializer/tree/v5.2.4" }, "funding": [ { @@ -4834,7 +4826,7 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-03-02T12:14:02+00:00" }, { "name": "symfony/service-contracts", @@ -4917,7 +4909,7 @@ }, { "name": "symfony/stopwatch", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -4959,7 +4951,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.2.3" + "source": "https://github.com/symfony/stopwatch/tree/v5.2.4" }, "funding": [ { @@ -4979,16 +4971,16 @@ }, { "name": "symfony/string", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "c95468897f408dd0aca2ff582074423dd0455122" + "reference": "4e78d7d47061fa183639927ec40d607973699609" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122", - "reference": "c95468897f408dd0aca2ff582074423dd0455122", + "url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609", + "reference": "4e78d7d47061fa183639927ec40d607973699609", "shasum": "" }, "require": { @@ -5042,7 +5034,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.2.3" + "source": "https://github.com/symfony/string/tree/v5.2.4" }, "funding": [ { @@ -5058,20 +5050,20 @@ "type": "tidelift" } ], - "time": "2021-01-25T15:14:59+00:00" + "time": "2021-02-16T10:20:28+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "72ca213014a92223a5d18651ce79ef441c12b694" + "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72ca213014a92223a5d18651ce79ef441c12b694", - "reference": "72ca213014a92223a5d18651ce79ef441c12b694", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/002ab5a36702adf0c9a11e6d8836623253e9045e", + "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e", "shasum": "" }, "require": { @@ -5130,7 +5122,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v5.2.5" }, "funding": [ { @@ -5146,11 +5138,11 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-03-06T07:59:01+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.2.3", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", @@ -5203,7 +5195,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.2.3" + "source": "https://github.com/symfony/var-exporter/tree/v5.2.4" }, "funding": [ { @@ -5223,16 +5215,16 @@ }, { "name": "symfony/yaml", - "version": "v5.2.3", + "version": "v5.2.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0" + "reference": "298a08ddda623485208506fcee08817807a251dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/338cddc6d74929f6adf19ca5682ac4b8e109cdb0", - "reference": "338cddc6d74929f6adf19ca5682ac4b8e109cdb0", + "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", + "reference": "298a08ddda623485208506fcee08817807a251dd", "shasum": "" }, "require": { @@ -5278,7 +5270,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.2.3" + "source": "https://github.com/symfony/yaml/tree/v5.2.5" }, "funding": [ { @@ -5294,22 +5286,22 @@ "type": "tidelift" } ], - "time": "2021-02-03T04:42:09+00:00" + "time": "2021-03-06T07:59:01+00:00" } ], "packages-dev": [ { "name": "doctrine/data-fixtures", - "version": "1.4.4", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/data-fixtures.git", - "reference": "16a03fadb5473f49aad70384002dfd5012fe680e" + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/16a03fadb5473f49aad70384002dfd5012fe680e", - "reference": "16a03fadb5473f49aad70384002dfd5012fe680e", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51d3d4880d28951fff42a635a2389f8c63baddc5", + "reference": "51d3d4880d28951fff42a635a2389f8c63baddc5", "shasum": "" }, "require": { @@ -5321,11 +5313,12 @@ "doctrine/phpcr-odm": "<1.3.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.2", "doctrine/dbal": "^2.5.4", "doctrine/mongodb-odm": "^1.3.0 || ^2.0.0", "doctrine/orm": "^2.7.0", - "phpunit/phpunit": "^7.0" + "ext-sqlite3": "*", + "phpunit/phpunit": "^8.0" }, "suggest": { "alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)", @@ -5334,11 +5327,6 @@ "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" @@ -5361,7 +5349,7 @@ ], "support": { "issues": "https://github.com/doctrine/data-fixtures/issues", - "source": "https://github.com/doctrine/data-fixtures/tree/1.4.x" + "source": "https://github.com/doctrine/data-fixtures/tree/1.5.0" }, "funding": [ { @@ -5377,7 +5365,7 @@ "type": "tidelift" } ], - "time": "2020-09-01T07:13:28+00:00" + "time": "2021-01-23T10:20:43+00:00" }, { "name": "doctrine/doctrine-fixtures-bundle", @@ -5466,12 +5454,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec" + "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", - "reference": "672ed7cb0191a12cf8b12b752c9ef74bb5d21cec", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/11b8a607a59818bb21fc9ffb334f03032a6ce5dc", + "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc", "shasum": "" }, "conflict": { @@ -5530,10 +5518,10 @@ "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<=6.13.8|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<=7.5.15", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", @@ -5561,6 +5549,7 @@ "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", + "impresscms/impresscms": "<=1.4.2", "ivankristianto/phpwhois": "<=4.3", "james-heinrich/getid3": "<1.9.9", "joomla/archive": "<1.1.10", @@ -5636,7 +5625,7 @@ "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", "shopware/core": "<=6.3.4", - "shopware/platform": "<=6.3.5", + "shopware/platform": "<=6.3.5.1", "shopware/shopware": "<5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", @@ -5672,6 +5661,7 @@ "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", @@ -5708,8 +5698,8 @@ "titon/framework": ">=0,<9.9.99", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", - "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", @@ -5788,20 +5778,20 @@ "type": "tidelift" } ], - "time": "2021-03-11T18:09:51+00:00" + "time": "2021-03-19T20:02:32+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.2.0", + "version": "v5.2.4", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0" + "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/92a76ca5e64effd41ce111b8f476144dfa29f1f0", - "reference": "92a76ca5e64effd41ce111b8f476144dfa29f1f0", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/9d85d900c1afe29138a0d5854505eb684bc3ac6d", + "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d", "shasum": "" }, "require": { @@ -5852,10 +5842,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony PHPUnit Bridge", + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.4" }, "funding": [ { @@ -5871,7 +5861,7 @@ "type": "tidelift" } ], - "time": "2020-11-27T00:39:34+00:00" + "time": "2021-02-04T18:05:54+00:00" } ], "aliases": [], @@ -5884,6 +5874,7 @@ "platform": { "php": "^8.0", "ext-ctype": "*", + "ext-dom": "*", "ext-iconv": "*", "ext-json": "*" }, diff --git a/docs/tle.html b/docs/tle.html deleted file mode 100644 index 9267052..0000000 --- a/docs/tle.html +++ /dev/null @@ -1,56 +0,0 @@ -

TLE API

- -

The TLE API provides up to date two line element set records, the data is updated daily from CelesTrak - and served in JSON format. - A two-line element set (TLE) is a data format encoding a list of orbital elements of an Earth-orbiting object for a - given point in time. For more information on TLE data format visit Definition - of Two-line Element Set Coordinate System. -

- -

Further documentation and response examples are available at: - http://data.ivanstanojevic.me/ - - api/tle/docs -

- -

Available endpoints

-

- The TLE API consists of two endpoints - - GET http://data.ivanstanojevic.me - -

- - - - - - - - - - - - - - - - - - -
EndpointDescription
GET /api/tle?search={q}Performing a search by satellite name
GET /api/tle/{q}Retrieving a single TLE record where query is satellite number
- -

Example query

-

- - - http://data.ivanstanojevic.me/ - - api/tle - - -

diff --git a/phpunit.xml.dist b/phpunit.xml.dist deleted file mode 100644 index 5b7c820..0000000 --- a/phpunit.xml.dist +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - tests - - - - - - src - - - - - - - diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..e69de29 diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 36f55de..0e5ce68 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,6 +14,15 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + protected const CORS_HEADERS = [ + 'Content-type' => 'application/json', + 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', + 'Access-Control-Max-Age' => 1728000, + ]; + protected const SORT_PARAM = 'sort'; protected const SORT_DIR_PARAM = 'sort-dir'; protected const PAGE_SIZE_PARAM = 'page-size'; @@ -121,14 +130,7 @@ public function response($response): Response return new Response( $this->serializer->serialize($response, 'json'), Response::HTTP_OK, - [ - 'Content-type' => 'application/json', - 'Access-Control-Allow-Origin' => '*', - 'Access-Control-Allow-Credentials' => 'true', - 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', - 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', - 'Access-Control-Max-Age' => 1728000, - ] + self::CORS_HEADERS ); } } diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 8890ad8..bff1611 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -6,11 +6,13 @@ use App\Repository\TleRepository; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[Route("/api/tle")] class TleController extends AbstractApiController @@ -20,8 +22,11 @@ class TleController extends AbstractApiController protected const PAGE_SIZE = 20; #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] - public function record(int $id, TleRepository $repository): Response - { + public function record( + int $id, + TleRepository $repository, + NormalizerInterface $normalizer + ): Response { /** @var Tle $tle */ $tle = $repository->findOneBy(['id' => $id]); @@ -29,7 +34,15 @@ public function record(int $id, TleRepository $repository): Response throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); } - return $this->response($tle); + $data = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + ]; + + return new JsonResponse( + array_merge($data, $normalizer->normalize($tle)), + Response::HTTP_OK, + self::CORS_HEADERS, + ); } #[Route("/", name: "tle_collection")] diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 6cb79c1..7134a94 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -9,19 +9,16 @@ class TleModelNormalizer implements NormalizerInterface { - private UrlGeneratorInterface $router; - - public function __construct(UrlGeneratorInterface $router) + public function __construct(private UrlGeneratorInterface $router) { - $this->router = $router; } /** - * @param TleModel $model - * @param null $format - * @param array $context + * @param $entity + * @param string|null $format + * @param array $context * - * @return array|bool|float|int|string + * @return array */ public function normalize($entity, string $format = null, array $context = []) { diff --git a/symfony.lock b/symfony.lock index 4aca444..65c7ee3 100644 --- a/symfony.lock +++ b/symfony.lock @@ -117,6 +117,18 @@ "myclabs/php-enum": { "version": "1.7.2" }, + "nelmio/cors-bundle": { + "version": "1.5", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.5", + "ref": "6bea22e6c564fba3a1391615cada1437d0bde39c" + }, + "files": [ + "config/packages/nelmio_cors.yaml" + ] + }, "ocramius/package-versions": { "version": "1.5.1" }, diff --git a/tests/TleTest.php b/tests/TleTest.php index a557992..022982a 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -54,16 +54,16 @@ public function testTleCollectionRecord(): void $response = $this->toArray($response); self::assertArrayHasKey('@context', $response); - self::assertEquals($response['@context'], 'http://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals('http://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertArrayHasKey('@id', $response); - self::assertEquals($response['@id'], 'http://localhost/api/tle'); + self::assertEquals('http://localhost/api/tle', $response['@id']); self::assertArrayHasKey('@type', $response); - self::assertEquals($response['@type'], 'Collection'); + self::assertEquals('Collection', $response['@type']); self::assertArrayHasKey('totalItems', $response); - self::assertEquals($response['totalItems'], 10); + self::assertEquals(10, $response['totalItems']); self::assertArrayHasKey('member', $response); self::assertEquals(\count($response['member']), $pageSize); @@ -72,16 +72,16 @@ public function testTleCollectionRecord(): void $parameters = $response['parameters']; self::assertArrayHasKey('search', $parameters); - self::assertEquals($parameters['search'], '*'); + self::assertEquals('*', $parameters['search']); self::assertArrayHasKey('sort', $parameters); - self::assertEquals($parameters['sort'], 'name'); + self::assertEquals('name', $parameters['sort']); self::assertArrayHasKey('sort-dir', $parameters); - self::assertEquals($parameters['sort-dir'], 'asc'); + self::assertEquals('asc', $parameters['sort-dir']); self::assertArrayHasKey('page', $parameters); - self::assertEquals($parameters['page'], 1); + self::assertEquals(1, $parameters['page']); self::assertArrayHasKey('page-size', $parameters); self::assertEquals($parameters['page-size'], $pageSize); From ab2ad584f958a3347dde37a519784b2420d221c3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 16:01:56 +0100 Subject: [PATCH 063/151] add request --- src/Entity/Request.php | 68 ++++++++++++++++++++++++ src/Event/StatisticSubscriber.php | 18 ++++++- src/Migrations/Version20210322150028.php | 36 +++++++++++++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/Entity/Request.php create mode 100644 src/Migrations/Version20210322150028.php diff --git a/src/Entity/Request.php b/src/Entity/Request.php new file mode 100644 index 0000000..5bcaaaa --- /dev/null +++ b/src/Entity/Request.php @@ -0,0 +1,68 @@ +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 60aaf11..c2f171a 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -2,14 +2,17 @@ namespace App\Event; +use App\Entity\Request; +use App\Entity\Tle; use App\Repository\StatisticRepository; +use App\Repository\TleRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\KernelEvents; class StatisticSubscriber implements EventSubscriberInterface { - public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em) + public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em, private TleRepository $tleRepository) { } @@ -26,6 +29,13 @@ public function onKernelTerminate($event): void return; } + /** @var Tle|null $tle */ + $tle = $this->tleRepository->find($event->getRequest()->get('id')); + + if ($tle === null) { + return; + } + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); if ($statistics === null) { @@ -34,6 +44,12 @@ public function onKernelTerminate($event): void $statistics->incrementHits(); + $request = new Request(); + $request->setTle($tle); + $request->setIp($event->getRequest()->getClientIp()); + + $this->em->persist($request); + $this->em->flush(); } } diff --git a/src/Migrations/Version20210322150028.php b/src/Migrations/Version20210322150028.php new file mode 100644 index 0000000..358185d --- /dev/null +++ b/src/Migrations/Version20210322150028.php @@ -0,0 +1,36 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE request (id INT AUTO_INCREMENT NOT NULL, tle_id INT NOT NULL, updated_at DATETIME NOT NULL, ip VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_3B978F9FE84B6F2B (tle_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE request ADD CONSTRAINT FK_3B978F9FE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('DROP TABLE request'); + } +} From 17facd9e2e2751395b21220884f969d721659539 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 16:12:15 +0100 Subject: [PATCH 064/151] add request --- src/Entity/Request.php | 2 +- src/Event/StatisticSubscriber.php | 14 ++++++++------ ...0210322150028.php => Version20210322151101.php} | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) rename src/Migrations/{Version20210322150028.php => Version20210322151101.php} (83%) diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 5bcaaaa..d39c0a5 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -22,7 +22,7 @@ class Request private int $id; /** - * @ORM\OneToOne(targetEntity="Tle") + * @ORM\ManyToOne(targetEntity="Tle") * @ORM\JoinColumn(name="tle_id", referencedColumnName="id", nullable=false) */ private Tle $tle; diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index c2f171a..51f509b 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -36,6 +36,14 @@ public function onKernelTerminate($event): void return; } + $request = new Request(); + $request->setTle($tle); + $request->setIp($event->getRequest()->getClientIp()); + + $this->em->persist($request); + + $this->em->flush(); + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); if ($statistics === null) { @@ -44,12 +52,6 @@ public function onKernelTerminate($event): void $statistics->incrementHits(); - $request = new Request(); - $request->setTle($tle); - $request->setIp($event->getRequest()->getClientIp()); - - $this->em->persist($request); - $this->em->flush(); } } diff --git a/src/Migrations/Version20210322150028.php b/src/Migrations/Version20210322151101.php similarity index 83% rename from src/Migrations/Version20210322150028.php rename to src/Migrations/Version20210322151101.php index 358185d..2d95f5d 100644 --- a/src/Migrations/Version20210322150028.php +++ b/src/Migrations/Version20210322151101.php @@ -10,7 +10,7 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20210322150028 extends AbstractMigration +final class Version20210322151101 extends AbstractMigration { public function getDescription() : string { @@ -22,7 +22,7 @@ public function up(Schema $schema) : void // this up() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - $this->addSql('CREATE TABLE request (id INT AUTO_INCREMENT NOT NULL, tle_id INT NOT NULL, updated_at DATETIME NOT NULL, ip VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_3B978F9FE84B6F2B (tle_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('CREATE TABLE request (id INT AUTO_INCREMENT NOT NULL, tle_id INT NOT NULL, updated_at DATETIME NOT NULL, ip VARCHAR(255) NOT NULL, INDEX IDX_3B978F9FE84B6F2B (tle_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); $this->addSql('ALTER TABLE request ADD CONSTRAINT FK_3B978F9FE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); } From 7866c54450475cd70208a44e6bd547e49c27b253 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 22 Mar 2021 19:57:54 +0100 Subject: [PATCH 065/151] gzip --- public/.htaccess | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/public/.htaccess b/public/.htaccess index 37fbfb3..e621e50 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -17,6 +17,37 @@ Options -MultiViews + + # Compress HTML, CSS, JavaScript, Text, XML and fonts + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/vnd.ms-fontobject + AddOutputFilterByType DEFLATE application/x-font + AddOutputFilterByType DEFLATE application/x-font-opentype + AddOutputFilterByType DEFLATE application/x-font-otf + AddOutputFilterByType DEFLATE application/x-font-truetype + AddOutputFilterByType DEFLATE application/x-font-ttf + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE font/opentype + AddOutputFilterByType DEFLATE font/otf + AddOutputFilterByType DEFLATE font/ttf + AddOutputFilterByType DEFLATE image/svg+xml + AddOutputFilterByType DEFLATE image/x-icon + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/xml + + # Remove browser bugs (only needed for really old browsers) + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + Header append Vary User-Agent + + RewriteEngine On From 60184f6cfa8cf518b8f4d41ef5a432650c09b752 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 08:28:27 +0100 Subject: [PATCH 066/151] gzip --- public/.htaccess | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/.htaccess b/public/.htaccess index e621e50..9c8c42f 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -65,6 +65,9 @@ RewriteCond %{HTTP:Authorization} .+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0] + RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] + RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L] + # Redirect to URI without front controller to prevent duplicate content # (with and without `/index.php`). Only do this redirect on the initial # rewrite by Apache and not on subsequent cycles. Otherwise we would get an From e8ffef87438a8e4f934346acef2385d81647377a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 08:33:20 +0100 Subject: [PATCH 067/151] add sentry --- .env | 4 + composer.json | 1 + composer.lock | 1550 ++++++++++++++++++++++++++++++++--- config/bundles.php | 1 + config/packages/sentry.yaml | 2 + symfony.lock | 12 + 6 files changed, 1471 insertions(+), 99 deletions(-) create mode 100644 config/packages/sentry.yaml diff --git a/.env b/.env index 5f55762..628129e 100644 --- a/.env +++ b/.env @@ -27,3 +27,7 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### + +###> sentry/sentry-symfony ### +SENTRY_DSN= +###< sentry/sentry-symfony ### diff --git a/composer.json b/composer.json index 325f044..a6bb34d 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "ext-json": "*", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", + "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", diff --git a/composer.lock b/composer.lock index 314a685..e71770d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,74 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e6d04bc24eedc3ec7826c480308b3b26", + "content-hash": "4d907021f971067b7e8ead6351e31ca9", "packages": [ + { + "name": "clue/stream-filter", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2020-10-02T12:38:20+00:00" + }, { "name": "composer/package-versions-deprecated", "version": "1.11.99.1", @@ -1668,6 +1734,60 @@ }, "time": "2021-03-21T16:25:00+00:00" }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.4.2", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.5", + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/master" + }, + "time": "2018-07-31T19:32:56+00:00" + }, { "name": "ivanstan/tle-php", "version": "1.0.3", @@ -1714,6 +1834,65 @@ }, "time": "2021-02-25T11:17:02+00:00" }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" + }, + "time": "2021-02-22T10:52:38+00:00" + }, { "name": "laminas/laminas-code", "version": "4.0.0", @@ -1974,31 +2153,54 @@ "time": "2021-02-15T16:11:48+00:00" }, { - "name": "psr/cache", - "version": "1.0.1", + "name": "php-http/client-common", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "url": "https://github.com/php-http/client-common.git", + "reference": "e37e46c610c87519753135fb893111798c69076a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", + "reference": "e37e46c610c87519753135fb893111798c69076a", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.0", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Http\\Client\\Common\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2007,42 +2209,64 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for caching libraries", + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", "keywords": [ - "cache", - "psr", - "psr-6" + "client", + "common", + "http", + "httplug" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.3.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2020-07-21T10:04:13+00:00" }, { - "name": "psr/container", - "version": "1.1.1", + "name": "php-http/discovery", + "version": "1.13.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "url": "https://github.com/php-http/discovery.git", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1", + "puli/composer-plugin": "1.0.0-beta10" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", + "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Http\\Discovery\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2051,51 +2275,60 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.13.0" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2020-11-27T14:49:42+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "php-http/httplug", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/php-http/httplug.git", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2104,49 +2337,77 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "Standard interfaces for event handling.", + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", "keywords": [ - "events", - "psr", - "psr-14" + "client", + "http" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/master" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2020-07-13T15:43:23+00:00" }, { - "name": "psr/http-message", - "version": "1.0.1", + "name": "php-http/message", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "url": "https://github.com/php-http/message.git", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", "shasum": "" }, "require": { - "php": ">=5.3.0" + "clue/stream-filter": "^1.5", + "php": "^7.1 || ^8.0", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "laminas/laminas-diactoros": "^2.0", + "phpspec/phpspec": "^5.1 || ^6.3", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" - } + "Http\\Message\\": "src/" + }, + "files": [ + "src/filters.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2154,51 +2415,50 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", "keywords": [ "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "message", + "psr-7" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.11.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2021-02-01T08:54:58+00:00" }, { - "name": "psr/log", - "version": "1.1.3", + "name": "php-http/message-factory", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.4", + "psr/http-message": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2207,28 +2467,445 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", "keywords": [ - "log", - "psr", - "psr-3" + "factory", + "http", + "message", + "stream", + "uri" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2015-12-19T14:08:53+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "php-http/promise", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { @@ -2267,6 +2944,270 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "sentry/sdk", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "shasum": "" + }, + "require": { + "http-interop/http-factory-guzzle": "^1.0", + "sentry/sentry": "^3.1", + "symfony/http-client": "^4.3|^5.0" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2020-12-01T10:31:45+00:00" + }, + { + "name": "sentry/sentry", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "899b0de58c1e01feb54829b3094af74252aff385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", + "reference": "899b0de58c1e01feb54829b3094af74252aff385", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7", + "jean85/pretty-package-versions": "^1.5|^2.0.1", + "php": "^7.2|^8.0", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.6.1", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "psr/http-factory": "^1.0", + "psr/http-message-implementation": "^1.0", + "psr/log": "^1.0", + "symfony/options-resolver": "^3.4.43|^4.4.11|^5.0.11", + "symfony/polyfill-php80": "^1.17", + "symfony/polyfill-uuid": "^1.13.1" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "http-interop/http-factory-guzzle": "^1.0", + "monolog/monolog": "^1.3|^2.0", + "nikic/php-parser": "^4.10.3", + "php-http/mock-client": "^1.3", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5.13|^9.4", + "symfony/phpunit-bridge": "^5.2", + "vimeo/psalm": "^4.2" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T11:54:34+00:00" + }, + { + "name": "sentry/sentry-symfony", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-symfony.git", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "shasum": "" + }, + "require": { + "jean85/pretty-package-versions": "^1.5 || ^2.0", + "php": "^7.2||^8.0", + "php-http/discovery": "^1.11", + "sentry/sdk": "^3.1", + "symfony/config": "^3.4.43||^4.4.11||^5.0.11", + "symfony/console": "^3.4.43||^4.4.11||^5.0.11", + "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", + "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", + "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", + "symfony/psr-http-message-bridge": "^2.0", + "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jangregor/phpstan-prophecy": "^0.8", + "monolog/monolog": "^1.3||^2.0", + "phpspec/prophecy": "!=1.11.0", + "phpspec/prophecy-phpunit": "^1.1||^2.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5||^9.0", + "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", + "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", + "symfony/messenger": "^4.4.11||^5.0.11", + "symfony/monolog-bundle": "^3.4", + "symfony/phpunit-bridge": "^5.0", + "symfony/polyfill-php80": "^1.22", + "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", + "vimeo/psalm": "^4.3" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "releases/3.2.x": "3.2.x-dev", + "releases/2.x": "2.x-dev", + "releases/1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/aliases.php" + ], + "psr-4": { + "Sentry\\SentryBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "David Cramer", + "email": "dcramer@gmail.com" + }, + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "Symfony integration for Sentry (http://getsentry.com)", + "homepage": "http://getsentry.com", + "keywords": [ + "errors", + "logging", + "sentry", + "symfony" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-symfony/issues", + "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T16:05:24+00:00" + }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -3830,7 +4771,93 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" + "time": "2021-03-09T08:47:49+00:00" + }, + { + "name": "symfony/http-client", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/c7d1f35a31ef153a302e3f80336170e1280b983d", + "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/http-client-contracts": "^2.2", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.0|^2" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.2" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4.13|^5.1.5", + "symfony/process": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-client/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-01T00:40:14+00:00" }, { "name": "symfony/http-client-contracts", @@ -4096,6 +5123,75 @@ ], "time": "2021-03-10T17:07:35+00:00" }, + { + "name": "symfony/options-resolver", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T12:56:27+00:00" + }, { "name": "symfony/orm-pack", "version": "v1.1.0", @@ -4636,6 +5732,173 @@ ], "time": "2021-01-07T16:49:33+00:00" }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1", + "symfony/browser-kit": "^4.4 || ^5.0", + "symfony/config": "^4.4 || ^5.0", + "symfony/event-dispatcher": "^4.4 || ^5.0", + "symfony/framework-bundle": "^4.4 || ^5.0", + "symfony/http-kernel": "^4.4 || ^5.0", + "symfony/phpunit-bridge": "^4.4.19 || ^5.2" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-17T10:35:25+00:00" + }, { "name": "symfony/routing", "version": "v5.2.4", @@ -4726,6 +5989,95 @@ ], "time": "2021-02-22T15:48:39+00:00" }, + { + "name": "symfony/security-core", + "version": "v5.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "688b21a293a7e4168e8e493a97625ac24280629f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/688b21a293a7e4168e8e493a97625ac24280629f", + "reference": "688b21a293a7e4168e8e493a97625ac24280629f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^5.2" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-07T15:51:33+00:00" + }, { "name": "symfony/serializer", "version": "v5.2.4", diff --git a/config/bundles.php b/config/bundles.php index 8c7b01e..fd8a43e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,4 +5,5 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Sentry\SentryBundle\SentryBundle::class => ['all' => true], ]; diff --git a/config/packages/sentry.yaml b/config/packages/sentry.yaml new file mode 100644 index 0000000..342036f --- /dev/null +++ b/config/packages/sentry.yaml @@ -0,0 +1,2 @@ +sentry: + dsn: '%env(SENTRY_DSN)%' diff --git a/symfony.lock b/symfony.lock index 65c7ee3..38af902 100644 --- a/symfony.lock +++ b/symfony.lock @@ -159,6 +159,18 @@ "roave/security-advisories": { "version": "dev-master" }, + "sentry/sentry-symfony": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "3.0", + "ref": "9746f0823302d7980e5273ef7a69ef3f5ac80914" + }, + "files": [ + "config/packages/sentry.yaml" + ] + }, "symfony/apache-pack": { "version": "1.0", "recipe": { From 55ccc7ab4d89344bcce539a61a5f63d5c8b926c6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 09:53:36 +0100 Subject: [PATCH 068/151] popular --- src/Controller/DocsController.php | 2 +- src/Controller/TleController.php | 48 +++++++++++++++++++++++++++---- src/Repository/TleRepository.php | 18 ++++++++++++ 3 files changed, 61 insertions(+), 7 deletions(-) diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 4d4eed3..d96bf19 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -8,7 +8,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; -class DocsController extends AbstractController +final class DocsController extends AbstractController { use FileSystemAwareTrait; diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index bff1611..a9d30f6 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -15,20 +15,23 @@ use Symfony\Component\Serializer\Normalizer\NormalizerInterface; #[Route("/api/tle")] -class TleController extends AbstractApiController +final class TleController extends AbstractApiController { protected const MAX_PAGE_SIZE = 100; protected const PAGE_SIZE = 20; + public function __construct(protected TleRepository $repository,) + { + } + #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record( int $id, - TleRepository $repository, NormalizerInterface $normalizer ): Response { /** @var Tle $tle */ - $tle = $repository->findOneBy(['id' => $id]); + $tle = $this->repository->findOneBy(['id' => $id]); if ($tle === null) { throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); @@ -46,8 +49,9 @@ public function record( } #[Route("/", name: "tle_collection")] - public function collection(Request $request, TleRepository $repository): Response - { + public function collection( + Request $request + ): Response { $this ->assertParamIsInteger($request, self::PAGE_PARAM) ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) @@ -62,7 +66,7 @@ public function collection(Request $request, TleRepository $repository): Respons $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); $pageSize = (int)min($request->get(self::PAGE_SIZE_PARAM, self::PAGE_SIZE), self::MAX_PAGE_SIZE); - $collection = $repository->collection( + $collection = $this->repository->collection( $search, $sort, $sortDir, @@ -88,4 +92,36 @@ public function collection(Request $request, TleRepository $repository): Respons ] ); } + + #[Route("/popular", name: "tle_popular")] + public function popular( + Request $request, + TleRepository $repository + ): Response { + $newerThan = new \DateTime('now'); + $newerThan->setTime(0, 0, 0); + $newerThan->modify('-3 days'); + + $limit = 10; + + $members = $repository->popular($newerThan, $limit); + + $data = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_popular', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => \count($members), + 'member' => $members, + 'parameters' => [ + '*limit' => $limit, + '*newerThan' => $newerThan->format('c'), + ], + ]; + + return new JsonResponse( + $data, + Response::HTTP_OK, + self::CORS_HEADERS, + ); + } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 7dae0b2..bba8da3 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -2,6 +2,7 @@ namespace App\Repository; +use App\Entity\Request; use App\Entity\Statistic; use App\Entity\Tle; use App\ViewModel\Model\PaginationCollection; @@ -72,6 +73,23 @@ public function collection( return $collection; } + public function popular(\DateTime $newerThen, int $limit): array + { + $builder = $this->_em->createQueryBuilder(); + + $builder->select(['t.name', 't.id', 'COUNT(q.ip) as hits']) + ->from(Request::class, 'q') + ->distinct('t.id') + ->leftJoin('q.tle', 't') + ->groupBy('t.id') + ->where('q.createdAt > :newerThan') + ->setParameter('newerThan', $newerThen) + ->setMaxResults($limit) + ->orderBy('hits', 'DESC'); + + return $builder->getQuery()->getResult(); + } + private function getCount(QueryBuilder $builder): int { $builder = clone $builder; From a36ea657b5df00c93f6ba793a82d0226a45b4880 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 23 Mar 2021 10:21:06 +0100 Subject: [PATCH 069/151] add request --- composer.json | 1 + composer.lock | 2 +- src/Command/UpdateImportSources.php | 286 ++++++++++++------------- src/Entity/Request.php | 136 ++++++------ src/Entity/Statistic.php | 96 ++++----- src/Event/StatisticSubscriber.php | 114 +++++----- src/Repository/StatisticRepository.php | 80 +++---- 7 files changed, 358 insertions(+), 357 deletions(-) diff --git a/composer.json b/composer.json index a6bb34d..7cd5ebb 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", + "symfony/psr-http-message-bridge": "^2.1", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" }, diff --git a/composer.lock b/composer.lock index e71770d..108fb01 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4d907021f971067b7e8ead6351e31ca9", + "content-hash": "30d1edfb8d1e2c72a8738ecc09959d4c", "packages": [ { "name": "clue/stream-filter", diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index 451b329..6ce7e84 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -1,143 +1,143 @@ -setName('tle:source'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $this->io = new SymfonyStyle($input, $output); - - $sourceFile = $this->getProjectDir() . ImportTleCommand::SOURCE; - - $this->sources = Yaml::parseFile($sourceFile); - - $newSources = $this->getSources(); - - $diff = array_diff($newSources, $this->sources); - - if (empty($diff)) { - $this->io->success('No new tle sources found'); - - return Command::SUCCESS; - } - - $this->io->writeln(""); - $this->io->writeln(\sprintf("Following new tle sources found and written to %s", $sourceFile)); - $this->io->writeln(""); - foreach ($diff as $url) { - $this->io->writeln($url); - } - - $this->io->writeln(""); - - $sources = array_merge($this->sources, $diff); - sort($sources); - - $yaml = Yaml::dump($sources); - - file_put_contents($sourceFile, $yaml); - - return Command::SUCCESS; - } - - protected function getSources(): array - { - $result = []; - - foreach (self::CATALOG as $catalog) { - $response = (new Client())->request('GET', $catalog); - - $crawler = new Crawler($response->getBody()->getContents()); - - /** @var DOMElement $anchor */ - foreach ($crawler->filter('a') as $anchor) { - $href = $anchor->getAttribute('href'); - $path = parse_url($href, PHP_URL_PATH); - $extension = pathinfo($path, PATHINFO_EXTENSION); - - if ($extension === 'txt') { - if (parse_url($href, PHP_URL_HOST) === null) { - if ($path[0] === '/') { - $scheme = parse_url($catalog, PHP_URL_SCHEME); - $host = parse_url($catalog, PHP_URL_HOST); - $href = $scheme . '://' . $host . $href; - } else { - $href = $catalog . trim($href, '/'); - } - } - - if (!$this->isIgnored($href)) { - $this->io->writeln(\sprintf('Verifying url: %s', $href)); - if ($this->isHealthy($href)) { - $result[] = $href; - } - } - } - } - } - - return $result; - } - - protected function isIgnored(string $url): bool - { - return in_array($url, self::IGNORED, false) || in_array($this->sources, self::IGNORED, false); - } - - protected function isHealthy(string $url): bool - { - try { - $response = (new Client())->request('GET', $url); - - return $response->getStatusCode() === 200; - } catch (\Exception) { - return false; - } - } -} +setName('tle:source'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->io = new SymfonyStyle($input, $output); + + $sourceFile = $this->getProjectDir() . ImportTleCommand::SOURCE; + + $this->sources = Yaml::parseFile($sourceFile); + + $newSources = $this->getSources(); + + $diff = array_diff($newSources, $this->sources); + + if (empty($diff)) { + $this->io->success('No new tle sources found'); + + return Command::SUCCESS; + } + + $this->io->writeln(""); + $this->io->writeln(\sprintf("Following new tle sources found and written to %s", $sourceFile)); + $this->io->writeln(""); + foreach ($diff as $url) { + $this->io->writeln($url); + } + + $this->io->writeln(""); + + $sources = array_merge($this->sources, $diff); + sort($sources); + + $yaml = Yaml::dump($sources); + + file_put_contents($sourceFile, $yaml); + + return Command::SUCCESS; + } + + protected function getSources(): array + { + $result = []; + + foreach (self::CATALOG as $catalog) { + $response = (new Client())->request('GET', $catalog); + + $crawler = new Crawler($response->getBody()->getContents()); + + /** @var DOMElement $anchor */ + foreach ($crawler->filter('a') as $anchor) { + $href = $anchor->getAttribute('href'); + $path = parse_url($href, PHP_URL_PATH); + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ($extension === 'txt') { + if (parse_url($href, PHP_URL_HOST) === null) { + if ($path[0] === '/') { + $scheme = parse_url($catalog, PHP_URL_SCHEME); + $host = parse_url($catalog, PHP_URL_HOST); + $href = $scheme . '://' . $host . $href; + } else { + $href = $catalog . trim($href, '/'); + } + } + + if (!$this->isIgnored($href)) { + $this->io->writeln(\sprintf('Verifying url: %s', $href)); + if ($this->isHealthy($href)) { + $result[] = $href; + } + } + } + } + } + + return $result; + } + + protected function isIgnored(string $url): bool + { + return in_array($url, self::IGNORED, false) || in_array($this->sources, self::IGNORED, false); + } + + protected function isHealthy(string $url): bool + { + try { + $response = (new Client())->request('GET', $url); + + return $response->getStatusCode() === 200; + } catch (\Exception) { + return false; + } + } +} diff --git a/src/Entity/Request.php b/src/Entity/Request.php index d39c0a5..5813bef 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -1,68 +1,68 @@ -createdAt = DateTimeService::getCurrentUTC(); - } - - public function getTle(): Tle - { - return $this->tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } - - public function getIp(): string - { - return $this->ip; - } - - public function setIp(string $ip): void - { - $this->ip = $ip; - } -} +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php index ba4c3d5..3d22e8e 100644 --- a/src/Entity/Statistic.php +++ b/src/Entity/Statistic.php @@ -1,48 +1,48 @@ -tle = $tle; - } - - public function getHits(): int - { - return $this->hits; - } - - public function setHits(int $hits): void - { - $this->hits = $hits; - } - - public function incrementHits(): void - { - $this->hits++; - } - - public function getTle(): Tle - { - return $this->tle; - } -} +tle = $tle; + } + + public function getHits(): int + { + return $this->hits; + } + + public function setHits(int $hits): void + { + $this->hits = $hits; + } + + public function incrementHits(): void + { + $this->hits++; + } + + public function getTle(): Tle + { + return $this->tle; + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 51f509b..5175346 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -1,57 +1,57 @@ - 'onKernelTerminate', - ]; - } - - public function onKernelTerminate($event): void - { - if ($event->getRequest()->get('_route') !== 'tle_record') { - return; - } - - /** @var Tle|null $tle */ - $tle = $this->tleRepository->find($event->getRequest()->get('id')); - - if ($tle === null) { - return; - } - - $request = new Request(); - $request->setTle($tle); - $request->setIp($event->getRequest()->getClientIp()); - - $this->em->persist($request); - - $this->em->flush(); - - $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); - - if ($statistics === null) { - return; - } - - $statistics->incrementHits(); - - $this->em->flush(); - } -} + 'onKernelTerminate', + ]; + } + + public function onKernelTerminate($event): void + { + if ($event->getRequest()->get('_route') !== 'tle_record') { + return; + } + + /** @var Tle|null $tle */ + $tle = $this->tleRepository->find($event->getRequest()->get('id')); + + if ($tle === null) { + return; + } + + $request = new Request(); + $request->setTle($tle); + $request->setIp($event->getRequest()->getClientIp()); + + $this->em->persist($request); + + $this->em->flush(); + + $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); + + if ($statistics === null) { + return; + } + + $statistics->incrementHits(); + + $this->em->flush(); + } +} diff --git a/src/Repository/StatisticRepository.php b/src/Repository/StatisticRepository.php index 4c39959..e477ad1 100644 --- a/src/Repository/StatisticRepository.php +++ b/src/Repository/StatisticRepository.php @@ -1,40 +1,40 @@ -getEntityManager()->getRepository(Tle::class)->find($id); - - if ($tle === null) { - return null; - } - - $statistic = new Statistic($tle); - $statistic->setHits(1); - - $this->_em->persist($statistic); - - return $statistic; - } -} +getEntityManager()->getRepository(Tle::class)->find($id); + + if ($tle === null) { + return null; + } + + $statistic = new Statistic($tle); + $statistic->setHits(1); + + $this->_em->persist($statistic); + + return $statistic; + } +} From 6f6b2431db0004fe3acf4cc0ba523d6c69f088f4 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 23 Mar 2021 10:38:45 +0100 Subject: [PATCH 070/151] remove sentry --- composer.json | 2 -- config/bundles.php | 1 - symfony.lock | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 7cd5ebb..325f044 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,6 @@ "ext-json": "*", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", - "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", @@ -19,7 +18,6 @@ "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", "symfony/orm-pack": "^1.1", - "symfony/psr-http-message-bridge": "^2.1", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" }, diff --git a/config/bundles.php b/config/bundles.php index fd8a43e..8c7b01e 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,5 +5,4 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], - Sentry\SentryBundle\SentryBundle::class => ['all' => true], ]; diff --git a/symfony.lock b/symfony.lock index 38af902..7a233ff 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,4 +1,7 @@ { + "clue/stream-filter": { + "version": "v1.5.0" + }, "doctrine/annotations": { "version": "1.0", "recipe": { @@ -99,6 +102,9 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, + "http-interop/http-factory-guzzle": { + "version": "1.0.0" + }, "ivanstan/tle-php": { "version": "1.0" }, @@ -138,6 +144,15 @@ "php": { "version": "7.4" }, + "php-http/client-common": { + "version": "2.3.0" + }, + "php-http/message": { + "version": "1.11.0" + }, + "php-http/message-factory": { + "version": "v1.0.2" + }, "psr/cache": { "version": "1.0.1" }, @@ -147,6 +162,9 @@ "psr/event-dispatcher": { "version": "1.0.0" }, + "psr/http-factory": { + "version": "1.0.1" + }, "psr/http-message": { "version": "1.0.1" }, @@ -159,6 +177,12 @@ "roave/security-advisories": { "version": "dev-master" }, + "sentry/sdk": { + "version": "3.1.0" + }, + "sentry/sentry": { + "version": "3.2.0" + }, "sentry/sentry-symfony": { "version": "3.0", "recipe": { @@ -276,6 +300,9 @@ "src/Kernel.php" ] }, + "symfony/http-client": { + "version": "v5.2.4" + }, "symfony/http-client-contracts": { "version": "v2.3.1" }, @@ -285,6 +312,9 @@ "symfony/http-kernel": { "version": "v5.0.1" }, + "symfony/options-resolver": { + "version": "v5.2.4" + }, "symfony/orm-pack": { "version": "v1.0.7" }, @@ -322,6 +352,9 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, + "symfony/polyfill-uuid": { + "version": "v1.22.1" + }, "symfony/routing": { "version": "4.2", "recipe": { From 6cbc6d46e965461f92a77fcdd9c4dd5a35236fdd Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 23 Mar 2021 10:39:24 +0100 Subject: [PATCH 071/151] popular --- config/packages/sentry.yaml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 config/packages/sentry.yaml diff --git a/config/packages/sentry.yaml b/config/packages/sentry.yaml deleted file mode 100644 index 342036f..0000000 --- a/config/packages/sentry.yaml +++ /dev/null @@ -1,2 +0,0 @@ -sentry: - dsn: '%env(SENTRY_DSN)%' From b44fd96e2b9566bf2c3c247410898a8331a7aa94 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 30 Mar 2021 16:00:22 +0200 Subject: [PATCH 072/151] add statistics --- .env | 4 - composer.json | 1 + composer.lock | 1569 ++--------------------- config/packages/doctrine.yaml | 8 + src/Controller/StatisticsController.php | 60 + symfony.lock | 46 +- 6 files changed, 208 insertions(+), 1480 deletions(-) create mode 100644 src/Controller/StatisticsController.php diff --git a/.env b/.env index 628129e..5f55762 100644 --- a/.env +++ b/.env @@ -27,7 +27,3 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### - -###> sentry/sentry-symfony ### -SENTRY_DSN= -###< sentry/sentry-symfony ### diff --git a/composer.json b/composer.json index 325f044..184b26e 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "ext-dom": "*", "ext-iconv": "*", "ext-json": "*", + "beberlei/doctrineextensions": "^1.3", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", "symfony/apache-pack": "^1.0", diff --git a/composer.lock b/composer.lock index 108fb01..f92651f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,73 +4,64 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "30d1edfb8d1e2c72a8738ecc09959d4c", + "content-hash": "a91a1c78abd782bb3b8a5c6e1d2b2474", "packages": [ { - "name": "clue/stream-filter", - "version": "v1.5.0", + "name": "beberlei/doctrineextensions", + "version": "v1.3.0", "source": { "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" + "url": "https://github.com/beberlei/DoctrineExtensions.git", + "reference": "008f162f191584a6c37c03a803f718802ba9dd9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", - "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "url": "https://api.github.com/repos/beberlei/DoctrineExtensions/zipball/008f162f191584a6c37c03a803f718802ba9dd9a", + "reference": "008f162f191584a6c37c03a803f718802ba9dd9a", "shasum": "" }, "require": { - "php": ">=5.3" + "doctrine/orm": "^2.7", + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "friendsofphp/php-cs-fixer": "^2.14", + "nesbot/carbon": "*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "symfony/yaml": "^4.2 || ^5.0", + "zf1/zend-date": "^1.12", + "zf1/zend-registry": "^1.12" }, "type": "library", "autoload": { "psr-4": { - "Clue\\StreamFilter\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + "DoctrineExtensions\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Christian Lück", - "email": "christian@clue.engineering" + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Steve Lacey", + "email": "steve@steve.ly" } ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", + "description": "A set of extensions to Doctrine 2 that add support for additional query functions available in MySQL, Oracle, PostgreSQL and SQLite.", "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" + "database", + "doctrine", + "orm" ], "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.5.0" + "source": "https://github.com/beberlei/DoctrineExtensions/tree/v1.3.0" }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2020-10-02T12:38:20+00:00" + "time": "2020-11-29T07:37:23+00:00" }, { "name": "composer/package-versions-deprecated", @@ -1734,60 +1725,6 @@ }, "time": "2021-03-21T16:25:00+00:00" }, - { - "name": "http-interop/http-factory-guzzle", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/http-interop/http-factory-guzzle.git", - "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", - "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", - "shasum": "" - }, - "require": { - "guzzlehttp/psr7": "^1.4.2", - "psr/http-factory": "^1.0" - }, - "provide": { - "psr/http-factory-implementation": "^1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.5", - "phpunit/phpunit": "^6.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Factory\\Guzzle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "An HTTP Factory using Guzzle PSR7", - "keywords": [ - "factory", - "http", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/http-interop/http-factory-guzzle/issues", - "source": "https://github.com/http-interop/http-factory-guzzle/tree/master" - }, - "time": "2018-07-31T19:32:56+00:00" - }, { "name": "ivanstan/tle-php", "version": "1.0.3", @@ -1834,65 +1771,6 @@ }, "time": "2021-02-25T11:17:02+00:00" }, - { - "name": "jean85/pretty-package-versions", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0.0", - "php": "^7.1|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^0.12.66", - "phpunit/phpunit": "^7.5|^8.5|^9.4", - "vimeo/psalm": "^4.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A library to get pretty versions strings of installed dependencies", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" - }, - "time": "2021-02-22T10:52:38+00:00" - }, { "name": "laminas/laminas-code", "version": "4.0.0", @@ -2153,54 +2031,31 @@ "time": "2021-02-15T16:11:48+00:00" }, { - "name": "php-http/client-common", - "version": "2.3.0", + "name": "psr/cache", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/php-http/client-common.git", - "reference": "e37e46c610c87519753135fb893111798c69076a" + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", - "reference": "e37e46c610c87519753135fb893111798c69076a", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/httplug": "^2.0", - "php-http/message": "^1.6", - "php-http/message-factory": "^1.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", - "symfony/polyfill-php80": "^1.17" - }, - "require-dev": { - "doctrine/instantiator": "^1.1", - "guzzlehttp/psr7": "^1.4", - "nyholm/psr7": "^1.2", - "phpspec/phpspec": "^5.1 || ^6.0", - "phpspec/prophecy": "^1.10.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" - }, - "suggest": { - "ext-json": "To detect JSON responses with the ContentTypePlugin", - "ext-libxml": "To detect XML responses with the ContentTypePlugin", - "php-http/cache-plugin": "PSR-6 Cache plugin", - "php-http/logger-plugin": "PSR-3 Logger plugin", - "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Http\\Client\\Common\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2209,64 +2064,42 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Common HTTP Client implementations and tools for HTTPlug", - "homepage": "http://httplug.io", + "description": "Common interface for caching libraries", "keywords": [ - "client", - "common", - "http", - "httplug" + "cache", + "psr", + "psr-6" ], "support": { - "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.3.0" + "source": "https://github.com/php-fig/cache/tree/master" }, - "time": "2020-07-21T10:04:13+00:00" + "time": "2016-08-06T20:24:11+00:00" }, { - "name": "php-http/discovery", - "version": "1.13.0", + "name": "psr/container", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0" - }, - "require-dev": { - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1", - "puli/composer-plugin": "1.0.0-beta10" - }, - "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", - "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, "autoload": { "psr-4": { - "Http\\Discovery\\": "src/" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2275,60 +2108,51 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Finds installed HTTPlug implementations and PSR-7 message factories", - "homepage": "http://php-http.org", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr7" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.13.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2020-11-27T14:49:42+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { - "name": "php-http/httplug", - "version": "2.2.0", + "name": "psr/event-dispatcher", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-http/httplug.git", - "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", - "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "php-http/promise": "^1.1", - "psr/http-client": "^1.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.1", - "phpspec/phpspec": "^5.1 || ^6.0" + "php": ">=7.2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Http\\Client\\": "src/" + "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2337,77 +2161,49 @@ ], "authors": [ { - "name": "Eric GELOEN", - "email": "geloen.eric@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "HTTPlug, the HTTP client abstraction for PHP", - "homepage": "http://httplug.io", + "description": "Standard interfaces for event handling.", "keywords": [ - "client", - "http" + "events", + "psr", + "psr-14" ], "support": { - "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/master" + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, - "time": "2020-07-13T15:43:23+00:00" + "time": "2019-01-08T18:20:26+00:00" }, { - "name": "php-http/message", - "version": "1.11.0", + "name": "psr/http-message", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", "shasum": "" }, "require": { - "clue/stream-filter": "^1.5", - "php": "^7.1 || ^8.0", - "php-http/message-factory": "^1.0.2", - "psr/http-message": "^1.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0", - "laminas/laminas-diactoros": "^2.0", - "phpspec/phpspec": "^5.1 || ^6.3", - "slim/slim": "^3.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Http\\Message\\": "src/" - }, - "files": [ - "src/filters.php" - ] + "Psr\\Http\\Message\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2415,50 +2211,51 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ "http", - "message", - "psr-7" + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.11.0" + "source": "https://github.com/php-fig/http-message/tree/master" }, - "time": "2021-02-01T08:54:58+00:00" + "time": "2016-08-06T14:39:51+00:00" }, { - "name": "php-http/message-factory", - "version": "v1.0.2", + "name": "psr/log", + "version": "1.1.3", "source": { "type": "git", - "url": "https://github.com/php-http/message-factory.git", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", - "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { - "php": ">=5.4", - "psr/http-message": "^1.0" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { "psr-4": { - "Http\\Message\\": "src/" + "Psr\\Log\\": "Psr/Log/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2467,465 +2264,48 @@ ], "authors": [ { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Factory interfaces for PSR-7 HTTP Message", - "homepage": "http://php-http.org", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "factory", - "http", - "message", - "stream", - "uri" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/php-http/message-factory/issues", - "source": "https://github.com/php-http/message-factory/tree/master" + "source": "https://github.com/php-fig/log/tree/1.1.3" }, - "time": "2015-12-19T14:08:53+00:00" + "time": "2020-03-23T09:12:05+00:00" }, { - "name": "php-http/promise", - "version": "1.1.0", + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/php-http/promise.git", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", - "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": ">=5.6" }, "require-dev": { - "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", - "phpspec/phpspec": "^5.1.2 || ^6.2" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { - "psr-4": { - "Http\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Joel Wurtz", - "email": "joel.wurtz@gmail.com" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Promise used for asynchronous HTTP requests", - "homepage": "http://httplug.io", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/php-http/promise/issues", - "source": "https://github.com/php-http/promise/tree/1.1.0" - }, - "time": "2020-07-07T09:29:14+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "time": "2020-06-29T06:28:15+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "time": "2019-04-30T12:38:16+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" - }, - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] + "files": [ + "src/getallheaders.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2944,270 +2324,6 @@ }, "time": "2019-03-08T08:55:37+00:00" }, - { - "name": "sentry/sdk", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php-sdk.git", - "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/f03133b067fdf03fed09ff03daf3f1d68f5f3673", - "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673", - "shasum": "" - }, - "require": { - "http-interop/http-factory-guzzle": "^1.0", - "sentry/sentry": "^3.1", - "symfony/http-client": "^4.3|^5.0" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", - "homepage": "http://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "sentry" - ], - "support": { - "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2020-12-01T10:31:45+00:00" - }, - { - "name": "sentry/sentry", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php.git", - "reference": "899b0de58c1e01feb54829b3094af74252aff385" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", - "reference": "899b0de58c1e01feb54829b3094af74252aff385", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7", - "jean85/pretty-package-versions": "^1.5|^2.0.1", - "php": "^7.2|^8.0", - "php-http/async-client-implementation": "^1.0", - "php-http/client-common": "^1.5|^2.0", - "php-http/discovery": "^1.6.1", - "php-http/httplug": "^1.1|^2.0", - "php-http/message": "^1.5", - "psr/http-factory": "^1.0", - "psr/http-message-implementation": "^1.0", - "psr/log": "^1.0", - "symfony/options-resolver": "^3.4.43|^4.4.11|^5.0.11", - "symfony/polyfill-php80": "^1.17", - "symfony/polyfill-uuid": "^1.13.1" - }, - "conflict": { - "php-http/client-common": "1.8.0", - "raven/raven": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", - "http-interop/http-factory-guzzle": "^1.0", - "monolog/monolog": "^1.3|^2.0", - "nikic/php-parser": "^4.10.3", - "php-http/mock-client": "^1.3", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5.13|^9.4", - "symfony/phpunit-bridge": "^5.2", - "vimeo/psalm": "^4.2" - }, - "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Sentry\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sentry", - "email": "accounts@sentry.io" - } - ], - "description": "A PHP SDK for Sentry (http://sentry.io)", - "homepage": "http://sentry.io", - "keywords": [ - "crash-reporting", - "crash-reports", - "error-handler", - "error-monitoring", - "log", - "logging", - "sentry" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2021-03-03T11:54:34+00:00" - }, - { - "name": "sentry/sentry-symfony", - "version": "4.0.3", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", - "shasum": "" - }, - "require": { - "jean85/pretty-package-versions": "^1.5 || ^2.0", - "php": "^7.2||^8.0", - "php-http/discovery": "^1.11", - "sentry/sdk": "^3.1", - "symfony/config": "^3.4.43||^4.4.11||^5.0.11", - "symfony/console": "^3.4.43||^4.4.11||^5.0.11", - "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", - "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", - "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", - "symfony/psr-http-message-bridge": "^2.0", - "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", - "jangregor/phpstan-prophecy": "^0.8", - "monolog/monolog": "^1.3||^2.0", - "phpspec/prophecy": "!=1.11.0", - "phpspec/prophecy-phpunit": "^1.1||^2.0", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5||^9.0", - "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", - "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", - "symfony/messenger": "^4.4.11||^5.0.11", - "symfony/monolog-bundle": "^3.4", - "symfony/phpunit-bridge": "^5.0", - "symfony/polyfill-php80": "^1.22", - "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", - "vimeo/psalm": "^4.3" - }, - "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev", - "releases/3.2.x": "3.2.x-dev", - "releases/2.x": "2.x-dev", - "releases/1.x": "1.x-dev" - } - }, - "autoload": { - "files": [ - "src/aliases.php" - ], - "psr-4": { - "Sentry\\SentryBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "David Cramer", - "email": "dcramer@gmail.com" - }, - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "Symfony integration for Sentry (http://getsentry.com)", - "homepage": "http://getsentry.com", - "keywords": [ - "errors", - "logging", - "sentry", - "symfony" - ], - "support": { - "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" - }, - "funding": [ - { - "url": "https://sentry.io/", - "type": "custom" - }, - { - "url": "https://sentry.io/pricing/", - "type": "custom" - } - ], - "time": "2021-03-03T16:05:24+00:00" - }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -4771,93 +3887,7 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" - }, - { - "name": "symfony/http-client", - "version": "v5.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client.git", - "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/c7d1f35a31ef153a302e3f80336170e1280b983d", - "reference": "c7d1f35a31ef153a302e3f80336170e1280b983d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/http-client-contracts": "^2.2", - "symfony/polyfill-php73": "^1.11", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.0|^2" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.2" - }, - "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", - "guzzlehttp/promises": "^1.4", - "nyholm/psr7": "^1.0", - "php-http/httplug": "^1.0|^2.0", - "psr/http-client": "^1.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/http-kernel": "^4.4.13|^5.1.5", - "symfony/process": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpClient\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-client/tree/v5.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-01T00:40:14+00:00" + "time": "2021-03-09T08:47:49+00:00" }, { "name": "symfony/http-client-contracts", @@ -5123,75 +4153,6 @@ ], "time": "2021-03-10T17:07:35+00:00" }, - { - "name": "symfony/options-resolver", - "version": "v5.2.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-27T12:56:27+00:00" - }, { "name": "symfony/orm-pack", "version": "v1.1.0", @@ -5732,173 +4693,6 @@ ], "time": "2021-01-07T16:49:33+00:00" }, - { - "name": "symfony/polyfill-uuid", - "version": "v1.22.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-uuid": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Uuid\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Grégoire Pineau", - "email": "lyrixx@lyrixx.info" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for uuid functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "uuid" - ], - "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-01-22T09:19:47+00:00" - }, - { - "name": "symfony/psr-http-message-bridge", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/psr-http-message-bridge.git", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", - "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0", - "symfony/http-foundation": "^4.4 || ^5.0" - }, - "require-dev": { - "nyholm/psr7": "^1.1", - "psr/log": "^1.1", - "symfony/browser-kit": "^4.4 || ^5.0", - "symfony/config": "^4.4 || ^5.0", - "symfony/event-dispatcher": "^4.4 || ^5.0", - "symfony/framework-bundle": "^4.4 || ^5.0", - "symfony/http-kernel": "^4.4 || ^5.0", - "symfony/phpunit-bridge": "^4.4.19 || ^5.2" - }, - "suggest": { - "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-main": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\PsrHttpMessage\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "PSR HTTP message bridge", - "homepage": "http://symfony.com", - "keywords": [ - "http", - "http-message", - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/symfony/psr-http-message-bridge/issues", - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-17T10:35:25+00:00" - }, { "name": "symfony/routing", "version": "v5.2.4", @@ -5989,95 +4783,6 @@ ], "time": "2021-02-22T15:48:39+00:00" }, - { - "name": "symfony/security-core", - "version": "v5.2.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/security-core.git", - "reference": "688b21a293a7e4168e8e493a97625ac24280629f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/688b21a293a7e4168e8e493a97625ac24280629f", - "reference": "688b21a293a7e4168e8e493a97625ac24280629f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^1.1|^2", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/event-dispatcher": "<4.4", - "symfony/ldap": "<4.4", - "symfony/security-guard": "<4.4", - "symfony/validator": "<5.2" - }, - "require-dev": { - "psr/container": "^1.0|^2.0", - "psr/log": "~1.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/ldap": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/validator": "^5.2" - }, - "suggest": { - "psr/container-implementation": "To instantiate the Security class", - "symfony/event-dispatcher": "", - "symfony/expression-language": "For using the expression voter", - "symfony/http-foundation": "", - "symfony/ldap": "For using LDAP integration", - "symfony/validator": "For using the user password constraint" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\Core\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Security Component - Core Library", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/security-core/tree/v5.2.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-03-07T15:51:33+00:00" - }, { "name": "symfony/serializer", "version": "v5.2.4", diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 5e80e77..e7bec11 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -16,3 +16,11 @@ doctrine: dir: '%kernel.project_dir%/src/Entity' prefix: 'App\Entity' alias: App + + dql: + string_functions: + DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat + CAST: DoctrineExtensions\Query\Mysql\Cast + IF: DoctrineExtensions\Query\Mysql\IfElse + numeric_functions: + ROUND: DoctrineExtensions\Query\Mysql\Round diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php new file mode 100644 index 0000000..b89c66b --- /dev/null +++ b/src/Controller/StatisticsController.php @@ -0,0 +1,60 @@ +createQueryBuilder(); + + $qb->select( + [ + 'DATE_FORMAT(r.createdAt, \'%Y-%m-%d\') as date', + 'ROUND(CAST(DATE_FORMAT(r.createdAt, \'%H\') AS UNSIGNED) / :interval) as hour', + 'COUNT(r.id) as hits', + ] + ); + + $qb + ->from(Request::class, 'r') + ->groupBy('date, hour') + ->setParameter('interval', self::INTERVAL); + + $result = $qb->getQuery()->getResult(); + + $response = []; + foreach ($result as $key => &$item) { + if ($item['hour'] === "0") { + $previousKey = $key - 1; + if (isset($result[$previousKey])) { + $result[$previousKey]['hits'] = $item['hits']; + } + + unset($result[$key]); + } + + $date = new \DateTime($item['date']); + $date->setTime((int)$item['hour'] * self::INTERVAL, 0); + + $response[$date->format('c')] = $item['hits']; + } + + return new JsonResponse( + $response, + Response::HTTP_OK, + self::CORS_HEADERS, + ); + } +} diff --git a/symfony.lock b/symfony.lock index 7a233ff..9ea3583 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,6 +1,6 @@ { - "clue/stream-filter": { - "version": "v1.5.0" + "beberlei/doctrineextensions": { + "version": "v1.3.0" }, "doctrine/annotations": { "version": "1.0", @@ -102,9 +102,6 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, - "http-interop/http-factory-guzzle": { - "version": "1.0.0" - }, "ivanstan/tle-php": { "version": "1.0" }, @@ -144,15 +141,6 @@ "php": { "version": "7.4" }, - "php-http/client-common": { - "version": "2.3.0" - }, - "php-http/message": { - "version": "1.11.0" - }, - "php-http/message-factory": { - "version": "v1.0.2" - }, "psr/cache": { "version": "1.0.1" }, @@ -162,9 +150,6 @@ "psr/event-dispatcher": { "version": "1.0.0" }, - "psr/http-factory": { - "version": "1.0.1" - }, "psr/http-message": { "version": "1.0.1" }, @@ -177,24 +162,6 @@ "roave/security-advisories": { "version": "dev-master" }, - "sentry/sdk": { - "version": "3.1.0" - }, - "sentry/sentry": { - "version": "3.2.0" - }, - "sentry/sentry-symfony": { - "version": "3.0", - "recipe": { - "repo": "github.com/symfony/recipes-contrib", - "branch": "master", - "version": "3.0", - "ref": "9746f0823302d7980e5273ef7a69ef3f5ac80914" - }, - "files": [ - "config/packages/sentry.yaml" - ] - }, "symfony/apache-pack": { "version": "1.0", "recipe": { @@ -300,9 +267,6 @@ "src/Kernel.php" ] }, - "symfony/http-client": { - "version": "v5.2.4" - }, "symfony/http-client-contracts": { "version": "v2.3.1" }, @@ -312,9 +276,6 @@ "symfony/http-kernel": { "version": "v5.0.1" }, - "symfony/options-resolver": { - "version": "v5.2.4" - }, "symfony/orm-pack": { "version": "v1.0.7" }, @@ -352,9 +313,6 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, - "symfony/polyfill-uuid": { - "version": "v1.22.1" - }, "symfony/routing": { "version": "4.2", "recipe": { From 2905429f4353d2ca69c2b591299da28ac2e406ed Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 30 Mar 2021 16:06:13 +0200 Subject: [PATCH 073/151] add statistics --- src/Controller/StatisticsController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index b89c66b..56edda4 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -17,6 +17,10 @@ class StatisticsController extends AbstractApiController public function hits( EntityManagerInterface $em ): Response { + $newerThan = new \DateTime('now'); + $newerThan->setTime(0, 0, 0); + $newerThan->modify('-3 days'); + $qb = $em->createQueryBuilder(); $qb->select( @@ -29,6 +33,8 @@ public function hits( $qb ->from(Request::class, 'r') + ->where('r.createdAt > :newerThan') + ->setParameter('newerThan', $newerThan) ->groupBy('date, hour') ->setParameter('interval', self::INTERVAL); From 47cc1a538f5c7f22e088f398e7f9268907baf59e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 31 Mar 2021 21:23:35 +0200 Subject: [PATCH 074/151] change column name --- src/Entity/Request.php | 136 +++++++++++------------ src/Migrations/Version20210331192030.php | 35 ++++++ 2 files changed, 103 insertions(+), 68 deletions(-) create mode 100644 src/Migrations/Version20210331192030.php diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 5813bef..d39c0a5 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -1,68 +1,68 @@ -createdAt = DateTimeService::getCurrentUTC(); - } - - public function getTle(): Tle - { - return $this->tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } - - public function getIp(): string - { - return $this->ip; - } - - public function setIp(string $ip): void - { - $this->ip = $ip; - } -} +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Migrations/Version20210331192030.php b/src/Migrations/Version20210331192030.php new file mode 100644 index 0000000..0404c36 --- /dev/null +++ b/src/Migrations/Version20210331192030.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request CHANGE updated_at created_at DATETIME NOT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request CHANGE created_at updated_at DATETIME NOT NULL'); + } +} From e26bb52c1adb8a73e4b561e011a1c4eff6a2d248 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 31 Mar 2021 21:23:58 +0200 Subject: [PATCH 075/151] change column name --- src/Entity/Request.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/Request.php b/src/Entity/Request.php index d39c0a5..3be4d0c 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -28,7 +28,7 @@ class Request private Tle $tle; /** - * @ORM\Column(name="updated_at", type="datetime") + * @ORM\Column(name="created_at", type="datetime") */ private \DateTime $createdAt; From 83621ff8002f708852f69f8e3607e165bdd7342a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 31 Mar 2021 21:37:37 +0200 Subject: [PATCH 076/151] add tle subscriber --- src/Controller/AbstractApiController.php | 2 +- src/Event/ApiExceptionSubscriber.php | 7 ++-- src/Event/TleEntitySubscriber.php | 42 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/Event/TleEntitySubscriber.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 0e5ce68..645d8e1 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,7 +14,7 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; - protected const CORS_HEADERS = [ + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', 'Access-Control-Allow-Credentials' => 'true', diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 83a5b91..9b8f465 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -2,6 +2,7 @@ namespace App\Event; +use App\Controller\AbstractApiController; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; @@ -32,7 +33,7 @@ public static function getSubscribedEvents(): array public function onException(ExceptionEvent $event): void { - if (strpos($event->getRequest()->getPathInfo(), self::API_PATH) === false) { + if (!str_contains($event->getRequest()->getPathInfo(), self::API_PATH)) { return; } @@ -63,9 +64,7 @@ private function setJsonResponse(ExceptionEvent $event, array $response): void 'response' => $response ], Response::HTTP_OK, - [ - 'Access-Control-Allow-Origin' => '*', - ] + AbstractApiController::CORS_HEADERS ) ); } diff --git a/src/Event/TleEntitySubscriber.php b/src/Event/TleEntitySubscriber.php new file mode 100644 index 0000000..6ca949f --- /dev/null +++ b/src/Event/TleEntitySubscriber.php @@ -0,0 +1,42 @@ +calculateFields($args); + } + + public function postPersist(LifecycleEventArgs $args): void + { + $this->calculateFields($args); + } + + protected function calculateFields(LifecycleEventArgs $args): void + { + $entity = $args->getObject(); + + if (!$entity instanceof Tle) { + return; + } + + $entityManager = $args->getObjectManager(); + } + + +} From 5dfb39146a3bd9ae1378dcad0522d1fcca09d3a0 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 1 Apr 2021 15:03:20 +0200 Subject: [PATCH 077/151] add tle subscriber --- .../Attributes/TleOneToOneReference.php | 26 ++++++++++++ src/Entity/Statistic.php | 13 +----- src/Entity/TleInformation.php | 29 +++++++++++++ src/Event/TleEntitySubscriber.php | 42 ------------------- 4 files changed, 57 insertions(+), 53 deletions(-) create mode 100644 src/Entity/Attributes/TleOneToOneReference.php create mode 100644 src/Entity/TleInformation.php delete mode 100644 src/Event/TleEntitySubscriber.php diff --git a/src/Entity/Attributes/TleOneToOneReference.php b/src/Entity/Attributes/TleOneToOneReference.php new file mode 100644 index 0000000..6dd34a4 --- /dev/null +++ b/src/Entity/Attributes/TleOneToOneReference.php @@ -0,0 +1,26 @@ +tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } +} diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php index 3d22e8e..c360155 100644 --- a/src/Entity/Statistic.php +++ b/src/Entity/Statistic.php @@ -2,6 +2,7 @@ namespace App\Entity; +use App\Entity\Attributes\TleOneToOneReference; use Doctrine\ORM\Mapping as ORM; /** @@ -9,12 +10,7 @@ */ class Statistic { - /** - * @ORM\Id - * @ORM\OneToOne(targetEntity="Tle") - * @ORM\JoinColumn(name="tle_id", referencedColumnName="id", nullable=false) - */ - private Tle $tle; + use TleOneToOneReference; /** * @ORM\Column(name="hits", type="bigint") @@ -40,9 +36,4 @@ public function incrementHits(): void { $this->hits++; } - - public function getTle(): Tle - { - return $this->tle; - } } diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php new file mode 100644 index 0000000..d78f8d2 --- /dev/null +++ b/src/Entity/TleInformation.php @@ -0,0 +1,29 @@ +tle = $tle; + } +} diff --git a/src/Event/TleEntitySubscriber.php b/src/Event/TleEntitySubscriber.php deleted file mode 100644 index 6ca949f..0000000 --- a/src/Event/TleEntitySubscriber.php +++ /dev/null @@ -1,42 +0,0 @@ -calculateFields($args); - } - - public function postPersist(LifecycleEventArgs $args): void - { - $this->calculateFields($args); - } - - protected function calculateFields(LifecycleEventArgs $args): void - { - $entity = $args->getObject(); - - if (!$entity instanceof Tle) { - return; - } - - $entityManager = $args->getObjectManager(); - } - - -} From 0169b3823fbb1579dc672da4cb03a4e5e2918490 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 07:11:06 +0200 Subject: [PATCH 078/151] add tle calculate add monolog --- composer.json | 1 + composer.lock | 261 +++++++++++++++++++- config/bundles.php | 1 + config/packages/dev/monolog.yaml | 19 ++ config/packages/prod/deprecations.yaml | 8 + config/packages/prod/monolog.yaml | 17 ++ config/packages/test/monolog.yaml | 12 + src/Command/TleCalculate.php | 67 +++++ src/Entity/TleInformation.php | 8 +- src/Migrations/Version20210402050806.php | 41 +++ src/Repository/TleInformationRepository.php | 15 ++ symfony.lock | 21 ++ 12 files changed, 466 insertions(+), 5 deletions(-) create mode 100644 config/packages/dev/monolog.yaml create mode 100644 config/packages/prod/deprecations.yaml create mode 100644 config/packages/prod/monolog.yaml create mode 100644 config/packages/test/monolog.yaml create mode 100644 src/Command/TleCalculate.php create mode 100644 src/Migrations/Version20210402050806.php create mode 100644 src/Repository/TleInformationRepository.php diff --git a/composer.json b/composer.json index 184b26e..e713a49 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "symfony/dotenv": "5.2.*", "symfony/flex": "^1.3.1", "symfony/framework-bundle": "5.2.*", + "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" diff --git a/composer.lock b/composer.lock index f92651f..201e4fe 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a91a1c78abd782bb3b8a5c6e1d2b2474", + "content-hash": "ac57924d16513118d6d09c51e69e22dc", "packages": [ { "name": "beberlei/doctrineextensions", @@ -1970,6 +1970,102 @@ ], "time": "2021-02-25T21:54:58+00:00" }, + { + "name": "monolog/monolog", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.59", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90 <7.0.1", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.2.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-12-14T13:15:25+00:00" + }, { "name": "myclabs/php-enum", "version": "1.8.0", @@ -4153,6 +4249,169 @@ ], "time": "2021-03-10T17:07:35+00:00" }, + { + "name": "symfony/monolog-bridge", + "version": "v5.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bridge.git", + "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/8a330ab86c4bdf3983b26abf64bf85574edf0d52", + "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52", + "shasum": "" + }, + "require": { + "monolog/monolog": "^1.25.1|^2", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/console": "<4.4", + "symfony/http-foundation": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", + "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", + "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Monolog\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides integration for Monolog with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/monolog-bridge/tree/v5.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-06T07:59:01+00:00" + }, + { + "name": "symfony/monolog-bundle", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/monolog-bundle.git", + "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/4054b2e940a25195ae15f0a49ab0c51718922eb4", + "reference": "4054b2e940a25195ae15f0a49ab0c51718922eb4", + "shasum": "" + }, + "require": { + "monolog/monolog": "~1.22 || ~2.0", + "php": ">=7.1.3", + "symfony/config": "~4.4 || ^5.0", + "symfony/dependency-injection": "^4.4 || ^5.0", + "symfony/http-kernel": "~4.4 || ^5.0", + "symfony/monolog-bridge": "~4.4 || ^5.0" + }, + "require-dev": { + "symfony/console": "~4.4 || ^5.0", + "symfony/phpunit-bridge": "^5.1", + "symfony/yaml": "~4.4 || ^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "https://symfony.com", + "keywords": [ + "log", + "logging" + ], + "support": { + "issues": "https://github.com/symfony/monolog-bundle/issues", + "source": "https://github.com/symfony/monolog-bundle/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-31T07:20:47+00:00" + }, { "name": "symfony/orm-pack", "version": "v1.1.0", diff --git a/config/bundles.php b/config/bundles.php index 8c7b01e..b10047b 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -5,4 +5,5 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], + Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], ]; diff --git a/config/packages/dev/monolog.yaml b/config/packages/dev/monolog.yaml new file mode 100644 index 0000000..32039e9 --- /dev/null +++ b/config/packages/dev/monolog.yaml @@ -0,0 +1,19 @@ +monolog: + handlers: + main: + type: stream + path: php://stderr + level: debug + channels: ["!event"] + # uncomment to get logging in your browser + # you may have to allow bigger header sizes in your Web server configuration + #firephp: + # type: firephp + # level: info + #chromephp: + # type: chromephp + # level: info + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine", "!console"] diff --git a/config/packages/prod/deprecations.yaml b/config/packages/prod/deprecations.yaml new file mode 100644 index 0000000..60026a1 --- /dev/null +++ b/config/packages/prod/deprecations.yaml @@ -0,0 +1,8 @@ +# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists +#monolog: +# channels: [deprecation] +# handlers: +# deprecation: +# type: stream +# channels: [deprecation] +# path: php://stderr diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml new file mode 100644 index 0000000..2c02ad8 --- /dev/null +++ b/config/packages/prod/monolog.yaml @@ -0,0 +1,17 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + buffer_size: 50 # How many messages should be saved? Prevent memory leaks + nested: + type: stream + path: php://stderr + level: debug + formatter: monolog.formatter.json + console: + type: console + process_psr_3_messages: false + channels: ["!event", "!doctrine"] diff --git a/config/packages/test/monolog.yaml b/config/packages/test/monolog.yaml new file mode 100644 index 0000000..fc40641 --- /dev/null +++ b/config/packages/test/monolog.yaml @@ -0,0 +1,12 @@ +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + excluded_http_codes: [404, 405] + channels: ["!event"] + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php new file mode 100644 index 0000000..f12ebe5 --- /dev/null +++ b/src/Command/TleCalculate.php @@ -0,0 +1,67 @@ +setDescription('Calculate and persist data in TleInformation entity'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $builder = $this->entityManager + ->createQueryBuilder() + ->select('tle') + ->from(Tle::class, 'tle'); + + $repository = $this->entityManager->getRepository(TleInformation::class); + + /** @var Tle $tle */ + foreach ($builder->getQuery()->toIterable() as $i => $tle) { + $exists = true; + + $tleInformation = $repository->find($tle->getId()); + + if ($tleInformation === null) { + $exists = false; + $tleInformation = new TleInformation($tle); + } + + $tleModel = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); + + $tleInformation->inclination = $tleModel->getInclination(); + $tleInformation->eccentricity = $tleModel->eccentricity(); + + if (!$exists) { + $this->entityManager->persist($tleInformation); + } + + if (($i % self::BATCH_SIZE) === 0) { + $this->entityManager->flush(); + $this->entityManager->clear(); + } + } + + $this->entityManager->flush(); + + return Command::SUCCESS; + } +} diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index d78f8d2..347bd31 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -13,14 +13,14 @@ class TleInformation use TleOneToOneReference; /** - * @ORM\Column(type="float", precision=10, nullable=true) + * @ORM\Column(type="float", precision=14, scale=12, nullable=true) */ - public int $eccentricity; + public float $eccentricity; /** - * @ORM\Column(type="float", precision=10, nullable=true) + * @ORM\Column(type="float", precision=16, scale=10, nullable=true) */ - public int $inclination; + public float $inclination; public function __construct(Tle $tle) { diff --git a/src/Migrations/Version20210402050806.php b/src/Migrations/Version20210402050806.php new file mode 100644 index 0000000..442c840 --- /dev/null +++ b/src/Migrations/Version20210402050806.php @@ -0,0 +1,41 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE tle_information (tle_id INT NOT NULL, eccentricity DOUBLE PRECISION DEFAULT NULL, inclination DOUBLE PRECISION DEFAULT NULL, PRIMARY KEY(tle_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB'); + $this->addSql('ALTER TABLE tle_information ADD CONSTRAINT FK_E216A773E84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id)'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('DROP TABLE tle_information'); + } +} diff --git a/src/Repository/TleInformationRepository.php b/src/Repository/TleInformationRepository.php new file mode 100644 index 0000000..daea987 --- /dev/null +++ b/src/Repository/TleInformationRepository.php @@ -0,0 +1,15 @@ + Date: Fri, 2 Apr 2021 11:43:21 +0200 Subject: [PATCH 079/151] filter validator added --- src/Controller/AbstractApiController.php | 11 ++++ src/Controller/TleController.php | 12 ++++- src/Service/Validator/RequestValidator.php | 61 +++++++++++++++++++++- 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 645d8e1..9484b8d 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,6 +14,17 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + protected const FILTER_TYPE_FLOAT = 'float'; + + protected const FILTER_FLOAT_OPERATORS = [ + self::FILTER_TYPE_FLOAT => [ + 'gt' => '>', + 'gte' => '>=', + 'lt' => '<', + 'lte' => '<=', + ], + ]; + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index a9d30f6..dfc67b1 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -21,7 +21,14 @@ final class TleController extends AbstractApiController protected const PAGE_SIZE = 20; - public function __construct(protected TleRepository $repository,) + protected const FILTER_ECCENTRICITY = 'eccentricity'; + protected const FILTER_INCLINATION = 'inclination'; + + protected const COLLECTION_FILTERS = [ + self::FILTER_ECCENTRICITY => self::FILTER_TYPE_FLOAT, + ]; + + public function __construct(protected TleRepository $repository) { } @@ -60,6 +67,9 @@ public function collection( ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); + + dd($filters); $search = $request->get(self::SEARCH_PARAM); $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index b50bd63..5301f6a 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -78,4 +78,63 @@ protected function assertParamInEnum(Request $request, string $name, array $valu return $this; } -} \ No newline at end of file + + protected function assertFilter(Request $request, array $filters): array + { + $result = []; + + foreach ($filters as $filter => $type) { + $values = $request->get($filter); + + foreach ($values as $operator => $value) { + $operator = $this->assertOperator($operator, $type, $filter); + $value = $this->assertValue($value, $type, $filter); + + $result[$filter][$operator] = $value; + } + } + + return $result; + } + + protected function assertOperator(string $operator, string $type, string $filter): ?string + { + if ($type === self::FILTER_TYPE_FLOAT) { + $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; + if (!array_key_exists($operator, $operators)) { + throw new BadRequestHttpException( + \sprintf( + 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', + $filter, + implode(', ', array_keys($operators)), + $operator + ) + ); + } + + return $operators[$operator]; + } + + return null; + } + + /** + * @noinspection CallableParameterUseCaseInTypeContextInspection + */ + protected function assertValue(string $value, string $type, string $filter): mixed + { + if ($type === self::FILTER_TYPE_FLOAT) { + $value = (float)$value; + + if (!is_float($value)) { + throw new BadRequestHttpException( + \sprintf('Filter %s value should be %s', $filter, $type) + ); + } + + return $value; + } + + return null; + } +} From b4bdf1b9dfeacfe4b7e8fa9b0f5fab97e5776dae Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 11:53:27 +0200 Subject: [PATCH 080/151] add filters --- src/Controller/TleController.php | 5 ++--- src/Repository/TleRepository.php | 17 ++++++++++++++++- src/Service/Validator/RequestValidator.php | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index dfc67b1..865fa29 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -69,8 +69,6 @@ public function collection( ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); - dd($filters); - $search = $request->get(self::SEARCH_PARAM); $sort = $request->get(self::SORT_PARAM, TleCollectionSortableFieldsEnum::POPULARITY); $sortDir = $request->get(self::SORT_DIR_PARAM, SortDirectionEnum::DESCENDING); @@ -81,7 +79,8 @@ public function collection( $sort, $sortDir, $pageSize, - $this->getPageOffset($this->getPage($request), $pageSize) + $this->getPageOffset($this->getPage($request), $pageSize), + $filters, ); return $this->response( diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index bba8da3..8b712ce 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -5,6 +5,7 @@ use App\Entity\Request; use App\Entity\Statistic; use App\Entity\Tle; +use App\Entity\TleInformation; use App\ViewModel\Model\PaginationCollection; use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; @@ -35,9 +36,11 @@ public function collection( string $sort, string $sortDir, int $pageSize, - int $offset + int $offset, + array $filters, ): PaginationCollection { $builder = $this->createQueryBuilder('tle'); + $builder->leftJoin(TleInformation::class, 'info', Expr\Join::WITH, 'info.tle = tle.id'); // search if ($search) { @@ -53,6 +56,18 @@ public function collection( $total = $this->getCount($builder); + if (!empty($filters)) { + foreach ($filters as $filter => $operators) { + $key = 0; + foreach ($operators as $operator => $value) { + $paramName = 'filter_' . $filter . '_' . $key; + $builder->andWhere(\sprintf('info.%s %s :%s', $filter, $operator, $paramName)); + $builder->setParameter($paramName, $value); + $key++; + } + } + } + // sort if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 5301f6a..73ee7ba 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -84,7 +84,7 @@ protected function assertFilter(Request $request, array $filters): array $result = []; foreach ($filters as $filter => $type) { - $values = $request->get($filter); + $values = $request->get($filter, []); foreach ($values as $operator => $value) { $operator = $this->assertOperator($operator, $type, $filter); From b9bdf581b239c6e558df37274fb381589d3e286c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 13:01:20 +0200 Subject: [PATCH 081/151] add filters --- src/Controller/AbstractApiController.php | 11 --- src/Controller/TleController.php | 25 ++++--- src/Repository/TleRepository.php | 16 ++--- src/Service/Validator/RequestValidator.php | 47 +------------ src/ViewModel/Filter.php | 78 ++++++++++++++++++++++ 5 files changed, 103 insertions(+), 74 deletions(-) create mode 100644 src/ViewModel/Filter.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 9484b8d..645d8e1 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -14,17 +14,6 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; - protected const FILTER_TYPE_FLOAT = 'float'; - - protected const FILTER_FLOAT_OPERATORS = [ - self::FILTER_TYPE_FLOAT => [ - 'gt' => '>', - 'gte' => '>=', - 'lt' => '<', - 'lte' => '<=', - ], - ]; - public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 865fa29..70cc649 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -4,6 +4,7 @@ use App\Entity\Tle; use App\Repository\TleRepository; +use App\ViewModel\Filter; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\JsonResponse; @@ -25,7 +26,8 @@ final class TleController extends AbstractApiController protected const FILTER_INCLINATION = 'inclination'; protected const COLLECTION_FILTERS = [ - self::FILTER_ECCENTRICITY => self::FILTER_TYPE_FLOAT, + self::FILTER_ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, + self::FILTER_INCLINATION => Filter::FILTER_TYPE_FLOAT, ]; public function __construct(protected TleRepository $repository) @@ -67,6 +69,7 @@ public function collection( ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + /** @var Filter[] $filters */ $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); $search = $request->get(self::SEARCH_PARAM); @@ -83,6 +86,18 @@ public function collection( $filters, ); + $parameters = [ + self::SEARCH_PARAM => $search ?? '*', + self::SORT_PARAM => $sort, + self::SORT_DIR_PARAM => $sortDir, + self::PAGE_PARAM => $this->getPage($request), + self::PAGE_SIZE_PARAM => $pageSize, + ]; + + foreach ($filters as $filter) { + $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; + } + return $this->response( [ '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', @@ -90,13 +105,7 @@ public function collection( '@type' => 'Collection', 'totalItems' => $collection->getTotal(), 'member' => $collection->getCollection(), - 'parameters' => [ - self::SEARCH_PARAM => $search ?? '*', - self::SORT_PARAM => $sort, - self::SORT_DIR_PARAM => $sortDir, - self::PAGE_PARAM => $this->getPage($request), - self::PAGE_SIZE_PARAM => $pageSize, - ], + 'parameters' => $parameters, 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), ] ); diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 8b712ce..676a3db 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -56,16 +56,12 @@ public function collection( $total = $this->getCount($builder); - if (!empty($filters)) { - foreach ($filters as $filter => $operators) { - $key = 0; - foreach ($operators as $operator => $value) { - $paramName = 'filter_' . $filter . '_' . $key; - $builder->andWhere(\sprintf('info.%s %s :%s', $filter, $operator, $paramName)); - $builder->setParameter($paramName, $value); - $key++; - } - } + $key = 0; + foreach ($filters as $filter) { + $paramName = 'filter_' . $filter->filter . '_' . $key; + $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $paramName)); + $builder->setParameter($paramName, $filter->value); + $key++; } // sort diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 73ee7ba..32214fd 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -2,6 +2,7 @@ namespace App\Service\Validator; +use App\ViewModel\Filter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -87,54 +88,10 @@ protected function assertFilter(Request $request, array $filters): array $values = $request->get($filter, []); foreach ($values as $operator => $value) { - $operator = $this->assertOperator($operator, $type, $filter); - $value = $this->assertValue($value, $type, $filter); - - $result[$filter][$operator] = $value; + $result[] = new Filter($filter, $type, $operator, $value); } } return $result; } - - protected function assertOperator(string $operator, string $type, string $filter): ?string - { - if ($type === self::FILTER_TYPE_FLOAT) { - $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; - if (!array_key_exists($operator, $operators)) { - throw new BadRequestHttpException( - \sprintf( - 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', - $filter, - implode(', ', array_keys($operators)), - $operator - ) - ); - } - - return $operators[$operator]; - } - - return null; - } - - /** - * @noinspection CallableParameterUseCaseInTypeContextInspection - */ - protected function assertValue(string $value, string $type, string $filter): mixed - { - if ($type === self::FILTER_TYPE_FLOAT) { - $value = (float)$value; - - if (!is_float($value)) { - throw new BadRequestHttpException( - \sprintf('Filter %s value should be %s', $filter, $type) - ); - } - - return $value; - } - - return null; - } } diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php new file mode 100644 index 0000000..fcb3483 --- /dev/null +++ b/src/ViewModel/Filter.php @@ -0,0 +1,78 @@ +'; + public const OPERATOR_GREATER_THEN_EQUAL = '>='; + public const OPERATOR_LESS_THEN = '<'; + public const OPERATOR_LESS_THEN_EQUAL = '<='; + public const REST_OPERATOR_GREATER_THEN = 'gt'; + public const REST_OPERATOR_GREATER_THEN_EQUAL = 'gte'; + public const REST_OPERATOR_LESS_THEN = 'lt'; + public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; + + public const FILTER_FLOAT_OPERATORS = [ + self::FILTER_TYPE_FLOAT => [ + self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, + self::REST_OPERATOR_GREATER_THEN_EQUAL => self::OPERATOR_GREATER_THEN_EQUAL, + self::REST_OPERATOR_LESS_THEN => self::OPERATOR_LESS_THEN, + self::REST_OPERATOR_LESS_THEN_EQUAL => self::OPERATOR_LESS_THEN_EQUAL, + ], + ]; + + public mixed $value; + public string $sqlOperator; + + public function __construct(public string $filter, public string $type, public string $operator, mixed $value) + { + $this->value = $this->validateValue($value); + $this->sqlOperator = $this->validateOperator(); + } + + protected function validateOperator(): string + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; + if (!array_key_exists($this->operator, $operators)) { + throw new BadRequestHttpException( + \sprintf( + 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', + $this->filter, + implode(', ', array_keys($operators)), + $this->operator + ) + ); + } + + return $operators[$this->operator]; + } + + return ''; + } + + /** + * @noinspection CallableParameterUseCaseInTypeContextInspection + */ + protected function validateValue(string $value): mixed + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $value = (float)$value; + + if (!is_float($value)) { + throw new \InvalidArgumentException( + \sprintf('Filter %s value should be %s', $this->filter, $this->type) + ); + } + + return $value; + } + + return null; + } +} From 68b2b806c0bf5b3106b978de4088e60950069709 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 14:01:00 +0200 Subject: [PATCH 082/151] add filters --- config/custom/tle.json | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index f84e61f..7efee55 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "TLE API", - "version": "1.3.0" + "version": "1.3.1" }, "servers": [ { @@ -74,6 +74,34 @@ }, { "$ref": "#/components/parameters/pageSize" + }, + { + "name": "eccentricity[gte]", + "in": "query", + "description": "Filter records with orbital eccentricity greater then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "eccentricity[lte]", + "in": "query", + "description": "Filter records with orbital eccentricity less then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "inclination[lt]", + "in": "query", + "description": "Filter records with orbital posigrade orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "inclination[gt]", + "in": "query", + "description": "Filter records with orbital retrograde orbital inclination", + "required": false, + "example": 90 } ], "responses": { From a3dabb5285005ee6b5b323c014a7b186c27b5553 Mon Sep 17 00:00:00 2001 From: Ivan Date: Fri, 2 Apr 2021 14:47:10 +0200 Subject: [PATCH 083/151] add sentry --- .env | 4 + composer.json | 1 + composer.lock | 1550 +++++++++++++++-- config/bundles.php | 1 + config/packages/sentry.yaml | 2 + config/services.yaml | 60 +- src/Command/TleCalculate.php | 134 +- src/Controller/StatisticsController.php | 132 +- .../Attributes/TleOneToOneReference.php | 52 +- src/Entity/Request.php | 136 +- src/Entity/TleInformation.php | 58 +- src/Repository/TleInformationRepository.php | 30 +- src/ViewModel/Filter.php | 156 +- symfony.lock | 66 + 14 files changed, 1904 insertions(+), 478 deletions(-) create mode 100644 config/packages/sentry.yaml diff --git a/.env b/.env index 5f55762..628129e 100644 --- a/.env +++ b/.env @@ -27,3 +27,7 @@ APP_SECRET=c165ffa974b09ac4d1bd06daf956753b # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###< doctrine/doctrine-bundle ### + +###> sentry/sentry-symfony ### +SENTRY_DSN= +###< sentry/sentry-symfony ### diff --git a/composer.json b/composer.json index e713a49..f89ed8c 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,7 @@ "beberlei/doctrineextensions": "^1.3", "ivanstan/tle-php": "^1.0.2", "myclabs/php-enum": "^1.7", + "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", "symfony/asset": "5.2.*", "symfony/browser-kit": "5.2.*", diff --git a/composer.lock b/composer.lock index 201e4fe..5add4c0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ac57924d16513118d6d09c51e69e22dc", + "content-hash": "4e878b0a0dd3d72e0cbc2f48d6e0e6c3", "packages": [ { "name": "beberlei/doctrineextensions", @@ -63,6 +63,72 @@ }, "time": "2020-11-29T07:37:23+00:00" }, + { + "name": "clue/stream-filter", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "reference": "aeb7d8ea49c7963d3b581378955dbf5bc49aa320", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2020-10-02T12:38:20+00:00" + }, { "name": "composer/package-versions-deprecated", "version": "1.11.99.1", @@ -1725,6 +1791,60 @@ }, "time": "2021-03-21T16:25:00+00:00" }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.4.2", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.5", + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/http-interop/http-factory-guzzle/issues", + "source": "https://github.com/http-interop/http-factory-guzzle/tree/master" + }, + "time": "2018-07-31T19:32:56+00:00" + }, { "name": "ivanstan/tle-php", "version": "1.0.3", @@ -1771,6 +1891,65 @@ }, "time": "2021-02-25T11:17:02+00:00" }, + { + "name": "jean85/pretty-package-versions", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", + "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A library to get pretty versions strings of installed dependencies", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "support": { + "issues": "https://github.com/Jean85/pretty-package-versions/issues", + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" + }, + "time": "2021-02-22T10:52:38+00:00" + }, { "name": "laminas/laminas-code", "version": "4.0.0", @@ -2127,31 +2306,54 @@ "time": "2021-02-15T16:11:48+00:00" }, { - "name": "psr/cache", - "version": "1.0.1", + "name": "php-http/client-common", + "version": "2.3.0", "source": { "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "url": "https://github.com/php-http/client-common.git", + "reference": "e37e46c610c87519753135fb893111798c69076a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-http/client-common/zipball/e37e46c610c87519753135fb893111798c69076a", + "reference": "e37e46c610c87519753135fb893111798c69076a", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "symfony/options-resolver": "^2.6 || ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpspec/phpspec": "^5.1 || ^6.0", + "phpspec/prophecy": "^1.10.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Cache\\": "src/" + "Http\\Client\\Common\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2160,42 +2362,64 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for caching libraries", + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", "keywords": [ - "cache", - "psr", - "psr-6" + "client", + "common", + "http", + "httplug" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.3.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2020-07-21T10:04:13+00:00" }, { - "name": "psr/container", - "version": "1.1.1", + "name": "php-http/discovery", + "version": "1.13.0", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "url": "https://github.com/php-http/discovery.git", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", + "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1", + "puli/composer-plugin": "1.0.0-beta10" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", + "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Http\\Discovery\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2204,51 +2428,60 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org", "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" ], "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.13.0" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2020-11-27T14:49:42+00:00" }, { - "name": "psr/event-dispatcher", - "version": "1.0.0", + "name": "php-http/httplug", + "version": "2.2.0", "source": { "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + "url": "https://github.com/php-http/httplug.git", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "url": "https://api.github.com/repos/php-http/httplug/zipball/191a0a1b41ed026b717421931f8d3bd2514ffbf9", + "reference": "191a0a1b41ed026b717421931f8d3bd2514ffbf9", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^5.1 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { "psr-4": { - "Psr\\EventDispatcher\\": "src/" + "Http\\Client\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2257,49 +2490,77 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "Standard interfaces for event handling.", + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", "keywords": [ - "events", - "psr", - "psr-14" + "client", + "http" ], "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/master" }, - "time": "2019-01-08T18:20:26+00:00" + "time": "2020-07-13T15:43:23+00:00" }, { - "name": "psr/http-message", - "version": "1.0.1", + "name": "php-http/message", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "url": "https://github.com/php-http/message.git", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", + "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", "shasum": "" }, "require": { - "php": ">=5.3.0" + "clue/stream-filter": "^1.5", + "php": "^7.1 || ^8.0", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "laminas/laminas-diactoros": "^2.0", + "phpspec/phpspec": "^5.1 || ^6.3", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { - "Psr\\Http\\Message\\": "src/" - } + "Http\\Message\\": "src/" + }, + "files": [ + "src/filters.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2307,51 +2568,50 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", "keywords": [ "http", - "http-message", - "psr", - "psr-7", - "request", - "response" + "message", + "psr-7" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.11.0" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2021-02-01T08:54:58+00:00" }, { - "name": "psr/log", - "version": "1.1.3", + "name": "php-http/message-factory", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.4", + "psr/http-message": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Http\\Message\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2360,25 +2620,442 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" } ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", "keywords": [ - "log", - "psr", - "psr-3" + "factory", + "http", + "message", + "stream", + "uri" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/master" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2015-12-19T14:08:53+00:00" }, { - "name": "ralouphie/getallheaders", - "version": "3.0.3", + "name": "php-http/promise", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2", + "phpspec/phpspec": "^5.1.2 || ^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.1.0" + }, + "time": "2020-07-07T09:29:14+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", @@ -2420,6 +3097,270 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "sentry/sdk", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "reference": "f03133b067fdf03fed09ff03daf3f1d68f5f3673", + "shasum": "" + }, + "require": { + "http-interop/http-factory-guzzle": "^1.0", + "sentry/sentry": "^3.1", + "symfony/http-client": "^4.3|^5.0" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended HTTP client.", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.1.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2020-12-01T10:31:45+00:00" + }, + { + "name": "sentry/sentry", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "899b0de58c1e01feb54829b3094af74252aff385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", + "reference": "899b0de58c1e01feb54829b3094af74252aff385", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7", + "jean85/pretty-package-versions": "^1.5|^2.0.1", + "php": "^7.2|^8.0", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.6.1", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "psr/http-factory": "^1.0", + "psr/http-message-implementation": "^1.0", + "psr/log": "^1.0", + "symfony/options-resolver": "^3.4.43|^4.4.11|^5.0.11", + "symfony/polyfill-php80": "^1.17", + "symfony/polyfill-uuid": "^1.13.1" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "http-interop/http-factory-guzzle": "^1.0", + "monolog/monolog": "^1.3|^2.0", + "nikic/php-parser": "^4.10.3", + "php-http/mock-client": "^1.3", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5.13|^9.4", + "symfony/phpunit-bridge": "^5.2", + "vimeo/psalm": "^4.2" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-php/issues", + "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T11:54:34+00:00" + }, + { + "name": "sentry/sentry-symfony", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-symfony.git", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "shasum": "" + }, + "require": { + "jean85/pretty-package-versions": "^1.5 || ^2.0", + "php": "^7.2||^8.0", + "php-http/discovery": "^1.11", + "sentry/sdk": "^3.1", + "symfony/config": "^3.4.43||^4.4.11||^5.0.11", + "symfony/console": "^3.4.43||^4.4.11||^5.0.11", + "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", + "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", + "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", + "symfony/psr-http-message-bridge": "^2.0", + "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "jangregor/phpstan-prophecy": "^0.8", + "monolog/monolog": "^1.3||^2.0", + "phpspec/prophecy": "!=1.11.0", + "phpspec/prophecy-phpunit": "^1.1||^2.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5||^9.0", + "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", + "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", + "symfony/messenger": "^4.4.11||^5.0.11", + "symfony/monolog-bundle": "^3.4", + "symfony/phpunit-bridge": "^5.0", + "symfony/polyfill-php80": "^1.22", + "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", + "vimeo/psalm": "^4.3" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev", + "releases/3.2.x": "3.2.x-dev", + "releases/2.x": "2.x-dev", + "releases/1.x": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/aliases.php" + ], + "psr-4": { + "Sentry\\SentryBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "David Cramer", + "email": "dcramer@gmail.com" + }, + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "Symfony integration for Sentry (http://getsentry.com)", + "homepage": "http://getsentry.com", + "keywords": [ + "errors", + "logging", + "sentry", + "symfony" + ], + "support": { + "issues": "https://github.com/getsentry/sentry-symfony/issues", + "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" + }, + "funding": [ + { + "url": "https://sentry.io/", + "type": "custom" + }, + { + "url": "https://sentry.io/pricing/", + "type": "custom" + } + ], + "time": "2021-03-03T16:05:24+00:00" + }, { "name": "symfony/apache-pack", "version": "v1.0.1", @@ -3967,7 +4908,93 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" + "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-09T08:47:49+00:00" + }, + { + "name": "symfony/http-client", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/3c3075467da15bc2edf38d2ac20d34719e794bd8", + "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/http-client-contracts": "^2.2", + "symfony/polyfill-php73": "^1.11", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.0|^2" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "2.2" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/http-kernel": "^4.4.13|^5.1.5", + "symfony/process": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-client/tree/v5.2.6" }, "funding": [ { @@ -3983,7 +5010,7 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" + "time": "2021-03-28T09:42:18+00:00" }, { "name": "symfony/http-client-contracts", @@ -4412,6 +5439,75 @@ ], "time": "2021-03-31T07:20:47+00:00" }, + { + "name": "symfony/options-resolver", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T12:56:27+00:00" + }, { "name": "symfony/orm-pack", "version": "v1.1.0", @@ -4952,6 +6048,173 @@ ], "time": "2021-01-07T16:49:33+00:00" }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-22T09:19:47+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/81db2d4ae86e9f0049828d9343a72b9523884e5d", + "reference": "81db2d4ae86e9f0049828d9343a72b9523884e5d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0", + "symfony/http-foundation": "^4.4 || ^5.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1", + "symfony/browser-kit": "^4.4 || ^5.0", + "symfony/config": "^4.4 || ^5.0", + "symfony/event-dispatcher": "^4.4 || ^5.0", + "symfony/framework-bundle": "^4.4 || ^5.0", + "symfony/http-kernel": "^4.4 || ^5.0", + "symfony/phpunit-bridge": "^4.4.19 || ^5.2" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-17T10:35:25+00:00" + }, { "name": "symfony/routing", "version": "v5.2.4", @@ -5042,6 +6305,95 @@ ], "time": "2021-02-22T15:48:39+00:00" }, + { + "name": "symfony/security-core", + "version": "v5.2.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/9dcedab1c2c637fc9a377b3a9313a61087609760", + "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/event-dispatcher": "<4.4", + "symfony/ldap": "<4.4", + "symfony/security-guard": "<4.4", + "symfony/validator": "<5.2" + }, + "require-dev": { + "psr/container": "^1.0|^2.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/ldap": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/validator": "^5.2" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v5.2.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-10T22:10:15+00:00" + }, { "name": "symfony/serializer", "version": "v5.2.4", diff --git a/config/bundles.php b/config/bundles.php index b10047b..ec6d32d 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,4 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], + Sentry\SentryBundle\SentryBundle::class => ['all' => true], ]; diff --git a/config/packages/sentry.yaml b/config/packages/sentry.yaml new file mode 100644 index 0000000..342036f --- /dev/null +++ b/config/packages/sentry.yaml @@ -0,0 +1,2 @@ +sentry: + dsn: '%env(SENTRY_DSN)%' diff --git a/config/services.yaml b/config/services.yaml index 6a1b3f7..3235b01 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -1,30 +1,30 @@ -# This file is the entry point to configure your own services. -# Files in the packages/ subdirectory configure your dependencies. - -# Put parameters here that don't need to change on each machine where the app is deployed -# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration -parameters: - -services: - # default configuration for services in *this* file - _defaults: - autowire: true # Automatically injects dependencies in your services. - autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. - - # makes classes in src/ available to be used as services - # this creates a service per class whose id is the fully-qualified class name - App\: - resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' - bind: - $env: '%kernel.environment%' - $projectDir: "%kernel.project_dir%" - - # controllers are imported separately to make sure services can be injected - # as action arguments even if you don't extend any base controller class - App\Controller\: - resource: '../src/Controller' - tags: ['controller.service_arguments'] - - # add more service definitions when explicit configuration is needed - # please note that last definitions always *replace* previous ones +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + bind: + $env: '%kernel.environment%' + $projectDir: "%kernel.project_dir%" + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index f12ebe5..fb0f190 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -1,67 +1,67 @@ -setDescription('Calculate and persist data in TleInformation entity'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $builder = $this->entityManager - ->createQueryBuilder() - ->select('tle') - ->from(Tle::class, 'tle'); - - $repository = $this->entityManager->getRepository(TleInformation::class); - - /** @var Tle $tle */ - foreach ($builder->getQuery()->toIterable() as $i => $tle) { - $exists = true; - - $tleInformation = $repository->find($tle->getId()); - - if ($tleInformation === null) { - $exists = false; - $tleInformation = new TleInformation($tle); - } - - $tleModel = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); - - $tleInformation->inclination = $tleModel->getInclination(); - $tleInformation->eccentricity = $tleModel->eccentricity(); - - if (!$exists) { - $this->entityManager->persist($tleInformation); - } - - if (($i % self::BATCH_SIZE) === 0) { - $this->entityManager->flush(); - $this->entityManager->clear(); - } - } - - $this->entityManager->flush(); - - return Command::SUCCESS; - } -} +setDescription('Calculate and persist data in TleInformation entity'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $builder = $this->entityManager + ->createQueryBuilder() + ->select('tle') + ->from(Tle::class, 'tle'); + + $repository = $this->entityManager->getRepository(TleInformation::class); + + /** @var Tle $tle */ + foreach ($builder->getQuery()->toIterable() as $i => $tle) { + $exists = true; + + $tleInformation = $repository->find($tle->getId()); + + if ($tleInformation === null) { + $exists = false; + $tleInformation = new TleInformation($tle); + } + + $tleModel = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); + + $tleInformation->inclination = $tleModel->getInclination(); + $tleInformation->eccentricity = $tleModel->eccentricity(); + + if (!$exists) { + $this->entityManager->persist($tleInformation); + } + + if (($i % self::BATCH_SIZE) === 0) { + $this->entityManager->flush(); + $this->entityManager->clear(); + } + } + + $this->entityManager->flush(); + + return Command::SUCCESS; + } +} diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 56edda4..79880e4 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -1,66 +1,66 @@ -setTime(0, 0, 0); - $newerThan->modify('-3 days'); - - $qb = $em->createQueryBuilder(); - - $qb->select( - [ - 'DATE_FORMAT(r.createdAt, \'%Y-%m-%d\') as date', - 'ROUND(CAST(DATE_FORMAT(r.createdAt, \'%H\') AS UNSIGNED) / :interval) as hour', - 'COUNT(r.id) as hits', - ] - ); - - $qb - ->from(Request::class, 'r') - ->where('r.createdAt > :newerThan') - ->setParameter('newerThan', $newerThan) - ->groupBy('date, hour') - ->setParameter('interval', self::INTERVAL); - - $result = $qb->getQuery()->getResult(); - - $response = []; - foreach ($result as $key => &$item) { - if ($item['hour'] === "0") { - $previousKey = $key - 1; - if (isset($result[$previousKey])) { - $result[$previousKey]['hits'] = $item['hits']; - } - - unset($result[$key]); - } - - $date = new \DateTime($item['date']); - $date->setTime((int)$item['hour'] * self::INTERVAL, 0); - - $response[$date->format('c')] = $item['hits']; - } - - return new JsonResponse( - $response, - Response::HTTP_OK, - self::CORS_HEADERS, - ); - } -} +setTime(0, 0, 0); + $newerThan->modify('-3 days'); + + $qb = $em->createQueryBuilder(); + + $qb->select( + [ + 'DATE_FORMAT(r.createdAt, \'%Y-%m-%d\') as date', + 'ROUND(CAST(DATE_FORMAT(r.createdAt, \'%H\') AS UNSIGNED) / :interval) as hour', + 'COUNT(r.id) as hits', + ] + ); + + $qb + ->from(Request::class, 'r') + ->where('r.createdAt > :newerThan') + ->setParameter('newerThan', $newerThan) + ->groupBy('date, hour') + ->setParameter('interval', self::INTERVAL); + + $result = $qb->getQuery()->getResult(); + + $response = []; + foreach ($result as $key => &$item) { + if ($item['hour'] === "0") { + $previousKey = $key - 1; + if (isset($result[$previousKey])) { + $result[$previousKey]['hits'] = $item['hits']; + } + + unset($result[$key]); + } + + $date = new \DateTime($item['date']); + $date->setTime((int)$item['hour'] * self::INTERVAL, 0); + + $response[$date->format('c')] = $item['hits']; + } + + return new JsonResponse( + $response, + Response::HTTP_OK, + self::CORS_HEADERS, + ); + } +} diff --git a/src/Entity/Attributes/TleOneToOneReference.php b/src/Entity/Attributes/TleOneToOneReference.php index 6dd34a4..3b2dcda 100644 --- a/src/Entity/Attributes/TleOneToOneReference.php +++ b/src/Entity/Attributes/TleOneToOneReference.php @@ -1,26 +1,26 @@ -tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } -} +tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } +} diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 3be4d0c..549ffad 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -1,68 +1,68 @@ -createdAt = DateTimeService::getCurrentUTC(); - } - - public function getTle(): Tle - { - return $this->tle; - } - - public function setTle(Tle $tle): void - { - $this->tle = $tle; - } - - public function getIp(): string - { - return $this->ip; - } - - public function setIp(string $ip): void - { - $this->ip = $ip; - } -} +createdAt = DateTimeService::getCurrentUTC(); + } + + public function getTle(): Tle + { + return $this->tle; + } + + public function setTle(Tle $tle): void + { + $this->tle = $tle; + } + + public function getIp(): string + { + return $this->ip; + } + + public function setIp(string $ip): void + { + $this->ip = $ip; + } +} diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 347bd31..0f55c69 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -1,29 +1,29 @@ -tle = $tle; - } -} +tle = $tle; + } +} diff --git a/src/Repository/TleInformationRepository.php b/src/Repository/TleInformationRepository.php index daea987..1cd77e7 100644 --- a/src/Repository/TleInformationRepository.php +++ b/src/Repository/TleInformationRepository.php @@ -1,15 +1,15 @@ -'; - public const OPERATOR_GREATER_THEN_EQUAL = '>='; - public const OPERATOR_LESS_THEN = '<'; - public const OPERATOR_LESS_THEN_EQUAL = '<='; - public const REST_OPERATOR_GREATER_THEN = 'gt'; - public const REST_OPERATOR_GREATER_THEN_EQUAL = 'gte'; - public const REST_OPERATOR_LESS_THEN = 'lt'; - public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; - - public const FILTER_FLOAT_OPERATORS = [ - self::FILTER_TYPE_FLOAT => [ - self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, - self::REST_OPERATOR_GREATER_THEN_EQUAL => self::OPERATOR_GREATER_THEN_EQUAL, - self::REST_OPERATOR_LESS_THEN => self::OPERATOR_LESS_THEN, - self::REST_OPERATOR_LESS_THEN_EQUAL => self::OPERATOR_LESS_THEN_EQUAL, - ], - ]; - - public mixed $value; - public string $sqlOperator; - - public function __construct(public string $filter, public string $type, public string $operator, mixed $value) - { - $this->value = $this->validateValue($value); - $this->sqlOperator = $this->validateOperator(); - } - - protected function validateOperator(): string - { - if ($this->type === self::FILTER_TYPE_FLOAT) { - $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; - if (!array_key_exists($this->operator, $operators)) { - throw new BadRequestHttpException( - \sprintf( - 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', - $this->filter, - implode(', ', array_keys($operators)), - $this->operator - ) - ); - } - - return $operators[$this->operator]; - } - - return ''; - } - - /** - * @noinspection CallableParameterUseCaseInTypeContextInspection - */ - protected function validateValue(string $value): mixed - { - if ($this->type === self::FILTER_TYPE_FLOAT) { - $value = (float)$value; - - if (!is_float($value)) { - throw new \InvalidArgumentException( - \sprintf('Filter %s value should be %s', $this->filter, $this->type) - ); - } - - return $value; - } - - return null; - } -} +'; + public const OPERATOR_GREATER_THEN_EQUAL = '>='; + public const OPERATOR_LESS_THEN = '<'; + public const OPERATOR_LESS_THEN_EQUAL = '<='; + public const REST_OPERATOR_GREATER_THEN = 'gt'; + public const REST_OPERATOR_GREATER_THEN_EQUAL = 'gte'; + public const REST_OPERATOR_LESS_THEN = 'lt'; + public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; + + public const FILTER_FLOAT_OPERATORS = [ + self::FILTER_TYPE_FLOAT => [ + self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, + self::REST_OPERATOR_GREATER_THEN_EQUAL => self::OPERATOR_GREATER_THEN_EQUAL, + self::REST_OPERATOR_LESS_THEN => self::OPERATOR_LESS_THEN, + self::REST_OPERATOR_LESS_THEN_EQUAL => self::OPERATOR_LESS_THEN_EQUAL, + ], + ]; + + public mixed $value; + public string $sqlOperator; + + public function __construct(public string $filter, public string $type, public string $operator, mixed $value) + { + $this->value = $this->validateValue($value); + $this->sqlOperator = $this->validateOperator(); + } + + protected function validateOperator(): string + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $operators = self::FILTER_FLOAT_OPERATORS[self::FILTER_TYPE_FLOAT]; + if (!array_key_exists($this->operator, $operators)) { + throw new BadRequestHttpException( + \sprintf( + 'Operator for filter \'%s\' should be one of the following %s, \'%s\' provided', + $this->filter, + implode(', ', array_keys($operators)), + $this->operator + ) + ); + } + + return $operators[$this->operator]; + } + + return ''; + } + + /** + * @noinspection CallableParameterUseCaseInTypeContextInspection + */ + protected function validateValue(string $value): mixed + { + if ($this->type === self::FILTER_TYPE_FLOAT) { + $value = (float)$value; + + if (!is_float($value)) { + throw new \InvalidArgumentException( + \sprintf('Filter %s value should be %s', $this->filter, $this->type) + ); + } + + return $value; + } + + return null; + } +} diff --git a/symfony.lock b/symfony.lock index 467554c..373001a 100644 --- a/symfony.lock +++ b/symfony.lock @@ -2,6 +2,9 @@ "beberlei/doctrineextensions": { "version": "v1.3.0" }, + "clue/stream-filter": { + "version": "v1.5.0" + }, "doctrine/annotations": { "version": "1.0", "recipe": { @@ -102,12 +105,18 @@ "guzzlehttp/psr7": { "version": "1.6.1" }, + "http-interop/http-factory-guzzle": { + "version": "1.0.0" + }, "ivanstan/tle-php": { "version": "1.0" }, "jdorn/sql-formatter": { "version": "v1.2.17" }, + "jean85/pretty-package-versions": { + "version": "2.0.3" + }, "laminas/laminas-code": { "version": "3.4.1" }, @@ -144,6 +153,24 @@ "php": { "version": "7.4" }, + "php-http/client-common": { + "version": "2.3.0" + }, + "php-http/discovery": { + "version": "1.13.0" + }, + "php-http/httplug": { + "version": "2.2.0" + }, + "php-http/message": { + "version": "1.11.0" + }, + "php-http/message-factory": { + "version": "v1.0.2" + }, + "php-http/promise": { + "version": "1.1.0" + }, "psr/cache": { "version": "1.0.1" }, @@ -153,6 +180,12 @@ "psr/event-dispatcher": { "version": "1.0.0" }, + "psr/http-client": { + "version": "1.0.1" + }, + "psr/http-factory": { + "version": "1.0.1" + }, "psr/http-message": { "version": "1.0.1" }, @@ -165,6 +198,24 @@ "roave/security-advisories": { "version": "dev-master" }, + "sentry/sdk": { + "version": "3.1.0" + }, + "sentry/sentry": { + "version": "3.2.0" + }, + "sentry/sentry-symfony": { + "version": "3.0", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "3.0", + "ref": "9746f0823302d7980e5273ef7a69ef3f5ac80914" + }, + "files": [ + "config/packages/sentry.yaml" + ] + }, "symfony/apache-pack": { "version": "1.0", "recipe": { @@ -270,6 +321,9 @@ "src/Kernel.php" ] }, + "symfony/http-client": { + "version": "v5.2.6" + }, "symfony/http-client-contracts": { "version": "v2.3.1" }, @@ -297,6 +351,9 @@ "config/packages/test/monolog.yaml" ] }, + "symfony/options-resolver": { + "version": "v5.2.4" + }, "symfony/orm-pack": { "version": "v1.0.7" }, @@ -334,6 +391,12 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, + "symfony/polyfill-uuid": { + "version": "v1.22.1" + }, + "symfony/psr-http-message-bridge": { + "version": "v2.1.0" + }, "symfony/routing": { "version": "4.2", "recipe": { @@ -348,6 +411,9 @@ "config/routes.yaml" ] }, + "symfony/security-core": { + "version": "v5.2.6" + }, "symfony/serializer": { "version": "v5.0.2" }, From 341c7ebec3fef3d09ea60d43dfe37aaf2f986062 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 16:57:34 +0200 Subject: [PATCH 084/151] response --- src/Controller/AbstractApiController.php | 9 ++++--- src/Controller/TleController.php | 33 +++++++++++------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 645d8e1..96d3a40 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -4,6 +4,7 @@ use App\Service\Validator\RequestValidator; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -125,12 +126,12 @@ public function getPagination(Request $request, int $total, int $pageSize): arra return $result; } - public function response($response): Response + public function response(array $data): Response { - return new Response( - $this->serializer->serialize($response, 'json'), + return new JsonResponse( + $data, Response::HTTP_OK, - self::CORS_HEADERS + self::CORS_HEADERS, ); } } diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 70cc649..1c42bc1 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -50,16 +50,15 @@ public function record( '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', ]; - return new JsonResponse( + return $this->response( array_merge($data, $normalizer->normalize($tle)), - Response::HTTP_OK, - self::CORS_HEADERS, ); } #[Route("/", name: "tle_collection")] public function collection( - Request $request + Request $request, + NormalizerInterface $normalizer ): Response { $this ->assertParamIsInteger($request, self::PAGE_PARAM) @@ -98,16 +97,18 @@ public function collection( $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; } + $response = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), + '@type' => 'Collection', + 'totalItems' => $collection->getTotal(), + 'member' => $collection->getCollection(), + 'parameters' => $parameters, + 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), + ]; + return $this->response( - [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', - '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => $collection->getTotal(), - 'member' => $collection->getCollection(), - 'parameters' => $parameters, - 'view' => $this->getPagination($request, $collection->getTotal(), $pageSize), - ] + $normalizer->normalize($response) ); } @@ -136,10 +137,6 @@ public function popular( ], ]; - return new JsonResponse( - $data, - Response::HTTP_OK, - self::CORS_HEADERS, - ); + return $this->response($data); } } From 0a1d5ac18db1e4b2cf1f72bb298aca82b7eacf99 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 21:17:14 +0200 Subject: [PATCH 085/151] add sentry frontend --- src/Serializer/TleModelNormalizer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 7134a94..8696825 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -14,13 +14,13 @@ public function __construct(private UrlGeneratorInterface $router) } /** - * @param $entity + * @param Tle $entity * @param string|null $format * @param array $context * * @return array */ - public function normalize($entity, string $format = null, array $context = []) + public function normalize($entity, ?string $format = null, array $context = []): array { $id = $this->router->generate('tle_record', ['id' => $entity->getId()], UrlGeneratorInterface::ABSOLUTE_URL); From 1d0556d012bd9bbc43eb7d32ad252fecd5f85419 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 2 Apr 2021 22:06:33 +0200 Subject: [PATCH 086/151] add tle extra --- src/Controller/TleController.php | 24 +++++++++++++++------- src/Entity/Tle.php | 10 +++++++++ src/Repository/TleRepository.php | 19 +++++++++-------- src/Serializer/TleModelNormalizer.php | 18 +++++++++++++++- src/Service/Validator/RequestValidator.php | 16 +++++++++++++++ src/ViewModel/Filter.php | 5 +++++ 6 files changed, 75 insertions(+), 17 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 1c42bc1..b6c94fd 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -7,7 +7,6 @@ use App\ViewModel\Filter; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; -use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -22,8 +21,10 @@ final class TleController extends AbstractApiController protected const PAGE_SIZE = 20; - protected const FILTER_ECCENTRICITY = 'eccentricity'; - protected const FILTER_INCLINATION = 'inclination'; + public const FILTER_ECCENTRICITY = 'eccentricity'; + public const FILTER_INCLINATION = 'inclination'; + + public const PARAM_EXTRA = 'extra'; protected const COLLECTION_FILTERS = [ self::FILTER_ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, @@ -37,8 +38,13 @@ public function __construct(protected TleRepository $repository) #[Route("/{id}", name: "tle_record", requirements: ["id" => "\d+"])] public function record( int $id, - NormalizerInterface $normalizer + NormalizerInterface $normalizer, + Request $request, ): Response { + $this->assertParamIsBoolean($request, self::PARAM_EXTRA); + + $extra = (bool)$request->get(self::PARAM_EXTRA, false); + /** @var Tle $tle */ $tle = $this->repository->findOneBy(['id' => $id]); @@ -51,7 +57,7 @@ public function record( ]; return $this->response( - array_merge($data, $normalizer->normalize($tle)), + array_merge($data, $normalizer->normalize($tle, null, [self::PARAM_EXTRA => $extra])), ); } @@ -67,7 +73,11 @@ public function collection( ->assertParamIsGreaterThan($request, self::PAGE_SIZE_PARAM, 0) ->assertParamIsLessThan($request, self::PAGE_SIZE_PARAM, self::MAX_PAGE_SIZE) ->assertParamInEnum($request, self::SORT_DIR_PARAM, SortDirectionEnum::toArray()) - ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()); + ->assertParamInEnum($request, self::SORT_PARAM, TleCollectionSortableFieldsEnum::toArray()) + ->assertParamIsBoolean($request, self::PARAM_EXTRA); + + $extra = (bool)$request->get(self::PARAM_EXTRA, false); + /** @var Filter[] $filters */ $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); @@ -108,7 +118,7 @@ public function collection( ]; return $this->response( - $normalizer->normalize($response) + $normalizer->normalize($response, null, [self::PARAM_EXTRA => $extra]) ); } diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 1fc8f78..2fa9441 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -7,6 +7,7 @@ use App\Field\TleField; use App\Service\DateTimeService; use Doctrine\ORM\Mapping as ORM; +use Doctrine\ORM\Mapping\OneToOne; /** * @ORM\Entity(repositoryClass="App\Repository\TleRepository") @@ -18,6 +19,11 @@ class Tle use NameField; use TleField; + /** + * @OneToOne(targetEntity="TleInformation", mappedBy="tle") + */ + private $info; + /** * @ORM\Column(name="updated_at", type="datetime") */ @@ -31,4 +37,8 @@ public function update(): void { $this->updatedAt = DateTimeService::getCurrentUTC(); } + + public function getInfo(): TleInformation { + return $this->info; + } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 676a3db..454dd94 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -24,7 +24,7 @@ public function __construct(ManagerRegistry $registry) /** * @return Tle[]|Collection */ - public function fetchAllIndexed() + public function fetchAllIndexed(): array|Collection { return $this->createQueryBuilder('tle', 'tle.id') ->getQuery() @@ -40,6 +40,8 @@ public function collection( array $filters, ): PaginationCollection { $builder = $this->createQueryBuilder('tle'); + + $builder->select('tle'); $builder->leftJoin(TleInformation::class, 'info', Expr\Join::WITH, 'info.tle = tle.id'); // search @@ -54,16 +56,15 @@ public function collection( ->setParameter('search', '%' . $search . '%'); } - $total = $this->getCount($builder); - - $key = 0; - foreach ($filters as $filter) { - $paramName = 'filter_' . $filter->filter . '_' . $key; - $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $paramName)); - $builder->setParameter($paramName, $filter->value); - $key++; + // filters + foreach ($filters as $index => $filter) { + $placeholder = \sprintf('filter_%s_%d', $filter->filter, $index); + $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $placeholder)); + $builder->setParameter($placeholder, $filter->value); } + $total = $this->getCount($builder); + // sort if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 8696825..b9e7c2b 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -2,6 +2,7 @@ namespace App\Serializer; +use App\Controller\TleController; use App\Entity\Tle; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -26,7 +27,9 @@ public function normalize($entity, ?string $format = null, array $context = []): $model = new TleModel($entity->getLine1(), $entity->getLine2(), $entity->getName()); - return [ + $isExtra = ($context[TleController::PARAM_EXTRA] ?? null) === true; + + $normalized = [ '@id' => $id, '@type' => 'TleModel', 'satelliteId' => $model->getId(), @@ -35,6 +38,19 @@ public function normalize($entity, ?string $format = null, array $context = []): 'line1' => $model->getLine1(), 'line2' => $model->getLine2(), ]; + + if ($isExtra) { + $extra = [ + 'extra' => [ + TleController::FILTER_ECCENTRICITY => $entity->getInfo()->eccentricity, + TleController::FILTER_INCLINATION => $entity->getInfo()->inclination, + ], + ]; + + $normalized = array_merge($normalized, $extra); + } + + return $normalized; } public function supportsNormalization($data, string $format = null): bool diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 32214fd..14d3519 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -8,6 +8,22 @@ trait RequestValidator { + protected function assertParamIsBoolean(Request $request, string $name): self { + $param = $request->get($name); + + if ($param === null) { + return $this; + } + + if (!in_array($param, Filter::BOOLEAN_VALUES, true)) { + throw new BadRequestHttpException( + \sprintf('Parameter \'%s\' must be boolean. Supported values are %s.', $name, implode(' or ', Filter::BOOLEAN_VALUES)) + ); + } + + return $this; + } + protected function assertParamIsInteger(Request $request, string $name): self { $param = (int)$request->get($name); diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php index e23e192..4ad6d43 100644 --- a/src/ViewModel/Filter.php +++ b/src/ViewModel/Filter.php @@ -17,6 +17,11 @@ class Filter public const REST_OPERATOR_LESS_THEN = 'lt'; public const REST_OPERATOR_LESS_THEN_EQUAL = 'lte'; + public const BOOLEAN_VALUES = [ + '1', + '0', + ]; + public const FILTER_FLOAT_OPERATORS = [ self::FILTER_TYPE_FLOAT => [ self::REST_OPERATOR_GREATER_THEN => self::OPERATOR_GREATER_THEN, From a189a35ff2c5351b3dfabb5343dfa39a3f0bc09a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 3 Apr 2021 14:23:20 +0200 Subject: [PATCH 087/151] add logos to deploy --- deploy.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deploy.php b/deploy.php index debfba5..4c7b8a7 100644 --- a/deploy.php +++ b/deploy.php @@ -18,6 +18,8 @@ 'public/asset-manifest.json', 'public/favicon.ico', 'public/index.html', + 'public/logo192.png', + 'public/logo512.png', ]); add('shared_dirs', [ 'var', From 28408cd5b0bee5d93ef338b9c51329d0718f48a1 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 19 Apr 2021 20:32:44 +0200 Subject: [PATCH 088/151] add sort by inclination and eccentricity --- src/Repository/TleRepository.php | 13 ++++++++++++- src/ViewModel/TleCollectionSortableFieldsEnum.php | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 454dd94..83107b9 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -70,7 +70,7 @@ public function collection( $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); $builder->addOrderBy('s.hits', $sortDir); } else { - $builder->addOrderBy('tle.' . $sort, $sortDir); + $builder->addOrderBy($this->getSortTableColumnMapping($sort), $sortDir); } // limit @@ -110,4 +110,15 @@ private function getCount(QueryBuilder $builder): int return $builder->getQuery()->getSingleScalarResult(); } + + private function getSortTableColumnMapping(string $sort) + { + return match ($sort) { + TleCollectionSortableFieldsEnum::ID => 'tle.id', + TleCollectionSortableFieldsEnum::NAME => 'tle.name', + TleCollectionSortableFieldsEnum::POPULARITY => null, + TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', + TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', + }; + } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index 6ba0f01..b573e33 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -9,4 +9,6 @@ class TleCollectionSortableFieldsEnum extends Enum public const ID = 'id'; public const NAME = 'name'; public const POPULARITY = 'popularity'; + public const INCLINATION = 'inclination'; + public const ECCENTRICITY = 'eccentricity'; } From 365a97fad7e02efa400f81334ebdd612312db39f Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 19 Apr 2021 20:33:00 +0200 Subject: [PATCH 089/151] add sort by inclination and eccentricity --- src/Repository/TleRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 83107b9..6d5d1e2 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -111,7 +111,7 @@ private function getCount(QueryBuilder $builder): int return $builder->getQuery()->getSingleScalarResult(); } - private function getSortTableColumnMapping(string $sort) + private function getSortTableColumnMapping(string $sort): ?string { return match ($sort) { TleCollectionSortableFieldsEnum::ID => 'tle.id', From 7c16306b5d961e2b613a474e0b636a4afe1ac61a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 10:46:53 +0200 Subject: [PATCH 090/151] add inclination filter --- composer.json | 29 +- composer.lock | 216 +++- lib/predict/Predict.php | 864 ++++++++++++++++ lib/predict/Predict/DeepArg.php | 35 + lib/predict/Predict/DeepStatic.php | 83 ++ lib/predict/Predict/Exception.php | 5 + lib/predict/Predict/Geodetic.php | 13 + lib/predict/Predict/Math.php | 194 ++++ lib/predict/Predict/ObsSet.php | 12 + lib/predict/Predict/Pass.php | 18 + lib/predict/Predict/PassDetail.php | 35 + lib/predict/Predict/QTH.php | 20 + lib/predict/Predict/SGPObs.php | 149 +++ lib/predict/Predict/SGPSDP.php | 1055 ++++++++++++++++++++ lib/predict/Predict/SGSDPStatic.php | 39 + lib/predict/Predict/Sat.php | 310 ++++++ lib/predict/Predict/Solar.php | 106 ++ lib/predict/Predict/TLE.php | 230 +++++ lib/predict/Predict/Time.php | 229 +++++ lib/predict/Predict/Vector.php | 13 + lib/predict/examples/benchmark.php | 57 ++ lib/predict/examples/findsun.php | 31 + lib/predict/examples/iss.tle | 3 + lib/predict/examples/solar_position.php | 44 + lib/predict/examples/visible_passes.php | 74 ++ lib/predict/tests/Table.php | 893 +++++++++++++++++ lib/predict/tests/test-001.php | 133 +++ lib/predict/tests/test-001.tle | 3 + lib/predict/tests/test-002.php | 135 +++ lib/predict/tests/test-002.tle | 4 + src/Controller/AbstractApiController.php | 2 + src/Controller/PropagateController.php | 77 ++ src/Serializer/ObserverNormalizer.php | 39 + src/Serializer/SatellitePassNormalizer.php | 49 + src/ViewModel/LatLng.php | 41 + src/ViewModel/Observer.php | 15 + symfony.lock | 6 + 37 files changed, 5244 insertions(+), 17 deletions(-) create mode 100644 lib/predict/Predict.php create mode 100644 lib/predict/Predict/DeepArg.php create mode 100644 lib/predict/Predict/DeepStatic.php create mode 100644 lib/predict/Predict/Exception.php create mode 100644 lib/predict/Predict/Geodetic.php create mode 100644 lib/predict/Predict/Math.php create mode 100644 lib/predict/Predict/ObsSet.php create mode 100644 lib/predict/Predict/Pass.php create mode 100644 lib/predict/Predict/PassDetail.php create mode 100644 lib/predict/Predict/QTH.php create mode 100644 lib/predict/Predict/SGPObs.php create mode 100644 lib/predict/Predict/SGPSDP.php create mode 100644 lib/predict/Predict/SGSDPStatic.php create mode 100644 lib/predict/Predict/Sat.php create mode 100644 lib/predict/Predict/Solar.php create mode 100644 lib/predict/Predict/TLE.php create mode 100644 lib/predict/Predict/Time.php create mode 100644 lib/predict/Predict/Vector.php create mode 100644 lib/predict/examples/benchmark.php create mode 100644 lib/predict/examples/findsun.php create mode 100644 lib/predict/examples/iss.tle create mode 100644 lib/predict/examples/solar_position.php create mode 100644 lib/predict/examples/visible_passes.php create mode 100644 lib/predict/tests/Table.php create mode 100644 lib/predict/tests/test-001.php create mode 100644 lib/predict/tests/test-001.tle create mode 100644 lib/predict/tests/test-002.php create mode 100644 lib/predict/tests/test-002.tle create mode 100644 src/Controller/PropagateController.php create mode 100644 src/Serializer/ObserverNormalizer.php create mode 100644 src/Serializer/SatellitePassNormalizer.php create mode 100644 src/ViewModel/LatLng.php create mode 100644 src/ViewModel/Observer.php diff --git a/composer.json b/composer.json index f89ed8c..75a8902 100644 --- a/composer.json +++ b/composer.json @@ -1,4 +1,6 @@ { + "name": "ivanstan/tle-backend", + "description": "TLE API backend", "type": "project", "license": "proprietary", "require": { @@ -21,11 +23,12 @@ "symfony/framework-bundle": "5.2.*", "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", + "symfony/property-access": "5.2.*", "symfony/serializer": "5.2.*", "symfony/yaml": "5.2.*" }, "require-dev": { - "roave/security-advisories": "dev-master", + "roave/security-advisories": "dev-latest", "doctrine/doctrine-fixtures-bundle": "^3.1", "symfony/phpunit-bridge": "^5.2" }, @@ -44,7 +47,29 @@ "autoload-dev": { "psr-4": { "App\\Tests\\": "tests/" - } + }, + "files": [ + "lib/predict/Predict.php", + "lib/predict/Predict/Time.php", + "lib/predict/Predict/Math.php", + "lib/predict/Predict/Pass.php", + "lib/predict/Predict/PassDetail.php", + "lib/predict/Predict/Vector.php", + "lib/predict/Predict/Geodetic.php", + "lib/predict/Predict/ObsSet.php", + "lib/predict/Predict/Solar.php", + "lib/predict/Predict/SGPObs.php", + "lib/predict/Predict/SGPSDP.php", + "lib/predict/Predict.php", + "lib/predict/Predict/Sat.php", + "lib/predict/Predict/QTH.php", + "lib/predict/Predict/Time.php", + "lib/predict/Predict/TLE.php", + "lib/predict/Predict/SGSDPStatic.php", + "lib/predict/Predict/SGSDPStatic.php", + "lib/predict/Predict/DeepArg.php", + "lib/predict/Predict/DeepStatic.php" + ] }, "replace": { "paragonie/random_compat": "2.*", diff --git a/composer.lock b/composer.lock index 5add4c0..0909423 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4e878b0a0dd3d72e0cbc2f48d6e0e6c3", + "content-hash": "e0bbf162f1ab7711762d6c0e7c9c710c", "packages": [ { "name": "beberlei/doctrineextensions", @@ -6127,6 +6127,177 @@ ], "time": "2021-01-22T09:19:47+00:00" }, + { + "name": "symfony/property-access", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3", + "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/property-info": "^5.2" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T10:15:41+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15", + "symfony/string": "^5.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/cache": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.2.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-17T15:24:54+00:00" + }, { "name": "symfony/psr-http-message-bridge", "version": "v2.1.0", @@ -7118,16 +7289,16 @@ }, { "name": "roave/security-advisories", - "version": "dev-master", + "version": "dev-latest", "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc" + "reference": "593c4de369ca852cf3b86037f19435d47c136448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/11b8a607a59818bb21fc9ffb334f03032a6ce5dc", - "reference": "11b8a607a59818bb21fc9ffb334f03032a6ce5dc", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/593c4de369ca852cf3b86037f19435d47c136448", + "reference": "593c4de369ca852cf3b86037f19435d47c136448", "shasum": "" }, "conflict": { @@ -7171,7 +7342,7 @@ "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", "dolibarr/dolibarr": "<11.0.4", "dompdf/dompdf": ">=0.6,<0.6.2", "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", @@ -7194,10 +7365,11 @@ "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<=2.5.1,>=2.0|<=1.16.13", + "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", "firebase/php-jwt": "<2", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", + "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", "fossar/tcpdf-parser": "<6.2.22", "friendsofsymfony/oauth2-php": "<1.3", @@ -7205,7 +7377,7 @@ "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7-beta.8", + "getgrav/grav": "<1.7.11", "getkirby/cms": ">=3,<3.4.5", "getkirby/panel": "<2.5.14", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", @@ -7237,11 +7409,15 @@ "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<2.16.5|>=3,<3.2.4|= 2.13.1", + "mautic/core": "<3.3.2|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", "namshi/jose": "<2.2", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nystudio107/craft-seomatic": "<3.3", @@ -7270,21 +7446,25 @@ "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "pimcore/pimcore": "<6.8.8", "pocketmine/pocketmine-mp": "<3.15.4", + "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", @@ -7292,8 +7472,9 @@ "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.4", - "shopware/platform": "<=6.3.5.1", + "shopware/core": "<=6.3.5.2", + "shopware/platform": "<=6.3.5.2", + "shopware/production": "<=6.3.5.2", "shopware/shopware": "<5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", @@ -7367,16 +7548,20 @@ "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", - "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.25|>=10,<10.4.14|>=11,<11.1.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", @@ -7414,6 +7599,7 @@ "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", "zfr/zfr-oauth2-server-module": "<0.1.2" }, + "default-branch": true, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7446,7 +7632,7 @@ "type": "tidelift" } ], - "time": "2021-03-19T20:02:32+00:00" + "time": "2021-04-16T20:01:44+00:00" }, { "name": "symfony/phpunit-bridge", diff --git a/lib/predict/Predict.php b/lib/predict/Predict.php new file mode 100644 index 0000000..9615ca8 --- /dev/null +++ b/lib/predict/Predict.php @@ -0,0 +1,864 @@ + + John A. Magliacane, KD2BD. + + Comments, questions and bugreports should be submitted via + http://sourceforge.net/projects/gpredict/ + More details can be found at the project home page: + + http://gpredict.oz9aec.net/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, visit http://www.fsf.org/ +*/ + +/** + * The main Predict class. Contains constants for use by other classes, as well as + * the prediction logic. + */ +class Predict +{ + const de2ra = 1.74532925E-2; /* Degrees to Radians */ + const pi = 3.1415926535898; /* Pi */ + const pio2 = 1.5707963267949; /* Pi/2 */ + const x3pio2 = 4.71238898; /* 3*Pi/2 */ + const twopi = 6.2831853071796; /* 2*Pi */ + const e6a = 1.0E-6; + const tothrd = 6.6666667E-1; /* 2/3 */ + const xj2 = 1.0826158E-3; /* J2 Harmonic */ + const xj3 = -2.53881E-6; /* J3 Harmonic */ + const xj4 = -1.65597E-6; /* J4 Harmonic */ + const xke = 7.43669161E-2; + const xkmper = 6.378135E3; /* Earth radius km */ + const xmnpda = 1.44E3; /* Minutes per day */ + const km2mi = 0.621371; /* Kilometers per Mile */ + const ae = 1.0; + const ck2 = 5.413079E-4; + const ck4 = 6.209887E-7; + const __f = 3.352779E-3; + const ge = 3.986008E5; + const __s__ = 1.012229; + const qoms2t = 1.880279E-09; + const secday = 8.6400E4; /* Seconds per day */ + const omega_E = 1.0027379; + const omega_ER = 6.3003879; + const zns = 1.19459E-5; + const c1ss = 2.9864797E-6; + const zes = 1.675E-2; + const znl = 1.5835218E-4; + const c1l = 4.7968065E-7; + const zel = 5.490E-2; + const zcosis = 9.1744867E-1; + const zsinis = 3.9785416E-1; + const zsings = -9.8088458E-1; + const zcosgs = 1.945905E-1; + const zcoshs = 1; + const zsinhs = 0; + const q22 = 1.7891679E-6; + const q31 = 2.1460748E-6; + const q33 = 2.2123015E-7; + const g22 = 5.7686396; + const g32 = 9.5240898E-1; + const g44 = 1.8014998; + const g52 = 1.0508330; + const g54 = 4.4108898; + const root22 = 1.7891679E-6; + const root32 = 3.7393792E-7; + const root44 = 7.3636953E-9; + const root52 = 1.1428639E-7; + const root54 = 2.1765803E-9; + const thdt = 4.3752691E-3; + const rho = 1.5696615E-1; + const mfactor = 7.292115E-5; + const __sr__ = 6.96000E5; /*Solar radius - kilometers (IAU 76)*/ + const AU = 1.49597870E8; /*Astronomical unit - kilometers (IAU 76)*/ + + /* visibility constants */ + const SAT_VIS_NONE = 0; + const SAT_VIS_VISIBLE = 1; + const SAT_VIS_DAYLIGHT = 2; + const SAT_VIS_ECLIPSED = 3; + + /* preferences */ + public $minEle = 10; // Minimum elevation + public $timeRes = 10; // Pass details: time resolution + public $numEntries = 20; // Pass details: number of entries + public $threshold = -6; // Twilight threshold + + /** + * Predict the next pass. + * + * This function simply wraps the get_pass function using the current time + * as parameter. + * + * Note: the data in sat will be corrupt (future) and must be refreshed + * by the caller, if the caller will need it later on (eg. if the caller + * is GtkSatList). + * + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer data. + * @param int $maxdt The maximum number of days to look ahead. + * + * @return Predict_Pass Pointer instance or NULL if no pass can be + * found. + */ + public function get_next_pass(Predict_Sat $sat, Predict_QTH $qth, $maxdt) + { + /* get the current time and call the get_pass function */ + $now = Predict_Time::get_current_daynum(); + + return $this->get_pass($sat, $qth, $now, $maxdt); + } + + /** Predict first pass after a certain time. + * + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer's location data. + * @param float $start Starting time. + * @param int $maxdt The maximum number of days to look ahead (0 for no limit). + * + * @return Predict_Pass or NULL if there was an error. + * + * This function will find the first upcoming pass with AOS no earlier than + * t = start and no later than t = (start+maxdt). + * + * note For no time limit use maxdt = 0.0 + * + * note the data in sat will be corrupt (future) and must be refreshed + * by the caller, if the caller will need it later on + */ + public function get_pass(Predict_Sat $sat_in, Predict_QTH $qth, $start, $maxdt) + { + $aos = 0.0; /* time of AOS */ + $tca = 0.0; /* time of TCA */ + $los = 0.0; /* time of LOS */ + $dt = 0.0; /* time diff */ + $step = 0.0; /* time step */ + $t0 = $start; + $tres = 0.0; /* required time resolution */ + $max_el = 0.0; /* maximum elevation */ + $pass = null; + $detail = null; + $done = false; + $iter = 0; /* number of iterations */ + /* FIXME: watchdog */ + + /*copy sat_in to a working structure*/ + $sat = clone $sat_in; + $sat_working = clone $sat_in; + + /* get time resolution; sat-cfg stores it in seconds */ + $tres = $this->timeRes / 86400.0; + + /* loop until we find a pass with elevation > SAT_CFG_INT_PRED_MIN_EL + or we run out of time + FIXME: we should have a safety break + */ + while (!$done) { + /* Find los of next pass or of current pass */ + $los = $this->find_los($sat, $qth, $t0, $maxdt); // See if a pass is ongoing + $aos = $this->find_aos($sat, $qth, $t0, $maxdt); + /* sat_log_log(SAT_LOG_LEVEL_MSG, "%s:%s:%d: found aos %f and los %f for t0=%f", */ + /* __FILE__, */ + /* __FUNCTION__, */ + /* __LINE__, */ + /* aos, */ + /* los, */ + /* t0); */ + if ($aos > $los) { + // los is from an currently happening pass, find previous aos + $aos = $this->find_prev_aos($sat, $qth, $t0); + } + + /* aos = 0.0 means no aos */ + if ($aos == 0.0) { + $done = true; + } else if (($maxdt > 0.0) && ($aos > ($start + $maxdt)) ) { + /* check whether we are within time limits; + maxdt = 0 mean no time limit. + */ + $done = true; + } else { + //los = find_los (sat, qth, aos + 0.001, maxdt); // +1.5 min later + $dt = $los - $aos; + + /* get time step, which will give us the max number of entries */ + $step = $dt / $this->numEntries; + + /* but if this is smaller than the required resolution + we go with the resolution + */ + if ($step < $tres) { + $step = $tres; + } + + /* create a pass_t entry; FIXME: g_try_new in 2.8 */ + $pass = new Predict_Pass(); + + $pass->aos = $aos; + $pass->los = $los; + $pass->max_el = 0.0; + $pass->aos_az = 0.0; + $pass->los_az = 0.0; + $pass->maxel_az = 0.0; + $pass->vis = '---'; + $pass->satname = $sat->nickname; + $pass->details = array(); + + /* iterate over each time step */ + for ($t = $pass->aos; $t <= $pass->los; $t += $step) { + + /* calculate satellite data */ + $this->predict_calc($sat, $qth, $t); + + /* in the first iter we want to store + pass->aos_az + */ + if ($t == $pass->aos) { + $pass->aos_az = $sat->az; + $pass->orbit = $sat->orbit; + } + + /* append details to sat->details */ + $detail = new Predict_PassDetail(); + $detail->time = $t; + $detail->pos->x = $sat->pos->x; + $detail->pos->y = $sat->pos->y; + $detail->pos->z = $sat->pos->z; + $detail->pos->w = $sat->pos->w; + $detail->vel->x = $sat->vel->x; + $detail->vel->y = $sat->vel->y; + $detail->vel->z = $sat->vel->z; + $detail->vel->w = $sat->vel->w; + $detail->velo = $sat->velo; + $detail->az = $sat->az; + $detail->el = $sat->el; + $detail->range = $sat->range; + $detail->range_rate = $sat->range_rate; + $detail->lat = $sat->ssplat; + $detail->lon = $sat->ssplon; + $detail->alt = $sat->alt; + $detail->ma = $sat->ma; + $detail->phase = $sat->phase; + $detail->footprint = $sat->footprint; + $detail->orbit = $sat->orbit; + $detail->vis = $this->get_sat_vis($sat, $qth, $t); + + /* also store visibility "bit" */ + switch ($detail->vis) { + case self::SAT_VIS_VISIBLE: + $pass->vis[0] = 'V'; + break; + case self::SAT_VIS_DAYLIGHT: + $pass->vis[1] = 'D'; + break; + case self::SAT_VIS_ECLIPSED: + $pass->vis[2] = 'E'; + break; + default: + break; + } + + // Using an array, no need to prepend and reverse the list + // as gpredict does + $pass->details[] = $detail; + + // Look up apparent magnitude if this is a visible pass + if ($detail->vis === self::SAT_VIS_VISIBLE) { + $apmag = $sat->calculateApparentMagnitude($t, $qth); + if ($pass->max_apparent_magnitude === null || $apmag < $pass->max_apparent_magnitude) { + $pass->max_apparent_magnitude = $apmag; + } + } + + /* store elevation if greater than the + previously stored one + */ + if ($sat->el > $max_el) { + $max_el = $sat->el; + $tca = $t; + $pass->maxel_az = $sat->az; + } + + /* g_print ("TIME: %f\tAZ: %f\tEL: %f (MAX: %f)\n", */ + /* t, sat->az, sat->el, max_el); */ + } + + /* calculate satellite data */ + $this->predict_calc($sat, $qth, $pass->los); + /* store los_az, max_el and tca */ + $pass->los_az = $sat->az; + $pass->max_el = $max_el; + $pass->tca = $tca; + + /* check whether this pass is good */ + if ($max_el >= $this->minEle) { + $done = true; + } else { + $done = false; + $t0 = $los + 0.014; // +20 min + $pass = null; + } + + $iter++; + } + } + + return $pass; + } + + /** + * Calculate satellite visibility. + * + * @param Predict_Sat $sat The satellite structure. + * @param Predict_QTH $qth The QTH + * @param float $jul_utc The time at which the visibility should be calculated. + * + * @return int The visiblity constant, 0, 1, 2, or 3 (see above) + */ + public function get_sat_vis(Predict_Sat $sat, Predict_QTH $qth, $jul_utc) + { + /* gboolean sat_sun_status; + gdouble sun_el; + gdouble threshold; + gdouble eclipse_depth; + sat_vis_t vis = SAT_VIS_NONE; */ + + $eclipse_depth = 0.0; + $zero_vector = new Predict_Vector(); + $obs_geodetic = new Predict_Geodetic(); + + /* Solar ECI position vector */ + $solar_vector = new Predict_Vector(); + + /* Solar observed az and el vector */ + $solar_set = new Predict_ObsSet(); + + /* FIXME: could be passed as parameter */ + $obs_geodetic->lon = $qth->lon * self::de2ra; + $obs_geodetic->lat = $qth->lat * self::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + + Predict_Solar::Calculate_Solar_Position($jul_utc, $solar_vector); + Predict_SGPObs::Calculate_Obs($jul_utc, $solar_vector, $zero_vector, $obs_geodetic, $solar_set); + + if (Predict_Solar::Sat_Eclipsed($sat->pos, $solar_vector, $eclipse_depth)) { + /* satellite is eclipsed */ + $sat_sun_status = false; + } else { + /* satellite in sunlight => may be visible */ + $sat_sun_status = true; + } + + if ($sat_sun_status) { + $sun_el = Predict_Math::Degrees($solar_set->el); + + if ($sun_el <= $this->threshold && $sat->el >= 0.0) { + $vis = self::SAT_VIS_VISIBLE; + } else { + $vis = self::SAT_VIS_DAYLIGHT; + } + } else { + $vis = self::SAT_VIS_ECLIPSED; + } + + return $vis; + } + + /** Find the AOS time of the next pass. + * @author Alexandru Csete, OZ9AEC + * @author John A. Magliacane, KD2BD + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer's location (QTH) data. + * @param float $start The julian date where calculation should start. + * @param int $maxdt The upper time limit in days (0.0 = no limit) + * @return The julain date of the next AOS or 0.0 if the satellite has no AOS. + * + * This function finds the time of AOS for the first coming pass taking place + * no earlier that start. + * If the satellite is currently within range, the function first calls + * find_los to get the next LOS time. Then the calculations are done using + * the new start time. + * + */ + public function find_aos(Predict_Sat $sat, Predict_QTH $qth, $start, $maxdt) + { + $t = $start; + $aostime = 0.0; + + + /* make sure current sat values are + in sync with the time + */ + $this->predict_calc($sat, $qth, $start); + + /* check whether satellite has aos */ + if (($sat->otype == Predict_SGPSDP::ORBIT_TYPE_GEO) || + ($sat->otype == Predict_SGPSDP::ORBIT_TYPE_DECAYED) || + !$this->has_aos($sat, $qth)) { + + return 0.0; + } + + if ($sat->el > 0.0) { + $t = $this->find_los($sat, $qth, $start, $maxdt) + 0.014; // +20 min + } + + /* invalid time (potentially returned by find_los) */ + if ($t < 0.1) { + return 0.0; + } + + /* update satellite data */ + $this->predict_calc($sat, $qth, $t); + + /* use upper time limit */ + if ($maxdt > 0.0) { + + /* coarse time steps */ + while (($sat->el < -1.0) && ($t <= ($start + $maxdt))) { + $t -= 0.00035 * ($sat->el * (($sat->alt / 8400.0) + 0.46) - 2.0); + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while (($aostime == 0.0) && ($t <= ($start + $maxdt))) { + + if (abs($sat->el) < 0.005) { + $aostime = $t; + } else { + $t -= $sat->el * sqrt($sat->alt) / 530000.0; + $this->predict_calc($sat, $qth, $t); + } + } + } else { + /* don't use upper time limit */ + + /* coarse time steps */ + while ($sat->el < -1.0) { + + $t -= 0.00035 * ($sat->el * (($sat->alt / 8400.0) + 0.46) - 2.0); + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while ($aostime == 0.0) { + + if (abs($sat->el) < 0.005) { + $aostime = $t; + } else { + $t -= $sat->el * sqrt($sat->alt) / 530000.0; + $this->predict_calc($sat, $qth, $t); + } + + } + } + + return $aostime; + } + + /** SGP4SDP4 driver for doing AOS/LOS calculations. + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The QTH observer location data. + * @param float $t The time for calculation (Julian Date) + * + */ + public function predict_calc(Predict_Sat $sat, Predict_QTH $qth, $t) + { + $obs_set = new Predict_ObsSet(); + $sat_geodetic = new Predict_Geodetic(); + $obs_geodetic = new Predict_Geodetic(); + + $obs_geodetic->lon = $qth->lon * self::de2ra; + $obs_geodetic->lat = $qth->lat * self::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + + $sat->jul_utc = $t; + $sat->tsince = ($sat->jul_utc - $sat->jul_epoch) * self::xmnpda; + + /* call the norad routines according to the deep-space flag */ + $sgpsdp = Predict_SGPSDP::getInstance($sat); + if ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) { + $sgpsdp->SDP4($sat, $sat->tsince); + } else { + $sgpsdp->SGP4($sat, $sat->tsince); + } + + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + /* get the velocity of the satellite */ + $sat->vel->w = sqrt($sat->vel->x * $sat->vel->x + $sat->vel->y * $sat->vel->y + $sat->vel->z * $sat->vel->z); + $sat->velo = $sat->vel->w; + Predict_SGPObs::Calculate_Obs($sat->jul_utc, $sat->pos, $sat->vel, $obs_geodetic, $obs_set); + Predict_SGPObs::Calculate_LatLonAlt($sat->jul_utc, $sat->pos, $sat_geodetic); + + while ($sat_geodetic->lon < -self::pi) { + $sat_geodetic->lon += self::twopi; + } + + while ($sat_geodetic->lon > (self::pi)) { + $sat_geodetic->lon -= self::twopi; + } + + $sat->az = Predict_Math::Degrees($obs_set->az); + $sat->el = Predict_Math::Degrees($obs_set->el); + $sat->range = $obs_set->range; + $sat->range_rate = $obs_set->range_rate; + $sat->ssplat = Predict_Math::Degrees($sat_geodetic->lat); + $sat->ssplon = Predict_Math::Degrees($sat_geodetic->lon); + $sat->alt = $sat_geodetic->alt; + $sat->ma = Predict_Math::Degrees($sat->phase); + $sat->ma *= 256.0 / 360.0; + $sat->phase = Predict_Math::Degrees($sat->phase); + + /* same formulas, but the one from predict is nicer */ + //sat->footprint = 2.0 * xkmper * acos (xkmper/sat->pos.w); + $sat->footprint = 12756.33 * acos(self::xkmper / (self::xkmper + $sat->alt)); + $age = $sat->jul_utc - $sat->jul_epoch; + $sat->orbit = floor(($sat->tle->xno * self::xmnpda / self::twopi + + $age * $sat->tle->bstar * self::ae) * $age + + $sat->tle->xmo / self::twopi) + $sat->tle->revnum - 1; + } + + /** Find the LOS time of the next pass. + * @author Alexandru Csete, OZ9AEC + * @author John A. Magliacane, KD2BD + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The QTH observer location data. + * @param float $start The time where calculation should start. (Julian Date) + * @param int $maxdt The upper time limit in days (0.0 = no limit) + * @return The time (julian date) of the next LOS or 0.0 if the satellite has no LOS. + * + * This function finds the time of LOS for the first coming pass taking place + * no earlier that start. + * If the satellite is currently out of range, the function first calls + * find_aos to get the next AOS time. Then the calculations are done using + * the new start time. + * The function has a built-in watchdog to ensure that we don't end up in + * lengthy loops. + * + */ + public function find_los(Predict_Sat $sat, Predict_QTH $qth, $start, $maxdt) + { + $t = $start; + $lostime = 0.0; + + + $this->predict_calc($sat, $qth, $start); + + /* check whether satellite has aos */ + if (($sat->otype == Predict_SGPSDP::ORBIT_TYPE_GEO) || + ($sat->otype == Predict_SGPSDP::ORBIT_TYPE_DECAYED) || + !$this->has_aos ($sat, $qth)) { + + return 0.0; + } + + if ($sat->el < 0.0) { + $t = $this->find_aos($sat, $qth, $start, $maxdt) + 0.001; // +1.5 min + } + + /* invalid time (potentially returned by find_aos) */ + if ($t < 0.01) { + return 0.0; + } + + /* update satellite data */ + $this->predict_calc($sat, $qth, $t); + + /* use upper time limit */ + if ($maxdt > 0.0) { + + /* coarse steps */ + while (($sat->el >= 1.0) && ($t <= ($start + $maxdt))) { + $t += cos(($sat->el - 1.0) * self::de2ra) * sqrt($sat->alt) / 25000.0; + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while (($lostime == 0.0) && ($t <= ($start + $maxdt))) { + + $t += $sat->el * sqrt($sat->alt) / 502500.0; + $this->predict_calc($sat, $qth, $t); + + if (abs($sat->el) < 0.005) { + $lostime = $t; + } + } + } else { + /* don't use upper limit */ + + /* coarse steps */ + while ($sat->el >= 1.0) { + $t += cos(($sat->el - 1.0) * self::de2ra) * sqrt($sat->alt) / 25000.0; + $this->predict_calc($sat, $qth, $t); + } + + /* fine steps */ + while ($lostime == 0.0) { + + $t += $sat->el * sqrt($sat->alt) / 502500.0; + $this->predict_calc($sat, $qth, $t); + + if (abs($sat->el) < 0.005) + $lostime = $t; + } + } + + return $lostime; + } + + /** Find AOS time of current pass. + * @param Predict_Sat $sat The satellite to find AOS for. + * @param Predict_QTH $qth The ground station. + * @param float $start Start time, prefereably now. + * @return The time of the previous AOS or 0.0 if the satellite has no AOS. + * + * This function can be used to find the AOS time in the past of the + * current pass. + */ + public function find_prev_aos(Predict_Sat $sat, Predict_QTH $qth, $start) + { + $aostime = $start; + + /* make sure current sat values are + in sync with the time + */ + $this->predict_calc($sat, $qth, $start); + + /* check whether satellite has aos */ + if (($sat->otype == Predict_SGPSDP::ORBIT_TYPE_GEO) || + ($sat->otype == Predict_SGPSDP::ORBIT_TYPE_DECAYED) || + !$this->has_aos($sat, $qth)) { + + return 0.0; + } + + while ($sat->el >= 0.0) { + $aostime -= 0.0005; // 0.75 min + $this->predict_calc($sat, $qth, $aostime); + } + + return $aostime; + } + + /** Determine whether satellite ever reaches AOS. + * @author John A. Magliacane, KD2BD + * @author Alexandru Csete, OZ9AEC + * @param Predict_Sat $sat The satellite data. + * @param Predict_QTH $qth The observer's location data + * @return bool true if the satellite will reach AOS, false otherwise. + * + */ + public function has_aos(Predict_Sat $sat, Predict_QTH $qth) + { + $retcode = false; + + /* FIXME */ + if ($sat->meanmo == 0.0) { + $retcode = false; + } else { + + /* xincl is already in RAD by select_ephemeris */ + $lin = $sat->tle->xincl; + if ($lin >= self::pio2) { + $lin = self::pi - $lin; + } + + $sma = 331.25 * exp(log(1440.0 / $sat->meanmo) * (2.0 / 3.0)); + $apogee = $sma * (1.0 + $sat->tle->eo) - self::xkmper; + + if ((acos(self::xkmper / ($apogee + self::xkmper)) + ($lin)) > abs($qth->lat * self::de2ra)) { + $retcode = true; + } else { + $retcode = false; + } + } + + return $retcode; + } + + /** Predict passes after a certain time. + * + * + * This function calculates num upcoming passes with AOS no earlier + * than t = start and not later that t = (start+maxdt). The function will + * repeatedly call get_pass until + * the number of predicted passes is equal to num, the time has reached + * limit or the get_pass function returns NULL. + * + * note For no time limit use maxdt = 0.0 + * + * note the data in sat will be corrupt (future) and must be refreshed + * by the caller, if the caller will need it later on (eg. if the caller + * is GtkSatList). + * + * note Prepending to a singly linked list is much faster than appending. + * Therefore, the elements are prepended whereafter the GSList is + * reversed + * + * + * @param Predict_Sat $sat The satellite data + * @param Predict_QTH $qth The observer's location data + * @param float $start The start julian date + * @param int $maxdt The max # of days to look + * @param int $num The max # of passes to get + * @return array of Predict_Pass instances if found, empty array otherwise + */ + public function get_passes(Predict_Sat $sat, Predict_QTH $qth, $start, $maxdt, $num = 0) + { + $passes = array(); + + /* if no number has been specified + set it to something big */ + if ($num == 0) { + $num = 100; + } + + $t = $start; + + for ($i = 0; $i < $num; $i++) { + $pass = $this->get_pass($sat, $qth, $t, $maxdt); + + if ($pass != null) { + $passes[] = $pass; + $t = $pass->los + 0.014; // +20 min + + /* if maxdt > 0.0 check whether we have reached t = start+maxdt + if yes finish predictions + */ + if (($maxdt > 0.0) && ($t >= ($start + $maxdt))) { + $i = $num; + } + } else { + /* we can't get any more passes */ + $i = $num; + } + } + + return $passes; + } + + /** + * Filters out visible passes and adds the visible aos, tca, los, and + * corresponding az and ele for each. + * + * @param array $passes The passes returned from get_passes() + * + * @author Bill Shupp + * @return array + */ + public function filterVisiblePasses(array $passes) + { + $filtered = array(); + + foreach ($passes as $result) { + // Dummy check + if ($result->vis[0] != 'V') { + continue; + } + + $aos = false; + $aos_az = false; + $aos = false; + $tca = false; + $los_az = false; + $max_el = 0; + + foreach ($result->details as $detail) { + if ($detail->vis != Predict::SAT_VIS_VISIBLE) { + continue; + } + if ($detail->el < $this->minEle) { + continue; + } + + if ($aos == false) { + $aos = $detail->time; + $aos_az = $detail->az; + $aos_el = $detail->el; + $tca = $detail->time; + $los = $detail->time; + $los_az = $detail->az; + $los_el = $detail->el; + $max_el = $detail->el; + $max_el_az = $detail->el; + continue; + } + $los = $detail->time; + $los_az = $detail->az; + $los_el = $detail->el; + + if ($detail->el > $max_el) { + $tca = $detail->time; + $max_el = $detail->el; + $max_el_az = $detail->az; + } + } + + if ($aos === false) { + // Does not reach minimum elevation, skip + continue; + } + + $result->visible_aos = $aos; + $result->visible_aos_az = $aos_az; + $result->visible_aos_el = $aos_el; + $result->visible_tca = $tca; + $result->visible_max_el = $max_el; + $result->visible_max_el_az = $max_el_az; + $result->visible_los = $los; + $result->visible_los_az = $los_az; + $result->visible_los_el = $los_el; + + $filtered[] = $result; + } + + return $filtered; + } + + /** + * Translates aziumuth degrees to compass direction: + * + * N (0°), NNE (22.5°), NE (45°), ENE (67.5°), E (90°), ESE (112.5°), + * SE (135°), SSE (157.5°), S (180°), SSW (202.5°), SW (225°), + * WSW (247.5°), W (270°), WNW (292.5°), NW (315°), NNW (337.5°) + * + * @param int $az The azimuth in degrees, defaults to 0 + * + * @return string + */ + public static function azDegreesToDirection($az = 0) + { + $i = floor($az / 22.5); + $m = (22.5 * (2 * $i + 1)) / 2; + $i = ($az >= $m) ? $i + 1 : $i; + + return trim(substr('N NNENE ENEE ESESE SSES SSWSW WSWW WNWNW NNWN ', $i * 3, 3)); + } +} diff --git a/lib/predict/Predict/DeepArg.php b/lib/predict/Predict/DeepArg.php new file mode 100644 index 0000000..f29178f --- /dev/null +++ b/lib/predict/Predict/DeepArg.php @@ -0,0 +1,35 @@ + 0 ) { + return 1; + } else if ($arg < 0 ) { + return -1; + } else { + return 0; + } + } + + /* Returns the arcsine of the argument */ + public static function ArcSin($arg) + { + if (abs($arg) >= 1 ) { + return (self::Sign($arg) * Predict::pio2); + } else { + return(atan($arg / sqrt(1 - $arg * $arg))); + } + } + + /* Returns arccosine of rgument */ + public static function ArcCos($arg) + { + return Predict::pio2 - self::ArcSin($arg); + } + + /* Adds vectors v1 and v2 together to produce v3 */ + public static function Vec_Add(Predict_Vector $v1, Predict_Vector $v2, Predict_Vector $v3) + { + $v3->x = $v1->x + $v2->x; + $v3->y = $v1->y + $v2->y; + $v3->z = $v1->z + $v2->z; + + $v3->w = sqrt($v3->x * $v3->x + $v3->y * $v3->y + $v3->z * $v3->z); + } + + /* Subtracts vector v2 from v1 to produce v3 */ + public static function Vec_Sub(Predict_Vector $v1, Predict_Vector $v2, Predict_Vector $v3) + { + $v3->x = $v1->x - $v2->x; + $v3->y = $v1->y - $v2->y; + $v3->z = $v1->z - $v2->z; + + $v3->w = sqrt($v3->x * $v3->x + $v3->y * $v3->y + $v3->z * $v3->z); + } + + /* Multiplies the vector v1 by the scalar k to produce the vector v2 */ + public static function Scalar_Multiply($k, Predict_Vector $v1, Predict_Vector $v2) + { + $v2->x = $k * $v1->x; + $v2->y = $k * $v1->y; + $v2->z = $k * $v1->z; + $v2->w = abs($k) * $v1->w; + } + + /* Multiplies the vector v1 by the scalar k */ + public static function Scale_Vector($k, Predict_Vector $v) + { + $v->x *= $k; + $v->y *= $k; + $v->z *= $k; + + $v->w = sqrt($v->x * $v->x + $v->y * $v->y + $v->z * $v->z); + } + + /* Returns the dot product of two vectors */ + public static function Dot(Predict_Vector $v1, Predict_Vector $v2) + { + return ($v1->x * $v2->x + $v1->y * $v2->y + $v1->z * $v2->z); + } + + /* Calculates the angle between vectors v1 and v2 */ + public static function Angle(Predict_Vector $v1, Predict_Vector $v2) + { + $v1->w = sqrt($v1->x * $v1->x + $v1->y * $v1->y + $v1->z * $v1->z); + $v2->w = sqrt($v2->x * $v2->x + $v2->y * $v2->y + $v2->z * $v2->z); + return (self::ArcCos(self::Dot($v1, $v2) / ($v1->w * $v2->w))); + } + + /* Produces cross product of v1 and v2, and returns in v3 */ + public static function Cross(Predict_Vector $v1, Predict_Vector $v2 ,Predict_Vector $v3) + { + $v3->x = $v1->y * $v2->z - $v1->z * $v2->y; + $v3->y = $v1->z * $v2->x - $v1->x * $v2->z; + $v3->z = $v1->x * $v2->y - $v1->y * $v2->x; + + $v3->w = sqrt($v3->x * $v3->x + $v3->y * $v3->y + $v3->z * $v3->z); + } + + /* Normalizes a vector */ + public static function Normalize(Predict_Vector $v ) + { + $v->x /= $v->w; + $v->y /= $v->w; + $v->z /= $v->w; + } + + /* Four-quadrant arctan function */ + public static function AcTan($sinx, $cosx) + { + if ($cosx == 0) { + if ($sinx > 0) { + return Predict::pio2; + } else { + return Predict::x3pio2; + } + } else { + if ($cosx > 0) { + if ($sinx > 0) { + return atan($sinx / $cosx); + } else { + return Predict::twopi + atan($sinx / $cosx); + } + } else { + return Predict::pi + atan($sinx / $cosx); + } + } + } + + /* Returns mod 2pi of argument */ + public static function FMod2p($x) + { + $ret_val = $x; + $i = (int) ($ret_val / Predict::twopi); + $ret_val -= $i * Predict::twopi; + + if ($ret_val < 0) { + $ret_val += Predict::twopi; + } + + return $ret_val; + } + + /* Returns arg1 mod arg2 */ + public static function Modulus($arg1, $arg2) + { + $ret_val = $arg1; + $i = (int) ($ret_val / $arg2); + $ret_val -= $i * $arg2; + + if ($ret_val < 0) { + $ret_val += $arg2; + } + + return $ret_val; + } + + /* Returns fractional part of double argument */ + public static function Frac($arg) + { + return $arg - floor($arg); + } + + /* Converts the satellite's position and velocity */ + /* vectors from normalised values to km and km/sec */ + public static function Convert_Sat_State(Predict_Vector $pos, Predict_Vector $vel) + { + self::Scale_Vector(Predict::xkmper, $pos); + self::Scale_Vector(Predict::xkmper * Predict::xmnpda / Predict::secday, $vel); + } + + /* Returns angle in radians from arg in degrees */ + public static function Radians($arg) + { + return $arg * Predict::de2ra; + } + + /* Returns angle in degrees from arg in rads */ + public static function Degrees($arg) + { + return $arg / Predict::de2ra; + } +} diff --git a/lib/predict/Predict/ObsSet.php b/lib/predict/Predict/ObsSet.php new file mode 100644 index 0000000..9470b93 --- /dev/null +++ b/lib/predict/Predict/ObsSet.php @@ -0,0 +1,12 @@ +pos = new Predict_Vector(); + $this->vel = new Predict_Vector(); + } +} diff --git a/lib/predict/Predict/QTH.php b/lib/predict/Predict/QTH.php new file mode 100644 index 0000000..5ccd5d3 --- /dev/null +++ b/lib/predict/Predict/QTH.php @@ -0,0 +1,20 @@ +lat); /* Only run sin($geodetic->lat) once */ + + $geodetic->theta = Predict_Math::FMod2p(Predict_Time::ThetaG_JD($_time) + $geodetic->lon);/*LMST*/ + $c = 1 / sqrt(1 + Predict::__f * (Predict::__f - 2) * $sinGeodeticLat * $sinGeodeticLat); + $sq = (1 - Predict::__f) * (1 - Predict::__f) * $c; + $achcp = (Predict::xkmper * $c + $geodetic->alt) * cos($geodetic->lat); + $obs_pos->x = $achcp * cos($geodetic->theta); /*kilometers*/ + $obs_pos->y = $achcp * sin($geodetic->theta); + $obs_pos->z = (Predict::xkmper * $sq + $geodetic->alt) * $sinGeodeticLat; + $obs_vel->x = -Predict::mfactor * $obs_pos->y; /*kilometers/second*/ + $obs_vel->y = Predict::mfactor * $obs_pos->x; + $obs_vel->z = 0; + $obs_pos->w = sqrt($obs_pos->x * $obs_pos->x + $obs_pos->y * $obs_pos->y + $obs_pos->z * $obs_pos->z); + $obs_vel->w = sqrt($obs_vel->x * $obs_vel->x + $obs_vel->y * $obs_vel->y + $obs_vel->z * $obs_vel->z); + } + + /* Procedure Calculate_LatLonAlt will calculate the geodetic */ + /* position of an object given its ECI position pos and time. */ + /* It is intended to be used to determine the ground track of */ + /* a satellite. The calculations assume the earth to be an */ + /* oblate spheroid as defined in WGS '72. */ + public static function Calculate_LatLonAlt($_time, Predict_Vector $pos, Predict_Geodetic $geodetic) + { + /* Reference: The 1992 Astronomical Almanac, page K12. */ + + /* double r,e2,phi,c; */ + + $geodetic->theta = Predict_Math::AcTan($pos->y, $pos->x); /*radians*/ + $geodetic->lon = Predict_Math::FMod2p($geodetic->theta - Predict_Time::ThetaG_JD($_time)); /*radians*/ + $r = sqrt(($pos->x * $pos->x) + ($pos->y * $pos->y)); + $e2 = Predict::__f * (2 - Predict::__f); + $geodetic->lat = Predict_Math::AcTan($pos->z, $r); /*radians*/ + + do { + $phi = $geodetic->lat; + $sinPhi = sin($phi); + $c = 1 / sqrt(1 - $e2 * ($sinPhi * $sinPhi)); + $geodetic->lat = Predict_Math::AcTan($pos->z + Predict::xkmper * $c * $e2 * $sinPhi, $r); + } while (abs($geodetic->lat - $phi) >= 1E-10); + + $geodetic->alt = $r / cos($geodetic->lat) - Predict::xkmper * $c;/*kilometers*/ + + if ($geodetic->lat > Predict::pio2) { + $geodetic->lat -= Predict::twopi; + } + } + + /* The procedures Calculate_Obs and Calculate_RADec calculate */ + /* the *topocentric* coordinates of the object with ECI position, */ + /* {pos}, and velocity, {vel}, from location {geodetic} at {time}. */ + /* The {obs_set} returned for Calculate_Obs consists of azimuth, */ + /* elevation, range, and range rate (in that order) with units of */ + /* radians, radians, kilometers, and kilometers/second, respectively. */ + /* The WGS '72 geoid is used and the effect of atmospheric refraction */ + /* (under standard temperature and pressure) is incorporated into the */ + /* elevation calculation; the effect of atmospheric refraction on */ + /* range and range rate has not yet been quantified. */ + + /* The {obs_set} for Calculate_RADec consists of right ascension and */ + /* declination (in that order) in radians. Again, calculations are */ + /* based on *topocentric* position using the WGS '72 geoid and */ + /* incorporating atmospheric refraction. */ + public static function Calculate_Obs($_time, Predict_Vector $pos, Predict_Vector $vel, Predict_Geodetic $geodetic, Predict_ObsSet $obs_set) + { + $obs_pos = new Predict_Vector(); + $obs_vel = new Predict_Vector(); + $range = new Predict_Vector(); + $rgvel = new Predict_Vector(); + + self::Calculate_User_PosVel($_time, $geodetic, $obs_pos, $obs_vel); + + $range->x = $pos->x - $obs_pos->x; + $range->y = $pos->y - $obs_pos->y; + $range->z = $pos->z - $obs_pos->z; + + $rgvel->x = $vel->x - $obs_vel->x; + $rgvel->y = $vel->y - $obs_vel->y; + $rgvel->z = $vel->z - $obs_vel->z; + + $range->w = sqrt($range->x * $range->x + $range->y * $range->y + $range->z * $range->z); + + $sin_lat = sin($geodetic->lat); + $cos_lat = cos($geodetic->lat); + $sin_theta = sin($geodetic->theta); + $cos_theta = cos($geodetic->theta); + $top_s = $sin_lat * $cos_theta * $range->x + + $sin_lat * $sin_theta * $range->y + - $cos_lat * $range->z; + $top_e = -$sin_theta * $range->x + + $cos_theta * $range->y; + $top_z = $cos_lat * $cos_theta * $range->x + + $cos_lat * $sin_theta * $range->y + + $sin_lat * $range->z; + $azim = atan(-$top_e / $top_s); /*Azimuth*/ + if ($top_s > 0) { + $azim = $azim + Predict::pi; + } + if ($azim < 0 ) { + $azim = $azim + Predict::twopi; + } + $el = Predict_Math::ArcSin($top_z / $range->w); + $obs_set->az = $azim; /* Azimuth (radians) */ + $obs_set->el = $el; /* Elevation (radians)*/ + $obs_set->range = $range->w; /* Range (kilometers) */ + + /* Range Rate (kilometers/second)*/ + $obs_set->range_rate = Predict_Math::Dot($range, $rgvel) / $range->w; + + /* Corrections for atmospheric refraction */ + /* Reference: Astronomical Algorithms by Jean Meeus, pp. 101-104 */ + /* Correction is meaningless when apparent elevation is below horizon */ + // obs_set->el = obs_set->el + Radians((1.02/tan(Radians(Degrees(el)+ + // 10.3/(Degrees(el)+5.11))))/60); + if ($obs_set->el < 0) { + $obs_set->el = $el; /*Reset to true elevation*/ + } + } +} diff --git a/lib/predict/Predict/SGPSDP.php b/lib/predict/Predict/SGPSDP.php new file mode 100644 index 0000000..eed5e1c --- /dev/null +++ b/lib/predict/Predict/SGPSDP.php @@ -0,0 +1,1055 @@ +flags & self::SGP4_INITIALIZED_FLAG) { + $sat->flags |= self::SGP4_INITIALIZED_FLAG; + + /* Recover original mean motion (xnodp) and */ + /* semimajor axis (aodp) from input elements. */ + $a1 = pow(Predict::xke / $sat->tle->xno, Predict::tothrd); + $sat->sgps->cosio = cos($sat->tle->xincl); + $theta2 = $sat->sgps->cosio * $sat->sgps->cosio; + $sat->sgps->x3thm1 = 3 * $theta2 - 1.0; + $eosq = $sat->tle->eo * $sat->tle->eo; + $betao2 = 1 - $eosq; + $betao = sqrt($betao2); + $del1 = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / ($a1 * $a1 * $betao * $betao2); + $ao = $a1 * (1 - $del1 * (0.5 * Predict::tothrd + $del1 * (1 + 134.0 / 81.0 * $del1))); + $delo = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / ($ao * $ao * $betao * $betao2); + $sat->sgps->xnodp = $sat->tle->xno / (1.0 + $delo); + $sat->sgps->aodp = $ao / (1.0 - $delo); + + /* For perigee less than 220 kilometers, the "simple" flag is set */ + /* and the equations are truncated to linear variation in sqrt a */ + /* and quadratic variation in mean anomaly. Also, the c3 term, */ + /* the delta omega term, and the delta m term are dropped. */ + if (($sat->sgps->aodp * (1.0 - $sat->tle->eo) / Predict::ae) < (220.0 / Predict::xkmper + Predict::ae)) { + $sat->flags |= self::SIMPLE_FLAG; + } else { + $sat->flags &= ~self::SIMPLE_FLAG; + } + + /* For perigee below 156 km, the */ + /* values of s and qoms2t are altered. */ + $s4 = Predict::__s__; + $qoms24 = Predict::qoms2t; + $perige = ($sat->sgps->aodp * (1 - $sat->tle->eo) - Predict::ae) * Predict::xkmper; + if ($perige < 156.0) { + if ($perige <= 98.0) { + $s4 = 20.0; + } else { + $s4 = $perige - 78.0; + } + $qoms24 = pow((120.0 - $s4) * Predict::ae / Predict::xkmper, 4); + $s4 = $s4 / Predict::xkmper + Predict::ae; + }; /* FIXME FIXME: End of if(perige <= 98) NO WAY!!!! */ + + $pinvsq = 1.0 / ($sat->sgps->aodp * $sat->sgps->aodp * $betao2 * $betao2); + $tsi = 1.0 / ($sat->sgps->aodp - $s4); + $sat->sgps->eta = $sat->sgps->aodp * $sat->tle->eo * $tsi; + $etasq = $sat->sgps->eta * $sat->sgps->eta; + $eeta = $sat->tle->eo * $sat->sgps->eta; + $psisq = abs(1.0 - $etasq); + $coef = $qoms24 * pow($tsi, 4); + $coef1 = $coef / pow($psisq, 3.5); + $c2 = $coef1 * $sat->sgps->xnodp * ($sat->sgps->aodp * + (1.0 + 1.5 * $etasq + $eeta * (4.0 + $etasq)) + + 0.75 * Predict::ck2 * $tsi / $psisq * $sat->sgps->x3thm1 * + (8.0 + 3.0 * $etasq * (8 + $etasq))); + $sat->sgps->c1 = $c2 * $sat->tle->bstar; + $sat->sgps->sinio = sin($sat->tle->xincl); + $a3ovk2 = -Predict::xj3 / Predict::ck2 * pow(Predict::ae, 3); + $c3 = $coef * $tsi * $a3ovk2 * $sat->sgps->xnodp * Predict::ae * $sat->sgps->sinio / $sat->tle->eo; + $sat->sgps->x1mth2 = 1.0 - $theta2; + $sat->sgps->c4 = 2.0 * $sat->sgps->xnodp * $coef1 * $sat->sgps->aodp * $betao2 * + ($sat->sgps->eta * (2.0 + 0.5 * $etasq) + + $sat->tle->eo * (0.5 + 2.0 * $etasq) - + 2.0 * Predict::ck2 * $tsi / ($sat->sgps->aodp * $psisq) * + (-3.0 * $sat->sgps->x3thm1 * (1.0 - 2.0 * $eeta + $etasq * (1.5 - 0.5 * $eeta)) + + 0.75 * $sat->sgps->x1mth2 * (2.0 * $etasq - $eeta * (1.0 + $etasq)) * + cos(2.0 * $sat->tle->omegao))); + $sat->sgps->c5 = 2.0 * $coef1 * $sat->sgps->aodp * $betao2 * + (1.0 + 2.75 * ($etasq + $eeta) + $eeta * $etasq); + $theta4 = $theta2 * $theta2; + $temp1 = 3.0 * Predict::ck2 * $pinvsq * $sat->sgps->xnodp; + $temp2 = $temp1 * Predict::ck2 * $pinvsq; + $temp3 = 1.25 * Predict::ck4 * $pinvsq * $pinvsq * $sat->sgps->xnodp; + $sat->sgps->xmdot = $sat->sgps->xnodp + 0.5 * $temp1 * $betao * $sat->sgps->x3thm1 + + 0.0625 * $temp2 * $betao * (13.0 - 78.0 * $theta2 + 137.0 * $theta4); + $x1m5th = 1.0 - 5.0 * $theta2; + $sat->sgps->omgdot = -0.5 * $temp1 * $x1m5th + + 0.0625 * $temp2 * (7.0 - 114.0 * $theta2 + 395.0 * $theta4) + + $temp3 * (3.0 - 36.0 * $theta2 + 49.0 * $theta4); + $xhdot1 = -$temp1 * $sat->sgps->cosio; + $sat->sgps->xnodot = $xhdot1 + (0.5 * $temp2 * (4.0 - 19.0 * $theta2) + + 2.0 * $temp3 * (3.0 - 7.0 * $theta2)) * $sat->sgps->cosio; + $sat->sgps->omgcof = $sat->tle->bstar * $c3 * cos($sat->tle->omegao); + $sat->sgps->xmcof = -Predict::tothrd * $coef * $sat->tle->bstar * Predict::ae / $eeta; + $sat->sgps->xnodcf = 3.5 * $betao2 * $xhdot1 * $sat->sgps->c1; + $sat->sgps->t2cof = 1.5 * $sat->sgps->c1; + $sat->sgps->xlcof = 0.125 * $a3ovk2 * $sat->sgps->sinio * + (3.0 + 5.0 * $sat->sgps->cosio) / (1.0 + $sat->sgps->cosio); + $sat->sgps->aycof = 0.25 * $a3ovk2 * $sat->sgps->sinio; + $sat->sgps->delmo = pow(1.0 + $sat->sgps->eta * cos($sat->tle->xmo), 3); + $sat->sgps->sinmo = sin($sat->tle->xmo); + $sat->sgps->x7thm1 = 7.0 * $theta2 - 1.0; + if (~$sat->flags & self::SIMPLE_FLAG) { + $c1sq = $sat->sgps->c1 * $sat->sgps->c1; + $sat->sgps->d2 = 4.0 * $sat->sgps->aodp * $tsi * $c1sq; + $temp = $sat->sgps->d2 * $tsi * $sat->sgps->c1 / 3.0; + $sat->sgps->d3 = (17.0 * $sat->sgps->aodp + $s4) * $temp; + $sat->sgps->d4 = 0.5 * $temp * $sat->sgps->aodp * $tsi * + (221.0 * $sat->sgps->aodp + 31.0 * $s4) * $sat->sgps->c1; + $sat->sgps->t3cof = $sat->sgps->d2 + 2.0 * $c1sq; + $sat->sgps->t4cof = 0.25 * (3.0 * $sat->sgps->d3 + $sat->sgps->c1 * + (12.0 * $sat->sgps->d2 + 10.0 * $c1sq)); + $sat->sgps->t5cof = 0.2 * (3.0 * $sat->sgps->d4 + + 12.0 * $sat->sgps->c1 * $sat->sgps->d3 + + 6.0 * $sat->sgps->d2 * $sat->sgps->d2 + + 15.0 * $c1sq * (2.0 * $sat->sgps->d2 + $c1sq)); + }; /* End of if (isFlagClear(SIMPLE_FLAG)) */ + }; /* End of SGP4() initialization */ + + /* Update for secular gravity and atmospheric drag. */ + $xmdf = $sat->tle->xmo + $sat->sgps->xmdot * $tsince; + $omgadf = $sat->tle->omegao + $sat->sgps->omgdot * $tsince; + $xnoddf = $sat->tle->xnodeo + $sat->sgps->xnodot * $tsince; + $omega = $omgadf; + $xmp = $xmdf; + $tsq = $tsince * $tsince; + $xnode = $xnoddf + $sat->sgps->xnodcf * $tsq; + $tempa = 1.0 - $sat->sgps->c1 * $tsince; + $tempe = $sat->tle->bstar * $sat->sgps->c4 * $tsince; + $templ = $sat->sgps->t2cof * $tsq; + if (~$sat->flags & self::SIMPLE_FLAG) { + $delomg = $sat->sgps->omgcof * $tsince; + $delm = $sat->sgps->xmcof * (pow(1 + $sat->sgps->eta * cos($xmdf), 3) - $sat->sgps->delmo); + $temp = $delomg + $delm; + $xmp = $xmdf + $temp; + $omega = $omgadf - $temp; + $tcube = $tsq * $tsince; + $tfour = $tsince * $tcube; + $tempa = $tempa - $sat->sgps->d2 * $tsq - $sat->sgps->d3 * $tcube - $sat->sgps->d4 * $tfour; + $tempe = $tempe + $sat->tle->bstar * $sat->sgps->c5 * (sin($xmp) - $sat->sgps->sinmo); + $templ = $templ + $sat->sgps->t3cof * $tcube + $tfour * + ($sat->sgps->t4cof + $tsince * $sat->sgps->t5cof); + }; /* End of if (isFlagClear(SIMPLE_FLAG)) */ + + $a = $sat->sgps->aodp * pow($tempa, 2); + $e = $sat->tle->eo - $tempe; + $xl = $xmp + $omega + $xnode + $sat->sgps->xnodp * $templ; + $beta = sqrt(1.0 - ($e * $e)); + $xn = Predict::xke / pow($a, 1.5); + + /* Long period periodics */ + $axn = $e * cos($omega); + $temp = 1.0 / ($a * $beta * $beta); + $xll = $temp * $sat->sgps->xlcof * $axn; + $aynl = $temp * $sat->sgps->aycof; + $xlt = $xl + $xll; + $ayn = $e * sin($omega) + $aynl; + + /* Solve Kepler's' Equation */ + $capu = Predict_Math::FMod2p($xlt - $xnode); + $temp2 = $capu; + + $i = 0; + do { + $sinepw = sin($temp2); + $cosepw = cos($temp2); + $temp3 = $axn * $sinepw; + $temp4 = $ayn * $cosepw; + $temp5 = $axn * $cosepw; + $temp6 = $ayn * $sinepw; + $epw = ($capu - $temp4 + $temp3 - $temp2) / (1.0 - $temp5 - $temp6) + $temp2; + if (abs($epw - $temp2) <= Predict::e6a) { + break; + } + $temp2 = $epw; + } while ($i++ < 10); + + /* Short period preliminary quantities */ + $ecose = $temp5 + $temp6; + $esine = $temp3 - $temp4; + $elsq = $axn * $axn + $ayn * $ayn; + $temp = 1.0 - $elsq; + $pl = $a * $temp; + $r = $a * (1.0 - $ecose); + $temp1 = 1.0 / $r; + $rdot = Predict::xke * sqrt($a) * $esine * $temp1; + $rfdot = Predict::xke * sqrt($pl) * $temp1; + $temp2 = $a * $temp1; + $betal = sqrt($temp); + $temp3 = 1.0 / (1.0 + $betal); + $cosu = $temp2 * ($cosepw - $axn + $ayn * $esine * $temp3); + $sinu = $temp2 * ($sinepw - $ayn - $axn * $esine * $temp3); + $u = Predict_Math::AcTan($sinu, $cosu); + $sin2u = 2.0 * $sinu * $cosu; + $cos2u = 2.0 * $cosu * $cosu - 1.0; + $temp = 1.0 / $pl; + $temp1 = Predict::ck2 * $temp; + $temp2 = $temp1 * $temp; + + /* Update for short periodics */ + $rk = $r * (1.0 - 1.5 * $temp2 * $betal * $sat->sgps->x3thm1) + + 0.5 * $temp1 * $sat->sgps->x1mth2 * $cos2u; + $uk = $u - 0.25 * $temp2 * $sat->sgps->x7thm1 * $sin2u; + $xnodek = $xnode + 1.5 * $temp2 * $sat->sgps->cosio * $sin2u; + $xinck = $sat->tle->xincl + 1.5 * $temp2 * $sat->sgps->cosio * $sat->sgps->sinio * $cos2u; + $rdotk = $rdot - $xn * $temp1 * $sat->sgps->x1mth2 * $sin2u; + $rfdotk = $rfdot + $xn * $temp1 * ($sat->sgps->x1mth2 * $cos2u + 1.5 * $sat->sgps->x3thm1); + + + /* Orientation vectors */ + $sinuk = sin($uk); + $cosuk = cos($uk); + $sinik = sin($xinck); + $cosik = cos($xinck); + $sinnok = sin($xnodek); + $cosnok = cos($xnodek); + $xmx = -$sinnok * $cosik; + $xmy = $cosnok * $cosik; + $ux = $xmx * $sinuk + $cosnok * $cosuk; + $uy = $xmy * $sinuk + $sinnok * $cosuk; + $uz = $sinik * $sinuk; + $vx = $xmx * $cosuk - $cosnok * $sinuk; + $vy = $xmy * $cosuk - $sinnok * $sinuk; + $vz = $sinik * $cosuk; + + /* Position and velocity */ + $sat->pos->x = $rk * $ux; + $sat->pos->y = $rk * $uy; + $sat->pos->z = $rk * $uz; + $sat->vel->x = $rdotk * $ux + $rfdotk * $vx; + $sat->vel->y = $rdotk * $uy + $rfdotk * $vy; + $sat->vel->z = $rdotk * $uz + $rfdotk * $vz; + + $sat->phase = $xlt - $xnode - $omgadf + Predict::twopi; + if ($sat->phase < 0) { + $sat->phase += Predict::twopi; + } + $sat->phase = Predict_Math::FMod2p($sat->phase); + + $sat->tle->omegao1 = $omega; + $sat->tle->xincl1 = $xinck; + $sat->tle->xnodeo1 = $xnodek; + + } /*SGP4*/ + + /* SDP4 */ + /* This function is used to calculate the position and velocity */ + /* of deep-space (period > 225 minutes) satellites. tsince is */ + /* time since epoch in minutes, tle is a pointer to a tle_t */ + /* structure with Keplerian orbital elements and pos and vel */ + /* are vector_t structures returning ECI satellite position and */ + /* velocity. Use Convert_Sat_State() to convert to km and km/s. */ + public function SDP4(Predict_Sat $sat, $tsince) + { + /* Initialization */ + if (~$sat->flags & self::SDP4_INITIALIZED_FLAG) { + + $sat->flags |= self::SDP4_INITIALIZED_FLAG; + + /* Recover original mean motion (xnodp) and */ + /* semimajor axis (aodp) from input elements. */ + $a1 = pow(Predict::xke / $sat->tle->xno, Predict::tothrd); + $sat->deep_arg->cosio = cos($sat->tle->xincl); + $sat->deep_arg->theta2 = $sat->deep_arg->cosio * $sat->deep_arg->cosio; + $sat->sgps->x3thm1 = 3.0 * $sat->deep_arg->theta2 - 1.0; + $sat->deep_arg->eosq = $sat->tle->eo * $sat->tle->eo; + $sat->deep_arg->betao2 = 1.0 - $sat->deep_arg->eosq; + $sat->deep_arg->betao = sqrt($sat->deep_arg->betao2); + $del1 = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / + ($a1 * $a1 * $sat->deep_arg->betao * $sat->deep_arg->betao2); + $ao = $a1 * (1.0 - $del1 * (0.5 * Predict::tothrd + $del1 * (1.0 + 134.0 / 81.0 * $del1))); + $delo = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / + ($ao * $ao * $sat->deep_arg->betao * $sat->deep_arg->betao2); + $sat->deep_arg->xnodp = $sat->tle->xno / (1.0 + $delo); + $sat->deep_arg->aodp = $ao / (1.0 - $delo); + + /* For perigee below 156 km, the values */ + /* of s and qoms2t are altered. */ + $s4 = Predict::__s__; + $qoms24 = Predict::qoms2t; + $perige = ($sat->deep_arg->aodp * (1.0 - $sat->tle->eo) - Predict::ae) * Predict::xkmper; + if ($perige < 156.0) { + if ($perige <= 98.0) { + $s4 = 20.0; + } else { + $s4 = $perige - 78.0; + } + $qoms24 = pow((120.0 - $s4) * Predict::ae / Predict::xkmper, 4); + $s4 = $s4 / Predict::xkmper + Predict::ae; + } + $pinvsq = 1.0 / ($sat->deep_arg->aodp * $sat->deep_arg->aodp * + $sat->deep_arg->betao2 * $sat->deep_arg->betao2); + $sat->deep_arg->sing = sin($sat->tle->omegao); + $sat->deep_arg->cosg = cos($sat->tle->omegao); + $tsi = 1.0 / ($sat->deep_arg->aodp - $s4); + $eta = $sat->deep_arg->aodp * $sat->tle->eo * $tsi; + $etasq = $eta * $eta; + $eeta = $sat->tle->eo * $eta; + $psisq = abs(1.0 - $etasq); + $coef = $qoms24 * pow($tsi, 4); + $coef1 = $coef / pow($psisq, 3.5); + $c2 = $coef1 * $sat->deep_arg->xnodp * ($sat->deep_arg->aodp * + (1.0 + 1.5 * $etasq + $eeta * + (4.0 + $etasq)) + 0.75 * Predict::ck2 * $tsi / $psisq * + $sat->sgps->x3thm1 * (8.0 + 3.0 * $etasq * + (8.0 + $etasq))); + $sat->sgps->c1 = $sat->tle->bstar * $c2; + $sat->deep_arg->sinio = sin($sat->tle->xincl); + $a3ovk2 = -Predict::xj3 / Predict::ck2 * pow(Predict::ae, 3); + $sat->sgps->x1mth2 = 1.0 - $sat->deep_arg->theta2; + $sat->sgps->c4 = 2.0 * $sat->deep_arg->xnodp * $coef1 * + $sat->deep_arg->aodp * $sat->deep_arg->betao2 * + ($eta * (2.0 + 0.5 * $etasq) + $sat->tle->eo * + (0.5 + 2.0 * $etasq) - 2.0 * Predict::ck2 * $tsi / + ($sat->deep_arg->aodp * $psisq) * (-3.0 * $sat->sgps->x3thm1 * + (1.0 - 2.0 * $eeta + $etasq * + (1.5 - 0.5 * $eeta)) + + 0.75 * $sat->sgps->x1mth2 * + (2.0 * $etasq - $eeta * (1.0 + $etasq)) * + cos(2.0 * $sat->tle->omegao))); + $theta4 = $sat->deep_arg->theta2 * $sat->deep_arg->theta2; + $temp1 = 3.0 * Predict::ck2 * $pinvsq * $sat->deep_arg->xnodp; + $temp2 = $temp1 * Predict::ck2 * $pinvsq; + $temp3 = 1.25 * Predict::ck4 * $pinvsq * $pinvsq * $sat->deep_arg->xnodp; + $sat->deep_arg->xmdot = $sat->deep_arg->xnodp + 0.5 * $temp1 * $sat->deep_arg->betao * + $sat->sgps->x3thm1 + 0.0625 * $temp2 * $sat->deep_arg->betao * + (13.0 - 78.0 * $sat->deep_arg->theta2 + 137.0 * $theta4); + $x1m5th = 1.0 - 5.0 * $sat->deep_arg->theta2; + $sat->deep_arg->omgdot = -0.5 * $temp1 * $x1m5th + 0.0625 * $temp2 * + (7.0 - 114.0 * $sat->deep_arg->theta2 + 395.0 * $theta4) + + $temp3 * (3.0 - 36.0 * $sat->deep_arg->theta2 + 49.0 * $theta4); + $xhdot1 = -$temp1 * $sat->deep_arg->cosio; + $sat->deep_arg->xnodot = $xhdot1 + (0.5 * $temp2 * (4.0 - 19.0 * $sat->deep_arg->theta2) + + 2.0 * $temp3 * (3.0 - 7.0 * $sat->deep_arg->theta2)) * + $sat->deep_arg->cosio; + $sat->sgps->xnodcf = 3.5 * $sat->deep_arg->betao2 * $xhdot1 * $sat->sgps->c1; + $sat->sgps->t2cof = 1.5 * $sat->sgps->c1; + $sat->sgps->xlcof = 0.125 * $a3ovk2 * $sat->deep_arg->sinio * + (3.0 + 5.0 * $sat->deep_arg->cosio) / (1.0 + $sat->deep_arg->cosio); + $sat->sgps->aycof = 0.25 * $a3ovk2 * $sat->deep_arg->sinio; + $sat->sgps->x7thm1 = 7.0 * $sat->deep_arg->theta2 - 1.0; + + /* initialize Deep() */ + $this->Deep(self::dpinit, $sat); + }; /*End of SDP4() initialization */ + + /* Update for secular gravity and atmospheric drag */ + $xmdf = $sat->tle->xmo + $sat->deep_arg->xmdot * $tsince; + $sat->deep_arg->omgadf = $sat->tle->omegao + $sat->deep_arg->omgdot * $tsince; + $xnoddf = $sat->tle->xnodeo + $sat->deep_arg->xnodot * $tsince; + $tsq = $tsince * $tsince; + $sat->deep_arg->xnode = $xnoddf + $sat->sgps->xnodcf * $tsq; + $tempa = 1.0 - $sat->sgps->c1 * $tsince; + $tempe = $sat->tle->bstar * $sat->sgps->c4 * $tsince; + $templ = $sat->sgps->t2cof * $tsq; + $sat->deep_arg->xn = $sat->deep_arg->xnodp; + + /* Update for deep-space secular effects */ + $sat->deep_arg->xll = $xmdf; + $sat->deep_arg->t = $tsince; + + $this->Deep(self::dpsec, $sat); + + $xmdf = $sat->deep_arg->xll; + $a = pow(Predict::xke / $sat->deep_arg->xn, Predict::tothrd) * $tempa * $tempa; + $sat->deep_arg->em = $sat->deep_arg->em - $tempe; + $xmam = $xmdf + $sat->deep_arg->xnodp * $templ; + + /* Update for deep-space periodic effects */ + $sat->deep_arg->xll = $xmam; + + $this->Deep(self::dpper, $sat); + + $xmam = $sat->deep_arg->xll; + $xl = $xmam + $sat->deep_arg->omgadf + $sat->deep_arg->xnode; + $beta = sqrt(1.0 - $sat->deep_arg->em * $sat->deep_arg->em); + $sat->deep_arg->xn = Predict::xke / pow($a, 1.5); + + /* Long period periodics */ + $axn = $sat->deep_arg->em * cos($sat->deep_arg->omgadf); + $temp = 1.0 / ($a * $beta * $beta); + $xll = $temp * $sat->sgps->xlcof * $axn; + $aynl = $temp * $sat->sgps->aycof; + $xlt = $xl + $xll; + $ayn = $sat->deep_arg->em * sin($sat->deep_arg->omgadf) + $aynl; + + /* Solve Kepler's Equation */ + $capu = Predict_Math::FMod2p ($xlt - $sat->deep_arg->xnode); + $temp2 = $capu; + + $i = 0; + do { + $sinepw = sin($temp2); + $cosepw = cos($temp2); + $temp3 = $axn * $sinepw; + $temp4 = $ayn * $cosepw; + $temp5 = $axn * $cosepw; + $temp6 = $ayn * $sinepw; + $epw = ($capu - $temp4 + $temp3 - $temp2) / (1.0 - $temp5 - $temp6) + $temp2; + if (abs($epw - $temp2) <= Predict::e6a) { + break; + } + $temp2 = $epw; + } while ($i++ < 10); + + /* Short period preliminary quantities */ + $ecose = $temp5 + $temp6; + $esine = $temp3 - $temp4; + $elsq = $axn * $axn + $ayn * $ayn; + $temp = 1.0 - $elsq; + $pl = $a * $temp; + $r = $a * (1.0 - $ecose); + $temp1 = 1.0 / $r; + $rdot = Predict::xke * sqrt($a) * $esine * $temp1; + $rfdot = Predict::xke * sqrt($pl) * $temp1; + $temp2 = $a * $temp1; + $betal = sqrt($temp); + $temp3 = 1.0 / (1.0 + $betal); + $cosu = $temp2 * ($cosepw - $axn + $ayn * $esine * $temp3); + $sinu = $temp2 * ($sinepw - $ayn - $axn * $esine * $temp3); + $u = Predict_Math::AcTan($sinu, $cosu); + $sin2u = 2.0 * $sinu * $cosu; + $cos2u = 2.0 * $cosu * $cosu - 1.0; + $temp = 1.0 / $pl; + $temp1 = Predict::ck2 * $temp; + $temp2 = $temp1 * $temp; + + /* Update for short periodics */ + $rk = $r * (1.0 - 1.5 * $temp2 * $betal * $sat->sgps->x3thm1) + + 0.5 * $temp1 * $sat->sgps->x1mth2 * $cos2u; + $uk = $u - 0.25 * $temp2 * $sat->sgps->x7thm1 * $sin2u; + $xnodek = $sat->deep_arg->xnode + 1.5 * $temp2 * $sat->deep_arg->cosio * $sin2u; + $xinck = $sat->deep_arg->xinc + 1.5 * $temp2 * + $sat->deep_arg->cosio * $sat->deep_arg->sinio * $cos2u; + $rdotk = $rdot - $sat->deep_arg->xn * $temp1 * $sat->sgps->x1mth2 * $sin2u; + $rfdotk = $rfdot + $sat->deep_arg->xn * $temp1 * + ($sat->sgps->x1mth2 * $cos2u + 1.5 * $sat->sgps->x3thm1); + + /* Orientation vectors */ + $sinuk = sin($uk); + $cosuk = cos($uk); + $sinik = sin($xinck); + $cosik = cos($xinck); + $sinnok = sin($xnodek); + $cosnok = cos($xnodek); + $xmx = -$sinnok * $cosik; + $xmy = $cosnok * $cosik; + $ux = $xmx * $sinuk + $cosnok * $cosuk; + $uy = $xmy * $sinuk + $sinnok * $cosuk; + $uz = $sinik * $sinuk; + $vx = $xmx * $cosuk - $cosnok * $sinuk; + $vy = $xmy * $cosuk - $sinnok * $sinuk; + $vz = $sinik * $cosuk; + + /* Position and velocity */ + $sat->pos->x = $rk * $ux; + $sat->pos->y = $rk * $uy; + $sat->pos->z = $rk * $uz; + $sat->vel->x = $rdotk * $ux + $rfdotk * $vx; + $sat->vel->y = $rdotk * $uy + $rfdotk * $vy; + $sat->vel->z = $rdotk * $uz + $rfdotk * $vz; + + /* Phase in rads */ + $sat->phase = $xlt - $sat->deep_arg->xnode - $sat->deep_arg->omgadf + Predict::twopi; + if ($sat->phase < 0.0) { + $sat->phase += Predict::twopi; + } + $sat->phase = Predict_Math::FMod2p ($sat->phase); + + $sat->tle->omegao1 = $sat->deep_arg->omgadf; + $sat->tle->xincl1 = $sat->deep_arg->xinc; + $sat->tle->xnodeo1 = $sat->deep_arg->xnode; + } /* SDP4 */ + + + /* DEEP */ + /* This function is used by SDP4 to add lunar and solar */ + /* perturbation effects to deep-space orbit objects. */ + public function Deep($ientry, Predict_Sat $sat) + { + switch ($ientry) { + case self::dpinit : /* Entrance for deep space initialization */ + $sat->dps->thgr = Predict_Time::ThetaG($sat->tle->epoch, $sat->deep_arg); + $eq = $sat->tle->eo; + $sat->dps->xnq = $sat->deep_arg->xnodp; + $aqnv = 1.0 / $sat->deep_arg->aodp; + $sat->dps->xqncl = $sat->tle->xincl; + $xmao = $sat->tle->xmo; + $xpidot = $sat->deep_arg->omgdot + $sat->deep_arg->xnodot; + $sinq = sin($sat->tle->xnodeo); + $cosq = cos($sat->tle->xnodeo); + $sat->dps->omegaq = $sat->tle->omegao; + $sat->dps->preep = 0; + + /* Initialize lunar solar terms */ + $day = $sat->deep_arg->ds50 + 18261.5; /* Days since 1900 Jan 0.5 */ + if ($day != $sat->dps->preep) { + $sat->dps->preep = $day; + $xnodce = 4.5236020 - 9.2422029E-4 * $day; + $stem = sin($xnodce); + $ctem = cos($xnodce); + $sat->dps->zcosil = 0.91375164 - 0.03568096 * $ctem; + $sat->dps->zsinil = sqrt(1.0 - $sat->dps->zcosil * $sat->dps->zcosil); + $sat->dps->zsinhl = 0.089683511 * $stem / $sat->dps->zsinil; + $sat->dps->zcoshl = sqrt(1.0 - $sat->dps->zsinhl * $sat->dps->zsinhl); + $c = 4.7199672 + 0.22997150 * $day; + $gam = 5.8351514 + 0.0019443680 * $day; + $sat->dps->zmol = Predict_Math::FMod2p($c - $gam); + $zx = 0.39785416 * $stem / $sat->dps->zsinil; + $zy = $sat->dps->zcoshl * $ctem + 0.91744867 * $sat->dps->zsinhl * $stem; + $zx = Predict_Math::AcTan($zx, $zy); + $zx = $gam + $zx - $xnodce; + $sat->dps->zcosgl = cos($zx); + $sat->dps->zsingl = sin($zx); + $sat->dps->zmos = 6.2565837 + 0.017201977 * $day; + $sat->dps->zmos = Predict_Math::FMod2p($sat->dps->zmos); + } /* End if(day != preep) */ + + /* Do solar terms */ + $sat->dps->savtsn = 1E20; + $zcosg = Predict::zcosgs; + $zsing = Predict::zsings; + $zcosi = Predict::zcosis; + $zsini = Predict::zsinis; + $zcosh = $cosq; + $zsinh = $sinq; + $cc = Predict::c1ss; + $zn = Predict::zns; + $ze = Predict::zes; + $zmo = $sat->dps->zmos; + $xnoi = 1.0 / $sat->dps->xnq; + + /* Loop breaks when Solar terms are done a second */ + /* time, after Lunar terms are initialized */ + for(;;) { + /* Solar terms done again after Lunar terms are done */ + $a1 = $zcosg * $zcosh + $zsing * $zcosi * $zsinh; + $a3 = -$zsing * $zcosh + $zcosg * $zcosi * $zsinh; + $a7 = -$zcosg * $zsinh + $zsing * $zcosi * $zcosh; + $a8 = $zsing * $zsini; + $a9 = $zsing * $zsinh + $zcosg * $zcosi * $zcosh; + $a10 = $zcosg * $zsini; + $a2 = $sat->deep_arg->cosio * $a7 + $sat->deep_arg->sinio * $a8; + $a4 = $sat->deep_arg->cosio * $a9 + $sat->deep_arg->sinio * $a10; + $a5 = -$sat->deep_arg->sinio * $a7 + $sat->deep_arg->cosio * $a8; + $a6 = -$sat->deep_arg->sinio * $a9 + $sat->deep_arg->cosio * $a10; + $x1 = $a1 * $sat->deep_arg->cosg + $a2 * $sat->deep_arg->sing; + $x2 = $a3 * $sat->deep_arg->cosg + $a4 * $sat->deep_arg->sing; + $x3 = -$a1 * $sat->deep_arg->sing + $a2 * $sat->deep_arg->cosg; + $x4 = -$a3 * $sat->deep_arg->sing + $a4 * $sat->deep_arg->cosg; + $x5 = $a5 * $sat->deep_arg->sing; + $x6 = $a6 * $sat->deep_arg->sing; + $x7 = $a5 * $sat->deep_arg->cosg; + $x8 = $a6 * $sat->deep_arg->cosg; + $z31 = 12 * $x1 * $x1 - 3 * $x3 * $x3; + $z32 = 24 * $x1 * $x2 - 6 * $x3 * $x4; + $z33 = 12 * $x2 * $x2 - 3 * $x4 * $x4; + $z1 = 3 * ($a1 * $a1 + $a2 * $a2) + $z31 * $sat->deep_arg->eosq; + $z2 = 6 * ($a1 * $a3 + $a2 * $a4) + $z32 * $sat->deep_arg->eosq; + $z3 = 3 * ($a3 * $a3 + $a4 * $a4) + $z33 * $sat->deep_arg->eosq; + $z11 = -6 * $a1 * $a5 + $sat->deep_arg->eosq * (-24 * $x1 * $x7 - 6 * $x3 * $x5); + $z12 = -6 * ($a1 * $a6 + $a3 * $a5) + $sat->deep_arg->eosq * + (-24 * ($x2 * $x7 + $x1 * $x8) - 6 * ($x3 * $x6 + $x4 * $x5)); + $z13 = -6 * $a3 * $a6 + $sat->deep_arg->eosq * (-24 * $x2 * $x8 - 6 * $x4 * $x6); + $z21 = 6 * $a2 * $a5 + $sat->deep_arg->eosq * (24 * $x1 * $x5 - 6 * $x3 * $x7); + $z22 = 6 * ($a4 * $a5 + $a2 * $a6) + $sat->deep_arg->eosq * + (24 * ($x2 * $x5 + $x1 * $x6) - 6 * ($x4 * $x7 + $x3 * $x8)); + $z23 = 6 * $a4 * $a6 + $sat->deep_arg->eosq * (24 * $x2 * $x6 - 6 * $x4 * $x8); + $z1 = $z1 + $z1 + $sat->deep_arg->betao2 * $z31; + $z2 = $z2 + $z2 + $sat->deep_arg->betao2 * $z32; + $z3 = $z3 + $z3 + $sat->deep_arg->betao2 * $z33; + $s3 = $cc * $xnoi; + $s2 = -0.5 * $s3 / $sat->deep_arg->betao; + $s4 = $s3 * $sat->deep_arg->betao; + $s1 = -15 * $eq * $s4; + $s5 = $x1 * $x3 + $x2 * $x4; + $s6 = $x2 * $x3 + $x1 * $x4; + $s7 = $x2 * $x4 - $x1 * $x3; + $se = $s1 * $zn * $s5; + $si = $s2 * $zn * ($z11 + $z13); + $sl = -$zn * $s3 * ($z1 + $z3 - 14 - 6 * $sat->deep_arg->eosq); + $sgh = $s4 * $zn * ($z31 + $z33 - 6); + $sh = -$zn * $s2 * ($z21 + $z23); + if ($sat->dps->xqncl < 5.2359877E-2) { + $sh = 0; + } + $sat->dps->ee2 = 2 * $s1 * $s6; + $sat->dps->e3 = 2 * $s1 * $s7; + $sat->dps->xi2 = 2 * $s2 * $z12; + $sat->dps->xi3 = 2 * $s2 * ($z13 - $z11); + $sat->dps->xl2 = -2 * $s3 * $z2; + $sat->dps->xl3 = -2 * $s3 * ($z3 - $z1); + $sat->dps->xl4 = -2 * $s3 * (-21 - 9 * $sat->deep_arg->eosq) * $ze; + $sat->dps->xgh2 = 2 * $s4 * $z32; + $sat->dps->xgh3 = 2 * $s4 * ($z33 - $z31); + $sat->dps->xgh4 = -18 * $s4 * $ze; + $sat->dps->xh2 = -2 * $s2 * $z22; + $sat->dps->xh3 = -2 * $s2 * ($z23 - $z21); + + if ($sat->flags & self::LUNAR_TERMS_DONE_FLAG) { + break; + } + + /* Do lunar terms */ + $sat->dps->sse = $se; + $sat->dps->ssi = $si; + $sat->dps->ssl = $sl; + $sat->dps->ssh = $sh / $sat->deep_arg->sinio; + $sat->dps->ssg = $sgh - $sat->deep_arg->cosio * $sat->dps->ssh; + $sat->dps->se2 = $sat->dps->ee2; + $sat->dps->si2 = $sat->dps->xi2; + $sat->dps->sl2 = $sat->dps->xl2; + $sat->dps->sgh2 = $sat->dps->xgh2; + $sat->dps->sh2 = $sat->dps->xh2; + $sat->dps->se3 = $sat->dps->e3; + $sat->dps->si3 = $sat->dps->xi3; + $sat->dps->sl3 = $sat->dps->xl3; + $sat->dps->sgh3 = $sat->dps->xgh3; + $sat->dps->sh3 = $sat->dps->xh3; + $sat->dps->sl4 = $sat->dps->xl4; + $sat->dps->sgh4 = $sat->dps->xgh4; + $zcosg = $sat->dps->zcosgl; + $zsing = $sat->dps->zsingl; + $zcosi = $sat->dps->zcosil; + $zsini = $sat->dps->zsinil; + $zcosh = $sat->dps->zcoshl * $cosq + $sat->dps->zsinhl * $sinq; + $zsinh = $sinq * $sat->dps->zcoshl - $cosq * $sat->dps->zsinhl; + $zn = Predict::znl; + $cc = Predict::c1l; + $ze = Predict::zel; + $zmo = $sat->dps->zmol; + $sat->flags |= self::LUNAR_TERMS_DONE_FLAG; + } /* End of for(;;) */ + + $sat->dps->sse = $sat->dps->sse + $se; + $sat->dps->ssi = $sat->dps->ssi + $si; + $sat->dps->ssl = $sat->dps->ssl + $sl; + $sat->dps->ssg = $sat->dps->ssg + $sgh - $sat->deep_arg->cosio / $sat->deep_arg->sinio * $sh; + $sat->dps->ssh = $sat->dps->ssh + $sh / $sat->deep_arg->sinio; + + /* Geopotential resonance initialization for 12 hour orbits */ + $sat->flags &= ~self::RESONANCE_FLAG; + $sat->flags &= ~self::SYNCHRONOUS_FLAG; + + if (!(($sat->dps->xnq < 0.0052359877) && ($sat->dps->xnq > 0.0034906585))) { + if( ($sat->dps->xnq < 0.00826) || ($sat->dps->xnq > 0.00924) ) { + return; + } + if ($eq < 0.5) { + return; + } + $sat->flags |= self::RESONANCE_FLAG; + $eoc = $eq * $sat->deep_arg->eosq; + $g201 = -0.306 - ($eq - 0.64) * 0.440; + if ($eq <= 0.65) { + $g211 = 3.616 - 13.247 * $eq + 16.290 * $sat->deep_arg->eosq; + $g310 = -19.302 + 117.390 * $eq - 228.419 * + $sat->deep_arg->eosq + 156.591 * $eoc; + $g322 = -18.9068 + 109.7927 * $eq - 214.6334 * + $sat->deep_arg->eosq + 146.5816 * $eoc; + $g410 = -41.122 + 242.694 * $eq - 471.094 * + $sat->deep_arg->eosq + 313.953 * $eoc; + $g422 = -146.407 + 841.880 * $eq - 1629.014 * + $sat->deep_arg->eosq + 1083.435 * $eoc; + $g520 = -532.114 + 3017.977 * $eq - 5740 * + $sat->deep_arg->eosq + 3708.276 * $eoc; + } else { + $g211 = -72.099 + 331.819 * $eq - 508.738 * + $sat->deep_arg->eosq + 266.724 * $eoc; + $g310 = -346.844 + 1582.851 * $eq - 2415.925 * + $sat->deep_arg->eosq + 1246.113 * $eoc; + $g322 = -342.585 + 1554.908 * $eq - 2366.899 * + $sat->deep_arg->eosq + 1215.972 * $eoc; + $g410 = -1052.797 + 4758.686 * $eq - 7193.992 * + $sat->deep_arg->eosq + 3651.957 * $eoc; + $g422 = -3581.69 + 16178.11 * $eq - 24462.77 * + $sat->deep_arg->eosq+ 12422.52 * $eoc; + if ($eq <= 0.715) { + $g520 = 1464.74 - 4664.75 * $eq + 3763.64 * $sat->deep_arg->eosq; + } else { + $g520 = -5149.66 + 29936.92 * $eq - 54087.36 * + $sat->deep_arg->eosq + 31324.56 * $eoc; + } + } /* End if (eq <= 0.65) */ + + if ($eq < 0.7) { + $g533 = -919.2277 + 4988.61 * $eq - 9064.77 * + $sat->deep_arg->eosq + 5542.21 * $eoc; + $g521 = -822.71072 + 4568.6173 * $eq - 8491.4146 * + $sat->deep_arg->eosq + 5337.524 * $eoc; + $g532 = -853.666 + 4690.25 * $eq - 8624.77 * + $sat->deep_arg->eosq + 5341.4 * $eoc; + } + else { + $g533 = -37995.78 + 161616.52 * $eq - 229838.2* + $sat->deep_arg->eosq + 109377.94 * $eoc; + $g521 = -51752.104 + 218913.95 * $eq - 309468.16* + $sat->deep_arg->eosq + 146349.42 * $eoc; + $g532 = -40023.88 + 170470.89 * $eq - 242699.48* + $sat->deep_arg->eosq + 115605.82 * $eoc; + } /* End if (eq <= 0.7) */ + + $sini2 = $sat->deep_arg->sinio * $sat->deep_arg->sinio; + $f220 = 0.75 * (1 + 2 * $sat->deep_arg->cosio + $sat->deep_arg->theta2); + $f221 = 1.5 * $sini2; + $f321 = 1.875 * $sat->deep_arg->sinio * (1 - 2 * + $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2); + $f322 = -1.875 * $sat->deep_arg->sinio * (1 + 2* + $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2); + $f441 = 35 * $sini2 * $f220; + $f442 = 39.3750 * $sini2 * $sini2; + $f522 = 9.84375 * $sat->deep_arg->sinio * ($sini2 * (1 - 2 * $sat->deep_arg->cosio - 5 * + $sat->deep_arg->theta2) + 0.33333333 * (-2 + 4 * $sat->deep_arg->cosio + + 6 * $sat->deep_arg->theta2)); + $f523 = $sat->deep_arg->sinio * (4.92187512 * $sini2 * (-2 - 4 * + $sat->deep_arg->cosio + 10 * $sat->deep_arg->theta2) + 6.56250012 + * (1 + 2 * $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2)); + $f542 = 29.53125 * $sat->deep_arg->sinio * (2 - 8 * + $sat->deep_arg->cosio + $sat->deep_arg->theta2 * + (-12 + 8 * $sat->deep_arg->cosio + 10 * $sat->deep_arg->theta2)); + $f543 = 29.53125 * $sat->deep_arg->sinio * (-2 - 8 * $sat->deep_arg->cosio + + $sat->deep_arg->theta2 * (12 + 8 * $sat->deep_arg->cosio - 10 * + $sat->deep_arg->theta2)); + $xno2 = $sat->dps->xnq * $sat->dps->xnq; + $ainv2 = $aqnv * $aqnv; + $temp1 = 3 * $xno2 * $ainv2; + $temp = $temp1 * Predict::root22; + $sat->dps->d2201 = $temp * $f220 * $g201; + $sat->dps->d2211 = $temp * $f221 * $g211; + $temp1 = $temp1 * $aqnv; + $temp = $temp1 * Predict::root32; + $sat->dps->d3210 = $temp * $f321 * $g310; + $sat->dps->d3222 = $temp * $f322 * $g322; + $temp1 = $temp1 * $aqnv; + $temp = 2 * $temp1 * Predict::root44; + $sat->dps->d4410 = $temp * $f441 * $g410; + $sat->dps->d4422 = $temp * $f442 * $g422; + $temp1 = $temp1 * $aqnv; + $temp = $temp1 * Predict::root52; + $sat->dps->d5220 = $temp * $f522 * $g520; + $sat->dps->d5232 = $temp * $f523 * $g532; + $temp = 2 * $temp1 * Predict::root54; + $sat->dps->d5421 = $temp * $f542 * $g521; + $sat->dps->d5433 = $temp * $f543 * $g533; + $sat->dps->xlamo = $xmao + $sat->tle->xnodeo + $sat->tle->xnodeo - $sat->dps->thgr - $sat->dps->thgr; + $bfact = $sat->deep_arg->xmdot + $sat->deep_arg->xnodot + + $sat->deep_arg->xnodot - Predict::thdt - Predict::thdt; + $bfact = $bfact + $sat->dps->ssl + $sat->dps->ssh + $sat->dps->ssh; + } else { + $sat->flags |= self::RESONANCE_FLAG; + $sat->flags |= self::SYNCHRONOUS_FLAG; + /* Synchronous resonance terms initialization */ + $g200 = 1 + $sat->deep_arg->eosq * (-2.5 + 0.8125 * $sat->deep_arg->eosq); + $g310 = 1 + 2 * $sat->deep_arg->eosq; + $g300 = 1 + $sat->deep_arg->eosq * (-6 + 6.60937 * $sat->deep_arg->eosq); + $f220 = 0.75 * (1 + $sat->deep_arg->cosio) * (1 + $sat->deep_arg->cosio); + $f311 = 0.9375 * $sat->deep_arg->sinio * $sat->deep_arg->sinio * + (1 + 3 * $sat->deep_arg->cosio) - 0.75 * (1 + $sat->deep_arg->cosio); + $f330 = 1 + $sat->deep_arg->cosio; + $f330 = 1.875 * $f330 * $f330 * $f330; + $sat->dps->del1 = 3 * $sat->dps->xnq * $sat->dps->xnq * $aqnv * $aqnv; + $sat->dps->del2 = 2 * $sat->dps->del1 * $f220 * $g200 * Predict::q22; + $sat->dps->del3 = 3 * $sat->dps->del1 * $f330 * $g300 * Predict::q33 * $aqnv; + $sat->dps->del1 = $sat->dps->del1 * $f311 * $g310 * Predict::q31 * $aqnv; + $sat->dps->fasx2 = 0.13130908; + $sat->dps->fasx4 = 2.8843198; + $sat->dps->fasx6 = 0.37448087; + $sat->dps->xlamo = $xmao + $sat->tle->xnodeo + $sat->tle->omegao - $sat->dps->thgr; + $bfact = $sat->deep_arg->xmdot + $xpidot - Predict::thdt; + $bfact = $bfact + $sat->dps->ssl + $sat->dps->ssg + $sat->dps->ssh; + } /* End if( !(xnq < 0.0052359877) && (xnq > 0.0034906585) ) */ + + $sat->dps->xfact = $bfact - $sat->dps->xnq; + + /* Initialize integrator */ + $sat->dps->xli = $sat->dps->xlamo; + $sat->dps->xni = $sat->dps->xnq; + $sat->dps->atime = 0; + $sat->dps->stepp = 720; + $sat->dps->stepn = -720; + $sat->dps->step2 = 259200; + /* End case self::dpinit: */ + return; + + case self::dpsec: /* Entrance for deep space secular effects */ + $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->ssl * $sat->deep_arg->t; + $sat->deep_arg->omgadf = $sat->deep_arg->omgadf + $sat->dps->ssg * $sat->deep_arg->t; + $sat->deep_arg->xnode = $sat->deep_arg->xnode + $sat->dps->ssh * $sat->deep_arg->t; + $sat->deep_arg->em = $sat->tle->eo + $sat->dps->sse * $sat->deep_arg->t; + $sat->deep_arg->xinc = $sat->tle->xincl + $sat->dps->ssi * $sat->deep_arg->t; + if ($sat->deep_arg->xinc < 0) { + $sat->deep_arg->xinc = -$sat->deep_arg->xinc; + $sat->deep_arg->xnode = $sat->deep_arg->xnode + Predict::pi; + $sat->deep_arg->omgadf = $sat->deep_arg->omgadf - Predict::pi; + } + if(~$sat->flags & self::RESONANCE_FLAG ) { + return; + } + + do { + if ( ($sat->dps->atime == 0) || + (($sat->deep_arg->t >= 0) && ($sat->dps->atime < 0)) || + (($sat->deep_arg->t < 0) && ($sat->dps->atime >= 0)) ) { + /* Epoch restart */ + if ($sat->deep_arg->t >= 0) { + $delt = $sat->dps->stepp; + } else { + $delt = $sat->dps->stepn; + } + + $sat->dps->atime = 0; + $sat->dps->xni = $sat->dps->xnq; + $sat->dps->xli = $sat->dps->xlamo; + } else { + if (abs($sat->deep_arg->t) >= abs($sat->dps->atime)) { + if ($sat->deep_arg->t > 0) { + $delt = $sat->dps->stepp; + } else { + $delt = $sat->dps->stepn; + } + } + } + + do { + if (abs($sat->deep_arg->t - $sat->dps->atime) >= $sat->dps->stepp) { + $sat->flags |= self::DO_LOOP_FLAG; + $sat->flags &= ~self::EPOCH_RESTART_FLAG; + } + else { + $ft = $sat->deep_arg->t - $sat->dps->atime; + $sat->flags &= ~self::DO_LOOP_FLAG; + } + + if (abs($sat->deep_arg->t) < abs($sat->dps->atime)) { + if ($sat->deep_arg->t >= 0) { + $delt = $sat->dps->stepn; + } else { + $delt = $sat->dps->stepp; + } + $sat->flags |= (self::DO_LOOP_FLAG | self::EPOCH_RESTART_FLAG); + } + + /* Dot terms calculated */ + if ($sat->flags & self::SYNCHRONOUS_FLAG) { + $xndot = $sat->dps->del1 * sin($sat->dps->xli - $sat->dps->fasx2) + $sat->dps->del2 * sin(2 * ($sat->dps->xli - $sat->dps->fasx4)) + + $sat->dps->del3 * sin(3 * ($sat->dps->xli - $sat->dps->fasx6)); + $xnddt = $sat->dps->del1 * cos($sat->dps->xli - $sat->dps->fasx2) + 2 * $sat->dps->del2 * cos(2 * ($sat->dps->xli - $sat->dps->fasx4)) + + 3 * $sat->dps->del3 * cos(3 * ($sat->dps->xli - $sat->dps->fasx6)); + } else { + $xomi = $sat->dps->omegaq + $sat->deep_arg->omgdot * $sat->dps->atime; + $x2omi = $xomi + $xomi; + $x2li = $sat->dps->xli + $sat->dps->xli; + $xndot = $sat->dps->d2201 * sin($x2omi + $sat->dps->xli - Predict::g22) + + $sat->dps->d2211 * sin($sat->dps->xli - Predict::g22) + + $sat->dps->d3210 * sin($xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d3222 * sin(-$xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d4410 * sin($x2omi + $x2li- Predict::g44) + + $sat->dps->d4422 * sin($x2li- Predict::g44) + + $sat->dps->d5220 * sin($xomi + $sat->dps->xli- Predict::g52) + + $sat->dps->d5232 * sin(-$xomi + $sat->dps->xli- Predict::g52) + + $sat->dps->d5421 * sin($xomi + $x2li - Predict::g54) + + $sat->dps->d5433 * sin(-$xomi + $x2li - Predict::g54); + $xnddt = $sat->dps->d2201 * cos($x2omi + $sat->dps->xli- Predict::g22) + + $sat->dps->d2211 * cos($sat->dps->xli - Predict::g22) + + $sat->dps->d3210 * cos($xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d3222 * cos(-$xomi + $sat->dps->xli - Predict::g32) + + $sat->dps->d5220 * cos($xomi + $sat->dps->xli - Predict::g52) + + $sat->dps->d5232 * cos(-$xomi + $sat->dps->xli - Predict::g52) + + 2 * ($sat->dps->d4410 * cos($x2omi + $x2li - Predict::g44) + + $sat->dps->d4422 * cos($x2li - Predict::g44) + + $sat->dps->d5421 * cos($xomi + $x2li - Predict::g54) + + $sat->dps->d5433 * cos(-$xomi + $x2li - Predict::g54)); + } /* End of if (isFlagSet(SYNCHRONOUS_FLAG)) */ + + $xldot = $sat->dps->xni + $sat->dps->xfact; + $xnddt = $xnddt * $xldot; + + if ($sat->flags & self::DO_LOOP_FLAG) { + $sat->dps->xli = $sat->dps->xli + $xldot * $delt + $xndot * $sat->dps->step2; + $sat->dps->xni = $sat->dps->xni + $xndot * $delt + $xnddt * $sat->dps->step2; + $sat->dps->atime = $sat->dps->atime + $delt; + } + } while (($sat->flags & self::DO_LOOP_FLAG) && + (~$sat->flags & self::EPOCH_RESTART_FLAG)); + } + while (($sat->flags & self::DO_LOOP_FLAG) && ($sat->flags & self::EPOCH_RESTART_FLAG)); + + $sat->deep_arg->xn = $sat->dps->xni + $xndot * $ft + $xnddt * $ft * $ft * 0.5; + $xl = $sat->dps->xli + $xldot * $ft + $xndot * $ft * $ft * 0.5; + $temp = -$sat->deep_arg->xnode + $sat->dps->thgr + $sat->deep_arg->t * Predict::thdt; + + if (~$sat->flags & self::SYNCHRONOUS_FLAG) { + $sat->deep_arg->xll = $xl + $temp + $temp; + } else { + $sat->deep_arg->xll = $xl - $sat->deep_arg->omgadf + $temp; + } + + return; + /* End case dpsec: */ + + case self::dpper: /* Entrance for lunar-solar periodics */ + $sinis = sin($sat->deep_arg->xinc); + $cosis = cos($sat->deep_arg->xinc); + if (abs($sat->dps->savtsn - $sat->deep_arg->t) >= 30) { + $sat->dps->savtsn = $sat->deep_arg->t; + $zm = $sat->dps->zmos + Predict::zns * $sat->deep_arg->t; + $zf = $zm + 2 * Predict::zes * sin($zm); + $sinzf = sin($zf); + $f2 = 0.5 * $sinzf * $sinzf - 0.25; + $f3 = -0.5 * $sinzf * cos($zf); + $ses = $sat->dps->se2 * $f2 + $sat->dps->se3 * $f3; + $sis = $sat->dps->si2 * $f2 + $sat->dps->si3 * $f3; + $sls = $sat->dps->sl2 * $f2 + $sat->dps->sl3 * $f3 + $sat->dps->sl4 * $sinzf; + $sat->dps->sghs = $sat->dps->sgh2 * $f2 + $sat->dps->sgh3 * $f3 + $sat->dps->sgh4 * $sinzf; + $sat->dps->shs = $sat->dps->sh2 * $f2 + $sat->dps->sh3 * $f3; + $zm = $sat->dps->zmol + Predict::znl * $sat->deep_arg->t; + $zf = $zm + 2 * Predict::zel * sin($zm); + $sinzf = sin($zf); + $f2 = 0.5 * $sinzf * $sinzf - 0.25; + $f3 = -0.5 * $sinzf * cos($zf); + $sel = $sat->dps->ee2 * $f2 + $sat->dps->e3 * $f3; + $sil = $sat->dps->xi2 * $f2 + $sat->dps->xi3 * $f3; + $sll = $sat->dps->xl2 * $f2 + $sat->dps->xl3 * $f3 + $sat->dps->xl4 * $sinzf; + $sat->dps->sghl = $sat->dps->xgh2 * $f2 + $sat->dps->xgh3 * $f3 + $sat->dps->xgh4 * $sinzf; + $sat->dps->sh1 = $sat->dps->xh2 * $f2 + $sat->dps->xh3 * $f3; + $sat->dps->pe = $ses + $sel; + $sat->dps->pinc = $sis + $sil; + $sat->dps->pl = $sls + $sll; + } + + $pgh = $sat->dps->sghs + $sat->dps->sghl; + $ph = $sat->dps->shs + $sat->dps->sh1; + $sat->deep_arg->xinc = $sat->deep_arg->xinc + $sat->dps->pinc; + $sat->deep_arg->em = $sat->deep_arg->em + $sat->dps->pe; + + if ($sat->dps->xqncl >= 0.2) { + /* Apply periodics directly */ + $ph = $ph / $sat->deep_arg->sinio; + $pgh = $pgh - $sat->deep_arg->cosio * $ph; + $sat->deep_arg->omgadf = $sat->deep_arg->omgadf + $pgh; + $sat->deep_arg->xnode = $sat->deep_arg->xnode + $ph; + $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->pl; + } else { + /* Apply periodics with Lyddane modification */ + $sinok = sin($sat->deep_arg->xnode); + $cosok = cos($sat->deep_arg->xnode); + $alfdp = $sinis * $sinok; + $betdp = $sinis * $cosok; + $dalf = $ph * $cosok + $sat->dps->pinc * $cosis * $sinok; + $dbet = -$ph * $sinok + $sat->dps->pinc * $cosis * $cosok; + $alfdp = $alfdp + $dalf; + $betdp = $betdp + $dbet; + $sat->deep_arg->xnode = Predict_Math::FMod2p($sat->deep_arg->xnode); + $xls = $sat->deep_arg->xll + $sat->deep_arg->omgadf + $cosis * $sat->deep_arg->xnode; + $dls = $sat->dps->pl + $pgh - $sat->dps->pinc * $sat->deep_arg->xnode * $sinis; + $xls = $xls + $dls; + $xnoh = $sat->deep_arg->xnode; + $sat->deep_arg->xnode = Predict_Math::AcTan($alfdp, $betdp); + + /* This is a patch to Lyddane modification */ + /* suggested by Rob Matson. */ + if(abs($xnoh - $sat->deep_arg->xnode) > Predict::pi) { + if ($sat->deep_arg->xnode < $xnoh) { + $sat->deep_arg->xnode += Predict::twopi; + } else { + $sat->deep_arg->xnode -= Predict::twopi; + } + } + + $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->pl; + $sat->deep_arg->omgadf = $xls - $sat->deep_arg->xll - cos($sat->deep_arg->xinc) * + $sat->deep_arg->xnode; + } /* End case dpper: */ + return; + + } /* End switch(ientry) */ + + } /* End of Deep() */ + + /** + * Singleton + * + * @param Predict_Sat $sat The current satellite data instance + * + * @return Predict_SGPSDP + */ + public static function getInstance(Predict_Sat $sat) + { + static $instances = array(); + $catnr = $sat->tle->catnr; + if (!isset($instances[$catnr])) { + $instances[$catnr] = new self(); + } + return $instances[$catnr]; + } +} +?> diff --git a/lib/predict/Predict/SGSDPStatic.php b/lib/predict/Predict/SGSDPStatic.php new file mode 100644 index 0000000..12a43a4 --- /dev/null +++ b/lib/predict/Predict/SGSDPStatic.php @@ -0,0 +1,39 @@ +header); + $this->name = $headerParts[0]; + $this->nickname = $this->name; + $this->tle = $tle; + $this->pos = new Predict_Vector(); + $this->vel = new Predict_Vector(); + $this->sgps = new Predict_SGSDPStatic(); + $this->deep_arg = new Predict_DeepArg(); + $this->dps = new Predict_DeepStatic(); + + $this->select_ephemeris(); + $this->sat_data_init_sat($this); + } + + /* Selects the apropriate ephemeris type to be used */ + /* for predictions according to the data in the TLE */ + /* It also processes values in the tle set so that */ + /* they are apropriate for the sgp4/sdp4 routines */ + public function select_ephemeris() + { + /* Preprocess tle set */ + $this->tle->xnodeo *= Predict::de2ra; + $this->tle->omegao *= Predict::de2ra; + $this->tle->xmo *= Predict::de2ra; + $this->tle->xincl *= Predict::de2ra; + $temp = Predict::twopi / Predict::xmnpda / Predict::xmnpda; + + /* store mean motion before conversion */ + $this->meanmo = $this->tle->xno; + $this->tle->xno = $this->tle->xno * $temp * Predict::xmnpda; + $this->tle->xndt2o *= $temp; + $this->tle->xndd6o = $this->tle->xndd6o * $temp / Predict::xmnpda; + $this->tle->bstar /= Predict::ae; + + /* Period > 225 minutes is deep space */ + $dd1 = Predict::xke / $this->tle->xno; + $dd2 = Predict::tothrd; + $a1 = pow($dd1, $dd2); + $r1 = cos($this->tle->xincl); + $dd1 = 1.0 - $this->tle->eo * $this->tle->eo; + $temp = Predict::ck2 * 1.5 * ($r1 * $r1 * 3.0 - 1.0) / pow($dd1, 1.5); + $del1 = $temp / ($a1 * $a1); + $ao = $a1 * (1.0 - $del1 * (Predict::tothrd * 0.5 + $del1 * + ($del1 * 1.654320987654321 + 1.0))); + $delo = $temp / ($ao * $ao); + $xnodp = $this->tle->xno / ($delo + 1.0); + + /* Select a deep-space/near-earth ephemeris */ + if (Predict::twopi / $xnodp / Predict::xmnpda >= .15625) { + $this->flags |= Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG; + } else { + $this->flags &= ~Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG; + } + } + + /** Initialise satellite data. + * @param sat The satellite to initialise. + * @param qth Optional QTH info, use (0,0) if NULL. + * + * This function calculates the satellite data at t = 0, ie. epoch time + * The function is called automatically by gtk_sat_data_read_sat. + */ + public function sat_data_init_sat(Predict_Sat $sat, Predict_QTH $qth = null) + { + $obs_geodetic = new Predict_Geodetic(); + $obs_set = new Predict_ObsSet(); + $sat_geodetic = new Predict_Geodetic(); + /* double jul_utc, age; */ + + $jul_utc = Predict_Time::Julian_Date_of_Epoch($sat->tle->epoch); // => tsince = 0.0 + $sat->jul_epoch = $jul_utc; + + /* initialise observer location */ + if ($qth != null) { + $obs_geodetic->lon = $qth->lon * Predict::de2ra; + $obs_geodetic->lat = $qth->lat * Predict::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + } + else { + $obs_geodetic->lon = 0.0; + $obs_geodetic->lat = 0.0; + $obs_geodetic->alt = 0.0; + $obs_geodetic->theta = 0; + } + + /* execute computations */ + $sdpsgp = Predict_SGPSDP::getInstance($sat); + if ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) { + $sdpsgp->SDP4($sat, 0.0); + } else { + $sdpsgp->SGP4($sat, 0.0); + } + + /* scale position and velocity to km and km/sec */ + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + /* get the velocity of the satellite */ + $sat->vel->w = sqrt($sat->vel->x * $sat->vel->x + $sat->vel->y * $sat->vel->y + $sat->vel->z * $sat->vel->z); + $sat->velo = $sat->vel->w; + Predict_SGPObs::Calculate_Obs($jul_utc, $sat->pos, $sat->vel, $obs_geodetic, $obs_set); + Predict_SGPObs::Calculate_LatLonAlt($jul_utc, $sat->pos, $sat_geodetic); + + while ($sat_geodetic->lon < -Predict::pi) { + $sat_geodetic->lon += Predict::twopi; + } + + while ($sat_geodetic->lon > Predict::pi) { + $sat_geodetic->lon -= Predict::twopi; + } + + $sat->az = Predict_Math::Degrees($obs_set->az); + $sat->el = Predict_Math::Degrees($obs_set->el); + $sat->range = $obs_set->range; + $sat->range_rate = $obs_set->range_rate; + $sat->ssplat = Predict_Math::Degrees($sat_geodetic->lat); + $sat->ssplon = Predict_Math::Degrees($sat_geodetic->lon); + $sat->alt = $sat_geodetic->alt; + $sat->ma = Predict_Math::Degrees($sat->phase); + $sat->ma *= 256.0 / 360.0; + $sat->footprint = 2.0 * Predict::xkmper * acos (Predict::xkmper/$sat->pos->w); + $age = 0.0; + $sat->orbit = floor(($sat->tle->xno * Predict::xmnpda / Predict::twopi + + $age * $sat->tle->bstar * Predict::ae) * $age + + $sat->tle->xmo / Predict::twopi) + $sat->tle->revnum - 1; + + /* orbit type */ + $sat->otype = $sat->get_orbit_type($sat); + } + + public function get_orbit_type(Predict_Sat $sat) + { + $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN; + + if ($this->geostationary($sat)) { + $orbit = Predict_SGPSDP::ORBIT_TYPE_GEO; + } else if ($this->decayed($sat)) { + $orbit = Predict_SGPSDP::ORBIT_TYPE_DECAYED; + } else { + $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN; + } + + return $orbit; + } + + + /** Determinte whether satellite is in geostationary orbit. + * @author John A. Magliacane, KD2BD + * @param sat Pointer to satellite data. + * @return TRUE if the satellite appears to be in geostationary orbit, + * FALSE otherwise. + * + * A satellite is in geostationary orbit if + * + * fabs (sat.meanmotion - 1.0027) < 0.0002 + * + * Note: Appearantly, the mean motion can deviate much more from 1.0027 than 0.0002 + */ + public function geostationary(Predict_Sat $sat) + { + if (abs($sat->meanmo - 1.0027) < 0.0002) { + return true; + } else { + return false; + } + } + + + /** Determine whether satellite has decayed. + * @author John A. Magliacane, KD2BD + * @author Alexandru Csete, OZ9AEC + * @param sat Pointer to satellite data. + * @return TRUE if the satellite appears to have decayed, FALSE otherwise. + * @bug Modified version of the predict code but it is not tested. + * + * A satellite is decayed if + * + * satepoch + ((16.666666 - sat.meanmo) / (10.0*fabs(sat.drag))) < "now" + * + */ + public function decayed(Predict_Sat $sat) + { + /* tle.xndt2o/(twopi/xmnpda/xmnpda) is the value before converted the + value matches up with the value in predict 2.2.3 */ + /*** FIXME decayed is treated as a static quantity. + It is time dependent. Also sat->jul_utc is often zero + when this function is called + ***/ + if ($sat->jul_epoch + ((16.666666 - $sat->meanmo) / + (10.0 * abs($sat->tle->xndt2o / (Predict::twopi / Predict::xmnpda / Predict::xmnpda)))) < $sat->jul_utc) { + return true; + } else { + return false; + } + } + + /** + * Experimental attempt at calculating apparent magnitude. Known intrinsic + * magnitudes are listed inside the function for now. + * + * @param float $time The daynum the satellite is calculated for + * @param Predict_QTH $qth The observer location + * + * @return null on failure, float otherwise + */ + public function calculateApparentMagnitude($time, Predict_QTH $qth) + { + // Recorded intrinsic magnitudes and their respective + // illumination and distance from heavens-above.com + static $intrinsicMagnitudes = array( + '25544' => array( + 'mag' => -1.3, + 'illum' => .5, + 'distance' => 1000, + ) + ); + + // Return null if we don't have a record of the intrinsic mag + if (!isset($intrinsicMagnitudes[$this->tle->catnr])) { + return null; + } + $imag = $intrinsicMagnitudes[$this->tle->catnr]; + + // Convert the observer's geodetic info to radians and km so + // we can compare vectors + $observerGeo = new Predict_Geodetic(); + $observerGeo->lat = Predict_Math::Radians($qth->lat); + $observerGeo->lon = Predict_Math::Radians($qth->lon); + $observerGeo->alt = $qth->alt * 1000; + + // Now determine the sun and observer positions + $observerPos = new Predict_Vector(); + $observerVel = new Predict_Vector(); + $solarVector = new Predict_Vector(); + Predict_Solar::Calculate_Solar_Position($time, $solarVector); + Predict_SGPObs::Calculate_User_PosVel($time, $observerGeo, $observerPos, $observerVel); + + // Determine the solar phase and and thus the percent illumination + $observerSatPos = new Predict_Vector(); + Predict_Math::Vec_Sub($this->pos, $observerPos, $observerSatPos); + $phaseAngle = Predict_Math::Degrees(Predict_Math::Angle($solarVector, $observerSatPos)); + $illum = $phaseAngle / 180; + + $illuminationChange = $illum / $imag['illum']; + $inverseSquareOfDistanceChange = pow(($imag['distance'] / $this->range), 2); + $changeInMagnitude = log( + $illuminationChange * $inverseSquareOfDistanceChange, + self::POGSONS_RATIO + ); + + return $imag['mag'] - $changeInMagnitude; + } +} diff --git a/lib/predict/Predict/Solar.php b/lib/predict/Predict/Solar.php new file mode 100644 index 0000000..06c2b9f --- /dev/null +++ b/lib/predict/Predict/Solar.php @@ -0,0 +1,106 @@ +x = $R * cos($Lsa); + $solar_vector->y = $R * sin($Lsa) * cos($eps); + $solar_vector->z = $R * sin($Lsa) * sin($eps); + $solar_vector->w = $R; + } + + /* Calculates stellite's eclipse status and depth */ + public static function Sat_Eclipsed(Predict_Vector $pos, Predict_Vector $sol, &$depth) + { + $Rho = new Predict_Vector(); + $earth = new Predict_Vector(); + + /* Determine partial eclipse */ + $sd_earth = Predict_Math::ArcSin(Predict::xkmper / $pos->w); + Predict_Math::Vec_Sub($sol, $pos, $Rho); + $sd_sun = Predict_Math::ArcSin(Predict::__sr__ / $Rho->w); + Predict_Math::Scalar_Multiply(-1, $pos, $earth); + $delta = Predict_Math::Angle($sol, $earth); + $depth = $sd_earth - $sd_sun - $delta; + + if ($sd_earth < $sd_sun) { + return 0; + } else if ($depth >= 0) { + return 1; + } else { + return 0; + } + } + + /** + * Finds the current location of the sun based on the observer location + * + * @param Predict_QTH $qth The observer location + * @param int $daynum The daynum or null to use the current daynum + * + * @return Predict_ObsSet + */ + public static function FindSun(Predict_QTH $qth, $daynum = null) + { + if ($daynum === null) { + $daynum = Predict_Time::get_current_daynum(); + } + + $obs_geodetic = new Predict_Geodetic(); + $obs_geodetic->lon = $qth->lon * Predict::de2ra; + $obs_geodetic->lat = $qth->lat * Predict::de2ra; + $obs_geodetic->alt = $qth->alt / 1000.0; + $obs_geodetic->theta = 0; + + $solar_vector = new Predict_Vector(); + $zero_vector = new Predict_Vector(); + $solar_set = new Predict_ObsSet(); + + self::Calculate_Solar_Position($daynum, $solar_vector); + Predict_SGPObs::Calculate_Obs( + $daynum, + $solar_vector, + $zero_vector, + $obs_geodetic, + $solar_set + ); + + $solar_set->az = Predict_Math::Degrees($solar_set->az); + $solar_set->el = Predict_Math::Degrees($solar_set->el); + + return $solar_set; + } +} diff --git a/lib/predict/Predict/TLE.php b/lib/predict/Predict/TLE.php new file mode 100644 index 0000000..4764f05 --- /dev/null +++ b/lib/predict/Predict/TLE.php @@ -0,0 +1,230 @@ +Good_Elements($line1, $line2)) { + throw new Predict_Exception('Invalid TLE contents'); + } + + $this->header = $header; + $this->line1 = $line1; + $this->line2 = $line2; + + /** Decode Card 1 **/ + /* Satellite's catalogue number */ + $this->catnr = (int) substr($line1, 2, 5); + + /* International Designator for satellite */ + $this->idesg = substr($line1, 9, 8); + + /* Epoch time; this is the complete, unconverted epoch. */ + /* Replace spaces with 0 before casting, as leading spaces are allowed */ + $this->epoch = (float) str_replace(' ', '0', substr($line1, 18, 14)); + + /* Now, convert the epoch time into year, day + and fraction of day, according to: + + YYDDD.FFFFFFFF + */ + + // Adjust for 2 digit year through 2056 + $this->epoch_year = (int) substr($line1, 18, 2); + if ($this->epoch_year > 56) { + $this->epoch_year = $this->epoch_year + 1900; + } else { + $this->epoch_year = $this->epoch_year + 2000; + } + + /* Epoch day */ + $this->epoch_day = (int) substr($line1, 20, 3); + + /* Epoch fraction of day */ + $this->epoch_fod = (float) substr($line1, 23, 9); + + + /* Satellite's First Time Derivative */ + $this->xndt2o = (float) substr($line1, 33, 10); + + /* Satellite's Second Time Derivative */ + $this->xndd6o = (float) (substr($line1, 44, 1) . '.' . substr($line1, 45, 5) . 'E' . substr($line1, 50, 2)); + + /* Satellite's bstar drag term + FIXME: How about buff[0] ???? + */ + $this->bstar = (float) (substr($line1, 53, 1) . '.' . substr($line1, 54, 5) . 'E' . substr($line1, 59, 2)); + + /* Element Number */ + $this->elset = (int) substr($line1, 64, 4); + + /** Decode Card 2 **/ + /* Satellite's Orbital Inclination (degrees) */ + $this->xincl = (float) substr($line2, 8, 8); + + /* Satellite's RAAN (degrees) */ + $this->xnodeo = (float) substr($line2, 17, 8); + + /* Satellite's Orbital Eccentricity */ + $this->eo = (float) ('.' . substr($line2, 26, 7)); + + /* Satellite's Argument of Perigee (degrees) */ + $this->omegao = (float) substr($line2, 34, 8); + + /* Satellite's Mean Anomaly of Orbit (degrees) */ + $this->xmo = (float) substr($line2, 43, 8); + + /* Satellite's Mean Motion (rev/day) */ + $this->xno = (float) substr($line2, 52, 11); + + /* Satellite's Revolution number at epoch */ + $this->revnum = (float) substr($line2, 63, 5); + } + + /* Calculates the checksum mod 10 of a line from a TLE set and */ + /* returns true if it compares with checksum in column 68, else false.*/ + /* tle_set is a character string holding the two lines read */ + /* from a text file containing NASA format Keplerian elements. */ + /* NOTE!!! The stuff about two lines is not quite true. + The function assumes that tle_set[0] is the begining + of the line and that there are 68 elements - see the consumer + */ + public function Checksum_Good($tle_set) + { + if (strlen($tle_set) < 69) { + return false; + } + + $checksum = 0; + + for ($i = 0; $i < 68; $i++) { + if (($tle_set[$i] >= '0') && ($tle_set[$i] <= '9')) { + $value = $tle_set[$i] - '0'; + } else if ($tle_set[$i] == '-' ) { + $value = 1; + } else { + $value = 0; + } + + $checksum += $value; + } + + $checksum %= 10; + $check_digit = $tle_set[68] - '0'; + + return $checksum == $check_digit; + } + + /* Carries out various checks on a TLE set to verify its validity */ + /* $line1 is the first line of the TLE, $line2 is the second line */ + /* from a text file containing NASA format Keplerian elements. */ + public function Good_Elements($line1, $line2) + { + /* Verify checksum of both lines of a TLE set */ + if (!$this->Checksum_Good($line1) || !$this->Checksum_Good($line2)) { + return false; + } + + /* Check the line number of each line */ + if (($line1[0] != '1') || ($line2[0] != '2')) { + return false; + } + + /* Verify that Satellite Number is same in both lines */ + if (strncmp($line1[2], $line2[2], 5) != 0) { + return false; + } + + /* Check that various elements are in the right place */ + if (($line1[23] != '.') || + ($line1[34] != '.') || + ($line2[11] != '.') || + ($line2[20] != '.') || + ($line2[37] != '.') || + ($line2[46] != '.') || + ($line2[54] != '.') || + (strncmp(substr($line1, 61), ' 0 ', 3) != 0)) { + + return false; + } + + return true; + } + + /** + * A function to allow checksum creation of a line. This is driven by + * the fact that some TLEs from SpaceTrack are missing checksum numbers. + * You can use this to create a checksum for a line, but you should + * probably have confidence that the TLE data itself is good. YMMV. + * + * @throws Predict_Exception if the line is not exactly 68 chars + * @return string + */ + static public function createChecksum($line) + { + if (strlen($line) != 68) { + throw Predict_Exception('Invalid line, needs to e 68 chars'); + } + + $checksum = 0; + + for ($i = 0; $i < 68; $i++) { + if (($line[$i] >= '0') && ($line[$i] <= '9')) { + $value = (int) $line[$i]; + } else if ($line[$i] == '-' ) { + $value = 1; + } else { + $value = 0; + } + + $checksum += $value; + } + + $checksum %= 10; + + return $checksum; + } +} diff --git a/lib/predict/Predict/Time.php b/lib/predict/Predict/Time.php new file mode 100644 index 0000000..b5c0d90 --- /dev/null +++ b/lib/predict/Predict/Time.php @@ -0,0 +1,229 @@ +ds50 = $jd - 2433281.5 + $UT; + + return Predict_Math::FMod2p(6.3003880987 * $deep_arg->ds50 + 1.72944494); + } + + /* See the ThetaG doc block above */ + public static function ThetaG_JD($jd) + { + /* Reference: The 1992 Astronomical Almanac, page B6. */ + $UT = Predict_Math::Frac($jd + 0.5); + $jd = $jd - $UT; + $TU = ($jd - 2451545.0) / 36525; + $GMST = 24110.54841 + $TU * (8640184.812866 + $TU * (0.093104 - $TU * 6.2E-6)); + $GMST = Predict_Math::Modulus($GMST + Predict::secday * Predict::omega_E * $UT, Predict::secday); + + return Predict::twopi * $GMST / Predict::secday; + } + + /** + * Read the system clock and return the current Julian day. From phpPredict + * + * @return float + */ + public static function get_current_daynum() { + // Gets the current decimal day number from microtime + + list($usec, $sec) = explode(' ', microtime()); + return self::unix2daynum($sec, $usec); + } + + /** + * Converts a standard unix timestamp and optional + * milliseconds to a daynum + * + * @param int $sec Seconds from the unix epoch + * @param int $usec Optional milliseconds + * + * @return float + */ + public static function unix2daynum($sec, $usec = 0) + { + $time = ((($sec + $usec) / 86400.0) - 3651.0); + return $time + 2444238.5; + } + + /* The function Delta_ET has been added to allow calculations on */ + /* the position of the sun. It provides the difference between UT */ + /* (approximately the same as UTC) and ET (now referred to as TDT).*/ + /* This function is based on a least squares fit of data from 1950 */ + /* to 1991 and will need to be updated periodically. */ + public static function Delta_ET($year) + { + /* Values determined using data from 1950-1991 in the 1990 + Astronomical Almanac. See DELTA_ET.WQ1 for details. */ + + $delta_et = 26.465 + 0.747622 * ($year - 1950) + + 1.886913 * sin(Predict::twopi * ($year - 1975) / 33); + + return $delta_et; + } + + /** + * Converts a daynum to a unix timestamp. From phpPredict. + * + * @param float $dn Julian Daynum + * + * @return float + */ + public static function daynum2unix($dn) { + // Converts a daynum to a UNIX timestamp + + return (86400.0 * ($dn - 2444238.5 + 3651.0)); + } + + /** + * Converts a daynum to a readable time format. + * + * @param float $dn The julian date + * @param string $zone The zone string, defaults to America/Los_Angeles + * @param string $format The date() function's format string. Defaults to m-d-Y H:i:s + * + * @return string + */ + public static function daynum2readable($dn, $zone = 'America/Los_Angeles', $format = 'm-d-Y H:i:s') + { + $unix = self::daynum2unix($dn); + $date = new DateTime("@" . round($unix)); + $dateTimezone = new DateTimezone($zone); + $date->setTimezone($dateTimezone); + return $date->format($format); + } + + public static function daynum2datetime($dn, $zone = 'UTC') + { + $unix = self::daynum2unix($dn); + $date = new DateTime("@" . round($unix)); + $dateTimezone = new DateTimezone($zone); + $date->setTimezone($dateTimezone); + return $date; + } + + /** + * Returns the unix timestamp of a TLE's epoch + * + * @param Predict_TLE $tle The TLE object + * + * @return int + */ + public static function getEpochTimeStamp(Predict_TLE $tle) + { + $year = $tle->epoch_year; + $day = $tle->epoch_day; + $sec = round(86400 * $tle->epoch_fod); + + $zone = new DateTimeZone('GMT'); + $date = new DateTime(); + $date->setTimezone($zone); + $date->setDate($year, 1, 1); + $date->setTime(0, 0, 0); + + return $date->format('U') + (86400 * $day) + $sec - 86400; + } +} diff --git a/lib/predict/Predict/Vector.php b/lib/predict/Predict/Vector.php new file mode 100644 index 0000000..8474905 --- /dev/null +++ b/lib/predict/Predict/Vector.php @@ -0,0 +1,13 @@ +save_run($xhprofData, $xhprofNameSpace); + } + register_shutdown_function('stop_xhprof_profiling'); +} + +$start = microtime(true); + +$predict = new Predict(); +$qth = new Predict_QTH(); +$qth->lat = 37.6550; +$qth->lon = -122.4070; +$qth->alt = 0; + +$tleFile = file('examples/iss.tle'); +$tle = new Predict_TLE($tleFile[0], $tleFile[1], $tleFile[2]); +$sat = new Predict_Sat($tle); +$now = Predict_Time::get_current_daynum(); + +$results = $predict->get_passes($sat, $qth, $now, 10); + +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; exit; diff --git a/lib/predict/examples/findsun.php b/lib/predict/examples/findsun.php new file mode 100644 index 0000000..1a3834f --- /dev/null +++ b/lib/predict/examples/findsun.php @@ -0,0 +1,31 @@ +lat = 37.786759; +$qth->lon = -122.405162; +$qth->alt = 10; // Altitude above sea level in meters + +$sunInfo = Predict_Solar::FindSun($qth, $daynum); + +$output = array( + 'elevation' => $sunInfo->el, + 'azimuth' => $sunInfo->az, + 'timestamp' => $time +); + +// output results +echo json_encode($output); diff --git a/lib/predict/examples/iss.tle b/lib/predict/examples/iss.tle new file mode 100644 index 0000000..e01670f --- /dev/null +++ b/lib/predict/examples/iss.tle @@ -0,0 +1,3 @@ +ISS (ZARYA) +1 25544U 98067A 21109.21251552 .00001445 00000-0 34486-4 0 9999 +2 25544 51.6452 274.4230 0002486 246.0034 286.0425 15.48900816279452 diff --git a/lib/predict/examples/solar_position.php b/lib/predict/examples/solar_position.php new file mode 100644 index 0000000..d07c4bc --- /dev/null +++ b/lib/predict/examples/solar_position.php @@ -0,0 +1,44 @@ +lat); +$solar_lon = Predict_Math::Degrees($solar_geodetic->lon); + +// Reverse values for night circle center +$dark_lat = -$solar_lat; +$dark_lon = -$solar_lon; + +$output = array( + 'solar_lat' => $solar_lat, + 'solar_lon' => $solar_lon, + 'dark_lat' => $dark_lat, + 'dark_lon' => $dark_lon, + 'timestamp' => $time +); + +// output results +var_dump(json_encode($output)); diff --git a/lib/predict/examples/visible_passes.php b/lib/predict/examples/visible_passes.php new file mode 100644 index 0000000..2741946 --- /dev/null +++ b/lib/predict/examples/visible_passes.php @@ -0,0 +1,74 @@ +alt = 0; // Altitude in meters + +// South San Francisco, example west of the meridian +$qth->lat = 37.6550; // Latitude North +$qth->lon = -122.4070; // Longitude East + +// Munich, example east of the meridian +// $qth->lat = 48.1505; // Lat North +// $qth->lon = 11.5809; // Lon East + +// The iss.tle file is the first 3 lines of +// http://celestrak.com/NORAD/elements/stations.txt +// Make sure you update this content, it goes out of date within a day or two +$tleFile = file('examples/iss.tle'); // Load up the ISS data file from NORAD +$tle = new Predict_TLE($tleFile[0], $tleFile[1], $tleFile[2]); // Instantiate it +$sat = new Predict_Sat($tle); // Load up the satellite data +$now = Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) + +// You can modify some preferences in Predict(), the defaults are below +// +// $predict->minEle = 10; // Minimum elevation for a pass +// $predict->timeRes = 10; // Pass details: time resolution in seconds +// $predict->numEntries = 20; // Pass details: number of entries per pass +// $predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + +// Get the passes and filter visible only, takes about 4 seconds for 10 days +$results = $predict->get_passes($sat, $qth, $now, 10); +$filtered = $predict->filterVisiblePasses($results); + +$zone = 'America/Los_Angeles'; // Pacific time zone +$format = 'm-d-Y H:i:s'; // Time format from PHP's date() function + +// Format the output similar to the heavens-above.com website +foreach ($filtered as $pass) { + echo "AOS Daynum: " . $pass->visible_aos . "\n"; + echo "AOS Time: " . Predict_Time::daynum2readable($pass->visible_aos, $zone, $format) . "\n"; + echo "AOS Az: " . $predict->azDegreesToDirection($pass->visible_aos_az) . "\n"; + echo "AOS El: " . round($pass->visible_aos_el) . "\n"; + echo "Max Time: " . Predict_Time::daynum2readable($pass->visible_tca, $zone, $format) . "\n"; + echo "Max Az: " . $predict->azDegreesToDirection($pass->visible_max_el_az) . "\n"; + echo "Max El: " . round($pass->visible_max_el) . "\n"; + echo "LOS Time: " . Predict_Time::daynum2readable($pass->visible_los, $zone, $format) . "\n"; + echo "LOS Az: " . $predict->azDegreesToDirection($pass->visible_los_az) . "\n"; + echo "LOS El: " . round($pass->visible_los_el) . "\n"; + echo "Magnitude: " . number_format($pass->max_apparent_magnitude, 1) . "\n"; + echo "\n"; +} + +// How long did this take? +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; exit; diff --git a/lib/predict/tests/Table.php b/lib/predict/tests/Table.php new file mode 100644 index 0000000..ce9d640 --- /dev/null +++ b/lib/predict/tests/Table.php @@ -0,0 +1,893 @@ + + * @author Jan Schneider + * @copyright 2002-2005 Richard Heyes + * @copyright 2006-2008 Jan Schneider + * @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) + * @version CVS: $Id: Table.php 268934 2008-11-13 10:35:34Z yunosh $ + * @link http://pear.php.net/package/Console_Table + */ + +define('CONSOLE_TABLE_HORIZONTAL_RULE', 1); +define('CONSOLE_TABLE_ALIGN_LEFT', -1); +define('CONSOLE_TABLE_ALIGN_CENTER', 0); +define('CONSOLE_TABLE_ALIGN_RIGHT', 1); +define('CONSOLE_TABLE_BORDER_ASCII', -1); + +/** + * The main class. + * + * @category Console + * @package Console_Table + * @author Jan Schneider + * @license http://www.debian.org/misc/bsd.license BSD License (3 Clause) + * @link http://pear.php.net/package/Console_Table + */ +class Console_Table +{ + /** + * The table headers. + * + * @var array + */ + var $_headers = array(); + + /** + * The data of the table. + * + * @var array + */ + var $_data = array(); + + /** + * The maximum number of columns in a row. + * + * @var integer + */ + var $_max_cols = 0; + + /** + * The maximum number of rows in the table. + * + * @var integer + */ + var $_max_rows = 0; + + /** + * Lengths of the columns, calculated when rows are added to the table. + * + * @var array + */ + var $_cell_lengths = array(); + + /** + * Heights of the rows. + * + * @var array + */ + var $_row_heights = array(); + + /** + * How many spaces to use to pad the table. + * + * @var integer + */ + var $_padding = 1; + + /** + * Column filters. + * + * @var array + */ + var $_filters = array(); + + /** + * Columns to calculate totals for. + * + * @var array + */ + var $_calculateTotals; + + /** + * Alignment of the columns. + * + * @var array + */ + var $_col_align = array(); + + /** + * Default alignment of columns. + * + * @var integer + */ + var $_defaultAlign; + + /** + * Character set of the data. + * + * @var string + */ + var $_charset = 'utf-8'; + + /** + * Border character. + * + * @var string + */ + var $_border = CONSOLE_TABLE_BORDER_ASCII; + + /** + * Whether the data has ANSI colors. + * + * @var boolean + */ + var $_ansiColor = false; + + /** + * Constructor. + * + * @param integer $align Default alignment. One of + * CONSOLE_TABLE_ALIGN_LEFT, + * CONSOLE_TABLE_ALIGN_CENTER or + * CONSOLE_TABLE_ALIGN_RIGHT. + * @param string $border The character used for table borders or + * CONSOLE_TABLE_BORDER_ASCII. + * @param integer $padding How many spaces to use to pad the table. + * @param string $charset A charset supported by the mbstring PHP + * extension. + * @param boolean $color Whether the data contains ansi color codes. + */ + function Console_Table($align = CONSOLE_TABLE_ALIGN_LEFT, + $border = CONSOLE_TABLE_BORDER_ASCII, $padding = 1, + $charset = null, $color = false) + { + $this->_defaultAlign = $align; + $this->_border = $border; + $this->_padding = $padding; + $this->_ansiColor = $color; + if ($this->_ansiColor) { + include_once 'Console/Color.php'; + } + if (!empty($charset)) { + $this->setCharset($charset); + } + } + + /** + * Converts an array to a table. + * + * @param array $headers Headers for the table. + * @param array $data A two dimensional array with the table + * data. + * @param boolean $returnObject Whether to return the Console_Table object + * instead of the rendered table. + * + * @static + * + * @return Console_Table|string A Console_Table object or the generated + * table. + */ + function fromArray($headers, $data, $returnObject = false) + { + if (!is_array($headers) || !is_array($data)) { + return false; + } + + $table = new Console_Table(); + $table->setHeaders($headers); + + foreach ($data as $row) { + $table->addRow($row); + } + + return $returnObject ? $table : $table->getTable(); + } + + /** + * Adds a filter to a column. + * + * Filters are standard PHP callbacks which are run on the data before + * table generation is performed. Filters are applied in the order they + * are added. The callback function must accept a single argument, which + * is a single table cell. + * + * @param integer $col Column to apply filter to. + * @param mixed &$callback PHP callback to apply. + * + * @return void + */ + function addFilter($col, &$callback) + { + $this->_filters[] = array($col, &$callback); + } + + /** + * Sets the charset of the provided table data. + * + * @param string $charset A charset supported by the mbstring PHP + * extension. + * + * @return void + */ + function setCharset($charset) + { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'en_US'); + $this->_charset = strtolower($charset); + setlocale(LC_CTYPE, $locale); + } + + /** + * Sets the alignment for the columns. + * + * @param integer $col_id The column number. + * @param integer $align Alignment to set for this column. One of + * CONSOLE_TABLE_ALIGN_LEFT + * CONSOLE_TABLE_ALIGN_CENTER + * CONSOLE_TABLE_ALIGN_RIGHT. + * + * @return void + */ + function setAlign($col_id, $align = CONSOLE_TABLE_ALIGN_LEFT) + { + switch ($align) { + case CONSOLE_TABLE_ALIGN_CENTER: + $pad = STR_PAD_BOTH; + break; + case CONSOLE_TABLE_ALIGN_RIGHT: + $pad = STR_PAD_LEFT; + break; + default: + $pad = STR_PAD_RIGHT; + break; + } + $this->_col_align[$col_id] = $pad; + } + + /** + * Specifies which columns are to have totals calculated for them and + * added as a new row at the bottom. + * + * @param array $cols Array of column numbers (starting with 0). + * + * @return void + */ + function calculateTotalsFor($cols) + { + $this->_calculateTotals = $cols; + } + + /** + * Sets the headers for the columns. + * + * @param array $headers The column headers. + * + * @return void + */ + function setHeaders($headers) + { + $this->_headers = array(array_values($headers)); + $this->_updateRowsCols($headers); + } + + /** + * Adds a row to the table. + * + * @param array $row The row data to add. + * @param boolean $append Whether to append or prepend the row. + * + * @return void + */ + function addRow($row, $append = true) + { + if ($append) { + $this->_data[] = array_values($row); + } else { + array_unshift($this->_data, array_values($row)); + } + + $this->_updateRowsCols($row); + } + + /** + * Inserts a row after a given row number in the table. + * + * If $row_id is not given it will prepend the row. + * + * @param array $row The data to insert. + * @param integer $row_id Row number to insert before. + * + * @return void + */ + function insertRow($row, $row_id = 0) + { + array_splice($this->_data, $row_id, 0, array($row)); + + $this->_updateRowsCols($row); + } + + /** + * Adds a column to the table. + * + * @param array $col_data The data of the column. + * @param integer $col_id The column index to populate. + * @param integer $row_id If starting row is not zero, specify it here. + * + * @return void + */ + function addCol($col_data, $col_id = 0, $row_id = 0) + { + foreach ($col_data as $col_cell) { + $this->_data[$row_id++][$col_id] = $col_cell; + } + + $this->_updateRowsCols(); + $this->_max_cols = max($this->_max_cols, $col_id + 1); + } + + /** + * Adds data to the table. + * + * @param array $data A two dimensional array with the table data. + * @param integer $col_id Starting column number. + * @param integer $row_id Starting row number. + * + * @return void + */ + function addData($data, $col_id = 0, $row_id = 0) + { + foreach ($data as $row) { + if ($row === CONSOLE_TABLE_HORIZONTAL_RULE) { + $this->_data[$row_id] = CONSOLE_TABLE_HORIZONTAL_RULE; + $row_id++; + continue; + } + $starting_col = $col_id; + foreach ($row as $cell) { + $this->_data[$row_id][$starting_col++] = $cell; + } + $this->_updateRowsCols(); + $this->_max_cols = max($this->_max_cols, $starting_col); + $row_id++; + } + } + + /** + * Adds a horizontal seperator to the table. + * + * @return void + */ + function addSeparator() + { + $this->_data[] = CONSOLE_TABLE_HORIZONTAL_RULE; + } + + /** + * Returns the generated table. + * + * @return string The generated table. + */ + function getTable() + { + $this->_applyFilters(); + $this->_calculateTotals(); + $this->_validateTable(); + + return $this->_buildTable(); + } + + /** + * Calculates totals for columns. + * + * @return void + */ + function _calculateTotals() + { + if (empty($this->_calculateTotals)) { + return; + } + + $this->addSeparator(); + + $totals = array(); + foreach ($this->_data as $row) { + if (is_array($row)) { + foreach ($this->_calculateTotals as $columnID) { + $totals[$columnID] += $row[$columnID]; + } + } + } + + $this->_data[] = $totals; + $this->_updateRowsCols(); + } + + /** + * Applies any column filters to the data. + * + * @return void + */ + function _applyFilters() + { + if (empty($this->_filters)) { + return; + } + + foreach ($this->_filters as $filter) { + $column = $filter[0]; + $callback = $filter[1]; + + foreach ($this->_data as $row_id => $row_data) { + if ($row_data !== CONSOLE_TABLE_HORIZONTAL_RULE) { + $this->_data[$row_id][$column] = + call_user_func($callback, $row_data[$column]); + } + } + } + } + + /** + * Ensures that column and row counts are correct. + * + * @return void + */ + function _validateTable() + { + if (!empty($this->_headers)) { + $this->_calculateRowHeight(-1, $this->_headers[0]); + } + + for ($i = 0; $i < $this->_max_rows; $i++) { + for ($j = 0; $j < $this->_max_cols; $j++) { + if (!isset($this->_data[$i][$j]) && + (!isset($this->_data[$i]) || + $this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE)) { + $this->_data[$i][$j] = ''; + } + + } + $this->_calculateRowHeight($i, $this->_data[$i]); + + if ($this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE) { + ksort($this->_data[$i]); + } + + } + + $this->_splitMultilineRows(); + + // Update cell lengths. + for ($i = 0; $i < count($this->_headers); $i++) { + $this->_calculateCellLengths($this->_headers[$i]); + } + for ($i = 0; $i < $this->_max_rows; $i++) { + $this->_calculateCellLengths($this->_data[$i]); + } + + ksort($this->_data); + } + + /** + * Splits multiline rows into many smaller one-line rows. + * + * @return void + */ + function _splitMultilineRows() + { + ksort($this->_data); + $sections = array(&$this->_headers, &$this->_data); + $max_rows = array(count($this->_headers), $this->_max_rows); + $row_height_offset = array(-1, 0); + + for ($s = 0; $s <= 1; $s++) { + $inserted = 0; + $new_data = $sections[$s]; + + for ($i = 0; $i < $max_rows[$s]; $i++) { + // Process only rows that have many lines. + $height = $this->_row_heights[$i + $row_height_offset[$s]]; + if ($height > 1) { + // Split column data into one-liners. + $split = array(); + for ($j = 0; $j < $this->_max_cols; $j++) { + $split[$j] = preg_split('/\r?\n|\r/', + $sections[$s][$i][$j]); + } + + $new_rows = array(); + // Construct new 'virtual' rows - insert empty strings for + // columns that have less lines that the highest one. + for ($i2 = 0; $i2 < $height; $i2++) { + for ($j = 0; $j < $this->_max_cols; $j++) { + $new_rows[$i2][$j] = !isset($split[$j][$i2]) + ? '' + : $split[$j][$i2]; + } + } + + // Replace current row with smaller rows. $inserted is + // used to take account of bigger array because of already + // inserted rows. + array_splice($new_data, $i + $inserted, 1, $new_rows); + $inserted += count($new_rows) - 1; + } + } + + // Has the data been modified? + if ($inserted > 0) { + $sections[$s] = $new_data; + $this->_updateRowsCols(); + } + } + } + + /** + * Builds the table. + * + * @return string The generated table string. + */ + function _buildTable() + { + if (!count($this->_data)) { + return ''; + } + + $rule = $this->_border == CONSOLE_TABLE_BORDER_ASCII + ? '|' + : $this->_border; + $separator = $this->_getSeparator(); + + $return = array(); + for ($i = 0; $i < count($this->_data); $i++) { + for ($j = 0; $j < count($this->_data[$i]); $j++) { + if ($this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE && + $this->_strlen($this->_data[$i][$j]) < + $this->_cell_lengths[$j]) { + $this->_data[$i][$j] = $this->_strpad($this->_data[$i][$j], + $this->_cell_lengths[$j], + ' ', + $this->_col_align[$j]); + } + } + + if ($this->_data[$i] !== CONSOLE_TABLE_HORIZONTAL_RULE) { + $row_begin = $rule . str_repeat(' ', $this->_padding); + $row_end = str_repeat(' ', $this->_padding) . $rule; + $implode_char = str_repeat(' ', $this->_padding) . $rule + . str_repeat(' ', $this->_padding); + $return[] = $row_begin + . implode($implode_char, $this->_data[$i]) . $row_end; + } elseif (!empty($separator)) { + $return[] = $separator; + } + + } + + $return = implode("\r\n", $return); + if (!empty($separator)) { + $return = $separator . "\r\n" . $return . "\r\n" . $separator; + } + $return .= "\r\n"; + + if (!empty($this->_headers)) { + $return = $this->_getHeaderLine() . "\r\n" . $return; + } + + return $return; + } + + /** + * Creates a horizontal separator for header separation and table + * start/end etc. + * + * @return string The horizontal separator. + */ + function _getSeparator() + { + if (!$this->_border) { + return; + } + + if ($this->_border == CONSOLE_TABLE_BORDER_ASCII) { + $rule = '-'; + $sect = '+'; + } else { + $rule = $sect = $this->_border; + } + + $return = array(); + foreach ($this->_cell_lengths as $cl) { + $return[] = str_repeat($rule, $cl); + } + + $row_begin = $sect . str_repeat($rule, $this->_padding); + $row_end = str_repeat($rule, $this->_padding) . $sect; + $implode_char = str_repeat($rule, $this->_padding) . $sect + . str_repeat($rule, $this->_padding); + + return $row_begin . implode($implode_char, $return) . $row_end; + } + + /** + * Returns the header line for the table. + * + * @return string The header line of the table. + */ + function _getHeaderLine() + { + // Make sure column count is correct + for ($j = 0; $j < count($this->_headers); $j++) { + for ($i = 0; $i < $this->_max_cols; $i++) { + if (!isset($this->_headers[$j][$i])) { + $this->_headers[$j][$i] = ''; + } + } + } + + for ($j = 0; $j < count($this->_headers); $j++) { + for ($i = 0; $i < count($this->_headers[$j]); $i++) { + if ($this->_strlen($this->_headers[$j][$i]) < + $this->_cell_lengths[$i]) { + $this->_headers[$j][$i] = + $this->_strpad($this->_headers[$j][$i], + $this->_cell_lengths[$i], + ' ', + $this->_col_align[$i]); + } + } + } + + $rule = $this->_border == CONSOLE_TABLE_BORDER_ASCII + ? '|' + : $this->_border; + $row_begin = $rule . str_repeat(' ', $this->_padding); + $row_end = str_repeat(' ', $this->_padding) . $rule; + $implode_char = str_repeat(' ', $this->_padding) . $rule + . str_repeat(' ', $this->_padding); + + $separator = $this->_getSeparator(); + if (!empty($separator)) { + $return[] = $separator; + } + for ($j = 0; $j < count($this->_headers); $j++) { + $return[] = $row_begin + . implode($implode_char, $this->_headers[$j]) . $row_end; + } + + return implode("\r\n", $return); + } + + /** + * Updates values for maximum columns and rows. + * + * @param array $rowdata Data array of a single row. + * + * @return void + */ + function _updateRowsCols($rowdata = array()) + { + // Update maximum columns. + $this->_max_cols = max($this->_max_cols, count($rowdata)); + + // Update maximum rows. + ksort($this->_data); + $keys = array_keys($this->_data); + $this->_max_rows = end($keys) + 1; + + switch ($this->_defaultAlign) { + case CONSOLE_TABLE_ALIGN_CENTER: + $pad = STR_PAD_BOTH; + break; + case CONSOLE_TABLE_ALIGN_RIGHT: + $pad = STR_PAD_LEFT; + break; + default: + $pad = STR_PAD_RIGHT; + break; + } + + // Set default column alignments + for ($i = count($this->_col_align); $i < $this->_max_cols; $i++) { + $this->_col_align[$i] = $pad; + } + } + + /** + * Calculates the maximum length for each column of a row. + * + * @param array $row The row data. + * + * @return void + */ + function _calculateCellLengths($row) + { + for ($i = 0; $i < count($row); $i++) { + if (!isset($this->_cell_lengths[$i])) { + $this->_cell_lengths[$i] = 0; + } + $this->_cell_lengths[$i] = max($this->_cell_lengths[$i], + $this->_strlen($row[$i])); + } + } + + /** + * Calculates the maximum height for all columns of a row. + * + * @param integer $row_number The row number. + * @param array $row The row data. + * + * @return void + */ + function _calculateRowHeight($row_number, $row) + { + if (!isset($this->_row_heights[$row_number])) { + $this->_row_heights[$row_number] = 1; + } + + // Do not process horizontal rule rows. + if ($row === CONSOLE_TABLE_HORIZONTAL_RULE) { + return; + } + + for ($i = 0, $c = count($row); $i < $c; ++$i) { + $lines = preg_split('/\r?\n|\r/', $row[$i]); + $this->_row_heights[$row_number] = max($this->_row_heights[$row_number], + count($lines)); + } + } + + /** + * Returns the character length of a string. + * + * @param string $str A multibyte or singlebyte string. + * + * @return integer The string length. + */ + function _strlen($str) + { + static $mbstring, $utf8; + + // Strip ANSI color codes if requested. + if ($this->_ansiColor) { + $str = Console_Color::strip($str); + } + + // Cache expensive function_exists() calls. + if (!isset($mbstring)) { + $mbstring = function_exists('mb_strlen'); + } + if (!isset($utf8)) { + $utf8 = function_exists('utf8_decode'); + } + + if ($utf8 && + ($this->_charset == strtolower('utf-8') || + $this->_charset == strtolower('utf8'))) { + return strlen(utf8_decode($str)); + } + if ($mbstring) { + return mb_strlen($str, $this->_charset); + } + + return strlen($str); + } + + /** + * Returns part of a string. + * + * @param string $string The string to be converted. + * @param integer $start The part's start position, zero based. + * @param integer $length The part's length. + * + * @return string The string's part. + */ + function _substr($string, $start, $length = null) + { + static $mbstring; + + // Cache expensive function_exists() calls. + if (!isset($mbstring)) { + $mbstring = function_exists('mb_substr'); + } + + if (is_null($length)) { + $length = $this->_strlen($string); + } + if ($mbstring) { + $ret = @mb_substr($string, $start, $length, $this->_charset); + if (!empty($ret)) { + return $ret; + } + } + return substr($string, $start, $length); + } + + /** + * Returns a string padded to a certain length with another string. + * + * This method behaves exactly like str_pad but is multibyte safe. + * + * @param string $input The string to be padded. + * @param integer $length The length of the resulting string. + * @param string $pad The string to pad the input string with. Must + * be in the same charset like the input string. + * @param const $type The padding type. One of STR_PAD_LEFT, + * STR_PAD_RIGHT, or STR_PAD_BOTH. + * + * @return string The padded string. + */ + function _strpad($input, $length, $pad = ' ', $type = STR_PAD_RIGHT) + { + $mb_length = $this->_strlen($input); + $sb_length = strlen($input); + $pad_length = $this->_strlen($pad); + + /* Return if we already have the length. */ + if ($mb_length >= $length) { + return $input; + } + + /* Shortcut for single byte strings. */ + if ($mb_length == $sb_length && $pad_length == strlen($pad)) { + return str_pad($input, $length, $pad, $type); + } + + switch ($type) { + case STR_PAD_LEFT: + $left = $length - $mb_length; + $output = $this->_substr(str_repeat($pad, ceil($left / $pad_length)), + 0, $left, $this->_charset) . $input; + break; + case STR_PAD_BOTH: + $left = floor(($length - $mb_length) / 2); + $right = ceil(($length - $mb_length) / 2); + $output = $this->_substr(str_repeat($pad, ceil($left / $pad_length)), + 0, $left, $this->_charset) . + $input . + $this->_substr(str_repeat($pad, ceil($right / $pad_length)), + 0, $right, $this->_charset); + break; + case STR_PAD_RIGHT: + $right = $length - $mb_length; + $output = $input . + $this->_substr(str_repeat($pad, ceil($right / $pad_length)), + 0, $right, $this->_charset); + break; + } + + return $output; + } + +} diff --git a/lib/predict/tests/test-001.php b/lib/predict/tests/test-001.php new file mode 100644 index 0000000..f9ab5e5 --- /dev/null +++ b/lib/predict/tests/test-001.php @@ -0,0 +1,133 @@ + 0.0, + 'x' => 2328.97048951, + 'y' => -5995.22076416, + 'z' => 1719.97067261, + 'vx' => 2.91207230, + 'vy' => -0.98341546, + 'vz' => -7.09081703 + ), + array( + 'step' => 360.0, + 'x' => 2456.10705566, + 'y' => -6071.93853760, + 'z' => 1222.89727783, + 'vx' => 2.67938992, + 'vy' => -0.44829041, + 'vz' => -7.22879231 + ), + array( + 'step' => 720.0, + 'x' => 2567.56195068, + 'y' => -6112.50384522, + 'z' => 713.96397400, + 'vx' => 2.44024599, + 'vy' => 0.09810869, + 'vz' => -7.31995916 + ), + array( + 'step' => 1080.0, + 'x' => 2663.09078980, + 'y' => -6115.48229980, + 'z' => 196.39640427, + 'vx' => 2.19611958, + 'vy' => 0.65241995, + 'vz' => -7.36282432 + ), + array( + 'step' => 1440.0, + 'x' => 2742.55133057, + 'y' => -6079.67144775, + 'z' => -326.38095856, + 'vx' => 1.94850229, + 'vy' => 1.21106251, + 'vz' => -7.35619372 + ) +); + +$headers = array( + 'step time', + 'label', + 'result', + 'expected', +); + +$data = array(); + + +$file = file('tests/test-001.tle'); +$tle = new Predict_TLE($file[0], $file[1], $file[2]); +$sat = new Predict_Sat($tle); +$sgpsdp = new Predict_SGPSDP(); + +$count = 0; +foreach ($expected as $e) { + $sgpsdp->SGP4($sat, $e['step']); + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $count++; + $data[$count] = array(); + $data[$count][0] = $e['step']; + $data[$count][1] = 'X'; + $data[$count][2] = $sat->pos->x; + $data[$count][3] = $e['x']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Y'; + $data[$count][2] = $sat->pos->y; + $data[$count][3] = $e['y']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Z'; + $data[$count][2] = $sat->pos->z; + $data[$count][3] = $e['z']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VX'; + $data[$count][2] = $sat->vel->x; + $data[$count][3] = $e['vx']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VY'; + $data[$count][2] = $sat->vel->y; + $data[$count][3] = $e['vy']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VZ'; + $data[$count][2] = $sat->vel->z; + $data[$count][3] = $e['vz']; +} +// exit; + +$tbl = new Console_Table(); +$tbl->setHeaders($headers); +$tbl->addData($data); + +echo "DEEP_SPACE_EPHEM: " . ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) . " (expected: 0)\n\n"; + +echo $tbl->getTable(); + +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; diff --git a/lib/predict/tests/test-001.tle b/lib/predict/tests/test-001.tle new file mode 100644 index 0000000..2d8ac4e --- /dev/null +++ b/lib/predict/tests/test-001.tle @@ -0,0 +1,3 @@ +TEST SAT SGP 001 +1 88888U 80275.98708465 .00073094 13844-3 66816-4 0 9 +2 88888 72.8435 115.9689 0086731 52.6988 110.5714 16.05824518 103 diff --git a/lib/predict/tests/test-002.php b/lib/predict/tests/test-002.php new file mode 100644 index 0000000..e491aa2 --- /dev/null +++ b/lib/predict/tests/test-002.php @@ -0,0 +1,135 @@ + 0.0, + 'x' => 7473.37066650, + 'y' => 428.95261765, + 'z' => 5828.74786377, + 'vx' => 5.1071513, + 'vy' => 6.44468284, + 'vz' => -0.18613096 + ), + array( + 'step' => 360.0, + 'x' => -3305.22537232, + 'y' => 32410.86328125, + 'z' => -24697.17675781, + 'vx' => -1.30113538, + 'vy' => -1.15131518, + 'vz' => -0.28333528 + ), + array( + 'step' => 720.0, + 'x' => 14271.28759766, + 'y' => 24110.46411133, + 'z' => -4725.76837158, + 'vx' => -0.32050445, + 'vy' => 2.67984074, + 'vz' => -2.08405289 + ), + array( + 'step' => 1080.0, + 'x' => -9990.05883789, + 'y' => 22717.35522461, + 'z' => -23616.890662501, + 'vx' => -1.01667246, + 'vy' => -2.29026759, + 'vz' => 0.72892364 + ), + array( + 'step' => 1440.0, + 'x' => 9787.86975097, + 'y' => 33753.34667969, + 'z' => -15030.81176758, + 'vx' => -1.09425966, + 'vy' => 0.92358845, + 'vz' => -1.52230928 + ) +); + +$headers = array( + 'step time', + 'label', + 'result', + 'expected', +); + +$data = array(); + + +$file = file('tests/test-002.tle'); +$tle = new Predict_TLE($file[0], $file[1], $file[2]); +$sat = new Predict_Sat($tle); +$sgpsdp = new Predict_SGPSDP(); + +$count = 0; +foreach ($expected as $e) { + $sgpsdp->SGP4($sat, $e['step']); + Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $count++; + $data[$count] = array(); + $data[$count][0] = $e['step']; + $data[$count][1] = 'X'; + $data[$count][2] = $sat->pos->x; + $data[$count][3] = $e['x']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Y'; + $data[$count][2] = $sat->pos->y; + $data[$count][3] = $e['y']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'Z'; + $data[$count][2] = $sat->pos->z; + $data[$count][3] = $e['z']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VX'; + $data[$count][2] = $sat->vel->x; + $data[$count][3] = $e['vx']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VY'; + $data[$count][2] = $sat->vel->y; + $data[$count][3] = $e['vy']; + + $count++; + $data[$count] = array(); + $data[$count][0] = ''; + $data[$count][1] = 'VZ'; + $data[$count][2] = $sat->vel->z; + $data[$count][3] = $e['vz']; +} +// exit; + +$tbl = new Console_Table(); +$tbl->setHeaders($headers); +$tbl->addData($data); + + +echo "DEEP_SPACE_EPHEM: " . ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) . " (expected: 64)\n\n"; + +echo $tbl->getTable(); + +echo "Execution time: " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; diff --git a/lib/predict/tests/test-002.tle b/lib/predict/tests/test-002.tle new file mode 100644 index 0000000..e7faff7 --- /dev/null +++ b/lib/predict/tests/test-002.tle @@ -0,0 +1,4 @@ +TEST SAT SDP 001 +1 11801U 80230.29629788 .01431103 00000-0 14311-1 0 2 +2 11801 46.7916 230.4354 7318036 47.4722 10.4117 2.28537848 2 + diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 96d3a40..e404293 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -15,6 +15,8 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + public const DATETIME_FORMAT = 'c'; + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php new file mode 100644 index 0000000..8d709f3 --- /dev/null +++ b/src/Controller/PropagateController.php @@ -0,0 +1,77 @@ + "\d+"])] + public function nextPass(int $id, Request $request, NormalizerInterface $normalizer): JsonResponse { + + try { + $observer = new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); + } catch (\InvalidArgumentException $exception) { + throw new BadRequestHttpException($exception->getMessage()); + } + + $predict = new \Predict(); + $qth = new \Predict_QTH(); + + $qth->lat = $observer->latitude; + $qth->lon = $observer->longitude; + $qth->alt = $observer->altitude; + + /** @var Tle $tle */ + $tle = $this->repository->findOneBy(['id' => $id]); + + $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); // Instantiate it + $sat = new \Predict_Sat($tle); // Load up the satellite data + $now = \Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) + + $predict->minEle = 10; // Minimum elevation for a pass + $predict->timeRes = 10; // Pass details: time resolution in seconds + $predict->numEntries = 20; // Pass details: number of entries per pass + $predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + + // Get the passes and filter visible only, takes about 4 seconds for 10 days + $results = $predict->get_passes($sat, $qth, $now, 10); + $results = $predict->filterVisiblePasses($results); + + $parameters = [ + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + ]; + + $url = $this->router->generate( + 'tle_pass', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $data = [ + '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@id' => $url, + '@type' => 'VisibleSatellitePassCollection', + 'observer' => $normalizer->normalize($observer), + 'member' => $normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]), + 'parameters' => $parameters, + ]; + + return new JsonResponse($data); + } +} diff --git a/src/Serializer/ObserverNormalizer.php b/src/Serializer/ObserverNormalizer.php new file mode 100644 index 0000000..45bdc6c --- /dev/null +++ b/src/Serializer/ObserverNormalizer.php @@ -0,0 +1,39 @@ +normalizer->normalize($object); + + unset($result['timeZone']); + + $result['@type'] = 'Observer'; + $result['datetime'] = $object->datetime; + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Observer; + } +} diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php new file mode 100644 index 0000000..d0ab383 --- /dev/null +++ b/src/Serializer/SatellitePassNormalizer.php @@ -0,0 +1,49 @@ + 'VisibleSatellitePass', + 'aos' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_aos, $context['timezone'])->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_aos_az, 2), + 'elevation' => round($object->visible_aos_el, 2), + ], + 'max' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_tca, $context['timezone'])->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_max_el_az, 2), + 'elevation' => round($object->visible_max_el, 2), + ], + 'los' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_los, $context['timezone'])->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_los_az, 2), + 'elevation' => round($object->visible_los_el, 2), + ], + ]; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof \Predict_Pass; + } +} diff --git a/src/ViewModel/LatLng.php b/src/ViewModel/LatLng.php new file mode 100644 index 0000000..85742c9 --- /dev/null +++ b/src/ViewModel/LatLng.php @@ -0,0 +1,41 @@ +latitude > 90 || $this->latitude < -90) { + throw new \InvalidArgumentException('Invalid latitude value'); + } + + if ($this->longitude > 180 || $this->longitude < -180) { + throw new \InvalidArgumentException('Invalid longitude value'); + } + } + + public function getTimeZone(): ?string + { + $diffs = []; + foreach (DateTimeZone::listIdentifiers() as $timezoneID) { + $timezone = new DateTimeZone($timezoneID); + $location = $timezone->getLocation(); + $tLat = $location['latitude']; + $tLng = $location['longitude']; + $diffLat = abs($this->latitude - $tLat); + $diffLng = abs($this->longitude - $tLng); + $diff = $diffLat + $diffLng; + $diffs[$timezoneID] = $diff; + } + + $timezone = array_keys($diffs, min($diffs)); + + return $timezone[0] ?? null; + } +} diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php new file mode 100644 index 0000000..749cdc9 --- /dev/null +++ b/src/ViewModel/Observer.php @@ -0,0 +1,15 @@ +datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); + } +} diff --git a/symfony.lock b/symfony.lock index 373001a..eec58c9 100644 --- a/symfony.lock +++ b/symfony.lock @@ -394,6 +394,12 @@ "symfony/polyfill-uuid": { "version": "v1.22.1" }, + "symfony/property-access": { + "version": "v5.2.4" + }, + "symfony/property-info": { + "version": "v5.2.4" + }, "symfony/psr-http-message-bridge": { "version": "v2.1.0" }, From 6a609afdadc4d2f569faf968cff75f9552c1d511 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:03:02 +0200 Subject: [PATCH 091/151] add period data --- composer.json | 2 +- composer.lock | 16 ++++++----- src/Command/TleCalculate.php | 1 + src/Entity/TleInformation.php | 11 ++++++-- src/Migrations/Version20210420125645.php | 35 ++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 src/Migrations/Version20210420125645.php diff --git a/composer.json b/composer.json index 75a8902..72f24ca 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "ext-iconv": "*", "ext-json": "*", "beberlei/doctrineextensions": "^1.3", - "ivanstan/tle-php": "^1.0.2", + "ivanstan/tle-php": "dev-master", "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", diff --git a/composer.lock b/composer.lock index 0909423..c10083b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e0bbf162f1ab7711762d6c0e7c9c710c", + "content-hash": "0a7e43912dee92d8247bdf135fc82f38", "packages": [ { "name": "beberlei/doctrineextensions", @@ -1847,16 +1847,16 @@ }, { "name": "ivanstan/tle-php", - "version": "1.0.3", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0" + "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/4ae1dbd53cba8de3d89328b8d20c701ee96558c0", - "reference": "4ae1dbd53cba8de3d89328b8d20c701ee96558c0", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/78133b47a05e336e3088d46ac0ffa9abdb084743", + "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743", "shasum": "" }, "require": { @@ -1868,6 +1868,7 @@ "require-dev": { "phpunit/phpunit": "^8" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -1887,9 +1888,9 @@ "description": "TLE Framework written in PHP and client to NASA TLE API.", "support": { "issues": "https://github.com/ivanstan/tle-php/issues", - "source": "https://github.com/ivanstan/tle-php/tree/1.0.3" + "source": "https://github.com/ivanstan/tle-php/tree/master" }, - "time": "2021-02-25T11:17:02+00:00" + "time": "2021-04-20T12:58:40+00:00" }, { "name": "jean85/pretty-package-versions", @@ -7721,6 +7722,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { + "ivanstan/tle-php": 20, "roave/security-advisories": 20 }, "prefer-stable": false, diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index fb0f190..47d665a 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -49,6 +49,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->inclination = $tleModel->getInclination(); $tleInformation->eccentricity = $tleModel->eccentricity(); + $tleInformation->period = $tleModel->period(); if (!$exists) { $this->entityManager->persist($tleInformation); diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 0f55c69..34614a9 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -15,12 +15,19 @@ class TleInformation /** * @ORM\Column(type="float", precision=14, scale=12, nullable=true) */ - public float $eccentricity; + public ?float $eccentricity; /** * @ORM\Column(type="float", precision=16, scale=10, nullable=true) */ - public float $inclination; + public ?float $inclination; + + /** + * Period for complete orbit in seconds + * + * @ORM\Column(type="float", precision=24, scale=10, nullable=true) + */ + public ?float $period; public function __construct(Tle $tle) { diff --git a/src/Migrations/Version20210420125645.php b/src/Migrations/Version20210420125645.php new file mode 100644 index 0000000..dbdf819 --- /dev/null +++ b/src/Migrations/Version20210420125645.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information ADD period DOUBLE PRECISION DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information DROP period'); + } +} From 78e9dd3fe01d0bffbb91cbd6b7030f6bf3749938 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:05:43 +0200 Subject: [PATCH 092/151] add period data --- src/Entity/TleInformation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 34614a9..8767b29 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -25,7 +25,7 @@ class TleInformation /** * Period for complete orbit in seconds * - * @ORM\Column(type="float", precision=24, scale=10, nullable=true) + * @ORM\Column(type="float", name="`period`" precision=24, scale=10, nullable=true) */ public ?float $period; From a6fb4a4943968dcee77fc506beacf1c4f937246b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:06:05 +0200 Subject: [PATCH 093/151] add period data --- src/Migrations/Version20210420125645.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Migrations/Version20210420125645.php b/src/Migrations/Version20210420125645.php index dbdf819..0942a2c 100644 --- a/src/Migrations/Version20210420125645.php +++ b/src/Migrations/Version20210420125645.php @@ -22,7 +22,7 @@ public function up(Schema $schema) : void // this up() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - $this->addSql('ALTER TABLE tle_information ADD period DOUBLE PRECISION DEFAULT NULL'); + $this->addSql('ALTER TABLE tle_information ADD `period` DOUBLE PRECISION DEFAULT NULL'); } public function down(Schema $schema) : void @@ -30,6 +30,6 @@ public function down(Schema $schema) : void // this down() migration is auto-generated, please modify it to your needs $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); - $this->addSql('ALTER TABLE tle_information DROP period'); + $this->addSql('ALTER TABLE tle_information DROP `period`'); } } From b849594d14e5ab1a88d8d478af7b0d59ea1abe49 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:07:28 +0200 Subject: [PATCH 094/151] add period data --- src/Entity/TleInformation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 8767b29..19eb374 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -25,7 +25,7 @@ class TleInformation /** * Period for complete orbit in seconds * - * @ORM\Column(type="float", name="`period`" precision=24, scale=10, nullable=true) + * @ORM\Column(type="float", name="`period`", precision=24, scale=10, nullable=true) */ public ?float $period; From ff780f98e275ce5e537e27c0b64182e75cec7971 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 15:13:30 +0200 Subject: [PATCH 095/151] hydra context in constant --- src/Controller/AbstractApiController.php | 2 ++ src/Controller/PropagateController.php | 2 +- src/Controller/StatisticsController.php | 2 +- src/Controller/TleController.php | 8 ++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index e404293..e70641a 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -17,6 +17,8 @@ abstract class AbstractApiController extends AbstractController public const DATETIME_FORMAT = 'c'; + protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; + public const CORS_HEADERS = [ 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 8d709f3..060220b 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -64,7 +64,7 @@ public function nextPass(int $id, Request $request, NormalizerInterface $normali $parameters['satelliteId'] = $id; $data = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, '@id' => $url, '@type' => 'VisibleSatellitePassCollection', 'observer' => $normalizer->normalize($observer), diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 79880e4..9be3a8e 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -54,7 +54,7 @@ public function hits( $date = new \DateTime($item['date']); $date->setTime((int)$item['hour'] * self::INTERVAL, 0); - $response[$date->format('c')] = $item['hits']; + $response[$date->format(self::DATETIME_FORMAT)] = $item['hits']; } return new JsonResponse( diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index b6c94fd..2384214 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -53,7 +53,7 @@ public function record( } $data = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, ]; return $this->response( @@ -108,7 +108,7 @@ public function collection( } $response = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), '@type' => 'Collection', 'totalItems' => $collection->getTotal(), @@ -136,14 +136,14 @@ public function popular( $members = $repository->popular($newerThan, $limit); $data = [ - '@context' => 'http://www.w3.org/ns/hydra/context.jsonld', + '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_popular', [], UrlGeneratorInterface::ABSOLUTE_URL), '@type' => 'Collection', 'totalItems' => \count($members), 'member' => $members, 'parameters' => [ '*limit' => $limit, - '*newerThan' => $newerThan->format('c'), + '*newerThan' => $newerThan->format(self::DATETIME_FORMAT), ], ]; From eb366e7f90a714e4114aa1e643d580a919fac4b1 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 20 Apr 2021 19:02:01 +0200 Subject: [PATCH 096/151] hydra context in constant --- composer.lock | 8 +- src/Command/TleCalculate.php | 1 + src/Controller/AbstractApiController.php | 3 +- src/Controller/PropagateController.php | 96 ++++++++++++++++++++++-- src/Controller/TleController.php | 17 ++--- src/Entity/TleInformation.php | 7 ++ src/Migrations/Version20210420170012.php | 35 +++++++++ src/Service/Traits/TleHttpTrait.php | 21 ++++++ 8 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 src/Migrations/Version20210420170012.php create mode 100644 src/Service/Traits/TleHttpTrait.php diff --git a/composer.lock b/composer.lock index c10083b..c350a2f 100644 --- a/composer.lock +++ b/composer.lock @@ -1851,12 +1851,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743" + "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/78133b47a05e336e3088d46ac0ffa9abdb084743", - "reference": "78133b47a05e336e3088d46ac0ffa9abdb084743", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/50ea45311c3bc50450a799d5cff56f3a904d5835", + "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835", "shasum": "" }, "require": { @@ -1890,7 +1890,7 @@ "issues": "https://github.com/ivanstan/tle-php/issues", "source": "https://github.com/ivanstan/tle-php/tree/master" }, - "time": "2021-04-20T12:58:40+00:00" + "time": "2021-04-20T16:57:25+00:00" }, { "name": "jean85/pretty-package-versions", diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 47d665a..e33e90d 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -50,6 +50,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->inclination = $tleModel->getInclination(); $tleInformation->eccentricity = $tleModel->eccentricity(); $tleInformation->period = $tleModel->period(); + $tleInformation->geostationary = $tleModel->isGeostationary(); if (!$exists) { $this->entityManager->persist($tleInformation); diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index e70641a..5db1684 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -15,6 +15,7 @@ abstract class AbstractApiController extends AbstractController { use RequestValidator; + /** @var string ISO-8601 date format */ public const DATETIME_FORMAT = 'c'; protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; @@ -130,7 +131,7 @@ public function getPagination(Request $request, int $total, int $pageSize): arra return $result; } - public function response(array $data): Response + public function response(array $data): JsonResponse { return new JsonResponse( $data, diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 060220b..ff3e403 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -4,23 +4,33 @@ use App\Entity\Tle; use App\Repository\TleRepository; +use App\Service\Traits\TleHttpTrait; use App\ViewModel\Observer; +use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; class PropagateController extends AbstractApiController { + use TleHttpTrait; + + protected const DEEP_SATELLITE_PERIOD = 225; // minutes + public function __construct(protected TleRepository $repository) { } - #[Route("/api/tle/{id}/next-pass", name: "tle_pass", requirements: ["id" => "\d+"])] - public function nextPass(int $id, Request $request, NormalizerInterface $normalizer): JsonResponse { - + #[Route("/api/tle/{id}/pass", name: "tle_pass", requirements: ["id" => "\d+"])] + public function pass( + int $id, + Request $request, + NormalizerInterface $normalizer + ): JsonResponse { try { $observer = new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); } catch (\InvalidArgumentException $exception) { @@ -34,10 +44,9 @@ public function nextPass(int $id, Request $request, NormalizerInterface $normali $qth->lon = $observer->longitude; $qth->alt = $observer->altitude; - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); + $tle = $this->getTle($id); - $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); // Instantiate it + $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); $sat = new \Predict_Sat($tle); // Load up the satellite data $now = \Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) @@ -72,6 +81,79 @@ public function nextPass(int $id, Request $request, NormalizerInterface $normali 'parameters' => $parameters, ]; - return new JsonResponse($data); + return $this->response($data); + } + + #[Route("/api/tle/{id}/vector", name: "tle_propagate", requirements: ["id" => "\d+"])] + public function vector( + int $id, + Request $request, + NormalizerInterface $normalizer + ): JsonResponse { + /** @var Tle $tle */ + $tle = $this->repository->findOneBy(['id' => $id]); + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); + $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); + + $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); + + $dateTimeUTC = clone $datetime; + $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); + $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); + + $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes + + $propagator = new \Predict_SGPSDP(); + if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { + $propagator->SDP4($sat, $deltaT); + $algorithm = 'SDP4'; + } else { + $propagator->SGP4($sat, $deltaT); + $algorithm = 'SGP4'; + } + + \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $parameters = [ + 'date' => $datetime->format(self::DATETIME_FORMAT), + ]; + + $url = $this->router->generate( + 'tle_propagate', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatelliteStateVector', + 'propagator' => $algorithm, + 'reference_frame' => 'ECI', + 'position' => [ + 'x' => $sat->pos->x, + 'y' => $sat->pos->y, + 'z' => $sat->pos->z, + 'r' => $sat->pos->w, + 'unit' => 'km', + ], + 'velocity' => [ + 'x' => $sat->vel->x, + 'y' => $sat->vel->y, + 'z' => $sat->vel->z, + 'r' => $sat->vel->w, + 'unit' => 'km/s', + ], + 'parameters' => $parameters, + ]; + + return $this->response($data); } } diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 2384214..eda86c9 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -4,9 +4,11 @@ use App\Entity\Tle; use App\Repository\TleRepository; +use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; use App\ViewModel\SortDirectionEnum; use App\ViewModel\TleCollectionSortableFieldsEnum; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -17,6 +19,8 @@ #[Route("/api/tle")] final class TleController extends AbstractApiController { + use TleHttpTrait; + protected const MAX_PAGE_SIZE = 100; protected const PAGE_SIZE = 20; @@ -40,17 +44,12 @@ public function record( int $id, NormalizerInterface $normalizer, Request $request, - ): Response { + ): JsonResponse { $this->assertParamIsBoolean($request, self::PARAM_EXTRA); $extra = (bool)$request->get(self::PARAM_EXTRA, false); - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } + $tle = $this->getTle($id); $data = [ '@context' => self::HYDRA_CONTEXT, @@ -65,7 +64,7 @@ public function record( public function collection( Request $request, NormalizerInterface $normalizer - ): Response { + ): JsonResponse { $this ->assertParamIsInteger($request, self::PAGE_PARAM) ->assertParamIsGreaterThan($request, self::PAGE_PARAM, 0) @@ -126,7 +125,7 @@ public function collection( public function popular( Request $request, TleRepository $repository - ): Response { + ): JsonResponse { $newerThan = new \DateTime('now'); $newerThan->setTime(0, 0, 0); $newerThan->modify('-3 days'); diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index 19eb374..b2d3cad 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -29,6 +29,13 @@ class TleInformation */ public ?float $period; + /** + * Period for complete orbit in seconds + * + * @ORM\Column(type="boolean", options={"default":"0"}) + */ + public bool $geostationary = false; + public function __construct(Tle $tle) { $this->tle = $tle; diff --git a/src/Migrations/Version20210420170012.php b/src/Migrations/Version20210420170012.php new file mode 100644 index 0000000..7755448 --- /dev/null +++ b/src/Migrations/Version20210420170012.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information ADD geostationary TINYINT(1) DEFAULT \'0\' NOT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information DROP geostationary'); + } +} diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php new file mode 100644 index 0000000..4814033 --- /dev/null +++ b/src/Service/Traits/TleHttpTrait.php @@ -0,0 +1,21 @@ +repository->findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $tle; + } +} From f99e2e2161841600c77b11b979c32c07e62721a5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Apr 2021 12:31:44 +0200 Subject: [PATCH 097/151] add period --- src/Controller/TleController.php | 7 ++----- src/Repository/TleRepository.php | 1 + src/Serializer/TleModelNormalizer.php | 6 ++++-- src/ViewModel/TleCollectionSortableFieldsEnum.php | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index eda86c9..e646e20 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -25,14 +25,11 @@ final class TleController extends AbstractApiController protected const PAGE_SIZE = 20; - public const FILTER_ECCENTRICITY = 'eccentricity'; - public const FILTER_INCLINATION = 'inclination'; - public const PARAM_EXTRA = 'extra'; protected const COLLECTION_FILTERS = [ - self::FILTER_ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, - self::FILTER_INCLINATION => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, ]; public function __construct(protected TleRepository $repository) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 6d5d1e2..7ce5b60 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -119,6 +119,7 @@ private function getSortTableColumnMapping(string $sort): ?string TleCollectionSortableFieldsEnum::POPULARITY => null, TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', + TleCollectionSortableFieldsEnum::PERIOD => 'info.period', }; } } diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index b9e7c2b..45bcb8e 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -4,6 +4,7 @@ use App\Controller\TleController; use App\Entity\Tle; +use App\ViewModel\TleCollectionSortableFieldsEnum; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -42,8 +43,9 @@ public function normalize($entity, ?string $format = null, array $context = []): if ($isExtra) { $extra = [ 'extra' => [ - TleController::FILTER_ECCENTRICITY => $entity->getInfo()->eccentricity, - TleController::FILTER_INCLINATION => $entity->getInfo()->inclination, + TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, + TleCollectionSortableFieldsEnum::INCLINATION => $entity->getInfo()->inclination, + TleCollectionSortableFieldsEnum::PERIOD => $entity->getInfo()->period, ], ]; diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index b573e33..7aa6989 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -11,4 +11,5 @@ class TleCollectionSortableFieldsEnum extends Enum public const POPULARITY = 'popularity'; public const INCLINATION = 'inclination'; public const ECCENTRICITY = 'eccentricity'; + public const PERIOD = 'period'; } From 3d17a056bbdf7e8b6217910122fa2c22c177328a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Apr 2021 14:32:40 +0200 Subject: [PATCH 098/151] add geodetic propagator --- src/Controller/PropagateController.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index ff3e403..1690bff 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -117,8 +117,17 @@ public function vector( $algorithm = 'SGP4'; } + $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); + \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $sat_geodetic = new \Predict_Geodetic(); + \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); + + $sat_geodetic->lat = rad2deg($sat_geodetic->lat); + $sat_geodetic->lon = rad2deg($sat_geodetic->lon); + $parameters = [ 'date' => $datetime->format(self::DATETIME_FORMAT), ]; @@ -151,6 +160,11 @@ public function vector( 'r' => $sat->vel->w, 'unit' => 'km/s', ], + 'geodetic' => [ + 'latitude' => $sat_geodetic->lat, + 'longitude' => $sat_geodetic->lon, + 'altitude' => $sat_geodetic->alt, + ], 'parameters' => $parameters, ]; From b15aba813bbfc3d3c57750a778637ed815634f72 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 11:16:46 +0200 Subject: [PATCH 099/151] add geodetic propagator --- config/custom/tle.json | 176 ++++++++++++++++++++++++- src/Controller/DocsController.php | 7 +- src/Controller/PropagateController.php | 42 +++--- src/Event/StatisticSubscriber.php | 8 +- 4 files changed, 207 insertions(+), 26 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 7efee55..0fa53d5 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "TLE API", - "version": "1.3.1" + "version": "1.3.2" }, "servers": [ { @@ -62,7 +62,11 @@ "default": "name", "enum": [ "id", - "name" + "name", + "popularity", + "inclination", + "eccentricity", + "period" ] } }, @@ -92,16 +96,30 @@ { "name": "inclination[lt]", "in": "query", - "description": "Filter records with orbital posigrade orbital inclination", + "description": "Filter records with posigrade orbital inclination", "required": false, "example": 90 }, { "name": "inclination[gt]", "in": "query", - "description": "Filter records with orbital retrograde orbital inclination", + "description": "Filter records with retrograde orbital inclination", "required": false, "example": 90 + }, + { + "name": "period[lt]", + "in": "query", + "description": "Filter records with orbital period less than specified", + "required": false, + "example": 255 + }, + { + "name": "period[gt]", + "in": "query", + "description": "Filter records with orbital period greater than specified", + "required": false, + "example": 255 } ], "responses": { @@ -170,6 +188,42 @@ } } } + }, + "/api/tle/{id}/propagate": { + "get": { + "summary": "Propagate (experimental)", + "operationId": "propagate", + "parameters": [ + { + "name": "date", + "in": "path", + "description": "date", + "required": true, + "schema": { + "type": "string", + "example": "2021-04-20T16:28:40+00:00" + } + } + ], + "responses": { + "200": { + "description": "Record found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Propagation" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } } }, "components": { @@ -242,6 +296,120 @@ "type": "object" } ] + }, + "Propagation": { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/44859/vector?date=2021-04-26T08:39:45+00:00" + }, + "@type": { + "type": "string", + "example": "SatellitePropagationResult" + }, + "tle": { + "$ref": "#/components/schemas/TLE" + }, + "propagator": { + "type": "string", + "example": "SGP4" + }, + "vector": { + "properties": { + "reference_frame": { + "type": "string", + "example": "ECI" + }, + "position": { + "properties": { + "x": { + "type": "number", + "example": "-2450.396984017652" + }, + "y": { + "type": "number", + "example": "6101.198295995954" + }, + "z": { + "type": "number", + "example": "-6032.216318229235" + }, + "r": { + "type": "number", + "example": "8922.819046481767" + }, + "unit": { + "type": "string", + "example": "km" + } + }, + "type": "object" + }, + + "velocity": { + "properties": { + "x": { + "type": "number", + "example": "-0.1644949004552056" + }, + "y": { + "type": "number", + "example": "4.639904402973215" + }, + "z": { + "type": "number", + "example": "4.406398357056158" + }, + "r": { + "type": "number", + "example": "6.400946642651633" + }, + "unit": { + "type": "string", + "example": "km/s" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "geodetic": { + "properties": { + "latitude": { + "type": "number", + "example": "-42.67210184042445" + }, + "longitude": { + "type": "number", + "example": "124.524923099869" + }, + "altitude": { + "type": "number", + "example": "2554.4740343929398" + } + }, + "type": "object" + }, + "parameters": { + "properties": { + "date": { + "type": "string", + "example": "2021-04-26T08:39:45+00:00" + }, + "satelliteId": { + "type": "string", + "example": "44859" + } + }, + "type": "object" + } + }, + "type": "object" } }, "responses": { diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index d96bf19..dc2e7ac 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -23,13 +23,16 @@ public function docs(): Response /** * @Route("/api/{name}.json", name="app_api_docs_json") + * @throws \JsonException */ public function getJson(string $name): JsonResponse { $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; - $file = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - return new JsonResponse($file, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); + unset($docs['paths']['/api/tle/{id}/propagate']); + + return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } } diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 1690bff..8b1f28a 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -84,8 +84,8 @@ public function pass( return $this->response($data); } - #[Route("/api/tle/{id}/vector", name: "tle_propagate", requirements: ["id" => "\d+"])] - public function vector( + #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] + public function propagate( int $id, Request $request, NormalizerInterface $normalizer @@ -121,7 +121,6 @@ public function vector( \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); - $sat_geodetic = new \Predict_Geodetic(); \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); @@ -143,22 +142,25 @@ public function vector( $data = [ '@context' => self::HYDRA_CONTEXT, '@id' => $url, - '@type' => 'SatelliteStateVector', + '@type' => 'SatellitePropagationResult', + 'tle' => $tle, 'propagator' => $algorithm, - 'reference_frame' => 'ECI', - 'position' => [ - 'x' => $sat->pos->x, - 'y' => $sat->pos->y, - 'z' => $sat->pos->z, - 'r' => $sat->pos->w, - 'unit' => 'km', - ], - 'velocity' => [ - 'x' => $sat->vel->x, - 'y' => $sat->vel->y, - 'z' => $sat->vel->z, - 'r' => $sat->vel->w, - 'unit' => 'km/s', + 'vector' => [ + 'reference_frame' => 'ECI', + 'position' => [ + 'x' => $sat->pos->x, + 'y' => $sat->pos->y, + 'z' => $sat->pos->z, + 'r' => $sat->pos->w, + 'unit' => 'km', + ], + 'velocity' => [ + 'x' => $sat->vel->x, + 'y' => $sat->vel->y, + 'z' => $sat->vel->z, + 'r' => $sat->vel->w, + 'unit' => 'km/s', + ], ], 'geodetic' => [ 'latitude' => $sat_geodetic->lat, @@ -168,6 +170,8 @@ public function vector( 'parameters' => $parameters, ]; - return $this->response($data); + return $this->response( + $normalizer->normalize($data) + ); } } diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 5175346..adc462d 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -12,6 +12,12 @@ class StatisticSubscriber implements EventSubscriberInterface { + protected const TLE_ROUTES = [ + 'tle_propagate', + 'tle_pass', + 'tle_record' + ]; + public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em, private TleRepository $tleRepository) { } @@ -25,7 +31,7 @@ public static function getSubscribedEvents(): array public function onKernelTerminate($event): void { - if ($event->getRequest()->get('_route') !== 'tle_record') { + if (!in_array($event->getRequest()->get('_route'), self::TLE_ROUTES, false)) { return; } From de58636aa6280804f6502c9ee5d9fb76c09d1b08 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 11:23:04 +0200 Subject: [PATCH 100/151] add geodetic propagator --- src/Controller/DocsController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index dc2e7ac..7512dec 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -22,12 +22,12 @@ public function docs(): Response } /** - * @Route("/api/{name}.json", name="app_api_docs_json") + * @Route("/api/tle.json", name="app_api_docs_json") * @throws \JsonException */ - public function getJson(string $name): JsonResponse + public function getJson(): JsonResponse { - $path = $this->getProjectDir() . '/config/custom/' . $name . '.json'; + $path = $this->getProjectDir() . '/config/custom/tle.json'; $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); From bf474a14dcea488c3ed4dd571a743e8d9836bdd3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 11:48:51 +0200 Subject: [PATCH 101/151] add geodetic propagator --- config/custom/tle.json | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 0fa53d5..a8291f8 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -31,7 +31,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TLE" + "$ref": "#/components/schemas/TleModel" } } } @@ -148,11 +148,11 @@ "member": { "type": "array", "items": { - "$ref": "#/components/schemas/TLE" + "$ref": "#/components/schemas/TleModel" } }, "parameters": { - "type": "array" + "type": "object" }, "view": { "type": "object", @@ -264,7 +264,7 @@ }, "type": "object" }, - "TLE": { + "TleModel": { "allOf": [ { "properties": { @@ -276,6 +276,10 @@ "type": "string", "example": "TleModel" }, + "satelliteId": { + "type": "integer", + "example": 43638 + }, "name": { "type": "string", "example": "1998-067PN" @@ -312,7 +316,7 @@ "example": "SatellitePropagationResult" }, "tle": { - "$ref": "#/components/schemas/TLE" + "$ref": "#/components/schemas/TleModel" }, "propagator": { "type": "string", @@ -480,7 +484,7 @@ "pageSize": { "name": "page-size", "in": "query", - "description": "Number of items per page", + "description": "Number of records per page", "schema": { "type": "integer", "default": 20, From 986c3c2a7e00d05679b8e732bb456c682b8062c5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 12:02:05 +0200 Subject: [PATCH 102/151] add geodetic propagator --- src/Controller/DocsController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 7512dec..386cbd5 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -31,7 +31,7 @@ public function getJson(): JsonResponse $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); - unset($docs['paths']['/api/tle/{id}/propagate']); +// unset($docs['paths']['/api/tle/{id}/propagate']); return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } From 6478b8f51159602ebeef7c6305e0e22202dee9d4 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 12:40:21 +0200 Subject: [PATCH 103/151] add geodetic propagator --- config/custom/tle.json | 60 ++++++++++++++++---------- src/Controller/PropagateController.php | 2 +- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index a8291f8..0346117 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -14,20 +14,22 @@ "get": { "summary": "Record", "operationId": "record", + "description": "Return single TleModel for requested satellite id", "parameters": [ { "name": "id", "in": "path", - "description": "id", + "description": "Satellite id", "required": true, "schema": { + "example": 43638, "type": "integer" } } ], "responses": { "200": { - "description": "Record found", + "description": "Resource found", "content": { "application/json": { "schema": { @@ -49,6 +51,7 @@ "get": { "summary": "Collection", "operationId": "collection", + "description": "Return collection of TleModels depending on requested parameters", "parameters": [ { "$ref": "#/components/parameters/search" @@ -124,7 +127,7 @@ ], "responses": { "200": { - "description": "Tle collection", + "description": "Resource found", "content": { "application/json": { "schema": { @@ -143,7 +146,7 @@ }, "totalItems": { "type": "integer", - "example": "50" + "example": 10414 }, "member": { "type": "array", @@ -192,13 +195,24 @@ "/api/tle/{id}/propagate": { "get": { "summary": "Propagate (experimental)", + "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", "operationId": "propagate", "parameters": [ { - "name": "date", + "name": "id", "in": "path", - "description": "date", + "description": "Target satellite id for which propagation is calculated", "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + }, + { + "name": "date", + "in": "query", + "description": "Target date and time", + "required": false, "schema": { "type": "string", "example": "2021-04-20T16:28:40+00:00" @@ -207,7 +221,7 @@ ], "responses": { "200": { - "description": "Record found", + "description": "Resource found", "content": { "application/json": { "schema": { @@ -318,8 +332,10 @@ "tle": { "$ref": "#/components/schemas/TleModel" }, - "propagator": { + "algorithm": { "type": "string", + "enum": ["SGP4", "SDP4"], + "description": "Algorithm used for propagation. Determined based on mean motion.", "example": "SGP4" }, "vector": { @@ -332,19 +348,19 @@ "properties": { "x": { "type": "number", - "example": "-2450.396984017652" + "example": -2450.396984017652 }, "y": { "type": "number", - "example": "6101.198295995954" + "example": 6101.198295995954 }, "z": { "type": "number", - "example": "-6032.216318229235" + "example": -6032.216318229235 }, "r": { "type": "number", - "example": "8922.819046481767" + "example": 8922.819046481767 }, "unit": { "type": "string", @@ -358,19 +374,19 @@ "properties": { "x": { "type": "number", - "example": "-0.1644949004552056" + "example": -0.1644949004552056 }, "y": { "type": "number", - "example": "4.639904402973215" + "example": 4.639904402973215 }, "z": { "type": "number", - "example": "4.406398357056158" + "example": 4.406398357056158 }, "r": { "type": "number", - "example": "6.400946642651633" + "example": 6.400946642651633 }, "unit": { "type": "string", @@ -386,15 +402,15 @@ "properties": { "latitude": { "type": "number", - "example": "-42.67210184042445" + "example": -42.67210184042445 }, "longitude": { "type": "number", - "example": "124.524923099869" + "example": 124.524923099869 }, "altitude": { "type": "number", - "example": "2554.4740343929398" + "example": 2554.4740343929398 } }, "type": "object" @@ -426,7 +442,7 @@ }, "example": { "response": { - "message": "Not found" + "message": "Resource not found" } } } @@ -441,7 +457,7 @@ }, "example": { "response": { - "message": "Server error" + "message": "Server has encountered an internal error" } } } @@ -484,7 +500,7 @@ "pageSize": { "name": "page-size", "in": "query", - "description": "Number of records per page", + "description": "Number of collection member per page", "schema": { "type": "integer", "default": 20, diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 8b1f28a..d65e994 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -144,7 +144,7 @@ public function propagate( '@id' => $url, '@type' => 'SatellitePropagationResult', 'tle' => $tle, - 'propagator' => $algorithm, + 'algorithm' => $algorithm, 'vector' => [ 'reference_frame' => 'ECI', 'position' => [ From 5495ae60a1457a1d8a7cf2472aa7d055ac718149 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 14:53:24 +0200 Subject: [PATCH 104/151] get rid of Statistic table --- config/packages/doctrine.yaml | 2 ++ src/Entity/Statistic.php | 39 ---------------------- src/Event/StatisticSubscriber.php | 13 +------- src/Migrations/Version20210426124814.php | 41 ++++++++++++++++++++++++ src/Repository/StatisticRepository.php | 40 ----------------------- src/Repository/TleRepository.php | 8 +++-- 6 files changed, 49 insertions(+), 94 deletions(-) delete mode 100644 src/Entity/Statistic.php create mode 100644 src/Migrations/Version20210426124814.php delete mode 100644 src/Repository/StatisticRepository.php diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index e7bec11..176cb1e 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -1,6 +1,8 @@ doctrine: dbal: url: '%env(resolve:DATABASE_URL)%' + options: + 1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))' # IMPORTANT: You MUST configure your server version, # either here or in the DATABASE_URL env var (see .env file) diff --git a/src/Entity/Statistic.php b/src/Entity/Statistic.php deleted file mode 100644 index c360155..0000000 --- a/src/Entity/Statistic.php +++ /dev/null @@ -1,39 +0,0 @@ -tle = $tle; - } - - public function getHits(): int - { - return $this->hits; - } - - public function setHits(int $hits): void - { - $this->hits = $hits; - } - - public function incrementHits(): void - { - $this->hits++; - } -} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index adc462d..df566cc 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -18,7 +18,7 @@ class StatisticSubscriber implements EventSubscriberInterface 'tle_record' ]; - public function __construct(private StatisticRepository $statisticRepository, private EntityManagerInterface $em, private TleRepository $tleRepository) + public function __construct(private EntityManagerInterface $em, private TleRepository $tleRepository) { } @@ -47,17 +47,6 @@ public function onKernelTerminate($event): void $request->setIp($event->getRequest()->getClientIp()); $this->em->persist($request); - - $this->em->flush(); - - $statistics = $this->statisticRepository->find((int)$event->getRequest()->get('id')); - - if ($statistics === null) { - return; - } - - $statistics->incrementHits(); - $this->em->flush(); } } diff --git a/src/Migrations/Version20210426124814.php b/src/Migrations/Version20210426124814.php new file mode 100644 index 0000000..44a827e --- /dev/null +++ b/src/Migrations/Version20210426124814.php @@ -0,0 +1,41 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('DROP TABLE statistic'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE statistic (tle_id INT NOT NULL, hits BIGINT NOT NULL, PRIMARY KEY(tle_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_unicode_ci` ENGINE = InnoDB COMMENT = \'\' '); + $this->addSql('ALTER TABLE statistic ADD CONSTRAINT FK_649B469CE84B6F2B FOREIGN KEY (tle_id) REFERENCES tle (id) ON UPDATE NO ACTION ON DELETE NO ACTION'); + } +} diff --git a/src/Repository/StatisticRepository.php b/src/Repository/StatisticRepository.php deleted file mode 100644 index e477ad1..0000000 --- a/src/Repository/StatisticRepository.php +++ /dev/null @@ -1,40 +0,0 @@ -getEntityManager()->getRepository(Tle::class)->find($id); - - if ($tle === null) { - return null; - } - - $statistic = new Statistic($tle); - $statistic->setHits(1); - - $this->_em->persist($statistic); - - return $statistic; - } -} diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 7ce5b60..e6100cc 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -3,7 +3,6 @@ namespace App\Repository; use App\Entity\Request; -use App\Entity\Statistic; use App\Entity\Tle; use App\Entity\TleInformation; use App\ViewModel\Model\PaginationCollection; @@ -67,8 +66,11 @@ public function collection( // sort if ($sort === TleCollectionSortableFieldsEnum::POPULARITY) { - $builder->leftJoin(Statistic::class, 's', Expr\Join::WITH, 's.tle = tle.id'); - $builder->addOrderBy('s.hits', $sortDir); + $before = (new \DateTime())->sub(new \DateInterval('P7D')); + $builder->leftJoin(Request::class, 's', Expr\Join::WITH, 's.tle = tle.id AND s.createdAt < :date'); + $builder->setParameter('date', $before); + $builder->groupBy('tle.id'); + $builder->addOrderBy('COUNT(s.id)', $sortDir); } else { $builder->addOrderBy($this->getSortTableColumnMapping($sort), $sortDir); } From dd0dae89b5a979ea8f9a1f1a566325929af24921 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 15:11:03 +0200 Subject: [PATCH 105/151] fix deprecations --- config/packages/doctrine.yaml | 1 + config/packages/doctrine_migrations.yaml | 6 ++---- src/Kernel.php | 4 ++-- tests/CollectionTest.php | 2 +- tests/TleTest.php | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index 176cb1e..b5a2432 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -1,6 +1,7 @@ doctrine: dbal: url: '%env(resolve:DATABASE_URL)%' + override_url: true options: 1002: 'SET sql_mode=(SELECT REPLACE(@@sql_mode, "ONLY_FULL_GROUP_BY", ""))' diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml index 3bf0fbc..aa336b1 100644 --- a/config/packages/doctrine_migrations.yaml +++ b/config/packages/doctrine_migrations.yaml @@ -1,5 +1,3 @@ doctrine_migrations: - dir_name: '%kernel.project_dir%/src/Migrations' - # namespace is arbitrary but should be different from App\Migrations - # as migrations classes should NOT be autoloaded - namespace: DoctrineMigrations + migrations_paths: + 'DoctrineMigrations': '%kernel.project_dir%/src/Migrations' diff --git a/src/Kernel.php b/src/Kernel.php index 509a308..2c07f58 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -7,7 +7,7 @@ use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel as BaseKernel; -use Symfony\Component\Routing\RouteCollectionBuilder; +use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; /** * @codeCoverageIgnore @@ -54,7 +54,7 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa } /** @throws \Exception */ - protected function configureRoutes(RouteCollectionBuilder $routes): void + protected function configureRoutes(RoutingConfigurator $routes): void { $confDir = $this->getProjectDir().'/config'; diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index 288e50e..20d2fd7 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -120,4 +120,4 @@ private function getCollection(int $page, int $pageSize): Response ] ); } -} \ No newline at end of file +} diff --git a/tests/TleTest.php b/tests/TleTest.php index 022982a..01ed397 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -54,7 +54,7 @@ public function testTleCollectionRecord(): void $response = $this->toArray($response); self::assertArrayHasKey('@context', $response); - self::assertEquals('http://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertArrayHasKey('@id', $response); self::assertEquals('http://localhost/api/tle', $response['@id']); From bbedad13e4a4968cac1429abb747c483c5ed42e3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 15:40:47 +0200 Subject: [PATCH 106/151] fix deprecations --- .env.test | 3 +-- config/routes.yaml | 6 +++--- config/routes/annotations.yaml | 3 --- config/routes/dev/framework.yaml | 3 --- src/Kernel.php | 8 ++++---- 5 files changed, 8 insertions(+), 15 deletions(-) delete mode 100644 config/routes/annotations.yaml delete mode 100644 config/routes/dev/framework.yaml diff --git a/.env.test b/.env.test index a68eadb..410d981 100644 --- a/.env.test +++ b/.env.test @@ -2,5 +2,4 @@ KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 -PANTHER_APP_ENV=panther -DATABASE_URL=mysql://root:root@127.0.0.1:3306/tle?serverVersion=5.7 +DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 diff --git a/config/routes.yaml b/config/routes.yaml index c3283aa..a9bbdc3 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -1,3 +1,3 @@ -#index: -# path: / -# controller: App\Controller\DefaultController::index +controllers: + resource: ../src/Controller/ + type: annotation diff --git a/config/routes/annotations.yaml b/config/routes/annotations.yaml deleted file mode 100644 index d49a502..0000000 --- a/config/routes/annotations.yaml +++ /dev/null @@ -1,3 +0,0 @@ -controllers: - resource: ../../src/Controller/ - type: annotation diff --git a/config/routes/dev/framework.yaml b/config/routes/dev/framework.yaml deleted file mode 100644 index bcbbf13..0000000 --- a/config/routes/dev/framework.yaml +++ /dev/null @@ -1,3 +0,0 @@ -_errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' - prefix: /_error diff --git a/src/Kernel.php b/src/Kernel.php index 2c07f58..d842862 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -54,12 +54,12 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa } /** @throws \Exception */ - protected function configureRoutes(RoutingConfigurator $routes): void + protected function configureRoutes(RoutingConfigurator $routes): void { $confDir = $this->getProjectDir().'/config'; - $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS, '/', 'glob'); - $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); - $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS); + $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS); + $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS); } } From 94a7f4a32374e16a9f05a7110f28c98aea372fda Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:06:59 +0200 Subject: [PATCH 107/151] fix tests --- config/custom/tle.json | 4 ++++ deploy.php | 2 +- tests/CollectionTest.php | 36 ++++++++++++++++++------------------ tests/DocumentationTest.php | 6 +++--- tests/TleTest.php | 8 ++++---- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 0346117..7022b48 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -282,6 +282,10 @@ "allOf": [ { "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, "@id": { "type": "string", "example": "https://tle.ivanstanojevic.me/api/tle/43638" diff --git a/deploy.php b/deploy.php index 4c7b8a7..154a0ff 100644 --- a/deploy.php +++ b/deploy.php @@ -67,5 +67,5 @@ ] ); -//before('deploy', 'test'); +before('deploy', 'test'); after('deploy:failed', 'deploy:unlock'); diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index 20d2fd7..b54e390 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -10,42 +10,42 @@ final class CollectionTest extends AbstractWebTestCase [ 'page' => 1, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=1&page-size=2', + '@id' => 'http://localhost/api/tle/?page=1&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'next' => 'http://localhost/api/tle?page=2&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'next' => 'http://localhost/api/tle/?page=2&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ], [ 'page' => 3, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=3&page-size=2', + '@id' => 'http://localhost/api/tle/?page=3&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=2&page-size=2', - 'next' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=2&page-size=2', + 'next' => 'http://localhost/api/tle/?page=4&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ], [ 'page' => 5, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=5&page-size=2', + '@id' => 'http://localhost/api/tle/?page=5&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=4&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=4&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ], [ 'page' => 7, 'expected' => [ - '@id' => 'http://localhost/api/tle?page=7&page-size=2', + '@id' => 'http://localhost/api/tle/?page=7&page-size=2', '@type' => 'PartialCollectionView', - 'first' => 'http://localhost/api/tle?page=1&page-size=2', - 'previous' => 'http://localhost/api/tle?page=6&page-size=2', - 'last' => 'http://localhost/api/tle?page=5&page-size=2' + 'first' => 'http://localhost/api/tle/?page=1&page-size=2', + 'previous' => 'http://localhost/api/tle/?page=6&page-size=2', + 'last' => 'http://localhost/api/tle/?page=5&page-size=2' ] ] ]; @@ -113,7 +113,7 @@ private function getCollectionContent(int $page, int $pageSize): array private function getCollection(int $page, int $pageSize): Response { return $this->get( - '/api/tle', + '/api/tle/', [ 'page' => $page, 'page-size' => $pageSize, diff --git a/tests/DocumentationTest.php b/tests/DocumentationTest.php index 64be291..1878bb8 100644 --- a/tests/DocumentationTest.php +++ b/tests/DocumentationTest.php @@ -17,7 +17,7 @@ public function testDocumentationIsCorrect(): void $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; $paginationSchema = $response['components']['schemas']['Pagination']['properties']; - $tleSchema = $response['components']['schemas']['TLE']['allOf'][0]['properties']; + $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; $tle = TleFixtures::create(); @@ -26,7 +26,7 @@ public function testDocumentationIsCorrect(): void self::assertCount(\count($tleSchema), $response); self::assertEquals(array_keys($tleSchema), array_keys($response)); - $response = $this->toArray($this->get('/api/tle', ['page-size' => 2, 'page' => 2])); + $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); self::assertCount(\count($paginationSchema), $response['view']); self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); @@ -34,4 +34,4 @@ public function testDocumentationIsCorrect(): void self::assertCount(\count($response), $collectionSchema); self::assertEquals(array_keys($response), array_keys($collectionSchema)); } -} \ No newline at end of file +} diff --git a/tests/TleTest.php b/tests/TleTest.php index 01ed397..6039820 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -43,7 +43,7 @@ public function testTleCollectionRecord(): void $pageSize = 2; $response = $this->get( - '/api/tle', + '/api/tle/', [ 'page-size' => $pageSize, ] @@ -57,7 +57,7 @@ public function testTleCollectionRecord(): void self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); self::assertArrayHasKey('@id', $response); - self::assertEquals('http://localhost/api/tle', $response['@id']); + self::assertEquals('http://localhost/api/tle/', $response['@id']); self::assertArrayHasKey('@type', $response); self::assertEquals('Collection', $response['@type']); @@ -75,10 +75,10 @@ public function testTleCollectionRecord(): void self::assertEquals('*', $parameters['search']); self::assertArrayHasKey('sort', $parameters); - self::assertEquals('name', $parameters['sort']); + self::assertEquals('popularity', $parameters['sort']); self::assertArrayHasKey('sort-dir', $parameters); - self::assertEquals('asc', $parameters['sort-dir']); + self::assertEquals('desc', $parameters['sort-dir']); self::assertArrayHasKey('page', $parameters); self::assertEquals(1, $parameters['page']); From a525bb1d7eb5e2f101752a27782e8bdb29fa5b85 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:34:36 +0200 Subject: [PATCH 108/151] move sentry to production --- config/bundles.php | 2 +- config/packages/{ => prod}/sentry.yaml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename config/packages/{ => prod}/sentry.yaml (100%) diff --git a/config/bundles.php b/config/bundles.php index ec6d32d..190f48c 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -6,5 +6,5 @@ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], - Sentry\SentryBundle\SentryBundle::class => ['all' => true], + Sentry\SentryBundle\SentryBundle::class => ['prod' => true], ]; diff --git a/config/packages/sentry.yaml b/config/packages/prod/sentry.yaml similarity index 100% rename from config/packages/sentry.yaml rename to config/packages/prod/sentry.yaml From 296e7e5e91fec00c98cd370a9d584625c6a5c5c6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:44:12 +0200 Subject: [PATCH 109/151] move sentry to production --- composer.json | 2 +- composer.lock | 12 ++++++------ src/Event/ApiExceptionSubscriber.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 72f24ca..73ca5b5 100644 --- a/composer.json +++ b/composer.json @@ -91,7 +91,7 @@ "post-update-cmd": [ "@auto-scripts" ], - "test": "@php bin/phpunit --coverage-text", + "test": "php bin/phpunit --coverage-text", "deploy": "dep deploy" }, "conflict": { diff --git a/composer.lock b/composer.lock index c350a2f..0802e91 100644 --- a/composer.lock +++ b/composer.lock @@ -7637,16 +7637,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v5.2.4", + "version": "v5.2.6", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d" + "reference": "f2f94fd78379cdcdef09dd5025af791301913968" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/9d85d900c1afe29138a0d5854505eb684bc3ac6d", - "reference": "9d85d900c1afe29138a0d5854505eb684bc3ac6d", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f2f94fd78379cdcdef09dd5025af791301913968", + "reference": "f2f94fd78379cdcdef09dd5025af791301913968", "shasum": "" }, "require": { @@ -7700,7 +7700,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.4" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.6" }, "funding": [ { @@ -7716,7 +7716,7 @@ "type": "tidelift" } ], - "time": "2021-02-04T18:05:54+00:00" + "time": "2021-03-23T20:42:04+00:00" } ], "aliases": [], diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 9b8f465..a2434b1 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -41,7 +41,7 @@ public function onException(ExceptionEvent $event): void $response = ['message' => 'Unspecified error']; - if ($this->env === 'dev') { + if ($this->env === 'dev' || $this->env === 'test') { $response['message'] = $exception->getMessage(); $response['exception'] = $this->throwableToArray($exception); } From 5fb357709a57bd758669b844629b3dcdb58d2ef6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:45:29 +0200 Subject: [PATCH 110/151] move sentry to production --- phpunit.xml.dist | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 phpunit.xml.dist diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..e2d15c0 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + tests + + + + + + src + + + + + + + From d5d1b010ea60c1d45bee69739c6d7f5a04beb5e8 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 16:53:12 +0200 Subject: [PATCH 111/151] move sentry to production --- .gitignore | 1 + phpunit.xml.dist | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 4ea500f..e108fb4 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ .phpunit .phpunit.result.cache /phpunit.xml +coverage ###< symfony/phpunit-bridge ### public/index.html diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e2d15c0..4681a8a 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -12,7 +12,7 @@ - + @@ -21,11 +21,18 @@ - - - src - - + + + src + + + + src/Migrations + src/Command + src/DataFixtures + src/Kernel.php + + From 1387b38db500adf664f74f6148ccd544e42e88af Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 17:42:14 +0200 Subject: [PATCH 112/151] move sentry to production --- src/Controller/TleController.php | 35 ++------------------------------ 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index e646e20..f763330 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -10,8 +10,6 @@ use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -30,6 +28,7 @@ final class TleController extends AbstractApiController protected const COLLECTION_FILTERS = [ TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::PERIOD => Filter::FILTER_TYPE_FLOAT, ]; public function __construct(protected TleRepository $repository) @@ -46,14 +45,12 @@ public function record( $extra = (bool)$request->get(self::PARAM_EXTRA, false); - $tle = $this->getTle($id); - $data = [ '@context' => self::HYDRA_CONTEXT, ]; return $this->response( - array_merge($data, $normalizer->normalize($tle, null, [self::PARAM_EXTRA => $extra])), + array_merge($data, $normalizer->normalize($this->getTle($id), null, [self::PARAM_EXTRA => $extra])), ); } @@ -117,32 +114,4 @@ public function collection( $normalizer->normalize($response, null, [self::PARAM_EXTRA => $extra]) ); } - - #[Route("/popular", name: "tle_popular")] - public function popular( - Request $request, - TleRepository $repository - ): JsonResponse { - $newerThan = new \DateTime('now'); - $newerThan->setTime(0, 0, 0); - $newerThan->modify('-3 days'); - - $limit = 10; - - $members = $repository->popular($newerThan, $limit); - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $this->router->generate('tle_popular', [], UrlGeneratorInterface::ABSOLUTE_URL), - '@type' => 'Collection', - 'totalItems' => \count($members), - 'member' => $members, - 'parameters' => [ - '*limit' => $limit, - '*newerThan' => $newerThan->format(self::DATETIME_FORMAT), - ], - ]; - - return $this->response($data); - } } From 645c09756cd529e411394b64f07c9fa5a1a9c25e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 17:58:15 +0200 Subject: [PATCH 113/151] move sentry to production --- tests/.gitignore | 0 tests/PropagateControllerTest.php | 53 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) delete mode 100644 tests/.gitignore create mode 100644 tests/PropagateControllerTest.php diff --git a/tests/.gitignore b/tests/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php new file mode 100644 index 0000000..3224379 --- /dev/null +++ b/tests/PropagateControllerTest.php @@ -0,0 +1,53 @@ +get('/api/tle/' . $tle->getId() . '/propagate', [ + 'date' => '2021-04-26T17:49:45+02:00' + ]); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SGP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 3731.3677738358); + self::assertEquals($response['vector']['position']['y'], -3929.0247024138); + self::assertEquals($response['vector']['position']['z'], -3820.6175474185); + self::assertEquals($response['vector']['position']['r'], 6630.0421581948); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); + self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); + self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); + self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], -35.362152001955); + self::assertEquals($response['geodetic']['longitude'], 221.21616992358); + self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + + self::assertEquals($response['parameters']['satelliteId'], 43550); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } +} From 3d99478901fb9981c3ae6623b4ff0525f662ae52 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 18:11:09 +0200 Subject: [PATCH 114/151] move sentry to production --- phpunit.xml.dist | 2 +- src/DataFixtures/TleFixtures.php | 12 +++++++ tests/PropagateControllerTest.php | 56 ++++++++++++++++++++++++++++--- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 4681a8a..47cc715 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -23,7 +23,7 @@ - src + ./src diff --git a/src/DataFixtures/TleFixtures.php b/src/DataFixtures/TleFixtures.php index 9ab650c..7b2ce03 100644 --- a/src/DataFixtures/TleFixtures.php +++ b/src/DataFixtures/TleFixtures.php @@ -25,10 +25,22 @@ public static function create(): Tle return $tle; } + public static function createDeep(): Tle + { + $tle = new Tle(); + $tle->setId(22049); + $tle->setName('GEOTAIL'); + $tle->setLine1('1 22049U 92044A 21119.24930644 -.00001485 00000-0 00000+0 0 9990'); + $tle->setLine2('2 22049 38.4941 42.7845 5317694 181.2241 357.6003 0.19228928 12156'); + + return $tle; + } + public function load(ObjectManager $manager): void { // create single record $manager->persist(self::create()); + $manager->persist(self::createDeep()); // create additional nine records with dummy satelliteIds for ($satelliteId = 1; $satelliteId < 10; $satelliteId++) { diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php index 3224379..c28bb79 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/PropagateControllerTest.php @@ -9,13 +9,16 @@ class PropagateControllerTest extends AbstractWebTestCase { - public function testPropagate(): void + public function testPropagateSGP4(): void { $tle = TleFixtures::create(); - $response = $this->get('/api/tle/' . $tle->getId() . '/propagate', [ - 'date' => '2021-04-26T17:49:45+02:00' - ]); + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); @@ -50,4 +53,49 @@ public function testPropagate(): void self::assertEquals($response['parameters']['satelliteId'], 43550); self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); } + + public function testPropagateSDP4(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SDP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 142825.54086031896); + self::assertEquals($response['vector']['position']['y'], 133973.34798843606); + self::assertEquals($response['vector']['position']['z'], 1303.6185230048); + self::assertEquals($response['vector']['position']['r'], 195830.7751976863); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); + self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); + self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); + self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); + self::assertEquals($response['geodetic']['longitude'], 310.86248495862); + self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + + self::assertEquals($response['parameters']['satelliteId'], 22049); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } } From 3cd2f4794dac8d64ef398282f9f0cd6675be8a17 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 18:24:41 +0200 Subject: [PATCH 115/151] move sentry to production --- tests/CollectionTest.php | 11 ++++++----- tests/PropagateControllerTest.php | 11 +++++++++++ tests/TleTest.php | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index b54e390..bbe070a 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -14,7 +14,7 @@ final class CollectionTest extends AbstractWebTestCase '@type' => 'PartialCollectionView', 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'next' => 'http://localhost/api/tle/?page=2&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ], [ @@ -25,7 +25,7 @@ final class CollectionTest extends AbstractWebTestCase 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'previous' => 'http://localhost/api/tle/?page=2&page-size=2', 'next' => 'http://localhost/api/tle/?page=4&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ], [ @@ -35,7 +35,8 @@ final class CollectionTest extends AbstractWebTestCase '@type' => 'PartialCollectionView', 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'previous' => 'http://localhost/api/tle/?page=4&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'next' => 'http://localhost/api/tle/?page=6&page-size=2', + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ], [ @@ -45,7 +46,7 @@ final class CollectionTest extends AbstractWebTestCase '@type' => 'PartialCollectionView', 'first' => 'http://localhost/api/tle/?page=1&page-size=2', 'previous' => 'http://localhost/api/tle/?page=6&page-size=2', - 'last' => 'http://localhost/api/tle/?page=5&page-size=2' + 'last' => 'http://localhost/api/tle/?page=6&page-size=2' ] ] ]; @@ -99,7 +100,7 @@ private function assertViewIsCorrect($expected, $actual): void { foreach ($actual as $key => $value) { self::assertArrayHasKey($key, $expected, \sprintf('Assert view has key %s', $key)); - self::assertEquals($value, $expected[$key], \sprintf('Assert value of key %s is correct', $key)); + self::assertEquals($expected[$key], $value , \sprintf('Assert value of key %s is correct', $key)); } } diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php index c28bb79..cd302d4 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/PropagateControllerTest.php @@ -9,6 +9,17 @@ class PropagateControllerTest extends AbstractWebTestCase { + public function testResourceNotFound(): void + { + $response = $this->get('/api/tle/0/propagate'); + + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + } + public function testPropagateSGP4(): void { $tle = TleFixtures::create(); diff --git a/tests/TleTest.php b/tests/TleTest.php index 6039820..0630b22 100644 --- a/tests/TleTest.php +++ b/tests/TleTest.php @@ -63,7 +63,7 @@ public function testTleCollectionRecord(): void self::assertEquals('Collection', $response['@type']); self::assertArrayHasKey('totalItems', $response); - self::assertEquals(10, $response['totalItems']); + self::assertEquals(11, $response['totalItems']); self::assertArrayHasKey('member', $response); self::assertEquals(\count($response['member']), $pageSize); From 7b5767838aa410856e13774c5450e7d44ca40238 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 18:31:09 +0200 Subject: [PATCH 116/151] move sentry to production --- tests/StatisticsControllerTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 tests/StatisticsControllerTest.php diff --git a/tests/StatisticsControllerTest.php b/tests/StatisticsControllerTest.php new file mode 100644 index 0000000..9c748c3 --- /dev/null +++ b/tests/StatisticsControllerTest.php @@ -0,0 +1,15 @@ +get('/api/tle/hits'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } +} From d6552f084eabcbd408707b38e54f77fd5ac84cb9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 26 Apr 2021 19:10:31 +0200 Subject: [PATCH 117/151] tests --- src/Command/TleCalculate.php | 10 +++++ src/Entity/Tle.php | 2 +- src/Repository/TleRepository.php | 17 --------- src/Serializer/TleModelNormalizer.php | 2 +- tests/AssertionTrait.php | 22 +++++++++++ tests/TleControllerTest.php | 54 +++++++++++++++++++++++++++ 6 files changed, 88 insertions(+), 19 deletions(-) create mode 100644 tests/AssertionTrait.php create mode 100644 tests/TleControllerTest.php diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index e33e90d..2c65cee 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -7,11 +7,13 @@ use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class TleCalculate extends Command { protected const BATCH_SIZE = 20; + protected const OPTION_TLE = 'tle'; protected static $defaultName = 'tle:calculate'; @@ -23,6 +25,7 @@ public function __construct(protected EntityManagerInterface $entityManager) protected function configure() { $this->setDescription('Calculate and persist data in TleInformation entity'); + $this->addOption(self::OPTION_TLE, 't', InputOption::VALUE_REQUIRED, 'Calculate only for specified record'); } protected function execute(InputInterface $input, OutputInterface $output): int @@ -32,6 +35,13 @@ protected function execute(InputInterface $input, OutputInterface $output): int ->select('tle') ->from(Tle::class, 'tle'); + $tle = $input->getOption(self::OPTION_TLE); + + if ($tle !== null) { + $builder->andWhere('tle.id = :tle'); + $builder->setParameter('tle', $tle); + } + $repository = $this->entityManager->getRepository(TleInformation::class); /** @var Tle $tle */ diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 2fa9441..01ccef3 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -38,7 +38,7 @@ public function update(): void $this->updatedAt = DateTimeService::getCurrentUTC(); } - public function getInfo(): TleInformation { + public function getInfo(): ?TleInformation { return $this->info; } } diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index e6100cc..0cea49d 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -87,23 +87,6 @@ public function collection( return $collection; } - public function popular(\DateTime $newerThen, int $limit): array - { - $builder = $this->_em->createQueryBuilder(); - - $builder->select(['t.name', 't.id', 'COUNT(q.ip) as hits']) - ->from(Request::class, 'q') - ->distinct('t.id') - ->leftJoin('q.tle', 't') - ->groupBy('t.id') - ->where('q.createdAt > :newerThan') - ->setParameter('newerThan', $newerThen) - ->setMaxResults($limit) - ->orderBy('hits', 'DESC'); - - return $builder->getQuery()->getResult(); - } - private function getCount(QueryBuilder $builder): int { $builder = clone $builder; diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 45bcb8e..77a8a29 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -40,7 +40,7 @@ public function normalize($entity, ?string $format = null, array $context = []): 'line2' => $model->getLine2(), ]; - if ($isExtra) { + if ($isExtra && $entity->getInfo()) { $extra = [ 'extra' => [ TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php new file mode 100644 index 0000000..f318f59 --- /dev/null +++ b/tests/AssertionTrait.php @@ -0,0 +1,22 @@ +getLine1(), $tle->getLine2(), $tle->getName()); + + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); + self::assertEquals('TleModel', $response['@type']); + self::assertEquals($tle->getId(), $response['satelliteId']); + self::assertEquals($tle->getName(), $response['name']); + self::assertEquals($model->getDate(), $response['date']); + self::assertEquals($tle->getLine1(), $response['line1']); + self::assertEquals($tle->getLine2(), $response['line2']); + } +} diff --git a/tests/TleControllerTest.php b/tests/TleControllerTest.php new file mode 100644 index 0000000..99736cb --- /dev/null +++ b/tests/TleControllerTest.php @@ -0,0 +1,54 @@ + 'tle:calculate', + '--tle' => TleFixtures::createDeep()->getId(), + ] + ); + + $application = new Application(static::$kernel); + $application->setAutoExit(false); + $application->run($input, new BufferedOutput()); + } + + public function testTleExtraFieldsMissingData(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } + + public function testTleExtraFields(): void + { + $tle = TleFixtures::create(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } +} From beff4376e04714c1b00968a010d2895ac8c886fe Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Tue, 27 Apr 2021 09:18:18 +0200 Subject: [PATCH 118/151] tests --- config/custom/tle.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/custom/tle.json b/config/custom/tle.json index 7022b48..445957b 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -327,7 +327,7 @@ }, "@id": { "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/44859/vector?date=2021-04-26T08:39:45+00:00" + "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" }, "@type": { "type": "string", From 51af694ece2d5f2fde2195a5ee28cf93901d7cc5 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 27 May 2021 21:24:23 +0200 Subject: [PATCH 119/151] ground tracks --- src/Command/TleCalculate.php | 2 + src/Controller/FlyOverController.php | 130 ++++++++++++++++++ src/Controller/PropagateController.php | 61 -------- src/Entity/TleInformation.php | 10 ++ src/Migrations/Version20210524103622.php | 35 +++++ src/Serializer/SatellitePassNormalizer.php | 41 ++++-- src/Serializer/TleModelNormalizer.php | 2 + src/Service/FlyOverService.php | 53 +++++++ src/Service/Traits/TleHttpTrait.php | 12 ++ .../TleCollectionSortableFieldsEnum.php | 2 + 10 files changed, 276 insertions(+), 72 deletions(-) create mode 100644 src/Controller/FlyOverController.php create mode 100644 src/Migrations/Version20210524103622.php create mode 100644 src/Service/FlyOverService.php diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 2c65cee..2850d50 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -61,6 +61,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->eccentricity = $tleModel->eccentricity(); $tleInformation->period = $tleModel->period(); $tleInformation->geostationary = $tleModel->isGeostationary(); + $tleInformation->raan = $tleModel->raan(); + $tleInformation->semiMajorAxis = $tleModel->semiMajorAxis(); if (!$exists) { $this->entityManager->persist($tleInformation); diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php new file mode 100644 index 0000000..6ba504c --- /dev/null +++ b/src/Controller/FlyOverController.php @@ -0,0 +1,130 @@ + "\d+"])] + public function flyover( + int $id, + Request $request + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $parameters = [ + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + 'only_visible' => $onlyVisible, + ]; + + $url = $this->router->generate( + 'tle_flyover', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); + + foreach ($members as $index => &$member) { + $member = array_merge( + [ + '@id' => $this->generateUrl( + 'tle_flyover_details', + ['id' => $id, 'passId' => $index], + UrlGeneratorInterface::ABSOLUTE_URL + ), + ], + $member + ); + } + + return $this->response( + [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatelliteFlyOverCollection', + 'observer' => $this->normalizer->normalize($observer), + 'member' => $members, + 'parameters' => $parameters, + ] + ); + } + + #[Route("/api/tle/{id}/flyover/{passId}", name: "tle_flyover_details", requirements: ["id" => "\d+", "passId" => "\d+"])] + public function flyoverDetails( + int $id, + int $passId, + Request $request, + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $pass = $results[$passId] ?? null; + + if ($pass === null) { + throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); + } + + $url = $this->router->generate( + 'tle_flyover_details', + array_merge($request->request->all(), ['id' => $id, 'passId' => $passId]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + 'observer' => $this->normalizer->normalize($observer), + ]; + + return $this->response( + array_merge( + $data, + $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) + ) + ); + } + +} diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index d65e994..2edfb0f 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -5,11 +5,9 @@ use App\Entity\Tle; use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; -use App\ViewModel\Observer; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -25,65 +23,6 @@ public function __construct(protected TleRepository $repository) { } - #[Route("/api/tle/{id}/pass", name: "tle_pass", requirements: ["id" => "\d+"])] - public function pass( - int $id, - Request $request, - NormalizerInterface $normalizer - ): JsonResponse { - try { - $observer = new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); - } catch (\InvalidArgumentException $exception) { - throw new BadRequestHttpException($exception->getMessage()); - } - - $predict = new \Predict(); - $qth = new \Predict_QTH(); - - $qth->lat = $observer->latitude; - $qth->lon = $observer->longitude; - $qth->alt = $observer->altitude; - - $tle = $this->getTle($id); - - $tle = new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()); - $sat = new \Predict_Sat($tle); // Load up the satellite data - $now = \Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum) - - $predict->minEle = 10; // Minimum elevation for a pass - $predict->timeRes = 10; // Pass details: time resolution in seconds - $predict->numEntries = 20; // Pass details: number of entries per pass - $predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) - - // Get the passes and filter visible only, takes about 4 seconds for 10 days - $results = $predict->get_passes($sat, $qth, $now, 10); - $results = $predict->filterVisiblePasses($results); - - $parameters = [ - 'latitude' => $observer->latitude, - 'longitude' => $observer->longitude, - ]; - - $url = $this->router->generate( - 'tle_pass', - array_merge($request->request->all(), $parameters, ['id' => $id]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $parameters['satelliteId'] = $id; - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - '@type' => 'VisibleSatellitePassCollection', - 'observer' => $normalizer->normalize($observer), - 'member' => $normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]), - 'parameters' => $parameters, - ]; - - return $this->response($data); - } - #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] public function propagate( int $id, diff --git a/src/Entity/TleInformation.php b/src/Entity/TleInformation.php index b2d3cad..e0e55d4 100644 --- a/src/Entity/TleInformation.php +++ b/src/Entity/TleInformation.php @@ -22,6 +22,16 @@ class TleInformation */ public ?float $inclination; + /** + * @ORM\Column(type="float", precision=16, scale=10, nullable=true) + */ + public ?float $raan; + + /** + * @ORM\Column(type="float", precision=16, scale=10, nullable=true) + */ + public ?float $semiMajorAxis; + /** * Period for complete orbit in seconds * diff --git a/src/Migrations/Version20210524103622.php b/src/Migrations/Version20210524103622.php new file mode 100644 index 0000000..7c8a16c --- /dev/null +++ b/src/Migrations/Version20210524103622.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information ADD raan DOUBLE PRECISION DEFAULT NULL, ADD semi_major_axis DOUBLE PRECISION DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE tle_information DROP raan, DROP semi_major_axis'); + } +} diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php index d0ab383..c267f04 100644 --- a/src/Serializer/SatellitePassNormalizer.php +++ b/src/Serializer/SatellitePassNormalizer.php @@ -4,9 +4,14 @@ use App\Controller\AbstractApiController; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; class SatellitePassNormalizer implements NormalizerInterface { + public function __construct(protected ObjectNormalizer $normalizer) + { + } + /** * @param \Predict_Pass $object * @param string|null $format @@ -16,30 +21,44 @@ class SatellitePassNormalizer implements NormalizerInterface */ public function normalize($object, string $format = null, array $context = []): array { - return [ - '@type' => 'VisibleSatellitePass', + $timezone = $context['timezone'] ?? 'UTC'; + $details = $context['details'] ?? false; + + $result = [ + '@type' => $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', 'aos' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_aos, $context['timezone'])->format( + 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( AbstractApiController::DATETIME_FORMAT ), - 'azimuth' => round($object->visible_aos_az, 2), - 'elevation' => round($object->visible_aos_el, 2), + 'azimuth' => round($object->visible_aos_az ?? null, 2), + 'elevation' => round($object->visible_aos_el ?? null, 2), ], 'max' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_tca, $context['timezone'])->format( + 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( AbstractApiController::DATETIME_FORMAT ), - 'azimuth' => round($object->visible_max_el_az, 2), - 'elevation' => round($object->visible_max_el, 2), + 'azimuth' => round($object->visible_max_el_az ?? null, 2), + 'elevation' => round($object->visible_max_el ?? null, 2), ], 'los' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_los, $context['timezone'])->format( + 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( AbstractApiController::DATETIME_FORMAT ), - 'azimuth' => round($object->visible_los_az, 2), - 'elevation' => round($object->visible_los_el, 2), + 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), + 'elevation' => round($object->visible_los_el ?? null, 2), ], ]; + + if ($details) { + foreach ($object->details as $item) { + $result['details'][] = [ + 'azimuth' => $item->az, + 'elevation' => $item->el + ]; + } + } + + return $result; } public function supportsNormalization($data, string $format = null): bool diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 77a8a29..2357599 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -46,6 +46,8 @@ public function normalize($entity, ?string $format = null, array $context = []): TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, TleCollectionSortableFieldsEnum::INCLINATION => $entity->getInfo()->inclination, TleCollectionSortableFieldsEnum::PERIOD => $entity->getInfo()->period, + TleCollectionSortableFieldsEnum::RAAN => $entity->getInfo()->raan, + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $entity->getInfo()->semiMajorAxis, ], ]; diff --git a/src/Service/FlyOverService.php b/src/Service/FlyOverService.php new file mode 100644 index 0000000..dd86ac1 --- /dev/null +++ b/src/Service/FlyOverService.php @@ -0,0 +1,53 @@ +predict = new \Predict(); + $this->qth = new \Predict_QTH(); + } + + public function setTle(Tle $tle): self + { + $this->sat = new \Predict_Sat( + new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()) + ); + + return $this; + } + + public function setObserver(Observer $observer): self + { + $this->qth->lat = $observer->latitude; + $this->qth->lon = $observer->longitude; + $this->qth->alt = $observer->altitude; + + return $this; + } + + public function getVisiblePasses(float $time): array + { + return $this->predict->filterVisiblePasses($this->getPasses($time)); + } + + public function getPasses(float $time): array + { + $this->predict->minEle = 10; // Minimum elevation for a pass + $this->predict->timeRes = 10; // Pass details: time resolution in seconds + $this->predict->numEntries = 20; // Pass details: number of entries per pass + $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + + // Get the passes and filter visible only, takes about 4 seconds for 10 days + return $this->predict->get_passes($this->sat, $this->qth, $time, 10); + } +} diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php index 4814033..64c92e0 100644 --- a/src/Service/Traits/TleHttpTrait.php +++ b/src/Service/Traits/TleHttpTrait.php @@ -3,6 +3,9 @@ namespace App\Service\Traits; use App\Entity\Tle; +use App\ViewModel\Observer; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; trait TleHttpTrait @@ -18,4 +21,13 @@ protected function getTle(int $id): Tle return $tle; } + + protected function getObserver(Request $request): Observer + { + try { + return new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); + } catch (\InvalidArgumentException $exception) { + throw new BadRequestHttpException($exception->getMessage()); + } + } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index 7aa6989..ca3bc88 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -12,4 +12,6 @@ class TleCollectionSortableFieldsEnum extends Enum public const INCLINATION = 'inclination'; public const ECCENTRICITY = 'eccentricity'; public const PERIOD = 'period'; + public const RAAN = 'raan'; + public const SEMI_MAJOR_AXIS = 'semi_major_axis'; } From 369db01f5a96613899c5574fa1610106f5ee9459 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 27 May 2021 21:26:17 +0200 Subject: [PATCH 120/151] update tle client --- composer.lock | 8 +- config/bootstrap.php | 98 ++++---- src/Controller/FlyOverController.php | 260 ++++++++++----------- src/Controller/PropagateController.php | 232 +++++++++--------- src/Serializer/ObserverNormalizer.php | 78 +++---- src/Serializer/SatellitePassNormalizer.php | 136 +++++------ src/Service/FlyOverService.php | 106 ++++----- src/Service/Traits/TleHttpTrait.php | 66 +++--- src/ViewModel/LatLng.php | 82 +++---- src/ViewModel/Observer.php | 30 +-- tests/AssertionTrait.php | 44 ++-- tests/PropagateControllerTest.php | 224 +++++++++--------- tests/StatisticsControllerTest.php | 30 +-- tests/TleControllerTest.php | 108 ++++----- 14 files changed, 751 insertions(+), 751 deletions(-) diff --git a/composer.lock b/composer.lock index 0802e91..cea44af 100644 --- a/composer.lock +++ b/composer.lock @@ -1851,12 +1851,12 @@ "source": { "type": "git", "url": "https://github.com/ivanstan/tle-php.git", - "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835" + "reference": "45255e18e2730938e8428f4f232d1943b9893991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/50ea45311c3bc50450a799d5cff56f3a904d5835", - "reference": "50ea45311c3bc50450a799d5cff56f3a904d5835", + "url": "https://api.github.com/repos/ivanstan/tle-php/zipball/45255e18e2730938e8428f4f232d1943b9893991", + "reference": "45255e18e2730938e8428f4f232d1943b9893991", "shasum": "" }, "require": { @@ -1890,7 +1890,7 @@ "issues": "https://github.com/ivanstan/tle-php/issues", "source": "https://github.com/ivanstan/tle-php/tree/master" }, - "time": "2021-04-20T16:57:25+00:00" + "time": "2021-05-27T19:24:24+00:00" }, { "name": "jean85/pretty-package-versions", diff --git a/config/bootstrap.php b/config/bootstrap.php index 452a4fb..9b1b3e9 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -1,49 +1,49 @@ -=1.2) -if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') - && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] -) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); - } -} elseif (class_exists(Dotenv::class)) { - // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); -} else { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} - -if ($_SERVER['APP_ENV'] === 'test') { - $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel - $kernel->boot(); - - $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); - (new Application($kernel))->add($command); - - $command->run( - new ArrayInput( - [ - 'command' => 'doctrine:reload', - '--no-interaction' => true, - ] - ), - new ConsoleOutput() - ); -} - -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = -$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') + && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] +) { + foreach ($env as $k => $v) { + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); + } +} elseif (class_exists(Dotenv::class)) { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + +if ($_SERVER['APP_ENV'] === 'test') { + $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel + $kernel->boot(); + + $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); + (new Application($kernel))->add($command); + + $command->run( + new ArrayInput( + [ + 'command' => 'doctrine:reload', + '--no-interaction' => true, + ] + ), + new ConsoleOutput() + ); +} + +$_SERVER += $_ENV; +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = +$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 6ba504c..7109001 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -1,130 +1,130 @@ - "\d+"])] - public function flyover( - int $id, - Request $request - ): JsonResponse { - $observer = $this->getObserver($request); - $onlyVisible = $request->get('only_visible', true); - - $this->service - ->setObserver($observer) - ->setTle($this->getTle($id)); - - if ($onlyVisible) { - $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); - } else { - $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); - } - - $parameters = [ - 'latitude' => $observer->latitude, - 'longitude' => $observer->longitude, - 'only_visible' => $onlyVisible, - ]; - - $url = $this->router->generate( - 'tle_flyover', - array_merge($request->request->all(), $parameters, ['id' => $id]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $parameters['satelliteId'] = $id; - - $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); - - foreach ($members as $index => &$member) { - $member = array_merge( - [ - '@id' => $this->generateUrl( - 'tle_flyover_details', - ['id' => $id, 'passId' => $index], - UrlGeneratorInterface::ABSOLUTE_URL - ), - ], - $member - ); - } - - return $this->response( - [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - '@type' => 'SatelliteFlyOverCollection', - 'observer' => $this->normalizer->normalize($observer), - 'member' => $members, - 'parameters' => $parameters, - ] - ); - } - - #[Route("/api/tle/{id}/flyover/{passId}", name: "tle_flyover_details", requirements: ["id" => "\d+", "passId" => "\d+"])] - public function flyoverDetails( - int $id, - int $passId, - Request $request, - ): JsonResponse { - $observer = $this->getObserver($request); - $onlyVisible = $request->get('only_visible', true); - - $this->service - ->setObserver($observer) - ->setTle($this->getTle($id)); - - if ($onlyVisible) { - $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); - } else { - $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); - } - - $pass = $results[$passId] ?? null; - - if ($pass === null) { - throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); - } - - $url = $this->router->generate( - 'tle_flyover_details', - array_merge($request->request->all(), ['id' => $id, 'passId' => $passId]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - 'observer' => $this->normalizer->normalize($observer), - ]; - - return $this->response( - array_merge( - $data, - $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) - ) - ); - } - -} + "\d+"])] + public function flyover( + int $id, + Request $request + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $parameters = [ + 'latitude' => $observer->latitude, + 'longitude' => $observer->longitude, + 'only_visible' => $onlyVisible, + ]; + + $url = $this->router->generate( + 'tle_flyover', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); + + foreach ($members as $index => &$member) { + $member = array_merge( + [ + '@id' => $this->generateUrl( + 'tle_flyover_details', + ['id' => $id, 'passId' => $index], + UrlGeneratorInterface::ABSOLUTE_URL + ), + ], + $member + ); + } + + return $this->response( + [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatelliteFlyOverCollection', + 'observer' => $this->normalizer->normalize($observer), + 'member' => $members, + 'parameters' => $parameters, + ] + ); + } + + #[Route("/api/tle/{id}/flyover/{passId}", name: "tle_flyover_details", requirements: ["id" => "\d+", "passId" => "\d+"])] + public function flyoverDetails( + int $id, + int $passId, + Request $request, + ): JsonResponse { + $observer = $this->getObserver($request); + $onlyVisible = $request->get('only_visible', true); + + $this->service + ->setObserver($observer) + ->setTle($this->getTle($id)); + + if ($onlyVisible) { + $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); + } else { + $results = $this->service->getPasses(\Predict_Time::get_current_daynum()); + } + + $pass = $results[$passId] ?? null; + + if ($pass === null) { + throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); + } + + $url = $this->router->generate( + 'tle_flyover_details', + array_merge($request->request->all(), ['id' => $id, 'passId' => $passId]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + 'observer' => $this->normalizer->normalize($observer), + ]; + + return $this->response( + array_merge( + $data, + $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) + ) + ); + } + +} diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 2edfb0f..6a4fbfe 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -1,116 +1,116 @@ - "\d+"])] - public function propagate( - int $id, - Request $request, - NormalizerInterface $normalizer - ): JsonResponse { - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); - $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); - - $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); - $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); - - $dateTimeUTC = clone $datetime; - $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); - $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); - - $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes - - $propagator = new \Predict_SGPSDP(); - if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { - $propagator->SDP4($sat, $deltaT); - $algorithm = 'SDP4'; - } else { - $propagator->SGP4($sat, $deltaT); - $algorithm = 'SGP4'; - } - - $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); - - \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); - - $sat_geodetic = new \Predict_Geodetic(); - \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); - - $sat_geodetic->lat = rad2deg($sat_geodetic->lat); - $sat_geodetic->lon = rad2deg($sat_geodetic->lon); - - $parameters = [ - 'date' => $datetime->format(self::DATETIME_FORMAT), - ]; - - $url = $this->router->generate( - 'tle_propagate', - array_merge($request->request->all(), $parameters, ['id' => $id]), - UrlGeneratorInterface::ABSOLUTE_URL - ); - - $parameters['satelliteId'] = $id; - - $data = [ - '@context' => self::HYDRA_CONTEXT, - '@id' => $url, - '@type' => 'SatellitePropagationResult', - 'tle' => $tle, - 'algorithm' => $algorithm, - 'vector' => [ - 'reference_frame' => 'ECI', - 'position' => [ - 'x' => $sat->pos->x, - 'y' => $sat->pos->y, - 'z' => $sat->pos->z, - 'r' => $sat->pos->w, - 'unit' => 'km', - ], - 'velocity' => [ - 'x' => $sat->vel->x, - 'y' => $sat->vel->y, - 'z' => $sat->vel->z, - 'r' => $sat->vel->w, - 'unit' => 'km/s', - ], - ], - 'geodetic' => [ - 'latitude' => $sat_geodetic->lat, - 'longitude' => $sat_geodetic->lon, - 'altitude' => $sat_geodetic->alt, - ], - 'parameters' => $parameters, - ]; - - return $this->response( - $normalizer->normalize($data) - ); - } -} + "\d+"])] + public function propagate( + int $id, + Request $request, + NormalizerInterface $normalizer + ): JsonResponse { + /** @var Tle $tle */ + $tle = $this->repository->findOneBy(['id' => $id]); + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); + $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); + + $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); + + $dateTimeUTC = clone $datetime; + $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); + $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); + + $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes + + $propagator = new \Predict_SGPSDP(); + if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { + $propagator->SDP4($sat, $deltaT); + $algorithm = 'SDP4'; + } else { + $propagator->SGP4($sat, $deltaT); + $algorithm = 'SGP4'; + } + + $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); + + \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); + + $sat_geodetic = new \Predict_Geodetic(); + \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); + + $sat_geodetic->lat = rad2deg($sat_geodetic->lat); + $sat_geodetic->lon = rad2deg($sat_geodetic->lon); + + $parameters = [ + 'date' => $datetime->format(self::DATETIME_FORMAT), + ]; + + $url = $this->router->generate( + 'tle_propagate', + array_merge($request->request->all(), $parameters, ['id' => $id]), + UrlGeneratorInterface::ABSOLUTE_URL + ); + + $parameters['satelliteId'] = $id; + + $data = [ + '@context' => self::HYDRA_CONTEXT, + '@id' => $url, + '@type' => 'SatellitePropagationResult', + 'tle' => $tle, + 'algorithm' => $algorithm, + 'vector' => [ + 'reference_frame' => 'ECI', + 'position' => [ + 'x' => $sat->pos->x, + 'y' => $sat->pos->y, + 'z' => $sat->pos->z, + 'r' => $sat->pos->w, + 'unit' => 'km', + ], + 'velocity' => [ + 'x' => $sat->vel->x, + 'y' => $sat->vel->y, + 'z' => $sat->vel->z, + 'r' => $sat->vel->w, + 'unit' => 'km/s', + ], + ], + 'geodetic' => [ + 'latitude' => $sat_geodetic->lat, + 'longitude' => $sat_geodetic->lon, + 'altitude' => $sat_geodetic->alt, + ], + 'parameters' => $parameters, + ]; + + return $this->response( + $normalizer->normalize($data) + ); + } +} diff --git a/src/Serializer/ObserverNormalizer.php b/src/Serializer/ObserverNormalizer.php index 45bdc6c..e498d69 100644 --- a/src/Serializer/ObserverNormalizer.php +++ b/src/Serializer/ObserverNormalizer.php @@ -1,39 +1,39 @@ -normalizer->normalize($object); - - unset($result['timeZone']); - - $result['@type'] = 'Observer'; - $result['datetime'] = $object->datetime; - - return $result; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof Observer; - } -} +normalizer->normalize($object); + + unset($result['timeZone']); + + $result['@type'] = 'Observer'; + $result['datetime'] = $object->datetime; + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof Observer; + } +} diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php index c267f04..d1979e1 100644 --- a/src/Serializer/SatellitePassNormalizer.php +++ b/src/Serializer/SatellitePassNormalizer.php @@ -1,68 +1,68 @@ - $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', - 'aos' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( - AbstractApiController::DATETIME_FORMAT - ), - 'azimuth' => round($object->visible_aos_az ?? null, 2), - 'elevation' => round($object->visible_aos_el ?? null, 2), - ], - 'max' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( - AbstractApiController::DATETIME_FORMAT - ), - 'azimuth' => round($object->visible_max_el_az ?? null, 2), - 'elevation' => round($object->visible_max_el ?? null, 2), - ], - 'los' => [ - 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( - AbstractApiController::DATETIME_FORMAT - ), - 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), - 'elevation' => round($object->visible_los_el ?? null, 2), - ], - ]; - - if ($details) { - foreach ($object->details as $item) { - $result['details'][] = [ - 'azimuth' => $item->az, - 'elevation' => $item->el - ]; - } - } - - return $result; - } - - public function supportsNormalization($data, string $format = null): bool - { - return $data instanceof \Predict_Pass; - } -} + $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', + 'aos' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_aos_az ?? null, 2), + 'elevation' => round($object->visible_aos_el ?? null, 2), + ], + 'max' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_max_el_az ?? null, 2), + 'elevation' => round($object->visible_max_el ?? null, 2), + ], + 'los' => [ + 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( + AbstractApiController::DATETIME_FORMAT + ), + 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), + 'elevation' => round($object->visible_los_el ?? null, 2), + ], + ]; + + if ($details) { + foreach ($object->details as $item) { + $result['details'][] = [ + 'azimuth' => $item->az, + 'elevation' => $item->el + ]; + } + } + + return $result; + } + + public function supportsNormalization($data, string $format = null): bool + { + return $data instanceof \Predict_Pass; + } +} diff --git a/src/Service/FlyOverService.php b/src/Service/FlyOverService.php index dd86ac1..b5e4ef6 100644 --- a/src/Service/FlyOverService.php +++ b/src/Service/FlyOverService.php @@ -1,53 +1,53 @@ -predict = new \Predict(); - $this->qth = new \Predict_QTH(); - } - - public function setTle(Tle $tle): self - { - $this->sat = new \Predict_Sat( - new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()) - ); - - return $this; - } - - public function setObserver(Observer $observer): self - { - $this->qth->lat = $observer->latitude; - $this->qth->lon = $observer->longitude; - $this->qth->alt = $observer->altitude; - - return $this; - } - - public function getVisiblePasses(float $time): array - { - return $this->predict->filterVisiblePasses($this->getPasses($time)); - } - - public function getPasses(float $time): array - { - $this->predict->minEle = 10; // Minimum elevation for a pass - $this->predict->timeRes = 10; // Pass details: time resolution in seconds - $this->predict->numEntries = 20; // Pass details: number of entries per pass - $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) - - // Get the passes and filter visible only, takes about 4 seconds for 10 days - return $this->predict->get_passes($this->sat, $this->qth, $time, 10); - } -} +predict = new \Predict(); + $this->qth = new \Predict_QTH(); + } + + public function setTle(Tle $tle): self + { + $this->sat = new \Predict_Sat( + new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2()) + ); + + return $this; + } + + public function setObserver(Observer $observer): self + { + $this->qth->lat = $observer->latitude; + $this->qth->lon = $observer->longitude; + $this->qth->alt = $observer->altitude; + + return $this; + } + + public function getVisiblePasses(float $time): array + { + return $this->predict->filterVisiblePasses($this->getPasses($time)); + } + + public function getPasses(float $time): array + { + $this->predict->minEle = 10; // Minimum elevation for a pass + $this->predict->timeRes = 10; // Pass details: time resolution in seconds + $this->predict->numEntries = 20; // Pass details: number of entries per pass + $this->predict->threshold = -6; // Twilight threshold (sun must be at this lat or lower) + + // Get the passes and filter visible only, takes about 4 seconds for 10 days + return $this->predict->get_passes($this->sat, $this->qth, $time, 10); + } +} diff --git a/src/Service/Traits/TleHttpTrait.php b/src/Service/Traits/TleHttpTrait.php index 64c92e0..a87d0a5 100644 --- a/src/Service/Traits/TleHttpTrait.php +++ b/src/Service/Traits/TleHttpTrait.php @@ -1,33 +1,33 @@ -repository->findOneBy(['id' => $id]); - - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } - - return $tle; - } - - protected function getObserver(Request $request): Observer - { - try { - return new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); - } catch (\InvalidArgumentException $exception) { - throw new BadRequestHttpException($exception->getMessage()); - } - } -} +repository->findOneBy(['id' => $id]); + + if ($tle === null) { + throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); + } + + return $tle; + } + + protected function getObserver(Request $request): Observer + { + try { + return new Observer((float)$request->get('latitude', 0), (float)$request->get('longitude', 0)); + } catch (\InvalidArgumentException $exception) { + throw new BadRequestHttpException($exception->getMessage()); + } + } +} diff --git a/src/ViewModel/LatLng.php b/src/ViewModel/LatLng.php index 85742c9..64fa7d0 100644 --- a/src/ViewModel/LatLng.php +++ b/src/ViewModel/LatLng.php @@ -1,41 +1,41 @@ -latitude > 90 || $this->latitude < -90) { - throw new \InvalidArgumentException('Invalid latitude value'); - } - - if ($this->longitude > 180 || $this->longitude < -180) { - throw new \InvalidArgumentException('Invalid longitude value'); - } - } - - public function getTimeZone(): ?string - { - $diffs = []; - foreach (DateTimeZone::listIdentifiers() as $timezoneID) { - $timezone = new DateTimeZone($timezoneID); - $location = $timezone->getLocation(); - $tLat = $location['latitude']; - $tLng = $location['longitude']; - $diffLat = abs($this->latitude - $tLat); - $diffLng = abs($this->longitude - $tLng); - $diff = $diffLat + $diffLng; - $diffs[$timezoneID] = $diff; - } - - $timezone = array_keys($diffs, min($diffs)); - - return $timezone[0] ?? null; - } -} +latitude > 90 || $this->latitude < -90) { + throw new \InvalidArgumentException('Invalid latitude value'); + } + + if ($this->longitude > 180 || $this->longitude < -180) { + throw new \InvalidArgumentException('Invalid longitude value'); + } + } + + public function getTimeZone(): ?string + { + $diffs = []; + foreach (DateTimeZone::listIdentifiers() as $timezoneID) { + $timezone = new DateTimeZone($timezoneID); + $location = $timezone->getLocation(); + $tLat = $location['latitude']; + $tLng = $location['longitude']; + $diffLat = abs($this->latitude - $tLat); + $diffLng = abs($this->longitude - $tLng); + $diff = $diffLat + $diffLng; + $diffs[$timezoneID] = $diff; + } + + $timezone = array_keys($diffs, min($diffs)); + + return $timezone[0] ?? null; + } +} diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php index 749cdc9..93385a9 100644 --- a/src/ViewModel/Observer.php +++ b/src/ViewModel/Observer.php @@ -1,15 +1,15 @@ -datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); - } -} +datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); + } +} diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php index f318f59..bdb68f2 100644 --- a/tests/AssertionTrait.php +++ b/tests/AssertionTrait.php @@ -1,22 +1,22 @@ -getLine1(), $tle->getLine2(), $tle->getName()); - - self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); - self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); - self::assertEquals('TleModel', $response['@type']); - self::assertEquals($tle->getId(), $response['satelliteId']); - self::assertEquals($tle->getName(), $response['name']); - self::assertEquals($model->getDate(), $response['date']); - self::assertEquals($tle->getLine1(), $response['line1']); - self::assertEquals($tle->getLine2(), $response['line2']); - } -} +getLine1(), $tle->getLine2(), $tle->getName()); + + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/' . $tle->getId(), $response['@id']); + self::assertEquals('TleModel', $response['@type']); + self::assertEquals($tle->getId(), $response['satelliteId']); + self::assertEquals($tle->getName(), $response['name']); + self::assertEquals($model->getDate(), $response['date']); + self::assertEquals($tle->getLine1(), $response['line1']); + self::assertEquals($tle->getLine2(), $response['line2']); + } +} diff --git a/tests/PropagateControllerTest.php b/tests/PropagateControllerTest.php index cd302d4..ff3f655 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/PropagateControllerTest.php @@ -1,112 +1,112 @@ -get('/api/tle/0/propagate'); - - self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); - } - - public function testPropagateSGP4(): void - { - $tle = TleFixtures::create(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SGP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 3731.3677738358); - self::assertEquals($response['vector']['position']['y'], -3929.0247024138); - self::assertEquals($response['vector']['position']['z'], -3820.6175474185); - self::assertEquals($response['vector']['position']['r'], 6630.0421581948); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); - self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); - self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); - self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], -35.362152001955); - self::assertEquals($response['geodetic']['longitude'], 221.21616992358); - self::assertEquals($response['geodetic']['altitude'], 259.03105001661); - - self::assertEquals($response['parameters']['satelliteId'], 43550); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } - - public function testPropagateSDP4(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SDP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 142825.54086031896); - self::assertEquals($response['vector']['position']['y'], 133973.34798843606); - self::assertEquals($response['vector']['position']['z'], 1303.6185230048); - self::assertEquals($response['vector']['position']['r'], 195830.7751976863); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); - self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); - self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); - self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); - self::assertEquals($response['geodetic']['longitude'], 310.86248495862); - self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); - - self::assertEquals($response['parameters']['satelliteId'], 22049); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } -} +get('/api/tle/0/propagate'); + + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + } + + public function testPropagateSGP4(): void + { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SGP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 3731.3677738358); + self::assertEquals($response['vector']['position']['y'], -3929.0247024138); + self::assertEquals($response['vector']['position']['z'], -3820.6175474185); + self::assertEquals($response['vector']['position']['r'], 6630.0421581948); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); + self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); + self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); + self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], -35.362152001955); + self::assertEquals($response['geodetic']['longitude'], 221.21616992358); + self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + + self::assertEquals($response['parameters']['satelliteId'], 43550); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } + + public function testPropagateSDP4(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SDP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 142825.54086031896); + self::assertEquals($response['vector']['position']['y'], 133973.34798843606); + self::assertEquals($response['vector']['position']['z'], 1303.6185230048); + self::assertEquals($response['vector']['position']['r'], 195830.7751976863); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); + self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); + self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); + self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); + self::assertEquals($response['geodetic']['longitude'], 310.86248495862); + self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + + self::assertEquals($response['parameters']['satelliteId'], 22049); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } +} diff --git a/tests/StatisticsControllerTest.php b/tests/StatisticsControllerTest.php index 9c748c3..a2e95ab 100644 --- a/tests/StatisticsControllerTest.php +++ b/tests/StatisticsControllerTest.php @@ -1,15 +1,15 @@ -get('/api/tle/hits'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - } -} +get('/api/tle/hits'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } +} diff --git a/tests/TleControllerTest.php b/tests/TleControllerTest.php index 99736cb..082b8d7 100644 --- a/tests/TleControllerTest.php +++ b/tests/TleControllerTest.php @@ -1,54 +1,54 @@ - 'tle:calculate', - '--tle' => TleFixtures::createDeep()->getId(), - ] - ); - - $application = new Application(static::$kernel); - $application->setAutoExit(false); - $application->run($input, new BufferedOutput()); - } - - public function testTleExtraFieldsMissingData(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } - - public function testTleExtraFields(): void - { - $tle = TleFixtures::create(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } -} + 'tle:calculate', + '--tle' => TleFixtures::createDeep()->getId(), + ] + ); + + $application = new Application(static::$kernel); + $application->setAutoExit(false); + $application->run($input, new BufferedOutput()); + } + + public function testTleExtraFieldsMissingData(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } + + public function testTleExtraFields(): void + { + $tle = TleFixtures::create(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } +} From 63be8083cd87a9b6c2806a219c4c91b717a19b01 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 28 May 2021 21:47:46 +0200 Subject: [PATCH 121/151] ground tracks --- src/Controller/AbstractApiController.php | 12 ------------ src/Controller/PropagateController.php | 4 +--- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 5db1684..300c68c 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -9,7 +9,6 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\RouterInterface; -use Symfony\Component\Serializer\SerializerInterface; abstract class AbstractApiController extends AbstractController { @@ -36,19 +35,8 @@ abstract class AbstractApiController extends AbstractController protected const PAGE_SIZE = 50; protected const SEARCH_PARAM = 'search'; - protected SerializerInterface $serializer; protected RouterInterface $router; - /** - * @required - * - * @param SerializerInterface $serializer - */ - public function setSerializer(SerializerInterface $serializer): void - { - $this->serializer = $serializer; - } - /** * @required * diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 6a4fbfe..60af093 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -56,12 +56,10 @@ public function propagate( $algorithm = 'SGP4'; } - $daynum = \Predict_Time::unix2daynum($datetime->getTimestamp()); - \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); $sat_geodetic = new \Predict_Geodetic(); - \Predict_SGPObs::Calculate_LatLonAlt($daynum, $sat->pos, $sat_geodetic); + \Predict_SGPObs::Calculate_LatLonAlt(\Predict_Time::unix2daynum($datetime->getTimestamp()), $sat->pos, $sat_geodetic); $sat_geodetic->lat = rad2deg($sat_geodetic->lat); $sat_geodetic->lon = rad2deg($sat_geodetic->lon); From 3e68d1d484cc63d0883c35a4a2ad6f80a3e8847a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 29 May 2021 21:31:32 +0200 Subject: [PATCH 122/151] add paypal button --- src/Repository/TleRepository.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 0cea49d..2885672 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -105,6 +105,8 @@ private function getSortTableColumnMapping(string $sort): ?string TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', TleCollectionSortableFieldsEnum::PERIOD => 'info.period', + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => 'info.semi_major_axis', + TleCollectionSortableFieldsEnum::RAAN => 'info.raan', }; } } From d666b5a7e7abcafbe70126ceea343a203a5e0cad Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 29 May 2021 21:42:29 +0200 Subject: [PATCH 123/151] add paypal button --- deploy.php | 2 +- src/Repository/TleRepository.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy.php b/deploy.php index 154a0ff..4a8d877 100644 --- a/deploy.php +++ b/deploy.php @@ -56,10 +56,10 @@ 'deploy:shared', 'deploy:assets', 'deploy:vendors', + 'deploy:writable', 'deploy:cache:clear', 'deploy:cache:warmup', 'deploy:dump-env', - 'deploy:writable', 'database:migrate', 'deploy:symlink', 'deploy:unlock', diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 2885672..ce57f58 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -105,7 +105,7 @@ private function getSortTableColumnMapping(string $sort): ?string TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', TleCollectionSortableFieldsEnum::ECCENTRICITY => 'info.eccentricity', TleCollectionSortableFieldsEnum::PERIOD => 'info.period', - TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => 'info.semi_major_axis', + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => 'info.semiMajorAxis', TleCollectionSortableFieldsEnum::RAAN => 'info.raan', }; } From 04e5e533afaa73c33c5e97bec434692c4db6907b Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 13:25:41 +0200 Subject: [PATCH 124/151] add paypal button --- src/Event/StatisticSubscriber.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index df566cc..61d80b1 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -4,7 +4,6 @@ use App\Entity\Request; use App\Entity\Tle; -use App\Repository\StatisticRepository; use App\Repository\TleRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -13,9 +12,10 @@ class StatisticSubscriber implements EventSubscriberInterface { protected const TLE_ROUTES = [ + 'tle_record', 'tle_propagate', - 'tle_pass', - 'tle_record' + 'tle_flyover', + 'tle_flyover_details' ]; public function __construct(private EntityManagerInterface $em, private TleRepository $tleRepository) From 6df0088626e2e5dde4b41d3870d4711dfcb71bf6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 13:40:32 +0200 Subject: [PATCH 125/151] upgrade symfony 5.3 --- composer.json | 22 +- composer.lock | 1362 +++++++++++++++++------------ src/Controller/DocsController.php | 13 +- symfony.lock | 9 + tests/ErrorPageTest.php | 4 +- 5 files changed, 840 insertions(+), 570 deletions(-) diff --git a/composer.json b/composer.json index 73ca5b5..f585d22 100644 --- a/composer.json +++ b/composer.json @@ -14,23 +14,23 @@ "myclabs/php-enum": "^1.7", "sentry/sentry-symfony": "^4.0", "symfony/apache-pack": "^1.0", - "symfony/asset": "5.2.*", - "symfony/browser-kit": "5.2.*", - "symfony/console": "5.2.*", - "symfony/css-selector": "5.2.*", - "symfony/dotenv": "5.2.*", + "symfony/asset": "5.3.*", + "symfony/browser-kit": "5.3.*", + "symfony/console": "5.3.*", + "symfony/css-selector": "5.3.*", + "symfony/dotenv": "5.3.*", "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.2.*", + "symfony/framework-bundle": "5.3.*", "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", - "symfony/property-access": "5.2.*", - "symfony/serializer": "5.2.*", - "symfony/yaml": "5.2.*" + "symfony/property-access": "5.3.*", + "symfony/serializer": "5.3.*", + "symfony/yaml": "5.3.*" }, "require-dev": { "roave/security-advisories": "dev-latest", "doctrine/doctrine-fixtures-bundle": "^3.1", - "symfony/phpunit-bridge": "^5.2" + "symfony/phpunit-bridge": "^5.3" }, "config": { "preferred-install": { @@ -101,7 +101,7 @@ "public-dir": "./public", "symfony": { "allow-contrib": false, - "require": "5.2.*" + "require": "5.3.*" } } } diff --git a/composer.lock b/composer.lock index cea44af..d38071b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0a7e43912dee92d8247bdf135fc82f38", + "content-hash": "b41d3e11936a61ff068ced78f87c22a1", "packages": [ { "name": "beberlei/doctrineextensions", @@ -131,16 +131,16 @@ }, { "name": "composer/package-versions-deprecated", - "version": "1.11.99.1", + "version": "1.11.99.2", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" + "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/c6522afe5540d5fc46675043d3ed5a45a740b27c", + "reference": "c6522afe5540d5fc46675043d3ed5a45a740b27c", "shasum": "" }, "require": { @@ -184,7 +184,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.2" }, "funding": [ { @@ -200,32 +200,34 @@ "type": "tidelift" } ], - "time": "2020-11-11T10:22:58+00:00" + "time": "2021-05-24T07:46:03+00:00" }, { "name": "doctrine/annotations", - "version": "1.12.1", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b" + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/b17c5014ef81d212ac539f07a1001832df1b6d3b", - "reference": "b17c5014ef81d212ac539f07a1001832df1b6d3b", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "1.*", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", "autoload": { @@ -268,46 +270,45 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.12.1" + "source": "https://github.com/doctrine/annotations/tree/1.13.1" }, - "time": "2021-02-21T21:00:45+00:00" + "time": "2021-05-16T18:07:53+00:00" }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "1.11.3", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "3bb5588cec00a0268829cc4a518490df6741af9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/3bb5588cec00a0268829cc4a518490df6741af9d", + "reference": "3bb5588cec00a0268829cc4a518490df6741af9d", "shasum": "" }, "require": { "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "doctrine/common": ">2.2,<2.4", + "psr/cache": ">=3" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.2" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -354,7 +355,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" + "source": "https://github.com/doctrine/cache/tree/1.11.3" }, "funding": [ { @@ -370,7 +371,7 @@ "type": "tidelift" } ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2021-05-25T09:01:55+00:00" }, { "name": "doctrine/collections", @@ -443,16 +444,16 @@ }, { "name": "doctrine/common", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3" + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/2afde5a9844126bc311cd5f548b5475e75f800d3", - "reference": "2afde5a9844126bc311cd5f548b5475e75f800d3", + "url": "https://api.github.com/repos/doctrine/common/zipball/a036d90c303f3163b5be8b8fde9b6755b2be4a3a", + "reference": "a036d90c303f3163b5be8b8fde9b6755b2be4a3a", "shasum": "" }, "require": { @@ -465,7 +466,8 @@ "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0", "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" + "symfony/phpunit-bridge": "^4.0.5", + "vimeo/psalm": "^4.4" }, "type": "library", "autoload": { @@ -512,7 +514,7 @@ ], "support": { "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.1.1" + "source": "https://github.com/doctrine/common/tree/3.1.2" }, "funding": [ { @@ -528,36 +530,37 @@ "type": "tidelift" } ], - "time": "2021-01-20T19:58:05+00:00" + "time": "2021-02-10T20:18:51+00:00" }, { "name": "doctrine/dbal", - "version": "2.12.1", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "adce7a954a1c2f14f85e94aed90c8489af204086" + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/adce7a954a1c2f14f85e94aed90c8489af204086", - "reference": "adce7a954a1c2f14f85e94aed90c8489af204086", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c800380457948e65bbd30ba92cc17cda108bf8c9", + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9", "shasum": "" }, "require": { "doctrine/cache": "^1.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", "ext-pdo": "*", - "php": "^7.3 || ^8" + "php": "^7.1 || ^8" }, "require-dev": { - "doctrine/coding-standard": "^8.1", - "jetbrains/phpstorm-stubs": "^2019.1", - "phpstan/phpstan": "^0.12.40", - "phpunit/phpunit": "^9.4", - "psalm/plugin-phpunit": "^0.10.0", + "doctrine/coding-standard": "8.2.0", + "jetbrains/phpstorm-stubs": "2020.2", + "phpstan/phpstan": "0.12.81", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.0", + "squizlabs/php_codesniffer": "3.6.0", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.17.2" + "vimeo/psalm": "4.6.4" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -566,11 +569,6 @@ "bin/doctrine-dbal" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" @@ -623,7 +621,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.12.1" + "source": "https://github.com/doctrine/dbal/tree/2.13.1" }, "funding": [ { @@ -639,63 +637,108 @@ "type": "tidelift" } ], - "time": "2020-11-14T20:26:58+00:00" + "time": "2021-04-17T17:30:19+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v0.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + }, + "time": "2021-03-21T12:59:47+00:00" }, { "name": "doctrine/doctrine-bundle", - "version": "2.3.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "8b922578bdee2243a26202b13df795e170efaef8" + "reference": "7f472cc85eba050a83fcf38cece87b868877d7e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/8b922578bdee2243a26202b13df795e170efaef8", - "reference": "8b922578bdee2243a26202b13df795e170efaef8", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/7f472cc85eba050a83fcf38cece87b868877d7e2", + "reference": "7f472cc85eba050a83fcf38cece87b868877d7e2", "shasum": "" }, "require": { + "doctrine/cache": "^1.11 || ^2.0", "doctrine/dbal": "^2.9.0|^3.0", "doctrine/persistence": "^1.3.3|^2.0", "doctrine/sql-formatter": "^1.0.1", "php": "^7.1 || ^8.0", - "symfony/cache": "^4.3.3|^5.0", - "symfony/config": "^4.3.3|^5.0", - "symfony/console": "^3.4.30|^4.3.3|^5.0", - "symfony/dependency-injection": "^4.3.3|^5.0", - "symfony/doctrine-bridge": "^4.3.7|^5.0", - "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/cache": "^4.3.3|^5.0|^6.0", + "symfony/config": "^4.4.3|^5.0|^6.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/dependency-injection": "^4.3.3|^5.0|^6.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/doctrine-bridge": "^4.4.22|^5.2.7|^6.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", "symfony/service-contracts": "^1.1.1|^2.0" }, "conflict": { - "doctrine/orm": "<2.6", + "doctrine/orm": "<2.9", "twig/twig": "<1.34|>=2.0,<2.4" }, "require-dev": { - "doctrine/coding-standard": "^8.0", - "doctrine/orm": "^2.6", + "doctrine/coding-standard": "^9.0", + "doctrine/orm": "^2.9", "friendsofphp/proxy-manager-lts": "^1.0", "phpunit/phpunit": "^7.5 || ^8.0 || ^9.3", - "symfony/phpunit-bridge": "^4.2", - "symfony/property-info": "^4.3.3|^5.0", - "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", - "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", - "symfony/validator": "^3.4.30|^4.3.3|^5.0", - "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", - "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12|^3.0" + "psalm/plugin-phpunit": "^0.15.1", + "psalm/plugin-symfony": "^2.3.0", + "symfony/phpunit-bridge": "^5.2|^6.0", + "symfony/property-info": "^4.3.3|^5.0|^6.0", + "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0|^6.0", + "symfony/security-bundle": "^4.4|^5.0|^6.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0|^6.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0|^6.0", + "twig/twig": "^1.34|^2.12|^3.0", + "vimeo/psalm": "^4.7" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "ext-pdo": "*", "symfony/web-profiler-bundle": "To use the data collector." }, "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Bundle\\DoctrineBundle\\": "" @@ -733,7 +776,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.3.0" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.4.1" }, "funding": [ { @@ -749,7 +792,7 @@ "type": "tidelift" } ], - "time": "2021-03-16T16:24:04+00:00" + "time": "2021-06-01T18:38:32+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -1277,53 +1320,53 @@ }, { "name": "doctrine/orm", - "version": "2.8.2", + "version": "2.9.2", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "ebae57eb9637acd8252b398df3121b120688ed5c" + "reference": "75b4b88c5b7cebc24ed7251a20c2a5aa027300e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/ebae57eb9637acd8252b398df3121b120688ed5c", - "reference": "ebae57eb9637acd8252b398df3121b120688ed5c", + "url": "https://api.github.com/repos/doctrine/orm/zipball/75b4b88c5b7cebc24ed7251a20c2a5aa027300e1", + "reference": "75b4b88c5b7cebc24ed7251a20c2a5aa027300e1", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.11.1", - "doctrine/cache": "^1.9.1", + "doctrine/annotations": "^1.13", + "doctrine/cache": "^1.11.3|^2.0.3", "doctrine/collections": "^1.5", "doctrine/common": "^3.0.3", - "doctrine/dbal": "^2.10.0", + "doctrine/dbal": "^2.13.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.1", "doctrine/inflector": "^1.4|^2.0", "doctrine/instantiator": "^1.3", "doctrine/lexer": "^1.0", - "doctrine/persistence": "^2.0", + "doctrine/persistence": "^2.2", "ext-pdo": "*", - "php": "^7.2|^8.0", - "symfony/console": "^3.0|^4.0|^5.0" + "php": "^7.1|^8.0", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^3.0|^4.0|^5.0|^6.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", - "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^8.5|^9.4", - "symfony/yaml": "^3.4|^4.0|^5.0", - "vimeo/psalm": "4.1.1" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^0.12.83", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "squizlabs/php_codesniffer": "3.6.0", + "symfony/cache": "^4.4|^5.2", + "symfony/yaml": "^3.4|^4.0|^5.0|^6.0", + "vimeo/psalm": "4.7.0" }, "suggest": { + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0", "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" }, "bin": [ "bin/doctrine" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\ORM\\": "lib/Doctrine/ORM" @@ -1363,41 +1406,44 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.8.2" + "source": "https://github.com/doctrine/orm/tree/2.9.2" }, - "time": "2021-02-16T22:10:18+00:00" + "time": "2021-05-31T09:53:14+00:00" }, { "name": "doctrine/persistence", - "version": "2.1.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/persistence.git", - "reference": "9899c16934053880876b920a3b8b02ed2337ac1d" + "reference": "d138f3ab5f761055cab1054070377cfd3222e368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/9899c16934053880876b920a3b8b02ed2337ac1d", - "reference": "9899c16934053880876b920a3b8b02ed2337ac1d", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/d138f3ab5f761055cab1054070377cfd3222e368", + "reference": "d138f3ab5f761055cab1054070377cfd3222e368", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/collections": "^1.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1.0|^2.0|^3.0" }, "conflict": { "doctrine/common": "<2.10@dev" }, "require-dev": { "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^6.0 || ^8.0", + "doctrine/coding-standard": "^6.0 || ^9.0", "doctrine/common": "^3.0", - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "0.12.84", "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", - "vimeo/psalm": "^3.11" + "symfony/cache": "^4.4|^5.0", + "vimeo/psalm": "4.7.0" }, "type": "library", "autoload": { @@ -1447,9 +1493,9 @@ ], "support": { "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.1.0" + "source": "https://github.com/doctrine/persistence/tree/2.2.1" }, - "time": "2020-10-24T22:13:54+00:00" + "time": "2021-05-19T07:07:01+00:00" }, { "name": "doctrine/sql-formatter", @@ -1510,22 +1556,22 @@ }, { "name": "friendsofphp/proxy-manager-lts", - "version": "v1.0.3", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git", - "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3" + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/121af47c9aee9c03031bdeca3fac0540f59aa5c3", - "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3", + "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/006aa5d32f887a4db4353b13b5b5095613e0611f", + "reference": "006aa5d32f887a4db4353b13b5b5095613e0611f", "shasum": "" }, "require": { "laminas/laminas-code": "~3.4.1|^4.0", "php": ">=7.1", - "symfony/filesystem": "^4.4.17|^5.0" + "symfony/filesystem": "^4.4.17|^5.0|^6.0" }, "conflict": { "laminas/laminas-stdlib": "<3.2.1", @@ -1536,7 +1582,7 @@ }, "require-dev": { "ext-phar": "*", - "symfony/phpunit-bridge": "^5.2" + "symfony/phpunit-bridge": "^5.2|^6.0" }, "type": "library", "extra": { @@ -1576,7 +1622,7 @@ ], "support": { "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues", - "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.3" + "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.5" }, "funding": [ { @@ -1588,7 +1634,7 @@ "type": "tidelift" } ], - "time": "2021-01-14T21:52:44+00:00" + "time": "2021-05-22T16:11:15+00:00" }, { "name": "guzzlehttp/guzzle", @@ -1718,16 +1764,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -1787,9 +1833,9 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.8.1" + "source": "https://github.com/guzzle/psr7/tree/1.8.2" }, - "time": "2021-03-21T16:25:00+00:00" + "time": "2021-04-26T09:17:50+00:00" }, { "name": "http-interop/http-factory-guzzle", @@ -1894,16 +1940,16 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf" + "reference": "694492c653c518456af2805f04eec445b997ed1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/b2c4ec2033a0196317a467cb197c7c843b794ddf", - "reference": "b2c4ec2033a0196317a467cb197c7c843b794ddf", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/694492c653c518456af2805f04eec445b997ed1f", + "reference": "694492c653c518456af2805f04eec445b997ed1f", "shasum": "" }, "require": { @@ -1947,22 +1993,22 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.3" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.4" }, - "time": "2021-02-22T10:52:38+00:00" + "time": "2021-05-26T08:46:42+00:00" }, { "name": "laminas/laminas-code", - "version": "4.0.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-code.git", - "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a" + "reference": "1beb4447f9efd26041eba7eff50614e798c353fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/28a6d70ea8b8bca687d7163300e611ae33baf82a", - "reference": "28a6d70ea8b8bca687d7163300e611ae33baf82a", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1beb4447f9efd26041eba7eff50614e798c353fd", + "reference": "1beb4447f9efd26041eba7eff50614e798c353fd", "shasum": "" }, "require": { @@ -2020,7 +2066,7 @@ "type": "community_bridge" } ], - "time": "2020-12-30T16:16:14+00:00" + "time": "2021-05-12T12:41:03+00:00" }, { "name": "laminas/laminas-eventmanager", @@ -2383,16 +2429,16 @@ }, { "name": "php-http/discovery", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7" + "reference": "778f722e29250c1fac0bbdef2c122fa5d038c9eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/788f72d64c43dc361e7fcc7464c3d947c64984a7", - "reference": "788f72d64c43dc361e7fcc7464c3d947c64984a7", + "url": "https://api.github.com/repos/php-http/discovery/zipball/778f722e29250c1fac0bbdef2c122fa5d038c9eb", + "reference": "778f722e29250c1fac0bbdef2c122fa5d038c9eb", "shasum": "" }, "require": { @@ -2409,8 +2455,7 @@ "puli/composer-plugin": "1.0.0-beta10" }, "suggest": { - "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", - "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" }, "type": "library", "extra": { @@ -2446,9 +2491,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.13.0" + "source": "https://github.com/php-http/discovery/tree/1.14.0" }, - "time": "2020-11-27T14:49:42+00:00" + "time": "2021-06-01T14:30:21+00:00" }, { "name": "php-http/httplug", @@ -2514,16 +2559,16 @@ }, { "name": "php-http/message", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/php-http/message.git", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29" + "reference": "887734d9c515ad9a564f6581a682fff87a6253cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/fb0dbce7355cad4f4f6a225f537c34d013571f29", - "reference": "fb0dbce7355cad4f4f6a225f537c34d013571f29", + "url": "https://api.github.com/repos/php-http/message/zipball/887734d9c515ad9a564f6581a682fff87a6253cc", + "reference": "887734d9c515ad9a564f6581a682fff87a6253cc", "shasum": "" }, "require": { @@ -2582,9 +2627,9 @@ ], "support": { "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.11.0" + "source": "https://github.com/php-http/message/tree/1.11.1" }, - "time": "2021-02-01T08:54:58+00:00" + "time": "2021-05-24T18:11:08+00:00" }, { "name": "php-http/message-factory", @@ -2699,20 +2744,20 @@ }, { "name": "psr/cache", - "version": "1.0.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -2732,7 +2777,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -2742,9 +2787,9 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/2.0.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2021-02-03T23:23:37+00:00" }, { "name": "psr/container", @@ -3006,16 +3051,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -3039,7 +3084,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -3050,9 +3095,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "ralouphie/getallheaders", @@ -3156,16 +3201,16 @@ }, { "name": "sentry/sentry", - "version": "3.2.0", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "899b0de58c1e01feb54829b3094af74252aff385" + "reference": "3bb122f9fc2bc43a4646e37db79eaf115b35b047" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/899b0de58c1e01feb54829b3094af74252aff385", - "reference": "899b0de58c1e01feb54829b3094af74252aff385", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/3bb122f9fc2bc43a4646e37db79eaf115b35b047", + "reference": "3bb122f9fc2bc43a4646e37db79eaf115b35b047", "shasum": "" }, "require": { @@ -3210,7 +3255,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2.x-dev" + "dev-master": "3.3.x-dev" } }, "autoload": { @@ -3244,7 +3289,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/3.2.0" + "source": "https://github.com/getsentry/sentry-php/tree/3.3.0" }, "funding": [ { @@ -3256,20 +3301,20 @@ "type": "custom" } ], - "time": "2021-03-03T11:54:34+00:00" + "time": "2021-05-25T18:32:24+00:00" }, { "name": "sentry/sentry-symfony", - "version": "4.0.3", + "version": "4.1.3", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872" + "reference": "d0b85df21f65499db87341648541a526a1f7960d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/cc73694eacd8af7acab12ca5c9d115b4b7a8a872", - "reference": "cc73694eacd8af7acab12ca5c9d115b4b7a8a872", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/d0b85df21f65499db87341648541a526a1f7960d", + "reference": "d0b85df21f65499db87341648541a526a1f7960d", "shasum": "" }, "require": { @@ -3277,16 +3322,20 @@ "php": "^7.2||^8.0", "php-http/discovery": "^1.11", "sentry/sdk": "^3.1", - "symfony/config": "^3.4.43||^4.4.11||^5.0.11", - "symfony/console": "^3.4.43||^4.4.11||^5.0.11", - "symfony/dependency-injection": "^3.4.43||^4.4.11||^5.0.11", - "symfony/event-dispatcher": "^3.4.43||^4.4.11||^5.0.11", - "symfony/http-kernel": "^3.4.43||^4.4.11||^5.0.11", - "symfony/psr-http-message-bridge": "^2.0", - "symfony/security-core": "^3.4.43||^4.4.11||^5.0.11" + "symfony/cache-contracts": "^2.4", + "symfony/config": "^3.4.44||^4.4.20||^5.0.11", + "symfony/console": "^3.4.44||^4.4.20||^5.0.11", + "symfony/dependency-injection": "^3.4.44||^4.4.20||^5.0.11", + "symfony/event-dispatcher": "^3.4.44||^4.4.20||^5.0.11", + "symfony/http-kernel": "^3.4.44||^4.4.20||^5.0.11", + "symfony/polyfill-php80": "^1.22", + "symfony/psr-http-message-bridge": "^1.2||^2.0", + "symfony/security-core": "^3.4.44||^4.4.20||^5.0.11" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "doctrine/dbal": "^2.10||^3.0", + "doctrine/doctrine-bundle": "^1.12||^2.0", + "friendsofphp/php-cs-fixer": "^2.18", "jangregor/phpstan-prophecy": "^0.8", "monolog/monolog": "^1.3||^2.0", "phpspec/prophecy": "!=1.11.0", @@ -3295,17 +3344,22 @@ "phpstan/phpstan": "^0.12", "phpstan/phpstan-phpunit": "^0.12", "phpunit/phpunit": "^8.5||^9.0", - "symfony/browser-kit": "^3.4.43||^4.4.11||^5.0.11", - "symfony/framework-bundle": "^3.4.43||^4.4.11||^5.0.11", - "symfony/messenger": "^4.4.11||^5.0.11", + "symfony/browser-kit": "^3.4.44||^4.4.20||^5.0.11", + "symfony/cache": "^3.4.44||^4.4.20||^5.0.11", + "symfony/dom-crawler": "^3.4.44||^4.4.20||^5.0.11", + "symfony/framework-bundle": "^3.4.44||^4.4.20||^5.0.11", + "symfony/messenger": "^4.4.20||^5.0.11", "symfony/monolog-bundle": "^3.4", - "symfony/phpunit-bridge": "^5.0", - "symfony/polyfill-php80": "^1.22", - "symfony/yaml": "^3.4.43||^4.4.11||^5.0.11", + "symfony/phpunit-bridge": "^5.2.6", + "symfony/twig-bundle": "^3.4.44||^4.4.20||^5.0.11", + "symfony/yaml": "^3.4.44||^4.4.20||^5.0.11", "vimeo/psalm": "^4.3" }, "suggest": { - "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + "doctrine/doctrine-bundle": "Allow distributed tracing of database queries using Sentry.", + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler.", + "symfony/cache": "Allow distributed tracing of cache pools using Sentry.", + "symfony/twig-bundle": "Allow distributed tracing of Twig template rendering using Sentry." }, "type": "symfony-bundle", "extra": { @@ -3348,7 +3402,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-symfony/issues", - "source": "https://github.com/getsentry/sentry-symfony/tree/4.0.3" + "source": "https://github.com/getsentry/sentry-symfony/tree/4.1.3" }, "funding": [ { @@ -3360,7 +3414,7 @@ "type": "custom" } ], - "time": "2021-03-03T16:05:24+00:00" + "time": "2021-05-31T07:54:49+00:00" }, { "name": "symfony/apache-pack", @@ -3390,24 +3444,28 @@ }, { "name": "symfony/asset", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828" + "reference": "4c8d354b8931788f2b07953cfe6846e5cda27637" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/54a42aa50f9359d1184bf7e954521b45ca3d5828", - "reference": "54a42aa50f9359d1184bf7e954521b45ca3d5828", + "url": "https://api.github.com/repos/symfony/asset/zipball/4c8d354b8931788f2b07953cfe6846e5cda27637", + "reference": "4c8d354b8931788f2b07953cfe6846e5cda27637", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1" + }, + "conflict": { + "symfony/http-foundation": "<5.3" }, "require-dev": { "symfony/http-client": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^5.3", "symfony/http-kernel": "^4.4|^5.0" }, "suggest": { @@ -3439,7 +3497,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.2.4" + "source": "https://github.com/symfony/asset/tree/v5.3.0" }, "funding": [ { @@ -3455,20 +3513,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/browser-kit", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93" + "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3ca3a57ce9860318b20a924fec5daf5c6db44d93", - "reference": "3ca3a57ce9860318b20a924fec5daf5c6db44d93", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/379984e25eee9811b0a25a2105e1a2b3b8d9b734", + "reference": "379984e25eee9811b0a25a2105e1a2b3b8d9b734", "shasum": "" }, "require": { @@ -3510,7 +3568,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.2.4" + "source": "https://github.com/symfony/browser-kit/tree/v5.3.0" }, "funding": [ { @@ -3526,20 +3584,20 @@ "type": "tidelift" } ], - "time": "2021-02-22T06:48:33+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/cache", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d" + "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", - "reference": "d15fb2576cdbe2c40d7c851e62f85b0faff3dd3d", + "url": "https://api.github.com/repos/symfony/cache/zipball/44fd0f97d1fb198d344f22379dfc56af2221e608", + "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608", "shasum": "" }, "require": { @@ -3547,6 +3605,7 @@ "psr/cache": "^1.0|^2.0", "psr/log": "^1.1", "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" @@ -3564,7 +3623,7 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6", + "doctrine/cache": "^1.6|^2.0", "doctrine/dbal": "^2.10|^3.0", "predis/predis": "^1.1", "psr/simple-cache": "^1.0", @@ -3605,7 +3664,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.2.4" + "source": "https://github.com/symfony/cache/tree/v5.3.0" }, "funding": [ { @@ -3621,25 +3680,25 @@ "type": "tidelift" } ], - "time": "2021-02-25T23:54:56+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/c0446463729b89dd4fa62e9aeecc80287323615d", + "reference": "c0446463729b89dd4fa62e9aeecc80287323615d", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/cache": "^1.0" + "psr/cache": "^1.0|^2.0|^3.0" }, "suggest": { "symfony/cache-implementation": "" @@ -3647,7 +3706,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3684,7 +3743,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.2.0" + "source": "https://github.com/symfony/cache-contracts/tree/v2.4.0" }, "funding": [ { @@ -3700,20 +3759,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/config", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263" + "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/212d54675bf203ff8aef7d8cee8eecfb72f4a263", - "reference": "212d54675bf203ff8aef7d8cee8eecfb72f4a263", + "url": "https://api.github.com/repos/symfony/config/zipball/9f4a448c2d7fd2c90882dfff930b627ddbe16810", + "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810", "shasum": "" }, "require": { @@ -3721,7 +3780,8 @@ "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php81": "^1.22" }, "conflict": { "symfony/finder": "<4.4" @@ -3762,7 +3822,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.2.4" + "source": "https://github.com/symfony/config/tree/v5.3.0" }, "funding": [ { @@ -3778,24 +3838,25 @@ "type": "tidelift" } ], - "time": "2021-02-23T23:58:19+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/console", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79" + "reference": "058553870f7809087fa80fa734704a21b9bcaeb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/938ebbadae1b0a9c9d1ec313f87f9708609f1b79", - "reference": "938ebbadae1b0a9c9d1ec313f87f9708609f1b79", + "url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2", + "reference": "058553870f7809087fa80fa734704a21b9bcaeb2", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", "symfony/polyfill-php80": "^1.15", @@ -3859,7 +3920,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.2.5" + "source": "https://github.com/symfony/console/tree/v5.3.0" }, "funding": [ { @@ -3875,20 +3936,20 @@ "type": "tidelift" } ], - "time": "2021-03-06T13:42:15+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/css-selector", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f" + "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f65f217b3314504a1ec99c2d6ef69016bb13490f", - "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", + "reference": "fcd0b29a7a0b1bb5bfbedc6231583d77fea04814", "shasum": "" }, "require": { @@ -3924,7 +3985,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.2.4" + "source": "https://github.com/symfony/css-selector/tree/v5.3.0" }, "funding": [ { @@ -3940,31 +4001,32 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T17:40:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970" + "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/be0c7926f5729b15e4e79fd2bf917cac584b1970", - "reference": "be0c7926f5729b15e4e79fd2bf917cac584b1970", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/94d973cb742d8c5c5dcf9534220e6b73b09af1d4", + "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0", + "psr/container": "^1.1.1", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<5.1", + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", "symfony/finder": "<4.4", "symfony/proxy-manager-bridge": "<4.4", "symfony/yaml": "<4.4" @@ -3974,7 +4036,7 @@ "symfony/service-implementation": "1.0|2.0" }, "require-dev": { - "symfony/config": "^5.1", + "symfony/config": "^5.3", "symfony/expression-language": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, @@ -4011,7 +4073,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.2.5" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.0" }, "funding": [ { @@ -4027,20 +4089,20 @@ "type": "tidelift" } ], - "time": "2021-03-05T20:13:41+00:00" + "time": "2021-05-26T17:57:12+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -4049,7 +4111,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4078,7 +4140,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" }, "funding": [ { @@ -4094,20 +4156,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/doctrine-bridge", - "version": "v5.2.5", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8" + "reference": "29516dcc8165bc7e2339182a9360ea7d3471fb03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", - "reference": "9e2c53f3e8f8a6ccecd80de5c2c8b71beeca7fc8", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/29516dcc8165bc7e2339182a9360ea7d3471fb03", + "reference": "29516dcc8165bc7e2339182a9360ea7d3471fb03", "shasum": "" }, "require": { @@ -4129,13 +4191,12 @@ "symfony/messenger": "<4.4", "symfony/property-info": "<5", "symfony/security-bundle": "<5", - "symfony/security-core": "<5", + "symfony/security-core": "<5.3", "symfony/validator": "<5.2" }, "require-dev": { "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.6", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^2.10|^3.0", @@ -4151,7 +4212,7 @@ "symfony/property-access": "^4.4|^5.0", "symfony/property-info": "^5.0", "symfony/proxy-manager-bridge": "^4.4|^5.0", - "symfony/security-core": "^5.0", + "symfony/security-core": "^5.3", "symfony/stopwatch": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", "symfony/uid": "^5.1", @@ -4192,7 +4253,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.2.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v5.3.1" }, "funding": [ { @@ -4208,24 +4269,25 @@ "type": "tidelift" } ], - "time": "2021-03-06T13:35:24+00:00" + "time": "2021-06-01T15:43:02+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "400e265163f65aceee7e904ef532e15228de674b" + "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/400e265163f65aceee7e904ef532e15228de674b", - "reference": "400e265163f65aceee7e904ef532e15228de674b", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/55fff62b19f413f897a752488ade1bc9c8a19cdd", + "reference": "55fff62b19f413f897a752488ade1bc9c8a19cdd", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.15" @@ -4266,7 +4328,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.2.4" + "source": "https://github.com/symfony/dom-crawler/tree/v5.3.0" }, "funding": [ { @@ -4282,20 +4344,20 @@ "type": "tidelift" } ], - "time": "2021-02-15T18:55:04+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/dotenv", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b" + "reference": "1ac423fcc9548709077f90aca26c733cdb7e6e5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/783f12027c6b40ab0e93d6136d9f642d1d67cd6b", - "reference": "783f12027c6b40ab0e93d6136d9f642d1d67cd6b", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/1ac423fcc9548709077f90aca26c733cdb7e6e5c", + "reference": "1ac423fcc9548709077f90aca26c733cdb7e6e5c", "shasum": "" }, "require": { @@ -4336,7 +4398,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.2.4" + "source": "https://github.com/symfony/dotenv/tree/v5.3.0" }, "funding": [ { @@ -4352,20 +4414,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T12:52:38+00:00" }, { "name": "symfony/error-handler", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0" + "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/b547d3babcab5c31e01de59ee33e9d9c1421d7d0", - "reference": "b547d3babcab5c31e01de59ee33e9d9c1421d7d0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0e6768b8c0dcef26df087df2bbbaa143867a59b2", + "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2", "shasum": "" }, "require": { @@ -4405,7 +4467,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.2.4" + "source": "https://github.com/symfony/error-handler/tree/v5.3.0" }, "funding": [ { @@ -4421,20 +4483,20 @@ "type": "tidelift" } ], - "time": "2021-02-11T08:21:20+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d08d6ec121a425897951900ab692b612a61d6240" + "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d08d6ec121a425897951900ab692b612a61d6240", - "reference": "d08d6ec121a425897951900ab692b612a61d6240", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", + "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", "shasum": "" }, "require": { @@ -4490,7 +4552,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" }, "funding": [ { @@ -4506,20 +4568,20 @@ "type": "tidelift" } ], - "time": "2021-02-18T17:12:37+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", "shasum": "" }, "require": { @@ -4532,7 +4594,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -4569,7 +4631,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" }, "funding": [ { @@ -4585,20 +4647,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/filesystem", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108" + "reference": "348116319d7fb7d1faa781d26a48922428013eb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/710d364200997a5afde34d9fe57bd52f3cc1e108", - "reference": "710d364200997a5afde34d9fe57bd52f3cc1e108", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/348116319d7fb7d1faa781d26a48922428013eb2", + "reference": "348116319d7fb7d1faa781d26a48922428013eb2", "shasum": "" }, "require": { @@ -4631,7 +4693,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.2.4" + "source": "https://github.com/symfony/filesystem/tree/v5.3.0" }, "funding": [ { @@ -4647,20 +4709,20 @@ "type": "tidelift" } ], - "time": "2021-02-12T10:38:38+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/finder", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0d639a0943822626290d169965804f79400e6a04" + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0d639a0943822626290d169965804f79400e6a04", - "reference": "0d639a0943822626290d169965804f79400e6a04", + "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", "shasum": "" }, "require": { @@ -4692,7 +4754,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.2.4" + "source": "https://github.com/symfony/finder/tree/v5.3.0" }, "funding": [ { @@ -4708,20 +4770,20 @@ "type": "tidelift" } ], - "time": "2021-02-15T18:55:04+00:00" + "time": "2021-05-26T12:52:38+00:00" }, { "name": "symfony/flex", - "version": "v1.12.2", + "version": "v1.13.3", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9" + "reference": "2597d0dda8042c43eed44a9cd07236b897e427d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/e472606b4b3173564f0edbca8f5d32b52fc4f2c9", - "reference": "e472606b4b3173564f0edbca8f5d32b52fc4f2c9", + "url": "https://api.github.com/repos/symfony/flex/zipball/2597d0dda8042c43eed44a9cd07236b897e427d7", + "reference": "2597d0dda8042c43eed44a9cd07236b897e427d7", "shasum": "" }, "require": { @@ -4738,7 +4800,7 @@ "type": "composer-plugin", "extra": { "branch-alias": { - "dev-main": "1.12-dev" + "dev-main": "1.13-dev" }, "class": "Symfony\\Flex\\Flex" }, @@ -4760,7 +4822,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.12.2" + "source": "https://github.com/symfony/flex/tree/v1.13.3" }, "funding": [ { @@ -4776,45 +4838,45 @@ "type": "tidelift" } ], - "time": "2021-02-16T14:05:05+00:00" + "time": "2021-05-19T07:19:15+00:00" }, { "name": "symfony/framework-bundle", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f" + "reference": "99196372c703b8cc97ee61d63d98acbf9896d425" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/4dae531503072a57cf26f7f4beb4c3ef8a061f8f", - "reference": "4dae531503072a57cf26f7f4beb4c3ef8a061f8f", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/99196372c703b8cc97ee61d63d98acbf9896d425", + "reference": "99196372c703b8cc97ee61d63d98acbf9896d425", "shasum": "" }, "require": { "ext-xml": "*", "php": ">=7.2.5", "symfony/cache": "^5.2", - "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.2", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^5.3", "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4.1|^5.0.1", "symfony/event-dispatcher": "^5.1", "symfony/filesystem": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", - "symfony/http-foundation": "^5.2.1", - "symfony/http-kernel": "^5.2.1", + "symfony/http-foundation": "^5.3", + "symfony/http-kernel": "^5.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.15", - "symfony/routing": "^5.2" + "symfony/routing": "^5.3" }, "conflict": { "doctrine/persistence": "<1.3", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<5.1", + "symfony/asset": "<5.3", "symfony/browser-kit": "<4.4", "symfony/console": "<5.2.5", "symfony/dom-crawler": "<4.4", @@ -4825,11 +4887,13 @@ "symfony/mailer": "<5.2", "symfony/messenger": "<4.4", "symfony/mime": "<4.4", - "symfony/property-access": "<5.2", + "symfony/property-access": "<5.3", "symfony/property-info": "<4.4", + "symfony/security-core": "<5.3", + "symfony/security-csrf": "<5.3", "symfony/serializer": "<5.2", "symfony/stopwatch": "<4.4", - "symfony/translation": "<5.0", + "symfony/translation": "<5.3", "symfony/twig-bridge": "<4.4", "symfony/twig-bundle": "<4.4", "symfony/validator": "<5.2", @@ -4838,39 +4902,71 @@ }, "require-dev": { "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", + "doctrine/cache": "^1.0|^2.0", "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.1", + "symfony/allmysms-notifier": "^5.3", + "symfony/asset": "^5.3", "symfony/browser-kit": "^4.4|^5.0", + "symfony/clickatell-notifier": "^5.3", "symfony/console": "^5.2", "symfony/css-selector": "^4.4|^5.0", + "symfony/discord-notifier": "^5.3", "symfony/dom-crawler": "^4.4|^5.0", "symfony/dotenv": "^5.1", + "symfony/esendex-notifier": "^5.3", "symfony/expression-language": "^4.4|^5.0", + "symfony/fake-chat-notifier": "^5.3", + "symfony/fake-sms-notifier": "^5.3", + "symfony/firebase-notifier": "^5.3", "symfony/form": "^5.2", + "symfony/free-mobile-notifier": "^5.3", + "symfony/gatewayapi-notifier": "^5.3", + "symfony/gitter-notifier": "^5.3", + "symfony/google-chat-notifier": "^5.3", "symfony/http-client": "^4.4|^5.0", + "symfony/infobip-notifier": "^5.3", + "symfony/iqsms-notifier": "^5.3", + "symfony/light-sms-notifier": "^5.3", + "symfony/linked-in-notifier": "^5.3", "symfony/lock": "^4.4|^5.0", "symfony/mailer": "^5.2", + "symfony/mattermost-notifier": "^5.3", + "symfony/message-bird-notifier": "^5.3", "symfony/messenger": "^5.2", + "symfony/microsoft-teams-notifier": "^5.3", "symfony/mime": "^4.4|^5.0", + "symfony/mobyt-notifier": "^5.3", + "symfony/nexmo-notifier": "^5.3", + "symfony/notifier": "^5.3", + "symfony/octopush-notifier": "^5.3", + "symfony/ovh-cloud-notifier": "^5.3", + "symfony/phpunit-bridge": "^5.3", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", - "symfony/security-bundle": "^5.1", - "symfony/security-core": "^4.4|^5.2", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", + "symfony/rate-limiter": "^5.2", + "symfony/rocket-chat-notifier": "^5.3", + "symfony/security-bundle": "^5.3", + "symfony/sendinblue-notifier": "^5.3", "symfony/serializer": "^5.2", + "symfony/sinch-notifier": "^5.3", + "symfony/slack-notifier": "^5.3", + "symfony/sms-biuras-notifier": "^5.3", + "symfony/smsapi-notifier": "^5.3", + "symfony/spot-hit-notifier": "^5.3", "symfony/stopwatch": "^4.4|^5.0", "symfony/string": "^5.0", - "symfony/translation": "^5.0", + "symfony/telegram-notifier": "^5.3", + "symfony/translation": "^5.3", "symfony/twig-bundle": "^4.4|^5.0", + "symfony/twilio-notifier": "^5.3", "symfony/validator": "^5.2", "symfony/web-link": "^4.4|^5.0", "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", + "symfony/zulip-notifier": "^5.3", "twig/twig": "^2.10|^3.0" }, "suggest": { @@ -4909,7 +5005,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.2.5" + "source": "https://github.com/symfony/framework-bundle/tree/v5.3.0" }, "funding": [ { @@ -4925,26 +5021,27 @@ "type": "tidelift" } ], - "time": "2021-03-09T08:47:49+00:00" + "time": "2021-05-31T10:12:54+00:00" }, { "name": "symfony/http-client", - "version": "v5.2.6", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8" + "reference": "ef85ca5fa7a4f9c57592fab49faeccdf22b13136" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/3c3075467da15bc2edf38d2ac20d34719e794bd8", - "reference": "3c3075467da15bc2edf38d2ac20d34719e794bd8", + "url": "https://api.github.com/repos/symfony/http-client/zipball/ef85ca5fa7a4f9c57592fab49faeccdf22b13136", + "reference": "ef85ca5fa7a4f9c57592fab49faeccdf22b13136", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/log": "^1.0", - "symfony/http-client-contracts": "^2.2", + "symfony/deprecation-contracts": "^2.1", + "symfony/http-client-contracts": "^2.4", "symfony/polyfill-php73": "^1.11", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.0|^2" @@ -4953,7 +5050,7 @@ "php-http/async-client-implementation": "*", "php-http/client-implementation": "*", "psr/http-client-implementation": "1.0", - "symfony/http-client-implementation": "2.2" + "symfony/http-client-implementation": "2.4" }, "require-dev": { "amphp/amp": "^2.5", @@ -4995,7 +5092,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v5.2.6" + "source": "https://github.com/symfony/http-client/tree/v5.3.0" }, "funding": [ { @@ -5011,20 +5108,20 @@ "type": "tidelift" } ], - "time": "2021-03-28T09:42:18+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v2.3.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", "shasum": "" }, "require": { @@ -5035,9 +5132,8 @@ }, "type": "library", "extra": { - "branch-version": "2.3", "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5074,7 +5170,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" + "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" }, "funding": [ { @@ -5090,20 +5186,20 @@ "type": "tidelift" } ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2021-04-11T23:07:08+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.2.4", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf" + "reference": "8827b90cf8806e467124ad476acd15216c2fceb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/54499baea7f7418bce7b5ec92770fd0799e8e9bf", - "reference": "54499baea7f7418bce7b5ec92770fd0799e8e9bf", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8827b90cf8806e467124ad476acd15216c2fceb6", + "reference": "8827b90cf8806e467124ad476acd15216c2fceb6", "shasum": "" }, "require": { @@ -5147,7 +5243,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.2.4" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.1" }, "funding": [ { @@ -5163,20 +5259,20 @@ "type": "tidelift" } ], - "time": "2021-02-25T17:16:57+00:00" + "time": "2021-06-02T09:32:00+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.2.5", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73" + "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", - "reference": "b8c63ef63c2364e174c3b3e0ba0bf83455f97f73", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/74eb022e3bac36b3d3a897951a98759f2b32b864", + "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864", "shasum": "" }, "require": { @@ -5186,7 +5282,7 @@ "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^5.3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.15" @@ -5196,7 +5292,7 @@ "symfony/cache": "<5.0", "symfony/config": "<5.0", "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.1.8", + "symfony/dependency-injection": "<5.3", "symfony/doctrine-bridge": "<5.0", "symfony/form": "<5.0", "symfony/http-client": "<5.0", @@ -5216,7 +5312,7 @@ "symfony/config": "^5.0", "symfony/console": "^4.4|^5.0", "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^5.1.8", + "symfony/dependency-injection": "^5.3", "symfony/dom-crawler": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/finder": "^4.4|^5.0", @@ -5259,7 +5355,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.2.5" + "source": "https://github.com/symfony/http-kernel/tree/v5.3.1" }, "funding": [ { @@ -5275,37 +5371,38 @@ "type": "tidelift" } ], - "time": "2021-03-10T17:07:35+00:00" + "time": "2021-06-02T10:07:12+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52" + "reference": "84841557874df015ef2843aa16ac63d09f97c7b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/8a330ab86c4bdf3983b26abf64bf85574edf0d52", - "reference": "8a330ab86c4bdf3983b26abf64bf85574edf0d52", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/84841557874df015ef2843aa16ac63d09f97c7b9", + "reference": "84841557874df015ef2843aa16ac63d09f97c7b9", "shasum": "" }, "require": { "monolog/monolog": "^1.25.1|^2", "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", + "symfony/http-kernel": "^5.3", "symfony/service-contracts": "^1.1|^2" }, "conflict": { "symfony/console": "<4.4", - "symfony/http-foundation": "<4.4" + "symfony/http-foundation": "<5.3" }, "require-dev": { "symfony/console": "^4.4|^5.0", "symfony/http-client": "^4.4|^5.0", "symfony/mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", "symfony/security-core": "^4.4|^5.0", "symfony/var-dumper": "^4.4|^5.0" @@ -5341,7 +5438,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.2.5" + "source": "https://github.com/symfony/monolog-bridge/tree/v5.3.0" }, "funding": [ { @@ -5357,7 +5454,7 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/monolog-bundle", @@ -5442,16 +5539,16 @@ }, { "name": "symfony/options-resolver", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/162e886ca035869866d233a2bfef70cc28f9bbe5", + "reference": "162e886ca035869866d233a2bfef70cc28f9bbe5", "shasum": "" }, "require": { @@ -5491,7 +5588,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + "source": "https://github.com/symfony/options-resolver/tree/v5.3.0" }, "funding": [ { @@ -5507,7 +5604,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T12:56:27+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/orm-pack", @@ -5555,18 +5652,91 @@ ], "time": "2020-07-08T14:31:54+00:00" }, + { + "name": "symfony/password-hasher", + "version": "v5.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "d487faef0347d5351d3e361e123a73496595509f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/d487faef0347d5351d3e361e123a73496595509f", + "reference": "d487faef0347d5351d3e361e123a73496595509f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/security-core": "<5.3" + }, + "require-dev": { + "symfony/console": "^5", + "symfony/security-core": "^5.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" + }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170" + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170", - "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", + "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", "shasum": "" }, "require": { @@ -5578,7 +5748,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5618,7 +5788,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" }, "funding": [ { @@ -5634,20 +5804,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483" + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483", - "reference": "2d63434d922daf7da8dd863e7907e67ee3031483", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -5661,7 +5831,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5705,7 +5875,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, "funding": [ { @@ -5721,20 +5891,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248", - "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -5746,7 +5916,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5789,7 +5959,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -5805,20 +5975,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", - "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", "shasum": "" }, "require": { @@ -5830,7 +6000,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5869,7 +6039,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" }, "funding": [ { @@ -5885,20 +6055,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -5907,7 +6077,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5948,7 +6118,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -5964,20 +6134,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", "shasum": "" }, "require": { @@ -5986,7 +6156,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6031,7 +6201,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" }, "funding": [ { @@ -6047,20 +6217,99 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.22.1", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a" + "reference": "9165effa2eb8a31bb3fa608df9d529920d21ddd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9773608c15d3fe6ba2b6456a124777a7b8ffee2a", - "reference": "9773608c15d3fe6ba2b6456a124777a7b8ffee2a", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9165effa2eb8a31bb3fa608df9d529920d21ddd9", + "reference": "9165effa2eb8a31bb3fa608df9d529920d21ddd9", "shasum": "" }, "require": { @@ -6072,7 +6321,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6110,7 +6359,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.22.1" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.23.0" }, "funding": [ { @@ -6126,20 +6375,20 @@ "type": "tidelift" } ], - "time": "2021-01-22T09:19:47+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/property-access", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3" + "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/3af8ed262bd3217512a13b023981fe68f36ad5f3", - "reference": "3af8ed262bd3217512a13b023981fe68f36ad5f3", + "url": "https://api.github.com/repos/symfony/property-access/zipball/8988399a556cffb0fba9bb3603f8d1ba4543eceb", + "reference": "8988399a556cffb0fba9bb3603f8d1ba4543eceb", "shasum": "" }, "require": { @@ -6191,7 +6440,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v5.2.4" + "source": "https://github.com/symfony/property-access/tree/v5.3.0" }, "funding": [ { @@ -6207,20 +6456,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/property-info", - "version": "v5.2.4", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189" + "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/7185bbc74e6f49c3f1b5936b4d9e4ca133921189", - "reference": "7185bbc74e6f49c3f1b5936b4d9e4ca133921189", + "url": "https://api.github.com/repos/symfony/property-info/zipball/6f8bff281f215dbf41929c7ec6f8309cdc0912cf", + "reference": "6f8bff281f215dbf41929c7ec6f8309cdc0912cf", "shasum": "" }, "require": { @@ -6281,7 +6530,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v5.2.4" + "source": "https://github.com/symfony/property-info/tree/v5.3.1" }, "funding": [ { @@ -6297,7 +6546,7 @@ "type": "tidelift" } ], - "time": "2021-02-17T15:24:54+00:00" + "time": "2021-05-31T12:40:48+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -6389,16 +6638,16 @@ }, { "name": "symfony/routing", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "cafa138128dfd6ab6be1abf6279169957b34f662" + "reference": "368e81376a8e049c37cb80ae87dbfbf411279199" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/cafa138128dfd6ab6be1abf6279169957b34f662", - "reference": "cafa138128dfd6ab6be1abf6279169957b34f662", + "url": "https://api.github.com/repos/symfony/routing/zipball/368e81376a8e049c37cb80ae87dbfbf411279199", + "reference": "368e81376a8e049c37cb80ae87dbfbf411279199", "shasum": "" }, "require": { @@ -6407,21 +6656,21 @@ "symfony/polyfill-php80": "^1.15" }, "conflict": { - "symfony/config": "<5.0", + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", "symfony/dependency-injection": "<4.4", "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", + "doctrine/annotations": "^1.12", "psr/log": "~1.0", - "symfony/config": "^5.0", + "symfony/config": "^5.3", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", "symfony/http-foundation": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation loader", "symfony/config": "For using the all-in-one router or any loader", "symfony/expression-language": "For using expression matching", "symfony/http-foundation": "For using a Symfony Request object", @@ -6459,7 +6708,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.2.4" + "source": "https://github.com/symfony/routing/tree/v5.3.0" }, "funding": [ { @@ -6475,41 +6724,45 @@ "type": "tidelift" } ], - "time": "2021-02-22T15:48:39+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/security-core", - "version": "v5.2.6", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760" + "reference": "22714af1f701937a0a0bd3e3ec2a761baed3f2d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/9dcedab1c2c637fc9a377b3a9313a61087609760", - "reference": "9dcedab1c2c637fc9a377b3a9313a61087609760", + "url": "https://api.github.com/repos/symfony/security-core/zipball/22714af1f701937a0a0bd3e3ec2a761baed3f2d0", + "reference": "22714af1f701937a0a0bd3e3ec2a761baed3f2d0", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^1.1|^2", + "symfony/password-hasher": "^5.3", "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { "symfony/event-dispatcher": "<4.4", + "symfony/http-foundation": "<5.3", "symfony/ldap": "<4.4", "symfony/security-guard": "<4.4", "symfony/validator": "<5.2" }, "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.0|^2.0", "psr/log": "~1.0", + "symfony/cache": "^4.4|^5.0", "symfony/event-dispatcher": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^5.3", "symfony/ldap": "^4.4|^5.0", "symfony/translation": "^4.4|^5.0", "symfony/validator": "^5.2" @@ -6548,7 +6801,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v5.2.6" + "source": "https://github.com/symfony/security-core/tree/v5.3.1" }, "funding": [ { @@ -6564,38 +6817,39 @@ "type": "tidelift" } ], - "time": "2021-03-10T22:10:15+00:00" + "time": "2021-06-01T15:43:02+00:00" }, { "name": "symfony/serializer", - "version": "v5.2.4", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "a285f474a72397ccbd384900abc968ffcb511dda" + "reference": "ebb3dc397af77a08d734eea7305e0b2ec8c5e875" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/a285f474a72397ccbd384900abc968ffcb511dda", - "reference": "a285f474a72397ccbd384900abc968ffcb511dda", + "url": "https://api.github.com/repos/symfony/serializer/zipball/ebb3dc397af77a08d734eea7305e0b2ec8c5e875", + "reference": "ebb3dc397af77a08d734eea7305e0b2ec8c5e875", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-php80": "^1.15" }, "conflict": { + "doctrine/annotations": "<1.12", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/dependency-injection": "<4.4", "symfony/property-access": "<4.4", - "symfony/property-info": "<4.4", + "symfony/property-info": "<5.3", "symfony/yaml": "<4.4" }, "require-dev": { - "doctrine/annotations": "^1.10.4", - "doctrine/cache": "~1.0", + "doctrine/annotations": "^1.12", "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "symfony/cache": "^4.4|^5.0", "symfony/config": "^4.4|^5.0", @@ -6607,15 +6861,14 @@ "symfony/http-kernel": "^4.4|^5.0", "symfony/mime": "^4.4|^5.0", "symfony/property-access": "^4.4.9|^5.0.9", - "symfony/property-info": "^4.4|^5.0", + "symfony/property-info": "^5.3", "symfony/uid": "^5.1", "symfony/validator": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0", "symfony/var-exporter": "^4.4|^5.0", "symfony/yaml": "^4.4|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", "psr/cache-implementation": "For using the metadata cache.", "symfony/config": "For using the XML mapping loader.", "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", @@ -6650,7 +6903,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.2.4" + "source": "https://github.com/symfony/serializer/tree/v5.3.1" }, "funding": [ { @@ -6666,25 +6919,25 @@ "type": "tidelift" } ], - "time": "2021-03-02T12:14:02+00:00" + "time": "2021-06-02T09:36:17+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -6692,7 +6945,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6729,7 +6982,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -6745,20 +6998,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c" + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b12274acfab9d9850c52583d136a24398cdf1a0c", - "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/313d02f59d6543311865007e5ff4ace05b35ee65", + "reference": "313d02f59d6543311865007e5ff4ace05b35ee65", "shasum": "" }, "require": { @@ -6791,7 +7044,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.2.4" + "source": "https://github.com/symfony/stopwatch/tree/v5.3.0" }, "funding": [ { @@ -6807,20 +7060,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/string", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4e78d7d47061fa183639927ec40d607973699609" + "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4e78d7d47061fa183639927ec40d607973699609", - "reference": "4e78d7d47061fa183639927ec40d607973699609", + "url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", + "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", "shasum": "" }, "require": { @@ -6874,7 +7127,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.2.4" + "source": "https://github.com/symfony/string/tree/v5.3.0" }, "funding": [ { @@ -6890,20 +7143,20 @@ "type": "tidelift" } ], - "time": "2021-02-16T10:20:28+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e" + "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/002ab5a36702adf0c9a11e6d8836623253e9045e", - "reference": "002ab5a36702adf0c9a11e6d8836623253e9045e", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1d3953e627fe4b5f6df503f356b6545ada6351f3", + "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3", "shasum": "" }, "require": { @@ -6962,7 +7215,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.2.5" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.0" }, "funding": [ { @@ -6978,20 +7231,20 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-05-27T12:28:50+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.2.4", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307" + "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5aed4875ab514c8cb9b6ff4772baa25fa4c10307", - "reference": "5aed4875ab514c8cb9b6ff4772baa25fa4c10307", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", + "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", "shasum": "" }, "require": { @@ -7035,7 +7288,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.2.4" + "source": "https://github.com/symfony/var-exporter/tree/v5.3.0" }, "funding": [ { @@ -7051,20 +7304,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-26T17:40:38+00:00" }, { "name": "symfony/yaml", - "version": "v5.2.5", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "298a08ddda623485208506fcee08817807a251dd" + "reference": "3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", - "reference": "298a08ddda623485208506fcee08817807a251dd", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11", + "reference": "3bbcf262fceb3d8f48175302e6ba0ac96e3a5a11", "shasum": "" }, "require": { @@ -7110,7 +7363,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.2.5" + "source": "https://github.com/symfony/yaml/tree/v5.3.0" }, "funding": [ { @@ -7126,7 +7379,7 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-05-26T17:43:10+00:00" } ], "packages-dev": [ @@ -7294,12 +7547,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "593c4de369ca852cf3b86037f19435d47c136448" + "reference": "9460a22455b82b353d2212fecedebcf73b141baa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/593c4de369ca852cf3b86037f19435d47c136448", - "reference": "593c4de369ca852cf3b86037f19435d47c136448", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9460a22455b82b353d2212fecedebcf73b141baa", + "reference": "9460a22455b82b353d2212fecedebcf73b141baa", "shasum": "" }, "conflict": { @@ -7316,7 +7569,8 @@ "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", - "bolt/bolt": "<3.7.1", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bolt/bolt": "<3.7.2", "bolt/core": "<4.1.13", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<5.1.2", @@ -7327,7 +7581,7 @@ "centreon/centreon": "<18.10.8|>=19,<19.4.5", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1-alpha.11", + "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", @@ -7335,6 +7589,7 @@ "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "directmailteam/direct-mail": "<5.2.4", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -7346,8 +7601,9 @@ "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", "dolibarr/dolibarr": "<11.0.4", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", - "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "dweeves/magmi": "<=0.7.24", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", @@ -7372,14 +7628,16 @@ "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.8.3", "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<6.5.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "fuel/core": "<1.8.1", "getgrav/grav": "<1.7.11", - "getkirby/cms": ">=3,<3.4.5", + "getkirby/cms": "<3.5.4", "getkirby/panel": "<2.5.14", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", @@ -7387,7 +7645,7 @@ "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "illuminate/database": "<6.20.26|>=7,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", "impresscms/impresscms": "<=1.4.2", @@ -7398,12 +7656,14 @@ "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", "kitodo/presentation": "<3.1.2", + "klaviyo/magento2-extension": ">=1,<3", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": "<6.20.14|>=7,<7.30.4|>=8,<8.24", + "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "league/commonmark": "<0.18.3", - "librenms/librenms": "<1.53", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<21.1", "livewire/livewire": ">2.2.4,<2.2.6", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", @@ -7424,13 +7684,14 @@ "nystudio107/craft-seomatic": "<3.3", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", - "october/cms": "= 1.0.469|>=1.0.319,<1.0.469", + "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466", "october/rain": "<1.0.472|>=1.1,<1.1.2", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.8|>=20,<20.0.4", + "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", @@ -7441,8 +7702,9 @@ "paypal/merchant-sdk-php": "<3.12", "pear/archive_tar": "<1.4.12", "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6", + "phpmailer/phpmailer": "<6.1.6|>=6.1.8,<6.4.1", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", @@ -7467,6 +7729,7 @@ "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", @@ -7476,7 +7739,7 @@ "shopware/core": "<=6.3.5.2", "shopware/platform": "<=6.3.5.2", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<5.6.9", + "shopware/shopware": "<=5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", @@ -7521,20 +7784,21 @@ "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/polyfill": ">=1,<1.10", "symfony/polyfill-php55": ">=1,<1.10", "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -7564,6 +7828,7 @@ "wallabag/tcpdf": "<6.2.22", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", + "wp-cli/wp-cli": "<2.5", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", "yiisoft/yii2": "<2.0.38", @@ -7573,7 +7838,9 @@ "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", + "yoast-seo-for-typo3/yoast_seo": "<7.2.1", "yourls/yourls": "<1.7.4", + "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -7598,7 +7865,8 @@ "zetacomponents/mail": "<1.8.2", "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" }, "default-branch": true, "type": "metapackage", @@ -7633,30 +7901,30 @@ "type": "tidelift" } ], - "time": "2021-04-16T20:01:44+00:00" + "time": "2021-06-01T22:04:47+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.2.6", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "f2f94fd78379cdcdef09dd5025af791301913968" + "reference": "15cab721487b7bf43ad545a1e7d0095782e26f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f2f94fd78379cdcdef09dd5025af791301913968", - "reference": "f2f94fd78379cdcdef09dd5025af791301913968", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/15cab721487b7bf43ad545a1e7d0095782e26f8c", + "reference": "15cab721487b7bf43ad545a1e7d0095782e26f8c", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": ">=7.1.3", + "symfony/deprecation-contracts": "^2.1" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0|9.1.2" + "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0" }, "suggest": { @@ -7700,7 +7968,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v5.2.6" + "source": "https://github.com/symfony/phpunit-bridge/tree/v5.3.0" }, "funding": [ { @@ -7716,7 +7984,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T20:42:04+00:00" + "time": "2021-05-26T17:57:12+00:00" } ], "aliases": [], diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 386cbd5..2564f29 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -12,27 +12,20 @@ final class DocsController extends AbstractController { use FileSystemAwareTrait; - /** - * @Route("/", name="tle_home") - * @Route("/api/tle/docs", name="app_api_docs") - */ + #[Route("/", name: "tle_home")] + #[Route('/api/tle/docs', name: "app_api_docs")] public function docs(): Response { return new Response(file_get_contents($this->getProjectDir() . '/public/index.html')); } - /** - * @Route("/api/tle.json", name="app_api_docs_json") - * @throws \JsonException - */ + #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { $path = $this->getProjectDir() . '/config/custom/tle.json'; $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); -// unset($docs['paths']['/api/tle/{id}/propagate']); - return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } } diff --git a/symfony.lock b/symfony.lock index eec58c9..7b9341e 100644 --- a/symfony.lock +++ b/symfony.lock @@ -32,6 +32,9 @@ "doctrine/dbal": { "version": "v2.10.0" }, + "doctrine/deprecations": { + "version": "v0.5.3" + }, "doctrine/doctrine-bundle": { "version": "2.0", "recipe": { @@ -357,6 +360,9 @@ "symfony/orm-pack": { "version": "v1.0.7" }, + "symfony/password-hasher": { + "version": "v5.3.0" + }, "symfony/phpunit-bridge": { "version": "4.3", "recipe": { @@ -391,6 +397,9 @@ "symfony/polyfill-php80": { "version": "v1.20.0" }, + "symfony/polyfill-php81": { + "version": "v1.23.0" + }, "symfony/polyfill-uuid": { "version": "v1.22.1" }, diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index 6e53d75..6955955 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -19,9 +19,9 @@ public function test404(): void $response = $this->toArray($response); self::assertEquals( - 'No route found for "GET /noop"', + 'No route found for "GET http://localhost/noop"', $response['response']['message'], 'Assert correct response message' ); } -} \ No newline at end of file +} From b56926bb4d1395daeb865d9d8a4e856bf46ef00d Mon Sep 17 00:00:00 2001 From: Serbian Case For Space <72007267+serbiancaseforspace@users.noreply.github.com> Date: Sat, 5 Jun 2021 13:46:34 +0200 Subject: [PATCH 126/151] Update README.md --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7f82184..76aa52e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # TLE API -[![build](https://travis-ci.com/ivanstan/tle-api.svg?branch=master)](https://travis-ci.com/ivanstan/tle-api) + + ![coverage](https://badgen.net/coveralls/c/github/ivanstan/tle-api) -![dependabot](https://badgen.net/dependabot/dependabot/dependabot-core/?icon=dependabot) ![status](https://badgen.net/uptime-robot/status/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/month/m781499721-d42767e28cc71aea507fb087) ![status](https://badgen.net/uptime-robot/response/m781499721-d42767e28cc71aea507fb087) @@ -14,20 +14,18 @@ API provides up to date two line element set records, the data is updated daily from [CelesTrak](https://celestrak.com/) and served in JSON format. A two-line element set (TLE) is a data format encoding a list of orbital elements of an Earth-orbiting object for a given point in time. -For more information on TLE data format visit [Definition of -Two-line Element Set Coordinate System](https://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/SSOP_Help/tle_def.html). ## Usage Further documentation and response examples are available at: -http://tle.ivanstanojevic.me/api/tle/docs +https://tle.ivanstanojevic.me/ -###Available endpoints +### Available endpoints The TLE API consists of two endpoints `GET http://tle.ivanstanojevic.me` | Endpoint | Description | |----------|:------:| -| `GET /api/tle?search={q}` | Perform search by satellite name | -| `GET /api/tle/{q}` | Retrieve a single TLE record where query is satellite number | +| `GET /api/tle?search={query}` | Perform search by satellite name | +| `GET /api/tle/{id}` | Retrieve a single TLE record where id is satellite number | Example query http://tle.ivanstanojevic.me/api/tle From 06225275f8dc38729b0db14d6dce92e0b52998ad Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 13:56:56 +0200 Subject: [PATCH 127/151] upgrade symfony 5.3 --- src/Controller/AbstractApiController.php | 5 ----- symfony.lock | 12 ------------ 2 files changed, 17 deletions(-) diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 300c68c..979e594 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -20,12 +20,7 @@ abstract class AbstractApiController extends AbstractController protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; public const CORS_HEADERS = [ - 'Content-type' => 'application/json', 'Access-Control-Allow-Origin' => '*', - 'Access-Control-Allow-Credentials' => 'true', - 'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS', - 'Access-Control-Allow-Headers' => 'DNT, X-User-Token, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type', - 'Access-Control-Max-Age' => 1728000, ]; protected const SORT_PARAM = 'sort'; diff --git a/symfony.lock b/symfony.lock index 7b9341e..19e818d 100644 --- a/symfony.lock +++ b/symfony.lock @@ -135,18 +135,6 @@ "myclabs/php-enum": { "version": "1.7.2" }, - "nelmio/cors-bundle": { - "version": "1.5", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "1.5", - "ref": "6bea22e6c564fba3a1391615cada1437d0bde39c" - }, - "files": [ - "config/packages/nelmio_cors.yaml" - ] - }, "ocramius/package-versions": { "version": "1.5.1" }, From bd01d64b010a293ba92d51b01dd6aac235dd5a14 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:20:15 +0200 Subject: [PATCH 128/151] upgrade symfony 5.3 --- public/.htaccess | 2 ++ src/Controller/AbstractApiController.php | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/public/.htaccess b/public/.htaccess index 9c8c42f..f98dab9 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -89,6 +89,8 @@ RewriteRule ^ %{ENV:BASE}/index.php [L] +Header add Access-Control-Allow-Origin "*" + # When mod_rewrite is not available, we instruct a temporary redirect of diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 979e594..172b434 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -19,10 +19,6 @@ abstract class AbstractApiController extends AbstractController protected const HYDRA_CONTEXT = 'https://www.w3.org/ns/hydra/context.jsonld'; - public const CORS_HEADERS = [ - 'Access-Control-Allow-Origin' => '*', - ]; - protected const SORT_PARAM = 'sort'; protected const SORT_DIR_PARAM = 'sort-dir'; protected const PAGE_SIZE_PARAM = 'page-size'; @@ -119,7 +115,6 @@ public function response(array $data): JsonResponse return new JsonResponse( $data, Response::HTTP_OK, - self::CORS_HEADERS, ); } } From f5c45f6d945ee1393240e1c64ea1355d21c7c8ab Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:21:18 +0200 Subject: [PATCH 129/151] upgrade symfony 5.3 --- src/Controller/StatisticsController.php | 1 - src/Event/ApiExceptionSubscriber.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 9be3a8e..a7f35fc 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -60,7 +60,6 @@ public function hits( return new JsonResponse( $response, Response::HTTP_OK, - self::CORS_HEADERS, ); } } diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index a2434b1..d2d5e8d 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -64,7 +64,6 @@ private function setJsonResponse(ExceptionEvent $event, array $response): void 'response' => $response ], Response::HTTP_OK, - AbstractApiController::CORS_HEADERS ) ); } From aa02e5995d2857282beb177f641c54e2d6f00d9c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:43:46 +0200 Subject: [PATCH 130/151] add referer --- src/Entity/Request.php | 15 ++++++++++ src/Event/StatisticSubscriber.php | 4 ++- src/Migrations/Version20210605124127.php | 35 ++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/Migrations/Version20210605124127.php diff --git a/src/Entity/Request.php b/src/Entity/Request.php index 549ffad..c634689 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -37,6 +37,11 @@ class Request */ private string $ip; + /** + * @ORM\Column(name="referer", type="string", nullable=true) + */ + private ?string $referer; + /** * @ORM\PrePersist() * @ORM\PreUpdate() @@ -65,4 +70,14 @@ public function setIp(string $ip): void { $this->ip = $ip; } + + public function getReferer(): ?string + { + return $this->referer; + } + + public function setReferer(?string $referer): void + { + $this->referer = $referer; + } } diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 61d80b1..5c7dce5 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -7,6 +7,7 @@ use App\Repository\TleRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpKernel\Event\TerminateEvent; use Symfony\Component\HttpKernel\KernelEvents; class StatisticSubscriber implements EventSubscriberInterface @@ -29,7 +30,7 @@ public static function getSubscribedEvents(): array ]; } - public function onKernelTerminate($event): void + public function onKernelTerminate(TerminateEvent $event): void { if (!in_array($event->getRequest()->get('_route'), self::TLE_ROUTES, false)) { return; @@ -45,6 +46,7 @@ public function onKernelTerminate($event): void $request = new Request(); $request->setTle($tle); $request->setIp($event->getRequest()->getClientIp()); + $request->setReferer($event->getRequest()->headers->get('referer')); $this->em->persist($request); $this->em->flush(); diff --git a/src/Migrations/Version20210605124127.php b/src/Migrations/Version20210605124127.php new file mode 100644 index 0000000..506a17e --- /dev/null +++ b/src/Migrations/Version20210605124127.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request ADD referer VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE request DROP referer'); + } +} From c5bf59992de4634ce9b50e99a2b5642160af7308 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 14:46:43 +0200 Subject: [PATCH 131/151] upgrade symfony 5.3 --- src/Migrations/Version20210605124127.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Migrations/Version20210605124127.php b/src/Migrations/Version20210605124127.php index 506a17e..e9a424a 100644 --- a/src/Migrations/Version20210605124127.php +++ b/src/Migrations/Version20210605124127.php @@ -12,9 +12,9 @@ */ final class Version20210605124127 extends AbstractMigration { - public function getDescription() : string + public function isTransactional(): bool { - return ''; + return false; } public function up(Schema $schema) : void From a3cbc1aecdc7bd7ba9effb5471f2018f2d2f3817 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 15:19:56 +0200 Subject: [PATCH 132/151] cleanup command --- src/Command/CleanupCommand.php | 33 +++++++++++++++++++++++++ src/Command/TleCalculate.php | 2 +- src/Controller/FlyOverController.php | 2 +- src/Controller/PropagateController.php | 2 +- src/Controller/StatisticsController.php | 2 +- src/Entity/Request.php | 2 +- src/Repository/RequestRepository.php | 27 ++++++++++++++++++++ 7 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/Command/CleanupCommand.php create mode 100644 src/Repository/RequestRepository.php diff --git a/src/Command/CleanupCommand.php b/src/Command/CleanupCommand.php new file mode 100644 index 0000000..4e6c05c --- /dev/null +++ b/src/Command/CleanupCommand.php @@ -0,0 +1,33 @@ +setName('cleanup') + ->setDescription('Performs periodic cleanup on unused data'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $this->repository->removeBefore( + (new \DateTime())->sub(new \DateInterval('P2M')) + ); + + return Command::SUCCESS; + } +} diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 2850d50..2b083ed 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -10,7 +10,7 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -class TleCalculate extends Command +final class TleCalculate extends Command { protected const BATCH_SIZE = 20; protected const OPTION_TLE = 'tle'; diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 7109001..21be595 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -12,7 +12,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -class FlyOverController extends AbstractApiController +final class FlyOverController extends AbstractApiController { use TleHttpTrait; diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 60af093..a8f4b77 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -13,7 +13,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -class PropagateController extends AbstractApiController +final class PropagateController extends AbstractApiController { use TleHttpTrait; diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index a7f35fc..9d5b7a7 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -9,7 +9,7 @@ use Symfony\Component\Routing\Annotation\Route; #[Route("/api/tle")] -class StatisticsController extends AbstractApiController +final class StatisticsController extends AbstractApiController { protected const INTERVAL = 6; diff --git a/src/Entity/Request.php b/src/Entity/Request.php index c634689..9d75b84 100644 --- a/src/Entity/Request.php +++ b/src/Entity/Request.php @@ -7,7 +7,7 @@ use Doctrine\ORM\Mapping as ORM; /** - * @ORM\Entity() + * @ORM\Entity(repositoryClass="App\Repository\RequestRepository") * @ORM\HasLifecycleCallbacks() */ class Request diff --git a/src/Repository/RequestRepository.php b/src/Repository/RequestRepository.php new file mode 100644 index 0000000..b7d9a6e --- /dev/null +++ b/src/Repository/RequestRepository.php @@ -0,0 +1,27 @@ +_em->createQueryBuilder(); + + $builder + ->delete(Request::class, 'r') + ->where('r.createdAt < :date') + ->setParameter('date', $dateTime); + + $builder->getQuery()->execute(); + } +} From 46a156b3f436ca00156a788a6647d27f9d7e5b39 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 5 Jun 2021 17:58:37 +0200 Subject: [PATCH 133/151] rate limiter --- .env | 6 ++ composer.json | 1 + composer.lock | 152 ++++++++++++++++++++++++++- config/packages/lock.yaml | 2 + config/packages/rate_limiter.yaml | 7 ++ src/Command/TleCalculate.php | 3 +- src/Event/ApiExceptionSubscriber.php | 1 + src/Event/ApiLimiterSubscriber.php | 70 ++++++++++++ src/Event/StatisticSubscriber.php | 13 +-- src/Service/FeatureFlag.php | 8 ++ src/Service/Route.php | 15 +++ symfony.lock | 15 +++ 12 files changed, 285 insertions(+), 8 deletions(-) create mode 100644 config/packages/lock.yaml create mode 100644 config/packages/rate_limiter.yaml create mode 100644 src/Event/ApiLimiterSubscriber.php create mode 100644 src/Service/FeatureFlag.php create mode 100644 src/Service/Route.php diff --git a/.env b/.env index 628129e..a4744f6 100644 --- a/.env +++ b/.env @@ -31,3 +31,9 @@ DATABASE_URL=mysql://root:root@localhost:3306/tle?serverVersion=8 ###> sentry/sentry-symfony ### SENTRY_DSN= ###< sentry/sentry-symfony ### + +###> symfony/lock ### +# Choose one of the stores below +# postgresql+advisory://db_user:db_password@localhost/db_name +LOCK_DSN=semaphore +###< symfony/lock ### diff --git a/composer.json b/composer.json index f585d22..c47bcd3 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "symfony/monolog-bundle": "^3.7", "symfony/orm-pack": "^1.1", "symfony/property-access": "5.3.*", + "symfony/rate-limiter": "5.3.*", "symfony/serializer": "5.3.*", "symfony/yaml": "5.3.*" }, diff --git a/composer.lock b/composer.lock index d38071b..1715c82 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b41d3e11936a61ff068ced78f87c22a1", + "content-hash": "f253f5360f5a5801c6fa721bde0c08b5", "packages": [ { "name": "beberlei/doctrineextensions", @@ -5373,6 +5373,86 @@ ], "time": "2021-06-02T10:07:12+00:00" }, + { + "name": "symfony/lock", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/lock.git", + "reference": "cf21749b2733508f0e1031c0a531cefa3efca0b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lock/zipball/cf21749b2733508f0e1031c0a531cefa3efca0b8", + "reference": "cf21749b2733508f0e1031c0a531cefa3efca0b8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "doctrine/dbal": "<2.10" + }, + "require-dev": { + "doctrine/dbal": "^2.10|^3.0", + "mongodb/mongodb": "~1.1", + "predis/predis": "~1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Lock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Derussé", + "email": "jeremy@derusse.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource", + "homepage": "https://symfony.com", + "keywords": [ + "cas", + "flock", + "locking", + "mutex", + "redlock", + "semaphore" + ], + "support": { + "source": "https://github.com/symfony/lock/tree/v5.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-01T18:47:32+00:00" + }, { "name": "symfony/monolog-bridge", "version": "v5.3.0", @@ -6636,6 +6716,76 @@ ], "time": "2021-02-17T10:35:25+00:00" }, + { + "name": "symfony/rate-limiter", + "version": "v5.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/rate-limiter.git", + "reference": "e9226c91163495ff0b655cdae0fff682e869640b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/e9226c91163495ff0b655cdae0fff682e869640b", + "reference": "e9226c91163495ff0b655cdae0fff682e869640b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/lock": "^5.2", + "symfony/options-resolver": "^5.1" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\RateLimiter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wouter de Jong", + "email": "wouter@wouterj.nl" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a Token Bucket implementation to rate limit input and output in your application", + "homepage": "https://symfony.com", + "keywords": [ + "limiter", + "rate-limiter" + ], + "support": { + "source": "https://github.com/symfony/rate-limiter/tree/v5.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-26T17:43:10+00:00" + }, { "name": "symfony/routing", "version": "v5.3.0", diff --git a/config/packages/lock.yaml b/config/packages/lock.yaml new file mode 100644 index 0000000..574879f --- /dev/null +++ b/config/packages/lock.yaml @@ -0,0 +1,2 @@ +framework: + lock: '%env(LOCK_DSN)%' diff --git a/config/packages/rate_limiter.yaml b/config/packages/rate_limiter.yaml new file mode 100644 index 0000000..a677d37 --- /dev/null +++ b/config/packages/rate_limiter.yaml @@ -0,0 +1,7 @@ +framework: + rate_limiter: + anonymous_api: + policy: 'sliding_window' + limit: 500 + interval: '60 minutes' + lock_factory: null diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 2b083ed..8adb615 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -5,6 +5,7 @@ use App\Entity\Tle; use App\Entity\TleInformation; use Doctrine\ORM\EntityManagerInterface; +use Ivanstan\Tle\Specification\GeostationaryOrbitTleSpecification; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -60,7 +61,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $tleInformation->inclination = $tleModel->getInclination(); $tleInformation->eccentricity = $tleModel->eccentricity(); $tleInformation->period = $tleModel->period(); - $tleInformation->geostationary = $tleModel->isGeostationary(); + $tleInformation->geostationary = (new GeostationaryOrbitTleSpecification())->isSatisfiedBy($tleModel); $tleInformation->raan = $tleModel->raan(); $tleInformation->semiMajorAxis = $tleModel->semiMajorAxis(); diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index d2d5e8d..69bc8b3 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -8,6 +8,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Exception\HttpException; +use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; use Symfony\Component\HttpKernel\KernelEvents; class ApiExceptionSubscriber implements EventSubscriberInterface diff --git a/src/Event/ApiLimiterSubscriber.php b/src/Event/ApiLimiterSubscriber.php new file mode 100644 index 0000000..5f098b7 --- /dev/null +++ b/src/Event/ApiLimiterSubscriber.php @@ -0,0 +1,70 @@ +limiter = $anonymousApiLimiter; + } + + public static function getSubscribedEvents(): array + { + return [ + KernelEvents::REQUEST => 'onRequest', + ]; + } + + public function onRequest(RequestEvent $event): void + { + $refererHost = parse_url($event->getRequest()->headers->get('referer'), PHP_URL_HOST); + + if (!FeatureFlag::API_RATE_LIMITER || $refererHost === Route::PRODUCTION_HOST || !Route::inArray($event->getRequest(), self::ROUTES)) { + return; + } + + $limit = $this->limiter->create($event->getRequest()->getClientIp())->consume(); + + if (false === $limit->isAccepted()) { + $headers = [ + 'X-RateLimit-Remaining' => $limit->getRemainingTokens(), + 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format('c'), + 'X-RateLimit-Limit' => $limit->getLimit(), + ]; + + $event->setResponse( + new JsonResponse( + [ + 'response' => [ + 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format('c')), + 'limit' => $limit->getLimit(), + 'remaining' => $limit->getRemainingTokens(), + ], + ], + Response::HTTP_TOO_MANY_REQUESTS, + $headers + ), + ); + } + } +} diff --git a/src/Event/StatisticSubscriber.php b/src/Event/StatisticSubscriber.php index 5c7dce5..3a04206 100644 --- a/src/Event/StatisticSubscriber.php +++ b/src/Event/StatisticSubscriber.php @@ -5,6 +5,7 @@ use App\Entity\Request; use App\Entity\Tle; use App\Repository\TleRepository; +use App\Service\Route; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\TerminateEvent; @@ -12,11 +13,11 @@ class StatisticSubscriber implements EventSubscriberInterface { - protected const TLE_ROUTES = [ - 'tle_record', - 'tle_propagate', - 'tle_flyover', - 'tle_flyover_details' + public const ROUTES = [ + 'tle_record', + 'tle_propagate', + 'tle_flyover', + 'tle_flyover_details', ]; public function __construct(private EntityManagerInterface $em, private TleRepository $tleRepository) @@ -32,7 +33,7 @@ public static function getSubscribedEvents(): array public function onKernelTerminate(TerminateEvent $event): void { - if (!in_array($event->getRequest()->get('_route'), self::TLE_ROUTES, false)) { + if (!Route::inArray($event->getRequest(), self::ROUTES)) { return; } diff --git a/src/Service/FeatureFlag.php b/src/Service/FeatureFlag.php new file mode 100644 index 0000000..d061893 --- /dev/null +++ b/src/Service/FeatureFlag.php @@ -0,0 +1,8 @@ +get('_route'), $routes, false); + } +} diff --git a/symfony.lock b/symfony.lock index 19e818d..0f1f0e4 100644 --- a/symfony.lock +++ b/symfony.lock @@ -324,6 +324,18 @@ "symfony/http-kernel": { "version": "v5.0.1" }, + "symfony/lock": { + "version": "5.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "5.2", + "ref": "13350583a83fa636bf45a5fb62da3bdc73be52a1" + }, + "files": [ + "config/packages/lock.yaml" + ] + }, "symfony/monolog-bridge": { "version": "v5.2.5" }, @@ -400,6 +412,9 @@ "symfony/psr-http-message-bridge": { "version": "v2.1.0" }, + "symfony/rate-limiter": { + "version": "v5.3.0" + }, "symfony/routing": { "version": "4.2", "recipe": { From d895f004006e3145aa12476c258e50fdce46e26c Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 6 Jun 2021 11:33:16 +0200 Subject: [PATCH 134/151] upgrade symfony 5.3 --- src/Controller/FlyOverController.php | 4 ++-- src/Serializer/ObserverNormalizer.php | 14 ++++++-------- src/ViewModel/LatLng.php | 2 +- src/ViewModel/Observer.php | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 21be595..f337cbe 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -55,7 +55,7 @@ public function flyover( $parameters['satelliteId'] = $id; - $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimeZone()]); + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); foreach ($members as $index => &$member) { $member = array_merge( @@ -122,7 +122,7 @@ public function flyoverDetails( return $this->response( array_merge( $data, - $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimeZone(), 'details' => true]) + $this->normalizer->normalize($pass, null, ['timezone' => $observer->getTimezone(), 'details' => true]) ) ); } diff --git a/src/Serializer/ObserverNormalizer.php b/src/Serializer/ObserverNormalizer.php index e498d69..15ccde1 100644 --- a/src/Serializer/ObserverNormalizer.php +++ b/src/Serializer/ObserverNormalizer.php @@ -22,14 +22,12 @@ public function __construct(protected ObjectNormalizer $normalizer) */ public function normalize($object, string $format = null, array $context = []): array { - $result = $this->normalizer->normalize($object); - - unset($result['timeZone']); - - $result['@type'] = 'Observer'; - $result['datetime'] = $object->datetime; - - return $result; + return array_merge( + [ + '@type' => 'Observer', + ], + $this->normalizer->normalize($object) + ); } public function supportsNormalization($data, string $format = null): bool diff --git a/src/ViewModel/LatLng.php b/src/ViewModel/LatLng.php index 64fa7d0..f93a368 100644 --- a/src/ViewModel/LatLng.php +++ b/src/ViewModel/LatLng.php @@ -20,7 +20,7 @@ public function __construct(public float $latitude, public float $longitude) } } - public function getTimeZone(): ?string + public function getTimezone(): ?string { $diffs = []; foreach (DateTimeZone::listIdentifiers() as $timezoneID) { diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php index 93385a9..8fa4eeb 100644 --- a/src/ViewModel/Observer.php +++ b/src/ViewModel/Observer.php @@ -4,12 +4,12 @@ class Observer extends LatLng { - public \DateTime $datetime; + public \DateTime $date; public function __construct(float $latitude, float $longitude, public $altitude = 0, ?\DateTime $dateTime = null) { parent::__construct($latitude, $longitude); - $this->datetime = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimeZone())); + $this->date = $dateTime ?? new \DateTime('now', new \DateTimeZone($this->getTimezone())); } } From 4fbf610251fd4a999983876a3e01acd4fe6b8096 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Mon, 7 Jun 2021 15:10:14 +0200 Subject: [PATCH 135/151] setup sentry filter --- config/packages/prod/sentry.yaml | 2 ++ src/Service/SentryCallbackBeforeSend.php | 26 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/Service/SentryCallbackBeforeSend.php diff --git a/config/packages/prod/sentry.yaml b/config/packages/prod/sentry.yaml index 342036f..a03c7fe 100644 --- a/config/packages/prod/sentry.yaml +++ b/config/packages/prod/sentry.yaml @@ -1,2 +1,4 @@ sentry: dsn: '%env(SENTRY_DSN)%' + options: + before_send: 'App\Service\SentryCallbackBeforeSend' diff --git a/src/Service/SentryCallbackBeforeSend.php b/src/Service/SentryCallbackBeforeSend.php new file mode 100644 index 0000000..a086de2 --- /dev/null +++ b/src/Service/SentryCallbackBeforeSend.php @@ -0,0 +1,26 @@ +getExceptions(); + + foreach ($exceptions as $exception) { + if (in_array($exception->getType(), self::SKIP)) { + return null; + } + } + + return $event; + } +} From 956c5a0419fcf632fd8d66d617cc4f3259f4d092 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Thu, 10 Jun 2021 11:35:47 +0200 Subject: [PATCH 136/151] upgrade symfony 5.3 --- deploy.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deploy.php b/deploy.php index 4a8d877..7834835 100644 --- a/deploy.php +++ b/deploy.php @@ -55,12 +55,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', - 'deploy:vendors', +// 'deploy:vendors', 'deploy:writable', - 'deploy:cache:clear', - 'deploy:cache:warmup', - 'deploy:dump-env', - 'database:migrate', +// 'deploy:cache:clear', +// 'deploy:cache:warmup', +// 'deploy:dump-env', +// 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', From 512b02c60e9693790dbeccc5fbfe5927693b98fe Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 11 Jun 2021 20:36:55 +0200 Subject: [PATCH 137/151] sentry test --- src/Controller/TleController.php | 1 - .../DocsControllerTest.php} | 81 ++++--- .../PropagateControllerTest.php | 223 +++++++++--------- .../StatisticsControllerTest.php | 31 +-- tests/{ => Controller}/TleControllerTest.php | 107 +++++---- tests/Service/SentryCallbackTest.php | 43 ++++ 6 files changed, 267 insertions(+), 219 deletions(-) rename tests/{DocumentationTest.php => Controller/DocsControllerTest.php} (80%) rename tests/{ => Controller}/PropagateControllerTest.php (97%) rename tests/{ => Controller}/StatisticsControllerTest.php (81%) rename tests/{ => Controller}/TleControllerTest.php (86%) create mode 100644 tests/Service/SentryCallbackTest.php diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index f763330..192af77 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -2,7 +2,6 @@ namespace App\Controller; -use App\Entity\Tle; use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; use App\ViewModel\Filter; diff --git a/tests/DocumentationTest.php b/tests/Controller/DocsControllerTest.php similarity index 80% rename from tests/DocumentationTest.php rename to tests/Controller/DocsControllerTest.php index 1878bb8..a322506 100644 --- a/tests/DocumentationTest.php +++ b/tests/Controller/DocsControllerTest.php @@ -1,37 +1,44 @@ -get('/api/tle.json'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); - - $response = $this->toArray($response); - - $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; - $paginationSchema = $response['components']['schemas']['Pagination']['properties']; - $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; - - $tle = TleFixtures::create(); - - $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); - - self::assertCount(\count($tleSchema), $response); - self::assertEquals(array_keys($tleSchema), array_keys($response)); - - $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); - - self::assertCount(\count($paginationSchema), $response['view']); - self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); - - self::assertCount(\count($response), $collectionSchema); - self::assertEquals(array_keys($response), array_keys($collectionSchema)); - } -} +get('/api/tle.json'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode(), 'Assert json documentation is available'); + + $response = $this->toArray($response); + + $collectionSchema = $response['paths']['/api/tle']['get']['responses'][200]['content']['application/json']['schema']['properties']; + $paginationSchema = $response['components']['schemas']['Pagination']['properties']; + $tleSchema = $response['components']['schemas']['TleModel']['allOf'][0]['properties']; + + $tle = TleFixtures::create(); + + $response = $this->toArray($this->get('/api/tle/' . $tle->getId())); + + self::assertCount(\count($tleSchema), $response); + self::assertEquals(array_keys($tleSchema), array_keys($response)); + + $response = $this->toArray($this->get('/api/tle/', ['page-size' => 2, 'page' => 2])); + + self::assertCount(\count($paginationSchema), $response['view']); + self::assertEquals(array_keys($paginationSchema), array_keys($response['view'])); + + self::assertCount(\count($response), $collectionSchema); + self::assertEquals(array_keys($response), array_keys($collectionSchema)); + } + + public function testHomepage(): void { + $response = $this->get('/api/tle/docs'); + + self::assertEmpty($response->getContent()); + } +} diff --git a/tests/PropagateControllerTest.php b/tests/Controller/PropagateControllerTest.php similarity index 97% rename from tests/PropagateControllerTest.php rename to tests/Controller/PropagateControllerTest.php index ff3f655..44cd28b 100644 --- a/tests/PropagateControllerTest.php +++ b/tests/Controller/PropagateControllerTest.php @@ -1,112 +1,111 @@ -get('/api/tle/0/propagate'); - - self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); - } - - public function testPropagateSGP4(): void - { - $tle = TleFixtures::create(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SGP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 3731.3677738358); - self::assertEquals($response['vector']['position']['y'], -3929.0247024138); - self::assertEquals($response['vector']['position']['z'], -3820.6175474185); - self::assertEquals($response['vector']['position']['r'], 6630.0421581948); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); - self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); - self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); - self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], -35.362152001955); - self::assertEquals($response['geodetic']['longitude'], 221.21616992358); - self::assertEquals($response['geodetic']['altitude'], 259.03105001661); - - self::assertEquals($response['parameters']['satelliteId'], 43550); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } - - public function testPropagateSDP4(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get( - '/api/tle/' . $tle->getId() . '/propagate', - [ - 'date' => '2021-04-26T17:49:45+02:00', - ] - ); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - - $response = $this->toArray($response); - - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); - - self::assertArrayHasKey('tle', $response); - - self::assertEquals($response['algorithm'], 'SDP4'); - - self::assertEquals($response['vector']['reference_frame'], 'ECI'); - - self::assertEquals($response['vector']['position']['x'], 142825.54086031896); - self::assertEquals($response['vector']['position']['y'], 133973.34798843606); - self::assertEquals($response['vector']['position']['z'], 1303.6185230048); - self::assertEquals($response['vector']['position']['r'], 195830.7751976863); - self::assertEquals($response['vector']['position']['unit'], 'km'); - - self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); - self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); - self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); - self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); - - self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); - self::assertEquals($response['geodetic']['longitude'], 310.86248495862); - self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); - - self::assertEquals($response['parameters']['satelliteId'], 22049); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); - } -} +get('/api/tle/0/propagate'); + + self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + } + + public function testPropagateSGP4(): void + { + $tle = TleFixtures::create(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SGP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 3731.3677738358); + self::assertEquals($response['vector']['position']['y'], -3929.0247024138); + self::assertEquals($response['vector']['position']['z'], -3820.6175474185); + self::assertEquals($response['vector']['position']['r'], 6630.0421581948); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); + self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); + self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); + self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], -35.362152001955); + self::assertEquals($response['geodetic']['longitude'], 221.21616992358); + self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + + self::assertEquals($response['parameters']['satelliteId'], 43550); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } + + public function testPropagateSDP4(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get( + '/api/tle/' . $tle->getId() . '/propagate', + [ + 'date' => '2021-04-26T17:49:45+02:00', + ] + ); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + + $response = $this->toArray($response); + + self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); + self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); + self::assertEquals($response['@type'], 'SatellitePropagationResult'); + + self::assertArrayHasKey('tle', $response); + + self::assertEquals($response['algorithm'], 'SDP4'); + + self::assertEquals($response['vector']['reference_frame'], 'ECI'); + + self::assertEquals($response['vector']['position']['x'], 142825.54086031896); + self::assertEquals($response['vector']['position']['y'], 133973.34798843606); + self::assertEquals($response['vector']['position']['z'], 1303.6185230048); + self::assertEquals($response['vector']['position']['r'], 195830.7751976863); + self::assertEquals($response['vector']['position']['unit'], 'km'); + + self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); + self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); + self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); + self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); + self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + + self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); + self::assertEquals($response['geodetic']['longitude'], 310.86248495862); + self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + + self::assertEquals($response['parameters']['satelliteId'], 22049); + self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + } +} diff --git a/tests/StatisticsControllerTest.php b/tests/Controller/StatisticsControllerTest.php similarity index 81% rename from tests/StatisticsControllerTest.php rename to tests/Controller/StatisticsControllerTest.php index a2e95ab..86e91a4 100644 --- a/tests/StatisticsControllerTest.php +++ b/tests/Controller/StatisticsControllerTest.php @@ -1,15 +1,16 @@ -get('/api/tle/hits'); - - self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); - } -} +get('/api/tle/hits'); + + self::assertEquals(Response::HTTP_OK, $response->getStatusCode()); + } +} diff --git a/tests/TleControllerTest.php b/tests/Controller/TleControllerTest.php similarity index 86% rename from tests/TleControllerTest.php rename to tests/Controller/TleControllerTest.php index 082b8d7..59f2470 100644 --- a/tests/TleControllerTest.php +++ b/tests/Controller/TleControllerTest.php @@ -1,54 +1,53 @@ - 'tle:calculate', - '--tle' => TleFixtures::createDeep()->getId(), - ] - ); - - $application = new Application(static::$kernel); - $application->setAutoExit(false); - $application->run($input, new BufferedOutput()); - } - - public function testTleExtraFieldsMissingData(): void - { - $tle = TleFixtures::createDeep(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } - - public function testTleExtraFields(): void - { - $tle = TleFixtures::create(); - - $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); - - $response = $this->toArray($response); - - $this->assertTle($tle, $response); - } -} + 'tle:calculate', + '--tle' => TleFixtures::createDeep()->getId(), + ] + ); + + $application = new Application(static::$kernel); + $application->setAutoExit(false); + $application->run($input, new BufferedOutput()); + } + + public function testTleExtraFieldsMissingData(): void + { + $tle = TleFixtures::createDeep(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } + + public function testTleExtraFields(): void + { + $tle = TleFixtures::create(); + + $response = $this->get('/api/tle/' . $tle->getId(), ['extra' => 1]); + + $response = $this->toArray($response); + + $this->assertTle($tle, $response); + } +} diff --git a/tests/Service/SentryCallbackTest.php b/tests/Service/SentryCallbackTest.php new file mode 100644 index 0000000..5feac85 --- /dev/null +++ b/tests/Service/SentryCallbackTest.php @@ -0,0 +1,43 @@ +setExceptions( + [ + new ExceptionDataBag(new NotFoundHttpException()), + ] + ); + + self::assertNull($callback($event)); + } + + public function testOtherExceptionsForwarded(): void + { + $callback = new SentryCallbackBeforeSend(); + + $event = Event::createTransaction(); + + $event->setExceptions( + [ + new ExceptionDataBag(new \Exception()), + ] + ); + + /** @noinspection GetClassUsageInspection */ + self::assertEquals(Event::class, get_class($callback($event))); + } +} From d1d6fd0028a8cb2f14ec70b4f748199c97b43647 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 11 Jun 2021 21:38:35 +0200 Subject: [PATCH 138/151] refactor --- src/Controller/AbstractApiController.php | 7 ++++++ src/Controller/PropagateController.php | 31 +++++++----------------- src/Enum/PropagatorAlgorithm.php | 11 +++++++++ 3 files changed, 27 insertions(+), 22 deletions(-) create mode 100644 src/Enum/PropagatorAlgorithm.php diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 172b434..bc64fa9 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -117,4 +117,11 @@ public function response(array $data): JsonResponse Response::HTTP_OK, ); } + + protected function getDate(Request $request, string $name): \DateTime + { + $date = $request->get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + + return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); + } } diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index a8f4b77..5791a12 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -2,13 +2,12 @@ namespace App\Controller; -use App\Entity\Tle; +use App\Enum\PropagatorAlgorithm; use App\Repository\TleRepository; use App\Service\Traits\TleHttpTrait; use Ivanstan\Tle\Model\Tle as TleModel; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -19,8 +18,11 @@ final class PropagateController extends AbstractApiController protected const DEEP_SATELLITE_PERIOD = 225; // minutes + protected \Predict_SGPSDP $propagator; + public function __construct(protected TleRepository $repository) { + $this->propagator = new \Predict_SGPSDP(); } #[Route("/api/tle/{id}/propagate", name: "tle_propagate", requirements: ["id" => "\d+"])] @@ -29,32 +31,17 @@ public function propagate( Request $request, NormalizerInterface $normalizer ): JsonResponse { - /** @var Tle $tle */ - $tle = $this->repository->findOneBy(['id' => $id]); - if ($tle === null) { - throw new NotFoundHttpException(\sprintf('Unable to find record with id %s', $id)); - } + $tle = $this->getTle($id); $tleModel = new TleModel($tle->getLine1(), $tle->getLine2(), $tle->getName()); $sat = new \Predict_Sat(new \Predict_TLE($tle->getName(), $tle->getLine1(), $tle->getLine2())); - $date = $request->get('date', (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); - $datetime = \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); - - $dateTimeUTC = clone $datetime; - $dateTimeUTC->setTimezone(new \DateTimeZone('UTC')); - $epoch = \DateTime::createFromFormat(\DateTimeInterface::ATOM, $tleModel->getDate()); + $datetime = $this->getDate($request, 'date'); + $deltaT = ($datetime->getTimestamp() - $tleModel->epochDateTime()->getTimestamp()) / 60; // minutes - $deltaT = ($datetime->getTimestamp() - $epoch->getTimestamp()) / 60; // minutes + $algorithm = ($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD ? PropagatorAlgorithm::SDP4 : PropagatorAlgorithm::SGP4; - $propagator = new \Predict_SGPSDP(); - if (($tleModel->period() / 60) > self::DEEP_SATELLITE_PERIOD) { - $propagator->SDP4($sat, $deltaT); - $algorithm = 'SDP4'; - } else { - $propagator->SGP4($sat, $deltaT); - $algorithm = 'SGP4'; - } + $this->propagator->$algorithm($sat, $deltaT); \Predict_Math::Convert_Sat_State($sat->pos, $sat->vel); diff --git a/src/Enum/PropagatorAlgorithm.php b/src/Enum/PropagatorAlgorithm.php new file mode 100644 index 0000000..9e92b79 --- /dev/null +++ b/src/Enum/PropagatorAlgorithm.php @@ -0,0 +1,11 @@ + Date: Fri, 11 Jun 2021 22:11:20 +0200 Subject: [PATCH 139/151] refactor --- config/packages/doctrine_migrations.yaml | 2 +- src/Command/TleCalculate.php | 2 +- src/Command/UpdateImportSources.php | 2 +- src/Controller/AbstractApiController.php | 5 +---- src/Controller/FlyOverController.php | 16 ++++++++++------ src/Controller/PropagateController.php | 2 +- src/Controller/StatisticsController.php | 5 +++-- src/Entity/Tle.php | 2 +- src/Event/ApiExceptionSubscriber.php | 2 -- src/Event/ApiLimiterSubscriber.php | 4 ++-- src/Migrations/Version20191217203053.php | 2 +- src/Migrations/Version20210308195105.php | 7 +------ src/Migrations/Version20210322151101.php | 7 +------ src/Migrations/Version20210331192030.php | 7 +------ src/Migrations/Version20210402050806.php | 7 +------ src/Migrations/Version20210420125645.php | 7 +------ src/Migrations/Version20210420170012.php | 7 +------ src/Migrations/Version20210426124814.php | 7 +------ src/Migrations/Version20210524103622.php | 7 +------ src/Migrations/Version20210605124127.php | 2 +- src/Serializer/SatellitePassNormalizer.php | 7 +++---- src/Serializer/TleModelNormalizer.php | 22 +++++++++++----------- src/ViewModel/Filter.php | 2 +- 23 files changed, 46 insertions(+), 87 deletions(-) diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml index aa336b1..19b53d5 100644 --- a/config/packages/doctrine_migrations.yaml +++ b/config/packages/doctrine_migrations.yaml @@ -1,3 +1,3 @@ doctrine_migrations: migrations_paths: - 'DoctrineMigrations': '%kernel.project_dir%/src/Migrations' + App\Migrations: '%kernel.project_dir%/src/Migrations' diff --git a/src/Command/TleCalculate.php b/src/Command/TleCalculate.php index 8adb615..784f15b 100644 --- a/src/Command/TleCalculate.php +++ b/src/Command/TleCalculate.php @@ -23,7 +23,7 @@ public function __construct(protected EntityManagerInterface $entityManager) parent::__construct(); } - protected function configure() + protected function configure(): void { $this->setDescription('Calculate and persist data in TleInformation entity'); $this->addOption(self::OPTION_TLE, 't', InputOption::VALUE_REQUIRED, 'Calculate only for specified record'); diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index 6ce7e84..fe3713c 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -1,4 +1,4 @@ -get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(self::DATETIME_FORMAT)); + $date = $request->get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTimeInterface::ATOM)); return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); } diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index f337cbe..7708290 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -55,10 +55,12 @@ public function flyover( $parameters['satelliteId'] = $id; - $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); + $normalized = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); - foreach ($members as $index => &$member) { - $member = array_merge( + $members = []; + + foreach ($normalized as $index => $member) { + $members[] = [ [ '@id' => $this->generateUrl( 'tle_flyover_details', @@ -66,10 +68,12 @@ public function flyover( UrlGeneratorInterface::ABSOLUTE_URL ), ], - $member - ); + $member, + ]; } + $members = array_merge([], ...$members); + return $this->response( [ '@context' => self::HYDRA_CONTEXT, @@ -104,7 +108,7 @@ public function flyoverDetails( $pass = $results[$passId] ?? null; if ($pass === null) { - throw new NotFoundHttpException(\sprintf('Unable to find requested flyover details')); + throw new NotFoundHttpException('Unable to find requested flyover details'); } $url = $this->router->generate( diff --git a/src/Controller/PropagateController.php b/src/Controller/PropagateController.php index 5791a12..d2befb8 100644 --- a/src/Controller/PropagateController.php +++ b/src/Controller/PropagateController.php @@ -52,7 +52,7 @@ public function propagate( $sat_geodetic->lon = rad2deg($sat_geodetic->lon); $parameters = [ - 'date' => $datetime->format(self::DATETIME_FORMAT), + 'date' => $datetime->format(\DateTimeInterface::ATOM), ]; $url = $this->router->generate( diff --git a/src/Controller/StatisticsController.php b/src/Controller/StatisticsController.php index 9d5b7a7..ba3acd7 100644 --- a/src/Controller/StatisticsController.php +++ b/src/Controller/StatisticsController.php @@ -18,7 +18,7 @@ public function hits( EntityManagerInterface $em ): Response { $newerThan = new \DateTime('now'); - $newerThan->setTime(0, 0, 0); + $newerThan->setTime(0, 0); $newerThan->modify('-3 days'); $qb = $em->createQueryBuilder(); @@ -38,6 +38,7 @@ public function hits( ->groupBy('date, hour') ->setParameter('interval', self::INTERVAL); + /** @var Request[] $result */ $result = $qb->getQuery()->getResult(); $response = []; @@ -54,7 +55,7 @@ public function hits( $date = new \DateTime($item['date']); $date->setTime((int)$item['hour'] * self::INTERVAL, 0); - $response[$date->format(self::DATETIME_FORMAT)] = $item['hits']; + $response[$date->format(\DateTimeInterface::ATOM)] = $item['hits']; } return new JsonResponse( diff --git a/src/Entity/Tle.php b/src/Entity/Tle.php index 01ccef3..6ddfe45 100644 --- a/src/Entity/Tle.php +++ b/src/Entity/Tle.php @@ -22,7 +22,7 @@ class Tle /** * @OneToOne(targetEntity="TleInformation", mappedBy="tle") */ - private $info; + private ?TleInformation $info = null; /** * @ORM\Column(name="updated_at", type="datetime") diff --git a/src/Event/ApiExceptionSubscriber.php b/src/Event/ApiExceptionSubscriber.php index 69bc8b3..6e83754 100644 --- a/src/Event/ApiExceptionSubscriber.php +++ b/src/Event/ApiExceptionSubscriber.php @@ -2,13 +2,11 @@ namespace App\Event; -use App\Controller\AbstractApiController; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Exception\HttpException; -use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; use Symfony\Component\HttpKernel\KernelEvents; class ApiExceptionSubscriber implements EventSubscriberInterface diff --git a/src/Event/ApiLimiterSubscriber.php b/src/Event/ApiLimiterSubscriber.php index 5f098b7..0159c8a 100644 --- a/src/Event/ApiLimiterSubscriber.php +++ b/src/Event/ApiLimiterSubscriber.php @@ -48,7 +48,7 @@ public function onRequest(RequestEvent $event): void if (false === $limit->isAccepted()) { $headers = [ 'X-RateLimit-Remaining' => $limit->getRemainingTokens(), - 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format('c'), + 'X-RateLimit-Retry-After' => $limit->getRetryAfter()->format(\DateTimeInterface::ATOM), 'X-RateLimit-Limit' => $limit->getLimit(), ]; @@ -56,7 +56,7 @@ public function onRequest(RequestEvent $event): void new JsonResponse( [ 'response' => [ - 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format('c')), + 'message' => \sprintf('Too many requests. Retry after %s.', $limit->getRetryAfter()->format(\DateTimeInterface::ATOM)), 'limit' => $limit->getLimit(), 'remaining' => $limit->getRemainingTokens(), ], diff --git a/src/Migrations/Version20191217203053.php b/src/Migrations/Version20191217203053.php index f68c4e8..60949fe 100644 --- a/src/Migrations/Version20191217203053.php +++ b/src/Migrations/Version20191217203053.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; diff --git a/src/Migrations/Version20210308195105.php b/src/Migrations/Version20210308195105.php index 49feca7..4d927e0 100644 --- a/src/Migrations/Version20210308195105.php +++ b/src/Migrations/Version20210308195105.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -23,11 +23,6 @@ public function down(Schema $schema): void $this->addSql('DROP TABLE statistic'); } - public function getDescription(): string - { - return ''; - } - public function isTransactional(): bool { return false; diff --git a/src/Migrations/Version20210322151101.php b/src/Migrations/Version20210322151101.php index 2d95f5d..94d1f08 100644 --- a/src/Migrations/Version20210322151101.php +++ b/src/Migrations/Version20210322151101.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210322151101 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210331192030.php b/src/Migrations/Version20210331192030.php index 0404c36..0af9a58 100644 --- a/src/Migrations/Version20210331192030.php +++ b/src/Migrations/Version20210331192030.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210331192030 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210402050806.php b/src/Migrations/Version20210402050806.php index 442c840..aa579bf 100644 --- a/src/Migrations/Version20210402050806.php +++ b/src/Migrations/Version20210402050806.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -17,11 +17,6 @@ public function isTransactional(): bool return false; } - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210420125645.php b/src/Migrations/Version20210420125645.php index 0942a2c..ce2fa46 100644 --- a/src/Migrations/Version20210420125645.php +++ b/src/Migrations/Version20210420125645.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210420125645 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210420170012.php b/src/Migrations/Version20210420170012.php index 7755448..177a0cf 100644 --- a/src/Migrations/Version20210420170012.php +++ b/src/Migrations/Version20210420170012.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210420170012 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210426124814.php b/src/Migrations/Version20210426124814.php index 44a827e..8baa678 100644 --- a/src/Migrations/Version20210426124814.php +++ b/src/Migrations/Version20210426124814.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210426124814 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function isTransactional(): bool { return false; diff --git a/src/Migrations/Version20210524103622.php b/src/Migrations/Version20210524103622.php index 7c8a16c..ca8913c 100644 --- a/src/Migrations/Version20210524103622.php +++ b/src/Migrations/Version20210524103622.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -12,11 +12,6 @@ */ final class Version20210524103622 extends AbstractMigration { - public function getDescription() : string - { - return ''; - } - public function up(Schema $schema) : void { // this up() migration is auto-generated, please modify it to your needs diff --git a/src/Migrations/Version20210605124127.php b/src/Migrations/Version20210605124127.php index e9a424a..4a4bae5 100644 --- a/src/Migrations/Version20210605124127.php +++ b/src/Migrations/Version20210605124127.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace DoctrineMigrations; +namespace App\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; diff --git a/src/Serializer/SatellitePassNormalizer.php b/src/Serializer/SatellitePassNormalizer.php index d1979e1..7e59c35 100644 --- a/src/Serializer/SatellitePassNormalizer.php +++ b/src/Serializer/SatellitePassNormalizer.php @@ -2,7 +2,6 @@ namespace App\Serializer; -use App\Controller\AbstractApiController; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; @@ -28,21 +27,21 @@ public function normalize($object, string $format = null, array $context = []): '@type' => $details ? 'SatelliteFlyOverDetails' : 'SatelliteFlyOver', 'aos' => [ 'date' => \Predict_Time::daynum2datetime($object->visible_aos ?? $object->aos, $timezone)->format( - AbstractApiController::DATETIME_FORMAT + \DateTimeInterface::ATOM ), 'azimuth' => round($object->visible_aos_az ?? null, 2), 'elevation' => round($object->visible_aos_el ?? null, 2), ], 'max' => [ 'date' => \Predict_Time::daynum2datetime($object->visible_tca ?? $object->tca, $timezone)->format( - AbstractApiController::DATETIME_FORMAT + \DateTimeInterface::ATOM ), 'azimuth' => round($object->visible_max_el_az ?? null, 2), 'elevation' => round($object->visible_max_el ?? null, 2), ], 'los' => [ 'date' => \Predict_Time::daynum2datetime($object->visible_los ?? $object->los, $timezone)->format( - AbstractApiController::DATETIME_FORMAT + \DateTimeInterface::ATOM ), 'azimuth' => round($object->visible_los_az ?? $object->los_az, 2), 'elevation' => round($object->visible_los_el ?? null, 2), diff --git a/src/Serializer/TleModelNormalizer.php b/src/Serializer/TleModelNormalizer.php index 2357599..2e65c22 100644 --- a/src/Serializer/TleModelNormalizer.php +++ b/src/Serializer/TleModelNormalizer.php @@ -16,17 +16,17 @@ public function __construct(private UrlGeneratorInterface $router) } /** - * @param Tle $entity + * @param Tle $object * @param string|null $format * @param array $context * * @return array */ - public function normalize($entity, ?string $format = null, array $context = []): array + public function normalize($object, ?string $format = null, array $context = []): array { - $id = $this->router->generate('tle_record', ['id' => $entity->getId()], UrlGeneratorInterface::ABSOLUTE_URL); + $id = $this->router->generate('tle_record', ['id' => $object->getId()], UrlGeneratorInterface::ABSOLUTE_URL); - $model = new TleModel($entity->getLine1(), $entity->getLine2(), $entity->getName()); + $model = new TleModel($object->getLine1(), $object->getLine2(), $object->getName()); $isExtra = ($context[TleController::PARAM_EXTRA] ?? null) === true; @@ -35,19 +35,19 @@ public function normalize($entity, ?string $format = null, array $context = []): '@type' => 'TleModel', 'satelliteId' => $model->getId(), 'name' => $model->getName(), - 'date' => $model->getDate(), + 'date' => $model->epochDateTime()->format(\DateTimeInterface::ATOM), 'line1' => $model->getLine1(), 'line2' => $model->getLine2(), ]; - if ($isExtra && $entity->getInfo()) { + if ($isExtra && $object->getInfo()) { $extra = [ 'extra' => [ - TleCollectionSortableFieldsEnum::ECCENTRICITY => $entity->getInfo()->eccentricity, - TleCollectionSortableFieldsEnum::INCLINATION => $entity->getInfo()->inclination, - TleCollectionSortableFieldsEnum::PERIOD => $entity->getInfo()->period, - TleCollectionSortableFieldsEnum::RAAN => $entity->getInfo()->raan, - TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $entity->getInfo()->semiMajorAxis, + TleCollectionSortableFieldsEnum::ECCENTRICITY => $object->getInfo()->eccentricity, + TleCollectionSortableFieldsEnum::INCLINATION => $object->getInfo()->inclination, + TleCollectionSortableFieldsEnum::PERIOD => $object->getInfo()->period, + TleCollectionSortableFieldsEnum::RAAN => $object->getInfo()->raan, + TleCollectionSortableFieldsEnum::SEMI_MAJOR_AXIS => $object->getInfo()->semiMajorAxis, ], ]; diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php index 4ad6d43..982c518 100644 --- a/src/ViewModel/Filter.php +++ b/src/ViewModel/Filter.php @@ -64,7 +64,7 @@ protected function validateOperator(): string /** * @noinspection CallableParameterUseCaseInTypeContextInspection */ - protected function validateValue(string $value): mixed + protected function validateValue(string $value): ?float { if ($this->type === self::FILTER_TYPE_FLOAT) { $value = (float)$value; From 6884e4b1794320eb4da368f7c9523750ad4ff249 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Fri, 11 Jun 2021 22:16:40 +0200 Subject: [PATCH 140/151] update tests --- tests/AssertionTrait.php | 4 +- tests/Controller/PropagateControllerTest.php | 82 ++++++++++---------- tests/ErrorPageTest.php | 2 +- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/tests/AssertionTrait.php b/tests/AssertionTrait.php index bdb68f2..c82a1b0 100644 --- a/tests/AssertionTrait.php +++ b/tests/AssertionTrait.php @@ -6,7 +6,7 @@ trait AssertionTrait { - public function assertTle(Tle $tle, array $response, bool $extra = false): void + public function assertTle(Tle $tle, array $response): void { $model = new \Ivanstan\Tle\Model\Tle($tle->getLine1(), $tle->getLine2(), $tle->getName()); @@ -15,7 +15,7 @@ public function assertTle(Tle $tle, array $response, bool $extra = false): void self::assertEquals('TleModel', $response['@type']); self::assertEquals($tle->getId(), $response['satelliteId']); self::assertEquals($tle->getName(), $response['name']); - self::assertEquals($model->getDate(), $response['date']); + self::assertEquals($model->epochDateTime()->format(\DateTimeInterface::ATOM), $response['date']); self::assertEquals($tle->getLine1(), $response['line1']); self::assertEquals($tle->getLine2(), $response['line2']); } diff --git a/tests/Controller/PropagateControllerTest.php b/tests/Controller/PropagateControllerTest.php index 44cd28b..236e04e 100644 --- a/tests/Controller/PropagateControllerTest.php +++ b/tests/Controller/PropagateControllerTest.php @@ -16,7 +16,7 @@ public function testResourceNotFound(): void $response = $this->toArray($response); - self::assertEquals($response['response']['message'], 'Unable to find record with id 0'); + self::assertEquals('Unable to find record with id 0', $response['response']['message']); } public function testPropagateSGP4(): void @@ -34,34 +34,34 @@ public function testPropagateSGP4(): void $response = $this->toArray($response); - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/43550/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); + self::assertEquals('SatellitePropagationResult', $response['@type']); self::assertArrayHasKey('tle', $response); - self::assertEquals($response['algorithm'], 'SGP4'); + self::assertEquals('SGP4', $response['algorithm']); - self::assertEquals($response['vector']['reference_frame'], 'ECI'); + self::assertEquals('ECI', $response['vector']['reference_frame']); - self::assertEquals($response['vector']['position']['x'], 3731.3677738358); - self::assertEquals($response['vector']['position']['y'], -3929.0247024138); - self::assertEquals($response['vector']['position']['z'], -3820.6175474185); - self::assertEquals($response['vector']['position']['r'], 6630.0421581948); - self::assertEquals($response['vector']['position']['unit'], 'km'); + self::assertEquals(3731.3677738358, $response['vector']['position']['x']); + self::assertEquals(-3929.0247024138, $response['vector']['position']['y']); + self::assertEquals(-3820.6175474185, $response['vector']['position']['z']); + self::assertEquals(6630.0421581948, $response['vector']['position']['r']); + self::assertEquals('km', $response['vector']['position']['unit']); - self::assertEquals($response['vector']['velocity']['x'], 2.2692661551689); - self::assertEquals($response['vector']['velocity']['y'], 6.1586427245624); - self::assertEquals($response['vector']['velocity']['z'], -4.1239106928913); - self::assertEquals($response['vector']['velocity']['r'], 7.7514571852487); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + self::assertEquals(2.2692661551689, $response['vector']['velocity']['x']); + self::assertEquals(6.1586427245624, $response['vector']['velocity']['y']); + self::assertEquals(-4.1239106928913, $response['vector']['velocity']['z']); + self::assertEquals(7.7514571852487, $response['vector']['velocity']['r']); + self::assertEquals('km/s', $response['vector']['velocity']['unit']); - self::assertEquals($response['geodetic']['latitude'], -35.362152001955); - self::assertEquals($response['geodetic']['longitude'], 221.21616992358); - self::assertEquals($response['geodetic']['altitude'], 259.03105001661); + self::assertEquals(-35.362152001955, $response['geodetic']['latitude']); + self::assertEquals(221.21616992358, $response['geodetic']['longitude']); + self::assertEquals(259.03105001661, $response['geodetic']['altitude']); - self::assertEquals($response['parameters']['satelliteId'], 43550); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + self::assertEquals(43550, $response['parameters']['satelliteId']); + self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); } public function testPropagateSDP4(): void @@ -79,33 +79,33 @@ public function testPropagateSDP4(): void $response = $this->toArray($response); - self::assertEquals($response['@context'], 'https://www.w3.org/ns/hydra/context.jsonld'); - self::assertEquals($response['@id'], 'http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00'); - self::assertEquals($response['@type'], 'SatellitePropagationResult'); + self::assertEquals('https://www.w3.org/ns/hydra/context.jsonld', $response['@context']); + self::assertEquals('http://localhost/api/tle/22049/propagate?date=2021-04-26T17:49:45%2B02:00', $response['@id']); + self::assertEquals('SatellitePropagationResult', $response['@type']); self::assertArrayHasKey('tle', $response); - self::assertEquals($response['algorithm'], 'SDP4'); + self::assertEquals('SDP4', $response['algorithm']); - self::assertEquals($response['vector']['reference_frame'], 'ECI'); + self::assertEquals('ECI', $response['vector']['reference_frame']); - self::assertEquals($response['vector']['position']['x'], 142825.54086031896); - self::assertEquals($response['vector']['position']['y'], 133973.34798843606); - self::assertEquals($response['vector']['position']['z'], 1303.6185230048); - self::assertEquals($response['vector']['position']['r'], 195830.7751976863); - self::assertEquals($response['vector']['position']['unit'], 'km'); + self::assertEquals(142825.54086031896, $response['vector']['position']['x']); + self::assertEquals(133973.34798843606, $response['vector']['position']['y']); + self::assertEquals(1303.6185230048, $response['vector']['position']['z']); + self::assertEquals(195830.7751976863, $response['vector']['position']['r']); + self::assertEquals('km', $response['vector']['position']['unit']); - self::assertEquals($response['vector']['velocity']['x'], -0.51310326492624); - self::assertEquals($response['vector']['velocity']['y'], 0.5491989174236); - self::assertEquals($response['vector']['velocity']['z'], 0.60190735910381); - self::assertEquals($response['vector']['velocity']['r'], 0.96290543685273); - self::assertEquals($response['vector']['velocity']['unit'], 'km/s'); + self::assertEquals(-0.51310326492624, $response['vector']['velocity']['x']); + self::assertEquals(0.5491989174236, $response['vector']['velocity']['y']); + self::assertEquals(0.60190735910381, $response['vector']['velocity']['z']); + self::assertEquals(0.96290543685273, $response['vector']['velocity']['r']); + self::assertEquals('km/s', $response['vector']['velocity']['unit']); - self::assertEquals($response['geodetic']['latitude'], 0.38149611267203); - self::assertEquals($response['geodetic']['longitude'], 310.86248495862); - self::assertEquals($response['geodetic']['altitude'], 189452.64114393186); + self::assertEquals(0.38149611267203, $response['geodetic']['latitude']); + self::assertEquals(310.86248495862, $response['geodetic']['longitude']); + self::assertEquals(189452.64114393186, $response['geodetic']['altitude']); - self::assertEquals($response['parameters']['satelliteId'], 22049); - self::assertEquals($response['parameters']['date'], '2021-04-26T17:49:45+02:00'); + self::assertEquals(22049, $response['parameters']['satelliteId']); + self::assertEquals('2021-04-26T17:49:45+02:00', $response['parameters']['date']); } } diff --git a/tests/ErrorPageTest.php b/tests/ErrorPageTest.php index 6955955..86481ab 100644 --- a/tests/ErrorPageTest.php +++ b/tests/ErrorPageTest.php @@ -11,8 +11,8 @@ public function test404(): void $response = $this->get('/noop'); self::assertEquals( - $response->getStatusCode(), Response::HTTP_NOT_FOUND, + $response->getStatusCode(), 'Assert page not found returns HTTP 404' ); From 79ddd6755293fccc273e8998f349539d627b46b9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 08:50:03 +0200 Subject: [PATCH 141/151] annotations --- src/Command/UpdateImportSources.php | 1 + src/Controller/AbstractApiController.php | 3 ++- src/Controller/DocsController.php | 3 +++ src/Repository/TleRepository.php | 4 ++++ src/ViewModel/Observer.php | 3 +++ tests/AbstractWebTestCase.php | 3 +++ tests/CollectionTest.php | 1 + 7 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Command/UpdateImportSources.php b/src/Command/UpdateImportSources.php index fe3713c..6206d61 100644 --- a/src/Command/UpdateImportSources.php +++ b/src/Command/UpdateImportSources.php @@ -103,6 +103,7 @@ protected function getSources(): array if ($extension === 'txt') { if (parse_url($href, PHP_URL_HOST) === null) { + /** @noinspection PhpArrayKeyDoesNotMatchArrayShapeInspection */ if ($path[0] === '/') { $scheme = parse_url($catalog, PHP_URL_SCHEME); $host = parse_url($catalog, PHP_URL_HOST); diff --git a/src/Controller/AbstractApiController.php b/src/Controller/AbstractApiController.php index 17f2a28..eba101f 100644 --- a/src/Controller/AbstractApiController.php +++ b/src/Controller/AbstractApiController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Service\DateTimeService; use App\Service\Validator\RequestValidator; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; @@ -117,7 +118,7 @@ public function response(array $data): JsonResponse protected function getDate(Request $request, string $name): \DateTime { - $date = $request->get($name, (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTimeInterface::ATOM)); + $date = $request->get($name, DateTimeService::getCurrentUTC()->format(\DateTimeInterface::ATOM)); return \DateTime::createFromFormat(\DateTimeInterface::ATOM, str_replace(' ', '+', $date)); } diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index 2564f29..cb14e4d 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -19,6 +19,9 @@ public function docs(): Response return new Response(file_get_contents($this->getProjectDir() . '/public/index.html')); } + /** + * @throws \JsonException + */ #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index ce57f58..404e5df 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -87,6 +87,10 @@ public function collection( return $collection; } + /** + * @throws \Doctrine\ORM\NoResultException + * @throws \Doctrine\ORM\NonUniqueResultException + */ private function getCount(QueryBuilder $builder): int { $builder = clone $builder; diff --git a/src/ViewModel/Observer.php b/src/ViewModel/Observer.php index 8fa4eeb..9120b7a 100644 --- a/src/ViewModel/Observer.php +++ b/src/ViewModel/Observer.php @@ -6,6 +6,9 @@ class Observer extends LatLng { public \DateTime $date; + /** + * @throws \Exception + */ public function __construct(float $latitude, float $longitude, public $altitude = 0, ?\DateTime $dateTime = null) { parent::__construct($latitude, $longitude); diff --git a/tests/AbstractWebTestCase.php b/tests/AbstractWebTestCase.php index 71b7270..2ef9f49 100644 --- a/tests/AbstractWebTestCase.php +++ b/tests/AbstractWebTestCase.php @@ -23,6 +23,9 @@ protected function get(string $url, array $params = []): Response return self::$client->getResponse(); } + /** + * @throws \JsonException + */ protected function toArray(Response $response): array { return json_decode($response->getContent(), true, 512, JSON_THROW_ON_ERROR); diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index bbe070a..61bf1b8 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -104,6 +104,7 @@ private function assertViewIsCorrect($expected, $actual): void } } + /** @noinspection PhpSameParameterValueInspection */ private function getCollectionContent(int $page, int $pageSize): array { return $this->toArray( From ca4b15848b528f7ccc44d3a3975abc39063144b3 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 09:44:11 +0200 Subject: [PATCH 142/151] annotations --- src/Controller/FlyOverController.php | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index 7708290..f754f91 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -55,24 +55,15 @@ public function flyover( $parameters['satelliteId'] = $id; - $normalized = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); - - $members = []; - - foreach ($normalized as $index => $member) { - $members[] = [ - [ - '@id' => $this->generateUrl( - 'tle_flyover_details', - ['id' => $id, 'passId' => $index], - UrlGeneratorInterface::ABSOLUTE_URL - ), - ], - $member, + $members = $this->normalizer->normalize($results, null, ['timezone' => $observer->getTimezone()]); + + foreach ($members as $index => &$member) { + $item = [ + '@id' => $this->generateUrl('tle_flyover_details', ['id' => $id, 'passId' => $index], UrlGeneratorInterface::ABSOLUTE_URL), ]; - } - $members = array_merge([], ...$members); + $member = $item + $member; + } return $this->response( [ From bb55d90b67350538fadfb0042e72cb55d30711ef Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 10:59:28 +0200 Subject: [PATCH 143/151] fix map arbitrary date --- src/Controller/FlyOverController.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Controller/FlyOverController.php b/src/Controller/FlyOverController.php index f754f91..af24873 100644 --- a/src/Controller/FlyOverController.php +++ b/src/Controller/FlyOverController.php @@ -30,10 +30,11 @@ public function flyover( ): JsonResponse { $observer = $this->getObserver($request); $onlyVisible = $request->get('only_visible', true); + $tle = $this->getTle($id); $this->service ->setObserver($observer) - ->setTle($this->getTle($id)); + ->setTle($tle); if ($onlyVisible) { $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); @@ -71,6 +72,7 @@ public function flyover( '@id' => $url, '@type' => 'SatelliteFlyOverCollection', 'observer' => $this->normalizer->normalize($observer), + 'tle' => $this->normalizer->normalize($tle), 'member' => $members, 'parameters' => $parameters, ] @@ -85,10 +87,11 @@ public function flyoverDetails( ): JsonResponse { $observer = $this->getObserver($request); $onlyVisible = $request->get('only_visible', true); + $tle = $this->getTle($id); $this->service ->setObserver($observer) - ->setTle($this->getTle($id)); + ->setTle($tle); if ($onlyVisible) { $results = $this->service->getVisiblePasses(\Predict_Time::get_current_daynum()); @@ -112,6 +115,7 @@ public function flyoverDetails( '@context' => self::HYDRA_CONTEXT, '@id' => $url, 'observer' => $this->normalizer->normalize($observer), + 'tle' => $this->normalizer->normalize($tle), ]; return $this->response( From 46b5694ca47aa7b0d61d9bc03cbc3c8cc52470bd Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sat, 12 Jun 2021 17:38:06 +0200 Subject: [PATCH 144/151] fix deploy script --- deploy.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/deploy.php b/deploy.php index 7834835..2995177 100644 --- a/deploy.php +++ b/deploy.php @@ -11,6 +11,7 @@ set('writable_mode', 'chmod'); set('default_stage', 'production'); set('bin/composer', '~/bin/composer.phar'); +set('composer_options', '{{composer_action}} --verbose --prefer-dist --no-progress --no-interaction --optimize-autoloader'); add('shared_files', [ '.env', 'public/robots.txt', @@ -55,12 +56,12 @@ 'deploy:create_cache_dir', 'deploy:shared', 'deploy:assets', -// 'deploy:vendors', 'deploy:writable', -// 'deploy:cache:clear', -// 'deploy:cache:warmup', -// 'deploy:dump-env', -// 'database:migrate', + 'deploy:vendors', + 'deploy:cache:clear', + 'deploy:cache:warmup', + 'deploy:dump-env', + 'database:migrate', 'deploy:symlink', 'deploy:unlock', 'cleanup', From 342f56088e806454199eb15aadfaaa9b06a634c9 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 13 Jun 2021 21:29:15 +0200 Subject: [PATCH 145/151] fix deploy script --- src/Controller/TleController.php | 11 ++++++++++ src/Repository/TleRepository.php | 12 +++++++++++ src/Service/Validator/RequestValidator.php | 7 +++++++ src/ViewModel/Filter.php | 21 +++++++++++++++---- .../TleCollectionSortableFieldsEnum.php | 1 + 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/Controller/TleController.php b/src/Controller/TleController.php index 192af77..68caf42 100644 --- a/src/Controller/TleController.php +++ b/src/Controller/TleController.php @@ -28,6 +28,7 @@ final class TleController extends AbstractApiController TleCollectionSortableFieldsEnum::ECCENTRICITY => Filter::FILTER_TYPE_FLOAT, TleCollectionSortableFieldsEnum::INCLINATION => Filter::FILTER_TYPE_FLOAT, TleCollectionSortableFieldsEnum::PERIOD => Filter::FILTER_TYPE_FLOAT, + TleCollectionSortableFieldsEnum::SATELLITE_ID => Filter::FILTER_TYPE_ARRAY, ]; public function __construct(protected TleRepository $repository) @@ -70,6 +71,8 @@ public function collection( $extra = (bool)$request->get(self::PARAM_EXTRA, false); + $satelliteIds = $request->get(TleCollectionSortableFieldsEnum::SATELLITE_ID, []); + /** @var Filter[] $filters */ $filters = $this->assertFilter($request, self::COLLECTION_FILTERS); @@ -96,9 +99,17 @@ public function collection( ]; foreach ($filters as $filter) { + if ($filter->filter === TleCollectionSortableFieldsEnum::SATELLITE_ID) { + continue; + } $parameters[\sprintf('%s[%s]', $filter->filter, $filter->operator)] = $filter->value; } + foreach ($satelliteIds as $index => $satelliteId) { + $name = \sprintf('%s[%d]', TleCollectionSortableFieldsEnum::SATELLITE_ID, $index); + $parameters[$name] = $satelliteId; + } + $response = [ '@context' => self::HYDRA_CONTEXT, '@id' => $this->router->generate('tle_collection', [], UrlGeneratorInterface::ABSOLUTE_URL), diff --git a/src/Repository/TleRepository.php b/src/Repository/TleRepository.php index 404e5df..4b4ee39 100644 --- a/src/Repository/TleRepository.php +++ b/src/Repository/TleRepository.php @@ -5,6 +5,7 @@ use App\Entity\Request; use App\Entity\Tle; use App\Entity\TleInformation; +use App\ViewModel\Filter; use App\ViewModel\Model\PaginationCollection; use App\ViewModel\TleCollectionSortableFieldsEnum; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; @@ -57,6 +58,16 @@ public function collection( // filters foreach ($filters as $index => $filter) { + if ($filter->type === Filter::FILTER_TYPE_ARRAY) { + $paramName = \sprintf('param_%d', $index); + + $builder + ->andWhere(\sprintf("%s IN (:%s)", $this->getSortTableColumnMapping($filter->filter), $paramName)) + ->setParameter($paramName, $filter->value); + + continue; + } + $placeholder = \sprintf('filter_%s_%d', $filter->filter, $index); $builder->andWhere(\sprintf('info.%s %s :%s', $filter->filter, $filter->sqlOperator, $placeholder)); $builder->setParameter($placeholder, $filter->value); @@ -104,6 +115,7 @@ private function getSortTableColumnMapping(string $sort): ?string { return match ($sort) { TleCollectionSortableFieldsEnum::ID => 'tle.id', + TleCollectionSortableFieldsEnum::SATELLITE_ID => 'tle.id', TleCollectionSortableFieldsEnum::NAME => 'tle.name', TleCollectionSortableFieldsEnum::POPULARITY => null, TleCollectionSortableFieldsEnum::INCLINATION => 'info.inclination', diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 14d3519..9826dc4 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -3,6 +3,7 @@ namespace App\Service\Validator; use App\ViewModel\Filter; +use App\ViewModel\TleCollectionSortableFieldsEnum; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; @@ -103,6 +104,12 @@ protected function assertFilter(Request $request, array $filters): array foreach ($filters as $filter => $type) { $values = $request->get($filter, []); + if ($type === Filter::FILTER_TYPE_ARRAY) { + $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); + + continue; + } + foreach ($values as $operator => $value) { $result[] = new Filter($filter, $type, $operator, $value); } diff --git a/src/ViewModel/Filter.php b/src/ViewModel/Filter.php index 982c518..808751c 100644 --- a/src/ViewModel/Filter.php +++ b/src/ViewModel/Filter.php @@ -7,7 +7,9 @@ class Filter { public const FILTER_TYPE_FLOAT = 'float'; + public const FILTER_TYPE_ARRAY = 'array'; + public const OPERATOR_EQUAL = '='; public const OPERATOR_GREATER_THEN = '>'; public const OPERATOR_GREATER_THEN_EQUAL = '>='; public const OPERATOR_LESS_THEN = '<'; @@ -58,13 +60,14 @@ protected function validateOperator(): string return $operators[$this->operator]; } + if ($this->type === self::FILTER_TYPE_ARRAY) { + return self::OPERATOR_EQUAL; + } + return ''; } - /** - * @noinspection CallableParameterUseCaseInTypeContextInspection - */ - protected function validateValue(string $value): ?float + protected function validateValue(mixed $value): mixed { if ($this->type === self::FILTER_TYPE_FLOAT) { $value = (float)$value; @@ -78,6 +81,16 @@ protected function validateValue(string $value): ?float return $value; } + if ($this->type === self::FILTER_TYPE_ARRAY) { + if (!is_array($value)) { + throw new \InvalidArgumentException( + \sprintf('Filter %s value should be %s', $this->filter, $this->type) + ); + } + + return $value; + } + return null; } } diff --git a/src/ViewModel/TleCollectionSortableFieldsEnum.php b/src/ViewModel/TleCollectionSortableFieldsEnum.php index ca3bc88..43a2469 100644 --- a/src/ViewModel/TleCollectionSortableFieldsEnum.php +++ b/src/ViewModel/TleCollectionSortableFieldsEnum.php @@ -13,5 +13,6 @@ class TleCollectionSortableFieldsEnum extends Enum public const ECCENTRICITY = 'eccentricity'; public const PERIOD = 'period'; public const RAAN = 'raan'; + public const SATELLITE_ID = 'satellite_id'; public const SEMI_MAJOR_AXIS = 'semi_major_axis'; } From 1bf4a2bcf362b0986596d514664b17b963059d3e Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 13 Jun 2021 21:34:52 +0200 Subject: [PATCH 146/151] bugfix --- src/Service/Validator/RequestValidator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Service/Validator/RequestValidator.php b/src/Service/Validator/RequestValidator.php index 9826dc4..8cd5969 100644 --- a/src/Service/Validator/RequestValidator.php +++ b/src/Service/Validator/RequestValidator.php @@ -104,7 +104,7 @@ protected function assertFilter(Request $request, array $filters): array foreach ($filters as $filter => $type) { $values = $request->get($filter, []); - if ($type === Filter::FILTER_TYPE_ARRAY) { + if ($type === Filter::FILTER_TYPE_ARRAY && !empty($values)) { $result[] = new Filter($filter, $type, Filter::OPERATOR_EQUAL, $values); continue; From 8b573e9c28fb7d5d7fed9519ec2392b34b12eaeb Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Jul 2021 07:49:22 +0200 Subject: [PATCH 147/151] bugfix --- composer.json | 1 + config/custom/tle.json | 2 +- config/packages/prod/sentry.yaml | 5 +++++ config/parameters.yaml | 2 ++ src/Controller/DocsController.php | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index c47bcd3..72e66ab 100644 --- a/composer.json +++ b/composer.json @@ -3,6 +3,7 @@ "description": "TLE API backend", "type": "project", "license": "proprietary", + "version": "1.3.2", "require": { "php": "^8.0", "ext-ctype": "*", diff --git a/config/custom/tle.json b/config/custom/tle.json index 445957b..bf1ab25 100644 --- a/config/custom/tle.json +++ b/config/custom/tle.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "TLE API", - "version": "1.3.2" + "version": "" }, "servers": [ { diff --git a/config/packages/prod/sentry.yaml b/config/packages/prod/sentry.yaml index a03c7fe..76704fc 100644 --- a/config/packages/prod/sentry.yaml +++ b/config/packages/prod/sentry.yaml @@ -2,3 +2,8 @@ sentry: dsn: '%env(SENTRY_DSN)%' options: before_send: 'App\Service\SentryCallbackBeforeSend' + environment: '%kernel.environment%' + release: '%env(string:key:version:json:file:COMPOSER_JSON)%' + messenger: + enabled: true # flushes Sentry messages at the end of each message handling + capture_soft_fails: true # captures exceptions marked for retry too diff --git a/config/parameters.yaml b/config/parameters.yaml index 05163a5..35e11fd 100644 --- a/config/parameters.yaml +++ b/config/parameters.yaml @@ -1 +1,3 @@ parameters: + env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" + version: '%env(string:key:version:json:file:COMPOSER_JSON)%' diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index cb14e4d..be1d7ca 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -29,6 +29,8 @@ public function getJson(): JsonResponse $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); + $docs['info']['version'] = $this->getParameter('version'); + return new JsonResponse($docs, Response::HTTP_OK, ['Access-Control-Allow-Origin' => '*',]); } } From eb06f90cc1998db0912635c347c8b205c66a675a Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Jul 2021 09:56:25 +0200 Subject: [PATCH 148/151] rename config to etc --- {config => etc}/bootstrap.php | 98 +- {config => etc}/bundles.php | 0 {config => etc}/custom/source.yaml | 0 {config => etc}/custom/tle.json | 1034 ++++++++--------- {config => etc}/packages/cache.yaml | 0 {config => etc}/packages/dev/monolog.yaml | 0 {config => etc}/packages/doctrine.yaml | 0 .../packages/doctrine_migrations.yaml | 0 {config => etc}/packages/framework.yaml | 0 {config => etc}/packages/lock.yaml | 0 .../packages/prod/deprecations.yaml | 0 {config => etc}/packages/prod/doctrine.yaml | 0 {config => etc}/packages/prod/monolog.yaml | 0 {config => etc}/packages/prod/routing.yaml | 0 {config => etc}/packages/prod/sentry.yaml | 0 {config => etc}/packages/rate_limiter.yaml | 0 {config => etc}/packages/routing.yaml | 0 {config => etc}/packages/test/framework.yaml | 0 {config => etc}/packages/test/monolog.yaml | 0 {config => etc}/parameters.yaml | 6 +- {config => etc}/routes.yaml | 0 {config => etc}/services.yaml | 60 +- public/index.php | 4 +- src/Controller/DocsController.php | 2 +- src/Kernel.php | 8 +- 25 files changed, 606 insertions(+), 606 deletions(-) rename {config => etc}/bootstrap.php (97%) rename {config => etc}/bundles.php (100%) rename {config => etc}/custom/source.yaml (100%) rename {config => etc}/custom/tle.json (96%) rename {config => etc}/packages/cache.yaml (100%) rename {config => etc}/packages/dev/monolog.yaml (100%) rename {config => etc}/packages/doctrine.yaml (100%) rename {config => etc}/packages/doctrine_migrations.yaml (100%) rename {config => etc}/packages/framework.yaml (100%) rename {config => etc}/packages/lock.yaml (100%) rename {config => etc}/packages/prod/deprecations.yaml (100%) rename {config => etc}/packages/prod/doctrine.yaml (100%) rename {config => etc}/packages/prod/monolog.yaml (100%) rename {config => etc}/packages/prod/routing.yaml (100%) rename {config => etc}/packages/prod/sentry.yaml (100%) rename {config => etc}/packages/rate_limiter.yaml (100%) rename {config => etc}/packages/routing.yaml (100%) rename {config => etc}/packages/test/framework.yaml (100%) rename {config => etc}/packages/test/monolog.yaml (100%) rename {config => etc}/parameters.yaml (97%) rename {config => etc}/routes.yaml (100%) rename {config => etc}/services.yaml (97%) diff --git a/config/bootstrap.php b/etc/bootstrap.php similarity index 97% rename from config/bootstrap.php rename to etc/bootstrap.php index 9b1b3e9..452a4fb 100644 --- a/config/bootstrap.php +++ b/etc/bootstrap.php @@ -1,49 +1,49 @@ -=1.2) -if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') - && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] -) { - foreach ($env as $k => $v) { - $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); - } -} elseif (class_exists(Dotenv::class)) { - // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); -} else { - throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); -} - -if ($_SERVER['APP_ENV'] === 'test') { - $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel - $kernel->boot(); - - $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); - (new Application($kernel))->add($command); - - $command->run( - new ArrayInput( - [ - 'command' => 'doctrine:reload', - '--no-interaction' => true, - ] - ), - new ConsoleOutput() - ); -} - -$_SERVER += $_ENV; -$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; -$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; -$_SERVER['APP_DEBUG'] = -$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; +=1.2) +if (is_array($env = @include dirname(__DIR__) . '/.env.local.php') + && ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env['APP_ENV']) === $env['APP_ENV'] +) { + foreach ($env as $k => $v) { + $_ENV[$k] = $_ENV[$k] ?? (isset($_SERVER[$k]) && strncmp($k, 'HTTP_', 5) !== 0 ? $_SERVER[$k] : $v); + } +} elseif (class_exists(Dotenv::class)) { + // load all the .env files + (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); +} else { + throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); +} + +if ($_SERVER['APP_ENV'] === 'test') { + $kernel = new Kernel($_SERVER['APP_ENV'], true); // create a "test" kernel + $kernel->boot(); + + $command = new DoctrineReloadCommand($_SERVER['APP_ENV']); + (new Application($kernel))->add($command); + + $command->run( + new ArrayInput( + [ + 'command' => 'doctrine:reload', + '--no-interaction' => true, + ] + ), + new ConsoleOutput() + ); +} + +$_SERVER += $_ENV; +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = +$_ENV['APP_DEBUG'] = (int)$_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/config/bundles.php b/etc/bundles.php similarity index 100% rename from config/bundles.php rename to etc/bundles.php diff --git a/config/custom/source.yaml b/etc/custom/source.yaml similarity index 100% rename from config/custom/source.yaml rename to etc/custom/source.yaml diff --git a/config/custom/tle.json b/etc/custom/tle.json similarity index 96% rename from config/custom/tle.json rename to etc/custom/tle.json index bf1ab25..18927df 100644 --- a/config/custom/tle.json +++ b/etc/custom/tle.json @@ -1,517 +1,517 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "TLE API", - "version": "" - }, - "servers": [ - { - "url": "/" - } - ], - "paths": { - "/api/tle/{id}": { - "get": { - "summary": "Record", - "operationId": "record", - "description": "Return single TleModel for requested satellite id", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Satellite id", - "required": true, - "schema": { - "example": 43638, - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TleModel" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - }, - "/api/tle": { - "get": { - "summary": "Collection", - "operationId": "collection", - "description": "Return collection of TleModels depending on requested parameters", - "parameters": [ - { - "$ref": "#/components/parameters/search" - }, - { - "name": "sort", - "in": "query", - "description": "Sort by", - "schema": { - "type": "string", - "default": "name", - "enum": [ - "id", - "name", - "popularity", - "inclination", - "eccentricity", - "period" - ] - } - }, - { - "$ref": "#/components/parameters/sortDirection" - }, - { - "$ref": "#/components/parameters/pageNumber" - }, - { - "$ref": "#/components/parameters/pageSize" - }, - { - "name": "eccentricity[gte]", - "in": "query", - "description": "Filter records with orbital eccentricity greater then or equal to the provided value", - "required": false, - "example": 1 - }, - { - "name": "eccentricity[lte]", - "in": "query", - "description": "Filter records with orbital eccentricity less then or equal to the provided value", - "required": false, - "example": 1 - }, - { - "name": "inclination[lt]", - "in": "query", - "description": "Filter records with posigrade orbital inclination", - "required": false, - "example": 90 - }, - { - "name": "inclination[gt]", - "in": "query", - "description": "Filter records with retrograde orbital inclination", - "required": false, - "example": 90 - }, - { - "name": "period[lt]", - "in": "query", - "description": "Filter records with orbital period less than specified", - "required": false, - "example": 255 - }, - { - "name": "period[gt]", - "in": "query", - "description": "Filter records with orbital period greater than specified", - "required": false, - "example": 255 - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "properties": { - "@context": { - "type": "string", - "example": "http://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle" - }, - "@type": { - "type": "string", - "example": "Collection" - }, - "totalItems": { - "type": "integer", - "example": 10414 - }, - "member": { - "type": "array", - "items": { - "$ref": "#/components/schemas/TleModel" - } - }, - "parameters": { - "type": "object" - }, - "view": { - "type": "object", - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - } - } - }, - "type": "object" - } - } - } - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - }, - "/api/tle/{id}/propagate": { - "get": { - "summary": "Propagate (experimental)", - "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", - "operationId": "propagate", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "Target satellite id for which propagation is calculated", - "required": true, - "schema": { - "example": 43638, - "type": "integer" - } - }, - { - "name": "date", - "in": "query", - "description": "Target date and time", - "required": false, - "schema": { - "type": "string", - "example": "2021-04-20T16:28:40+00:00" - } - } - ], - "responses": { - "200": { - "description": "Resource found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Propagation" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - }, - "500": { - "$ref": "#/components/responses/500" - } - } - } - } - }, - "components": { - "schemas": { - "Pagination": { - "properties": { - "@id": { - "type": "string" - }, - "@type": { - "type": "string" - }, - "first": { - "type": "string" - }, - "previous": { - "type": "string" - }, - "next": { - "type": "string" - }, - "last": { - "type": "string" - } - }, - "type": "object" - }, - "Exception": { - "properties": { - "response": { - "properties": { - "message": { - "type": "string" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "TleModel": { - "allOf": [ - { - "properties": { - "@context": { - "type": "string", - "example": "https://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/43638" - }, - "@type": { - "type": "string", - "example": "TleModel" - }, - "satelliteId": { - "type": "integer", - "example": 43638 - }, - "name": { - "type": "string", - "example": "1998-067PN" - }, - "date": { - "type": "string", - "example": "2021-02-16T06:41:41+00:00" - }, - "line1": { - "type": "string", - "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" - }, - "line2": { - "type": "string", - "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" - } - }, - "type": "object" - } - ] - }, - "Propagation": { - "properties": { - "@context": { - "type": "string", - "example": "https://www.w3.org/ns/hydra/context.jsonld" - }, - "@id": { - "type": "string", - "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" - }, - "@type": { - "type": "string", - "example": "SatellitePropagationResult" - }, - "tle": { - "$ref": "#/components/schemas/TleModel" - }, - "algorithm": { - "type": "string", - "enum": ["SGP4", "SDP4"], - "description": "Algorithm used for propagation. Determined based on mean motion.", - "example": "SGP4" - }, - "vector": { - "properties": { - "reference_frame": { - "type": "string", - "example": "ECI" - }, - "position": { - "properties": { - "x": { - "type": "number", - "example": -2450.396984017652 - }, - "y": { - "type": "number", - "example": 6101.198295995954 - }, - "z": { - "type": "number", - "example": -6032.216318229235 - }, - "r": { - "type": "number", - "example": 8922.819046481767 - }, - "unit": { - "type": "string", - "example": "km" - } - }, - "type": "object" - }, - - "velocity": { - "properties": { - "x": { - "type": "number", - "example": -0.1644949004552056 - }, - "y": { - "type": "number", - "example": 4.639904402973215 - }, - "z": { - "type": "number", - "example": 4.406398357056158 - }, - "r": { - "type": "number", - "example": 6.400946642651633 - }, - "unit": { - "type": "string", - "example": "km/s" - } - }, - "type": "object" - } - }, - "type": "object" - }, - "geodetic": { - "properties": { - "latitude": { - "type": "number", - "example": -42.67210184042445 - }, - "longitude": { - "type": "number", - "example": 124.524923099869 - }, - "altitude": { - "type": "number", - "example": 2554.4740343929398 - } - }, - "type": "object" - }, - "parameters": { - "properties": { - "date": { - "type": "string", - "example": "2021-04-26T08:39:45+00:00" - }, - "satelliteId": { - "type": "string", - "example": "44859" - } - }, - "type": "object" - } - }, - "type": "object" - } - }, - "responses": { - "404": { - "description": "Resource not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "message": "Resource not found" - } - } - } - } - }, - "500": { - "description": "Server error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Exception" - }, - "example": { - "response": { - "message": "Server has encountered an internal error" - } - } - } - } - } - }, - "parameters": { - "search": { - "name": "search", - "in": "query", - "description": "Search string", - "schema": { - "type": "string", - "default": "*" - } - }, - "sortDirection": { - "name": "sort-dir", - "in": "query", - "description": "Sort direction", - "schema": { - "type": "string", - "default": "asc", - "enum": [ - "asc", - "desc" - ] - } - }, - "pageNumber": { - "name": "page", - "in": "query", - "description": "Page number", - "schema": { - "type": "integer", - "default": 1, - "minimum": 1 - } - }, - "pageSize": { - "name": "page-size", - "in": "query", - "description": "Number of collection member per page", - "schema": { - "type": "integer", - "default": 20, - "minimum": 1, - "maximum": 100 - } - } - } - } -} +{ + "openapi": "3.0.0", + "info": { + "title": "TLE API", + "version": "" + }, + "servers": [ + { + "url": "/" + } + ], + "paths": { + "/api/tle/{id}": { + "get": { + "summary": "Record", + "operationId": "record", + "description": "Return single TleModel for requested satellite id", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Satellite id", + "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TleModel" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + }, + "/api/tle": { + "get": { + "summary": "Collection", + "operationId": "collection", + "description": "Return collection of TleModels depending on requested parameters", + "parameters": [ + { + "$ref": "#/components/parameters/search" + }, + { + "name": "sort", + "in": "query", + "description": "Sort by", + "schema": { + "type": "string", + "default": "name", + "enum": [ + "id", + "name", + "popularity", + "inclination", + "eccentricity", + "period" + ] + } + }, + { + "$ref": "#/components/parameters/sortDirection" + }, + { + "$ref": "#/components/parameters/pageNumber" + }, + { + "$ref": "#/components/parameters/pageSize" + }, + { + "name": "eccentricity[gte]", + "in": "query", + "description": "Filter records with orbital eccentricity greater then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "eccentricity[lte]", + "in": "query", + "description": "Filter records with orbital eccentricity less then or equal to the provided value", + "required": false, + "example": 1 + }, + { + "name": "inclination[lt]", + "in": "query", + "description": "Filter records with posigrade orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "inclination[gt]", + "in": "query", + "description": "Filter records with retrograde orbital inclination", + "required": false, + "example": 90 + }, + { + "name": "period[lt]", + "in": "query", + "description": "Filter records with orbital period less than specified", + "required": false, + "example": 255 + }, + { + "name": "period[gt]", + "in": "query", + "description": "Filter records with orbital period greater than specified", + "required": false, + "example": 255 + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "properties": { + "@context": { + "type": "string", + "example": "http://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle" + }, + "@type": { + "type": "string", + "example": "Collection" + }, + "totalItems": { + "type": "integer", + "example": 10414 + }, + "member": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TleModel" + } + }, + "parameters": { + "type": "object" + }, + "view": { + "type": "object", + "properties": { + "@id": { + "type": "string" + }, + "@type": { + "type": "string" + }, + "first": { + "type": "string" + }, + "previous": { + "type": "string" + }, + "next": { + "type": "string" + }, + "last": { + "type": "string" + } + } + } + }, + "type": "object" + } + } + } + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + }, + "/api/tle/{id}/propagate": { + "get": { + "summary": "Propagate (experimental)", + "description": "Return propagation result with satellite position and velocity using SGP4 or SDP4 algorithms", + "operationId": "propagate", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Target satellite id for which propagation is calculated", + "required": true, + "schema": { + "example": 43638, + "type": "integer" + } + }, + { + "name": "date", + "in": "query", + "description": "Target date and time", + "required": false, + "schema": { + "type": "string", + "example": "2021-04-20T16:28:40+00:00" + } + } + ], + "responses": { + "200": { + "description": "Resource found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Propagation" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + }, + "500": { + "$ref": "#/components/responses/500" + } + } + } + } + }, + "components": { + "schemas": { + "Pagination": { + "properties": { + "@id": { + "type": "string" + }, + "@type": { + "type": "string" + }, + "first": { + "type": "string" + }, + "previous": { + "type": "string" + }, + "next": { + "type": "string" + }, + "last": { + "type": "string" + } + }, + "type": "object" + }, + "Exception": { + "properties": { + "response": { + "properties": { + "message": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "TleModel": { + "allOf": [ + { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/43638" + }, + "@type": { + "type": "string", + "example": "TleModel" + }, + "satelliteId": { + "type": "integer", + "example": 43638 + }, + "name": { + "type": "string", + "example": "1998-067PN" + }, + "date": { + "type": "string", + "example": "2021-02-16T06:41:41+00:00" + }, + "line1": { + "type": "string", + "example": "1 43638U 98067PN 21047.27895714 .00025925 00000-0 18734-3 0 9990" + }, + "line2": { + "type": "string", + "example": "2 43638 51.6322 151.1192 0001883 262.5831 97.4954 15.73313437134937" + } + }, + "type": "object" + } + ] + }, + "Propagation": { + "properties": { + "@context": { + "type": "string", + "example": "https://www.w3.org/ns/hydra/context.jsonld" + }, + "@id": { + "type": "string", + "example": "https://tle.ivanstanojevic.me/api/tle/44859/propagate?date=2021-04-26T08:39:45+00:00" + }, + "@type": { + "type": "string", + "example": "SatellitePropagationResult" + }, + "tle": { + "$ref": "#/components/schemas/TleModel" + }, + "algorithm": { + "type": "string", + "enum": ["SGP4", "SDP4"], + "description": "Algorithm used for propagation. Determined based on mean motion.", + "example": "SGP4" + }, + "vector": { + "properties": { + "reference_frame": { + "type": "string", + "example": "ECI" + }, + "position": { + "properties": { + "x": { + "type": "number", + "example": -2450.396984017652 + }, + "y": { + "type": "number", + "example": 6101.198295995954 + }, + "z": { + "type": "number", + "example": -6032.216318229235 + }, + "r": { + "type": "number", + "example": 8922.819046481767 + }, + "unit": { + "type": "string", + "example": "km" + } + }, + "type": "object" + }, + + "velocity": { + "properties": { + "x": { + "type": "number", + "example": -0.1644949004552056 + }, + "y": { + "type": "number", + "example": 4.639904402973215 + }, + "z": { + "type": "number", + "example": 4.406398357056158 + }, + "r": { + "type": "number", + "example": 6.400946642651633 + }, + "unit": { + "type": "string", + "example": "km/s" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "geodetic": { + "properties": { + "latitude": { + "type": "number", + "example": -42.67210184042445 + }, + "longitude": { + "type": "number", + "example": 124.524923099869 + }, + "altitude": { + "type": "number", + "example": 2554.4740343929398 + } + }, + "type": "object" + }, + "parameters": { + "properties": { + "date": { + "type": "string", + "example": "2021-04-26T08:39:45+00:00" + }, + "satelliteId": { + "type": "string", + "example": "44859" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "responses": { + "404": { + "description": "Resource not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Exception" + }, + "example": { + "response": { + "message": "Resource not found" + } + } + } + } + }, + "500": { + "description": "Server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Exception" + }, + "example": { + "response": { + "message": "Server has encountered an internal error" + } + } + } + } + } + }, + "parameters": { + "search": { + "name": "search", + "in": "query", + "description": "Search string", + "schema": { + "type": "string", + "default": "*" + } + }, + "sortDirection": { + "name": "sort-dir", + "in": "query", + "description": "Sort direction", + "schema": { + "type": "string", + "default": "asc", + "enum": [ + "asc", + "desc" + ] + } + }, + "pageNumber": { + "name": "page", + "in": "query", + "description": "Page number", + "schema": { + "type": "integer", + "default": 1, + "minimum": 1 + } + }, + "pageSize": { + "name": "page-size", + "in": "query", + "description": "Number of collection member per page", + "schema": { + "type": "integer", + "default": 20, + "minimum": 1, + "maximum": 100 + } + } + } + } +} diff --git a/config/packages/cache.yaml b/etc/packages/cache.yaml similarity index 100% rename from config/packages/cache.yaml rename to etc/packages/cache.yaml diff --git a/config/packages/dev/monolog.yaml b/etc/packages/dev/monolog.yaml similarity index 100% rename from config/packages/dev/monolog.yaml rename to etc/packages/dev/monolog.yaml diff --git a/config/packages/doctrine.yaml b/etc/packages/doctrine.yaml similarity index 100% rename from config/packages/doctrine.yaml rename to etc/packages/doctrine.yaml diff --git a/config/packages/doctrine_migrations.yaml b/etc/packages/doctrine_migrations.yaml similarity index 100% rename from config/packages/doctrine_migrations.yaml rename to etc/packages/doctrine_migrations.yaml diff --git a/config/packages/framework.yaml b/etc/packages/framework.yaml similarity index 100% rename from config/packages/framework.yaml rename to etc/packages/framework.yaml diff --git a/config/packages/lock.yaml b/etc/packages/lock.yaml similarity index 100% rename from config/packages/lock.yaml rename to etc/packages/lock.yaml diff --git a/config/packages/prod/deprecations.yaml b/etc/packages/prod/deprecations.yaml similarity index 100% rename from config/packages/prod/deprecations.yaml rename to etc/packages/prod/deprecations.yaml diff --git a/config/packages/prod/doctrine.yaml b/etc/packages/prod/doctrine.yaml similarity index 100% rename from config/packages/prod/doctrine.yaml rename to etc/packages/prod/doctrine.yaml diff --git a/config/packages/prod/monolog.yaml b/etc/packages/prod/monolog.yaml similarity index 100% rename from config/packages/prod/monolog.yaml rename to etc/packages/prod/monolog.yaml diff --git a/config/packages/prod/routing.yaml b/etc/packages/prod/routing.yaml similarity index 100% rename from config/packages/prod/routing.yaml rename to etc/packages/prod/routing.yaml diff --git a/config/packages/prod/sentry.yaml b/etc/packages/prod/sentry.yaml similarity index 100% rename from config/packages/prod/sentry.yaml rename to etc/packages/prod/sentry.yaml diff --git a/config/packages/rate_limiter.yaml b/etc/packages/rate_limiter.yaml similarity index 100% rename from config/packages/rate_limiter.yaml rename to etc/packages/rate_limiter.yaml diff --git a/config/packages/routing.yaml b/etc/packages/routing.yaml similarity index 100% rename from config/packages/routing.yaml rename to etc/packages/routing.yaml diff --git a/config/packages/test/framework.yaml b/etc/packages/test/framework.yaml similarity index 100% rename from config/packages/test/framework.yaml rename to etc/packages/test/framework.yaml diff --git a/config/packages/test/monolog.yaml b/etc/packages/test/monolog.yaml similarity index 100% rename from config/packages/test/monolog.yaml rename to etc/packages/test/monolog.yaml diff --git a/config/parameters.yaml b/etc/parameters.yaml similarity index 97% rename from config/parameters.yaml rename to etc/parameters.yaml index 35e11fd..1d32fae 100644 --- a/config/parameters.yaml +++ b/etc/parameters.yaml @@ -1,3 +1,3 @@ -parameters: - env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" - version: '%env(string:key:version:json:file:COMPOSER_JSON)%' +parameters: + env(COMPOSER_JSON): "%kernel.project_dir%/composer.json" + version: '%env(string:key:version:json:file:COMPOSER_JSON)%' diff --git a/config/routes.yaml b/etc/routes.yaml similarity index 100% rename from config/routes.yaml rename to etc/routes.yaml diff --git a/config/services.yaml b/etc/services.yaml similarity index 97% rename from config/services.yaml rename to etc/services.yaml index 3235b01..6a1b3f7 100644 --- a/config/services.yaml +++ b/etc/services.yaml @@ -1,30 +1,30 @@ -# This file is the entry point to configure your own services. -# Files in the packages/ subdirectory configure your dependencies. - -# Put parameters here that don't need to change on each machine where the app is deployed -# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration -parameters: - -services: - # default configuration for services in *this* file - _defaults: - autowire: true # Automatically injects dependencies in your services. - autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. - - # makes classes in src/ available to be used as services - # this creates a service per class whose id is the fully-qualified class name - App\: - resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' - bind: - $env: '%kernel.environment%' - $projectDir: "%kernel.project_dir%" - - # controllers are imported separately to make sure services can be injected - # as action arguments even if you don't extend any base controller class - App\Controller\: - resource: '../src/Controller' - tags: ['controller.service_arguments'] - - # add more service definitions when explicit configuration is needed - # please note that last definitions always *replace* previous ones +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/*' + exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' + bind: + $env: '%kernel.environment%' + $projectDir: "%kernel.project_dir%" + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller' + tags: ['controller.service_arguments'] + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/public/index.php b/public/index.php index f094a9b..9ca9419 100644 --- a/public/index.php +++ b/public/index.php @@ -4,7 +4,7 @@ use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\HttpFoundation\Request; -require dirname(__DIR__).'/config/bootstrap.php'; +require dirname(__DIR__).'/etc/bootstrap.php'; if ($_SERVER['APP_DEBUG']) { umask(0000); @@ -13,7 +13,7 @@ } if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) { - Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST); + Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_FOR ^ Request::HEADER_X_FORWARDED_HOST); } if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) { diff --git a/src/Controller/DocsController.php b/src/Controller/DocsController.php index be1d7ca..343af1f 100644 --- a/src/Controller/DocsController.php +++ b/src/Controller/DocsController.php @@ -25,7 +25,7 @@ public function docs(): Response #[Route("/api/tle.json", name: "app_api_docs_json")] public function getJson(): JsonResponse { - $path = $this->getProjectDir() . '/config/custom/tle.json'; + $path = $this->getProjectDir() . '/etc/custom/tle.json'; $docs = json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR); diff --git a/src/Kernel.php b/src/Kernel.php index d842862..19c3e4c 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -24,7 +24,7 @@ class Kernel extends BaseKernel */ public function registerBundles(): iterable { - $contents = require $this->getProjectDir().'/config/bundles.php'; + $contents = require $this->getProjectDir().'/etc/bundles.php'; foreach ($contents as $class => $envs) { if ($envs[$this->environment] ?? $envs['all'] ?? false) { yield new $class(); @@ -41,10 +41,10 @@ public function getProjectDir(): string /** @throws \Exception */ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { - $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); + $container->addResource(new FileResource($this->getProjectDir().'/etc/bundles.php')); $container->setParameter('container.dumper.inline_class_loader', \PHP_VERSION_ID < 70400); $container->setParameter('container.dumper.inline_factories', true); - $confDir = $this->getProjectDir().'/config'; + $confDir = $this->getProjectDir().'/etc'; $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); $loader->load($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob'); @@ -56,7 +56,7 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa /** @throws \Exception */ protected function configureRoutes(RoutingConfigurator $routes): void { - $confDir = $this->getProjectDir().'/config'; + $confDir = $this->getProjectDir().'/etc'; $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS); $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS); From 8b16d57e168f0e0f1cf9fccffe81fcb205f6f6ee Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Wed, 21 Jul 2021 10:03:07 +0200 Subject: [PATCH 149/151] rename config to etc --- src/Kernel.php | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/Kernel.php b/src/Kernel.php index 19c3e4c..35824d9 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -9,22 +9,15 @@ use Symfony\Component\HttpKernel\Kernel as BaseKernel; use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; -/** - * @codeCoverageIgnore - */ class Kernel extends BaseKernel { use MicroKernelTrait; private const CONFIG_EXTS = '.{php,xml,yaml,yml}'; - /** - * @noinspection UsingInclusionReturnValueInspection - * @noinspection PhpIncludeInspection - */ public function registerBundles(): iterable { - $contents = require $this->getProjectDir().'/etc/bundles.php'; + $contents = require $this->getConfigDir() . '/bundles.php'; foreach ($contents as $class => $envs) { if ($envs[$this->environment] ?? $envs['all'] ?? false) { yield new $class(); @@ -32,31 +25,37 @@ public function registerBundles(): iterable } } - /** @noinspection PhpMissingParentCallCommonInspection */ public function getProjectDir(): string { return \dirname(__DIR__); } - /** @throws \Exception */ + public function getConfigDir(): string + { + return $this->getProjectDir() . '/etc'; + } + + /** + * @throws \Exception + */ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { - $container->addResource(new FileResource($this->getProjectDir().'/etc/bundles.php')); + $confDir = $this->getConfigDir(); + + $container->addResource(new FileResource($confDir . '/bundles.php')); $container->setParameter('container.dumper.inline_class_loader', \PHP_VERSION_ID < 70400); $container->setParameter('container.dumper.inline_factories', true); - $confDir = $this->getProjectDir().'/etc'; - $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{parameters}'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{packages}/' . $this->environment . '/*' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{parameters}' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{services}' . self::CONFIG_EXTS, 'glob'); + $loader->load($confDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob'); } - /** @throws \Exception */ protected function configureRoutes(RoutingConfigurator $routes): void { - $confDir = $this->getProjectDir().'/etc'; + $confDir = $this->getConfigDir(); $routes->import($confDir.'/{routes}/'.$this->environment.'/*'.self::CONFIG_EXTS); $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS); From 81dfa0d15e8b3fe1a8a68236f485d07cb9ebb1d6 Mon Sep 17 00:00:00 2001 From: Ivan Stanojevic Date: Sun, 25 Jul 2021 15:03:16 +0200 Subject: [PATCH 150/151] add optional progress bar --- bin/console | 2 +- src/Command/ImportTleCommand.php | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/bin/console b/bin/console index 5d5c80f..a9fa7b0 100644 --- a/bin/console +++ b/bin/console @@ -27,7 +27,7 @@ if ($input->hasParameterOption('--no-debug', true)) { putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); } -require dirname(__DIR__).'/config/bootstrap.php'; +require dirname(__DIR__).'/etc/bootstrap.php'; if ($_SERVER['APP_DEBUG']) { umask(0000); diff --git a/src/Command/ImportTleCommand.php b/src/Command/ImportTleCommand.php index 5ff15c0..e2692a3 100644 --- a/src/Command/ImportTleCommand.php +++ b/src/Command/ImportTleCommand.php @@ -13,6 +13,7 @@ use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Yaml\Yaml; @@ -21,7 +22,9 @@ final class ImportTleCommand extends Command use FileSystemAwareTrait; private const BATCH_SIZE = 50; - public const SOURCE = '/config/custom/source.yaml'; + private const OPTION_NO_PROGRESS = 'no-progress'; + + public const SOURCE = '/etc/custom/source.yaml'; private EntityManagerInterface $em; private TleRepository $repository; @@ -38,12 +41,15 @@ public function __construct(EntityManagerInterface $em, TleRepository $repositor /** @noinspection PhpMissingParentCallCommonInspection */ protected function configure(): void { - $this->setName('import:tle'); + $this->setName('import:tle') + ->addOption(self::OPTION_NO_PROGRESS, null, InputOption::VALUE_OPTIONAL, 'Hide progress bar', false); } /** @noinspection PhpMissingParentCallCommonInspection */ protected function execute(InputInterface $input, OutputInterface $output): int { + $showProgress = $input->getOption(self::OPTION_NO_PROGRESS) === false; + $this->satellites = $this->repository->fetchAllIndexed(); $totalInsert = 0; @@ -51,12 +57,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int $sources = Yaml::parseFile($this->getProjectDir() . self::SOURCE); - $progressBar = new ProgressBar($output, \count($sources)); - $progressBar->start(); + if ($showProgress) { + $progressBar = new ProgressBar($output, \count($sources)); + $progressBar->start(); + } foreach ($sources as $uri) { /** @noinspection DisconnectedForeachInstructionInspection */ - $progressBar->advance(); + if (isset($progressBar)) { + $progressBar->advance(); + } try { $response = (new Client())->request('GET', $uri); @@ -96,7 +106,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int } - $progressBar->finish(); + if (isset($progressBar)) { + $progressBar->finish(); + } $output->writeln(''); $output->writeln(''); From fe17e9365b7792028c1f0b4e26132cc3957ebc14 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 27 Jul 2021 06:30:03 +0000 Subject: [PATCH 151/151] Bump symfony/framework-bundle from 5.3.0 to 5.3.4 Bumps [symfony/framework-bundle](https://github.com/symfony/framework-bundle) from 5.3.0 to 5.3.4. - [Release notes](https://github.com/symfony/framework-bundle/releases) - [Changelog](https://github.com/symfony/framework-bundle/blob/5.3/CHANGELOG.md) - [Commits](https://github.com/symfony/framework-bundle/compare/v5.3.0...v5.3.4) Signed-off-by: dependabot-preview[bot] --- composer.lock | 229 ++++++++++++++++++++++---------------------------- 1 file changed, 99 insertions(+), 130 deletions(-) diff --git a/composer.lock b/composer.lock index 1715c82..7a71777 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f253f5360f5a5801c6fa721bde0c08b5", + "content-hash": "71e846a8b6688a9e07c24696b2d0ad75", "packages": [ { "name": "beberlei/doctrineextensions", @@ -3588,25 +3588,25 @@ }, { "name": "symfony/cache", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608" + "reference": "944db6004fc374fbe032d18e07cce51cc4e1e661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/44fd0f97d1fb198d344f22379dfc56af2221e608", - "reference": "44fd0f97d1fb198d344f22379dfc56af2221e608", + "url": "https://api.github.com/repos/symfony/cache/zipball/944db6004fc374fbe032d18e07cce51cc4e1e661", + "reference": "944db6004fc374fbe032d18e07cce51cc4e1e661", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/cache": "^1.0|^2.0", - "psr/log": "^1.1", + "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^1.1.7|^2", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0" }, @@ -3664,7 +3664,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.3.0" + "source": "https://github.com/symfony/cache/tree/v5.3.4" }, "funding": [ { @@ -3680,7 +3680,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/cache-contracts", @@ -3763,16 +3763,16 @@ }, { "name": "symfony/config", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810" + "reference": "4268f3059c904c61636275182707f81645517a37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/9f4a448c2d7fd2c90882dfff930b627ddbe16810", - "reference": "9f4a448c2d7fd2c90882dfff930b627ddbe16810", + "url": "https://api.github.com/repos/symfony/config/zipball/4268f3059c904c61636275182707f81645517a37", + "reference": "4268f3059c904c61636275182707f81645517a37", "shasum": "" }, "require": { @@ -3780,7 +3780,7 @@ "symfony/deprecation-contracts": "^2.1", "symfony/filesystem": "^4.4|^5.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/polyfill-php81": "^1.22" }, "conflict": { @@ -3822,7 +3822,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.3.0" + "source": "https://github.com/symfony/config/tree/v5.3.4" }, "funding": [ { @@ -3838,7 +3838,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/console", @@ -4005,23 +4005,23 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4" + "reference": "5a825e4b386066167a8b55487091cb62beec74c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/94d973cb742d8c5c5dcf9534220e6b73b09af1d4", - "reference": "94d973cb742d8c5c5dcf9534220e6b73b09af1d4", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5a825e4b386066167a8b55487091cb62beec74c2", + "reference": "5a825e4b386066167a8b55487091cb62beec74c2", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1.1", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { @@ -4073,7 +4073,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.3.0" + "source": "https://github.com/symfony/dependency-injection/tree/v5.3.4" }, "funding": [ { @@ -4089,7 +4089,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:57:12+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4418,22 +4418,21 @@ }, { "name": "symfony/error-handler", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2" + "reference": "281f6c4660bcf5844bb0346fe3a4664722fe4c73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/0e6768b8c0dcef26df087df2bbbaa143867a59b2", - "reference": "0e6768b8c0dcef26df087df2bbbaa143867a59b2", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/281f6c4660bcf5844bb0346fe3a4664722fe4c73", + "reference": "281f6c4660bcf5844bb0346fe3a4664722fe4c73", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/polyfill-php80": "^1.15", + "psr/log": "^1|^2|^3", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { @@ -4467,7 +4466,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.3.0" + "source": "https://github.com/symfony/error-handler/tree/v5.3.4" }, "funding": [ { @@ -4483,27 +4482,27 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce" + "reference": "f2fd2208157553874560f3645d4594303058c4bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67a5f354afa8e2f231081b3fa11a5912f933c3ce", - "reference": "67a5f354afa8e2f231081b3fa11a5912f933c3ce", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f2fd2208157553874560f3645d4594303058c4bd", + "reference": "f2fd2208157553874560f3645d4594303058c4bd", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/dependency-injection": "<4.4" @@ -4513,7 +4512,7 @@ "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/error-handler": "^4.4|^5.0", @@ -4552,7 +4551,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.4" }, "funding": [ { @@ -4568,7 +4567,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4651,21 +4650,22 @@ }, { "name": "symfony/filesystem", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "348116319d7fb7d1faa781d26a48922428013eb2" + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/348116319d7fb7d1faa781d26a48922428013eb2", - "reference": "348116319d7fb7d1faa781d26a48922428013eb2", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", + "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4693,7 +4693,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.0" + "source": "https://github.com/symfony/filesystem/tree/v5.3.4" }, "funding": [ { @@ -4709,24 +4709,25 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/finder", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6" + "reference": "17f50e06018baec41551a71a15731287dbaab186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", - "reference": "0ae3f047bed4edff6fd35b26a9a6bfdc92c953c6", + "url": "https://api.github.com/repos/symfony/finder/zipball/17f50e06018baec41551a71a15731287dbaab186", + "reference": "17f50e06018baec41551a71a15731287dbaab186", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -4754,7 +4755,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.0" + "source": "https://github.com/symfony/finder/tree/v5.3.4" }, "funding": [ { @@ -4770,7 +4771,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T12:52:38+00:00" + "time": "2021-07-23T15:54:19+00:00" }, { "name": "symfony/flex", @@ -4842,16 +4843,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "99196372c703b8cc97ee61d63d98acbf9896d425" + "reference": "2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/99196372c703b8cc97ee61d63d98acbf9896d425", - "reference": "99196372c703b8cc97ee61d63d98acbf9896d425", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8", + "reference": "2c5ed14a5992a2d04dfdb238a5f9589bab0a68d8", "shasum": "" }, "require": { @@ -4868,7 +4869,7 @@ "symfony/http-foundation": "^5.3", "symfony/http-kernel": "^5.3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/routing": "^5.3" }, "conflict": { @@ -4906,67 +4907,35 @@ "doctrine/persistence": "^1.3|^2.0", "paragonie/sodium_compat": "^1.8", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/allmysms-notifier": "^5.3", "symfony/asset": "^5.3", "symfony/browser-kit": "^4.4|^5.0", - "symfony/clickatell-notifier": "^5.3", "symfony/console": "^5.2", "symfony/css-selector": "^4.4|^5.0", - "symfony/discord-notifier": "^5.3", "symfony/dom-crawler": "^4.4|^5.0", "symfony/dotenv": "^5.1", - "symfony/esendex-notifier": "^5.3", "symfony/expression-language": "^4.4|^5.0", - "symfony/fake-chat-notifier": "^5.3", - "symfony/fake-sms-notifier": "^5.3", - "symfony/firebase-notifier": "^5.3", "symfony/form": "^5.2", - "symfony/free-mobile-notifier": "^5.3", - "symfony/gatewayapi-notifier": "^5.3", - "symfony/gitter-notifier": "^5.3", - "symfony/google-chat-notifier": "^5.3", "symfony/http-client": "^4.4|^5.0", - "symfony/infobip-notifier": "^5.3", - "symfony/iqsms-notifier": "^5.3", - "symfony/light-sms-notifier": "^5.3", - "symfony/linked-in-notifier": "^5.3", "symfony/lock": "^4.4|^5.0", "symfony/mailer": "^5.2", - "symfony/mattermost-notifier": "^5.3", - "symfony/message-bird-notifier": "^5.3", "symfony/messenger": "^5.2", - "symfony/microsoft-teams-notifier": "^5.3", "symfony/mime": "^4.4|^5.0", - "symfony/mobyt-notifier": "^5.3", - "symfony/nexmo-notifier": "^5.3", "symfony/notifier": "^5.3", - "symfony/octopush-notifier": "^5.3", - "symfony/ovh-cloud-notifier": "^5.3", "symfony/phpunit-bridge": "^5.3", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^4.4|^5.0", "symfony/property-info": "^4.4|^5.0", "symfony/rate-limiter": "^5.2", - "symfony/rocket-chat-notifier": "^5.3", "symfony/security-bundle": "^5.3", - "symfony/sendinblue-notifier": "^5.3", "symfony/serializer": "^5.2", - "symfony/sinch-notifier": "^5.3", - "symfony/slack-notifier": "^5.3", - "symfony/sms-biuras-notifier": "^5.3", - "symfony/smsapi-notifier": "^5.3", - "symfony/spot-hit-notifier": "^5.3", "symfony/stopwatch": "^4.4|^5.0", "symfony/string": "^5.0", - "symfony/telegram-notifier": "^5.3", "symfony/translation": "^5.3", "symfony/twig-bundle": "^4.4|^5.0", - "symfony/twilio-notifier": "^5.3", "symfony/validator": "^5.2", "symfony/web-link": "^4.4|^5.0", "symfony/workflow": "^5.2", "symfony/yaml": "^4.4|^5.0", - "symfony/zulip-notifier": "^5.3", "twig/twig": "^2.10|^3.0" }, "suggest": { @@ -5005,7 +4974,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.3.0" + "source": "https://github.com/symfony/framework-bundle/tree/v5.3.4" }, "funding": [ { @@ -5021,7 +4990,7 @@ "type": "tidelift" } ], - "time": "2021-05-31T10:12:54+00:00" + "time": "2021-07-25T09:39:16+00:00" }, { "name": "symfony/http-client", @@ -5190,23 +5159,23 @@ }, { "name": "symfony/http-foundation", - "version": "v5.3.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "8827b90cf8806e467124ad476acd15216c2fceb6" + "reference": "d6602aca7d3e11f401a0b24f43b611c530abfad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8827b90cf8806e467124ad476acd15216c2fceb6", - "reference": "8827b90cf8806e467124ad476acd15216c2fceb6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d6602aca7d3e11f401a0b24f43b611c530abfad3", + "reference": "d6602aca7d3e11f401a0b24f43b611c530abfad3", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", @@ -5243,7 +5212,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.1" + "source": "https://github.com/symfony/http-foundation/tree/v5.3.4" }, "funding": [ { @@ -5259,25 +5228,25 @@ "type": "tidelift" } ], - "time": "2021-06-02T09:32:00+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.3.1", + "version": "v5.3.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864" + "reference": "9eb3ee3cb6c69e12ba5770665b89fe82f0b99033" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/74eb022e3bac36b3d3a897951a98759f2b32b864", - "reference": "74eb022e3bac36b3d3a897951a98759f2b32b864", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9eb3ee3cb6c69e12ba5770665b89fe82f0b99033", + "reference": "9eb3ee3cb6c69e12ba5770665b89fe82f0b99033", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/log": "~1.0", + "psr/log": "^1|^2", "symfony/deprecation-contracts": "^2.1", "symfony/error-handler": "^4.4|^5.0", "symfony/event-dispatcher": "^5.0", @@ -5285,7 +5254,7 @@ "symfony/http-foundation": "^5.3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "symfony/browser-kit": "<4.4", @@ -5304,7 +5273,7 @@ "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", @@ -5355,7 +5324,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.3.1" + "source": "https://github.com/symfony/http-kernel/tree/v5.3.5" }, "funding": [ { @@ -5371,7 +5340,7 @@ "type": "tidelift" } ], - "time": "2021-06-02T10:07:12+00:00" + "time": "2021-07-27T04:39:22+00:00" }, { "name": "symfony/lock", @@ -6788,22 +6757,22 @@ }, { "name": "symfony/routing", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "368e81376a8e049c37cb80ae87dbfbf411279199" + "reference": "0a35d2f57d73c46ab6d042ced783b81d09a624c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/368e81376a8e049c37cb80ae87dbfbf411279199", - "reference": "368e81376a8e049c37cb80ae87dbfbf411279199", + "url": "https://api.github.com/repos/symfony/routing/zipball/0a35d2f57d73c46ab6d042ced783b81d09a624c4", + "reference": "0a35d2f57d73c46ab6d042ced783b81d09a624c4", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "doctrine/annotations": "<1.12", @@ -6813,7 +6782,7 @@ }, "require-dev": { "doctrine/annotations": "^1.12", - "psr/log": "~1.0", + "psr/log": "^1|^2|^3", "symfony/config": "^5.3", "symfony/dependency-injection": "^4.4|^5.0", "symfony/expression-language": "^4.4|^5.0", @@ -6858,7 +6827,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.3.0" + "source": "https://github.com/symfony/routing/tree/v5.3.4" }, "funding": [ { @@ -6874,7 +6843,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/security-core", @@ -7297,22 +7266,22 @@ }, { "name": "symfony/var-dumper", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3" + "reference": "a895407f7cf55da42aa1480935d707684b690bfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1d3953e627fe4b5f6df503f356b6545ada6351f3", - "reference": "1d3953e627fe4b5f6df503f356b6545ada6351f3", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a895407f7cf55da42aa1480935d707684b690bfc", + "reference": "a895407f7cf55da42aa1480935d707684b690bfc", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "phpunit/phpunit": "<5.4.3", @@ -7365,7 +7334,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.0" + "source": "https://github.com/symfony/var-dumper/tree/v5.3.4" }, "funding": [ { @@ -7381,25 +7350,25 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:28:50+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.3.0", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb" + "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", - "reference": "7a7c9dd972541f78e7815c03c0bae9f81e0e9dbb", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", + "reference": "b7898a65fc91e7c41de7a88c7db9aee9c0d432f0", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9" @@ -7438,7 +7407,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.3.0" + "source": "https://github.com/symfony/var-exporter/tree/v5.3.4" }, "funding": [ { @@ -7454,7 +7423,7 @@ "type": "tidelift" } ], - "time": "2021-05-26T17:40:38+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/yaml",