From 1354e43bf0ea3bd8f019309f142ba3675d8a44b5 Mon Sep 17 00:00:00 2001 From: Norbert Orzechowicz <1921950+norberttech@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:26:09 +0200 Subject: [PATCH] symfony http foundation bridge - flow streamed response (#1234) * RM * Added symfony-http-foundation-bridge * Updated dependencies * Fixed website * Fixed failing tests * Ignore first failure when removing container --- .github/workflows/monorepo-split.yml | 2 + .github/workflows/test-suite.yml | 4 +- composer.json | 130 ++++---- composer.lock | 287 ++++++++++++++---- .../bridges/symfony-http-foundation-bridge.md | 110 +++++++ phpunit.xml.dist | 4 +- .../src/Flow/ETL/Adapter/CSV/functions.php | 6 +- .../Flow/ETL/Adapter/Parquet/functions.php | 8 +- .../Integration/AzureBlobServiceTestCase.php | 7 +- .../symfony/http-foundation/.gitattributes | 9 + .../.github/workflows/readonly.yaml | 17 ++ .../symfony/http-foundation/CONTRIBUTING.md | 6 + src/bridge/symfony/http-foundation/LICENSE | 19 ++ src/bridge/symfony/http-foundation/README.md | 9 + .../symfony/http-foundation/composer.json | 40 +++ .../HttpFoundation/FlowStreamedResponse.php | 44 +++ .../Bridge/Symfony/HttpFoundation/Output.php | 15 + .../HttpFoundation/Output/CSVOutput.php | 44 +++ .../HttpFoundation/Output/JsonOutput.php | 38 +++ .../HttpFoundation/Output/ParquetOutput.php | 47 +++ .../Symfony/HttpFoundation/Output/Type.php | 25 ++ .../HttpFoundation/Output/XMLOutput.php | 42 +++ .../Transformation/MaskColumns.php | 24 ++ .../Transformation/Transformations.php | 29 ++ .../Integration/FlowStreamedResponseTest.php | 83 +++++ .../MaskColumnTransformationTest.php | 36 +++ .../FilesystemStreamsTest.php | 6 +- .../Azure/SDK/Exception/AzureException.php | 2 +- .../src/Flow/Filesystem/DSL/functions.php | 10 +- .../Local/StdOut/StdOutDestinationStream.php | 22 +- .../filesystem/src/Flow/Filesystem/Path.php | 21 +- .../src/Flow/Filesystem/Path/Options.php | 43 +++ .../Filesystem/Stream/ResourceContext.php | 2 +- .../Integration/StdOutFilesystemTest.php | 35 ++- .../Flow/Filesystem/Tests/Unit/PathTest.php | 5 + tools/blackfire/composer.lock | 14 +- tools/box/composer.lock | 98 +++--- tools/cs-fixer/composer.lock | 64 ++-- tools/infection/composer.lock | 60 ++-- tools/phpbench/composer.lock | 48 +-- tools/phpstan/composer.lock | 10 +- tools/phpunit/composer.lock | 12 +- 42 files changed, 1214 insertions(+), 323 deletions(-) create mode 100644 docs/components/bridges/symfony-http-foundation-bridge.md create mode 100644 src/bridge/symfony/http-foundation/.gitattributes create mode 100644 src/bridge/symfony/http-foundation/.github/workflows/readonly.yaml create mode 100644 src/bridge/symfony/http-foundation/CONTRIBUTING.md create mode 100644 src/bridge/symfony/http-foundation/LICENSE create mode 100644 src/bridge/symfony/http-foundation/README.md create mode 100644 src/bridge/symfony/http-foundation/composer.json create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/FlowStreamedResponse.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/CSVOutput.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/JsonOutput.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/ParquetOutput.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/Type.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/XMLOutput.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/MaskColumns.php create mode 100644 src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/Transformations.php create mode 100644 src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Integration/FlowStreamedResponseTest.php create mode 100644 src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Unit/Transformation/MaskColumnTransformationTest.php create mode 100644 src/lib/filesystem/src/Flow/Filesystem/Path/Options.php diff --git a/.github/workflows/monorepo-split.yml b/.github/workflows/monorepo-split.yml index f1da1af68..90578cbab 100644 --- a/.github/workflows/monorepo-split.yml +++ b/.github/workflows/monorepo-split.yml @@ -74,6 +74,8 @@ jobs: split_repository: 'filesystem-azure-bridge' - local_path: 'src/bridge/monolog/http' split_repository: 'monolog-http-bridge' + - local_path: 'src/bridge/symfony/http-foundation' + split_repository: 'symfony-http-foundation-bridge' - local_path: 'src/tools/homebrew' split_repository: 'homebrew-flow' diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index 79d126878..4f276ef22 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -110,7 +110,9 @@ jobs: - name: Start Azurite blob endpoint shell: bash - run: azurite-blob --blobHost 0.0.0.0 --blobPort 10000 & + run: | + azurite-blob --blobHost 0.0.0.0 --blobPort 10000 & + sleep 5 env: AZURITE_ACCOUNTS: flowphpaccount01:flowphpkey01 diff --git a/composer.json b/composer.json index 51fbb6adb..1e9caf32d 100644 --- a/composer.json +++ b/composer.json @@ -1,14 +1,14 @@ { "name": "flow-php/flow", - "type": "library", "description": "PHP ETL - Extract Transform Load - Data processing framework", + "license": "MIT", + "type": "library", "keywords": [ "etl", "extract", "transform", "load" ], - "license": "MIT", "require": { "php": "~8.1.0 || ~8.2.0 || ~8.3.0", "ext-bcmath": "*", @@ -36,6 +36,7 @@ "psr/log": "^2.0 || ^3.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", "symfony/console": "^6.3 || ^7.0", + "symfony/http-foundation": "~5.4.0 || ~6.4.0 || ~7", "webmozart/glob": "^3.0 || ^4.0" }, "require-dev": { @@ -53,29 +54,41 @@ "symfony/finder": "^6.3 || ^7.0", "symfony/uid": "^6.3 || ^7.0" }, + "replace": { + "flow-php/array-dot": "self.version", + "flow-php/azure-sdk": "self.version", + "flow-php/doctrine-dbal-bulk": "self.version", + "flow-php/doctrine-dbal-bulk-tools": "self.version", + "flow-php/dremel": "self.version", + "flow-php/etl": "self.version", + "flow-php/etl-adapter-avro": "self.version", + "flow-php/etl-adapter-chartjs": "self.version", + "flow-php/etl-adapter-csv": "self.version", + "flow-php/etl-adapter-dbal-tools": "self.version", + "flow-php/etl-adapter-doctrine": "self.version", + "flow-php/etl-adapter-elasticsearch": "self.version", + "flow-php/etl-adapter-filesystem": "self.version", + "flow-php/etl-adapter-google-sheet": "self.version", + "flow-php/etl-adapter-http": "self.version", + "flow-php/etl-adapter-json": "self.version", + "flow-php/etl-adapter-logger": "self.version", + "flow-php/etl-adapter-logger-tools": "self.version", + "flow-php/etl-adapter-meilisearch": "self.version", + "flow-php/etl-adapter-parquet": "self.version", + "flow-php/etl-adapter-text": "self.version", + "flow-php/etl-adapter-xml": "self.version", + "flow-php/filesystem": "self.version", + "flow-php/filesytem-azure-bridge": "self.version", + "flow-php/monolog-http-bridge": "self.version", + "flow-php/parquet": "self.version", + "flow-php/parquet-viewer": "self.version", + "flow-php/rdsl": "self.version", + "flow-php/snappy": "self.version", + "flow-php/symfony-http-foundation": "self.version" + }, + "minimum-stability": "dev", + "prefer-stable": true, "autoload": { - "files": [ - "src/adapter/etl-adapter-avro/src/Flow/ETL/Adapter/Avro/functions.php", - "src/adapter/etl-adapter-chartjs/src/Flow/ETL/Adapter/ChartJS/functions.php", - "src/adapter/etl-adapter-csv/src/Flow/ETL/Adapter/CSV/functions.php", - "src/adapter/etl-adapter-doctrine/src/Flow/ETL/Adapter/Doctrine/functions.php", - "src/adapter/etl-adapter-elasticsearch/src/Flow/ETL/Adapter/Elasticsearch/functions.php", - "src/adapter/etl-adapter-google-sheet/src/Flow/ETL/Adapter/GoogleSheet/functions.php", - "src/adapter/etl-adapter-json/src/Flow/ETL/Adapter/JSON/functions.php", - "src/adapter/etl-adapter-meilisearch/src/Flow/ETL/Adapter/Meilisearch/functions.php", - "src/adapter/etl-adapter-parquet/src/Flow/ETL/Adapter/Parquet/functions.php", - "src/adapter/etl-adapter-text/src/Flow/ETL/Adapter/Text/functions.php", - "src/adapter/etl-adapter-xml/src/Flow/ETL/Adapter/XML/functions.php", - "src/bridge/filesystem/azure/src/Flow/Filesystem/Bridge/Azure/DSL/functions.php", - "src/core/etl/src/Flow/ETL/DSL/functions.php", - "src/functions.php", - "src/lib/array-dot/src/Flow/ArrayDot/array_dot.php", - "src/lib/azure-sdk/src/Flow/Azure/SDK/DSL/functions.php", - "src/lib/filesystem/src/Flow/Filesystem/DSL/functions.php", - "src/lib/parquet/src/Flow/Parquet/functions.php", - "src/lib/parquet/src/stubs.php", - "src/lib/snappy/polyfill.php" - ], "psr-4": { "Flow\\": [ "src/adapter/etl-adapter-avro/src/Flow", @@ -93,6 +106,7 @@ "src/adapter/etl-adapter-xml/src/Flow", "src/bridge/filesystem/azure/src/Flow", "src/bridge/monolog/http/src/Flow", + "src/bridge/symfony/http-foundation/src/Flow", "src/core/etl/src/Flow", "src/lib/array-dot/src/Flow", "src/lib/azure-sdk/src/Flow", @@ -111,7 +125,29 @@ "Flow\\ETL\\Adapter\\Doctrine\\": [ "src/adapter/etl-adapter-doctrine/src/Flow/ETL/Adapter/Doctrine" ] - } + }, + "files": [ + "src/adapter/etl-adapter-avro/src/Flow/ETL/Adapter/Avro/functions.php", + "src/adapter/etl-adapter-chartjs/src/Flow/ETL/Adapter/ChartJS/functions.php", + "src/adapter/etl-adapter-csv/src/Flow/ETL/Adapter/CSV/functions.php", + "src/adapter/etl-adapter-doctrine/src/Flow/ETL/Adapter/Doctrine/functions.php", + "src/adapter/etl-adapter-elasticsearch/src/Flow/ETL/Adapter/Elasticsearch/functions.php", + "src/adapter/etl-adapter-google-sheet/src/Flow/ETL/Adapter/GoogleSheet/functions.php", + "src/adapter/etl-adapter-json/src/Flow/ETL/Adapter/JSON/functions.php", + "src/adapter/etl-adapter-meilisearch/src/Flow/ETL/Adapter/Meilisearch/functions.php", + "src/adapter/etl-adapter-parquet/src/Flow/ETL/Adapter/Parquet/functions.php", + "src/adapter/etl-adapter-text/src/Flow/ETL/Adapter/Text/functions.php", + "src/adapter/etl-adapter-xml/src/Flow/ETL/Adapter/XML/functions.php", + "src/bridge/filesystem/azure/src/Flow/Filesystem/Bridge/Azure/DSL/functions.php", + "src/core/etl/src/Flow/ETL/DSL/functions.php", + "src/functions.php", + "src/lib/array-dot/src/Flow/ArrayDot/array_dot.php", + "src/lib/azure-sdk/src/Flow/Azure/SDK/DSL/functions.php", + "src/lib/filesystem/src/Flow/Filesystem/DSL/functions.php", + "src/lib/parquet/src/Flow/Parquet/functions.php", + "src/lib/parquet/src/stubs.php", + "src/lib/snappy/polyfill.php" + ] }, "autoload-dev": { "psr-4": { @@ -131,6 +167,7 @@ "src/adapter/etl-adapter-xml/tests/Flow", "src/bridge/filesystem/azure/tests/Flow", "src/bridge/monolog/http/tests/Flow", + "src/bridge/symfony/http-foundation/tests/Flow", "src/core/etl/tests/Flow", "src/lib/array-dot/tests/Flow", "src/lib/azure-sdk/tests/Flow", @@ -156,36 +193,10 @@ "sort-packages": true, "allow-plugins": false }, - "replace": { - "flow-php/array-dot": "self.version", - "flow-php/azure-sdk": "self.version", - "flow-php/doctrine-dbal-bulk": "self.version", - "flow-php/doctrine-dbal-bulk-tools": "self.version", - "flow-php/dremel": "self.version", - "flow-php/etl": "self.version", - "flow-php/etl-adapter-avro": "self.version", - "flow-php/etl-adapter-chartjs": "self.version", - "flow-php/etl-adapter-csv": "self.version", - "flow-php/etl-adapter-dbal-tools": "self.version", - "flow-php/etl-adapter-doctrine": "self.version", - "flow-php/etl-adapter-elasticsearch": "self.version", - "flow-php/etl-adapter-filesystem": "self.version", - "flow-php/etl-adapter-google-sheet": "self.version", - "flow-php/etl-adapter-http": "self.version", - "flow-php/etl-adapter-json": "self.version", - "flow-php/etl-adapter-logger": "self.version", - "flow-php/etl-adapter-logger-tools": "self.version", - "flow-php/etl-adapter-meilisearch": "self.version", - "flow-php/etl-adapter-parquet": "self.version", - "flow-php/etl-adapter-text": "self.version", - "flow-php/etl-adapter-xml": "self.version", - "flow-php/filesystem": "self.version", - "flow-php/filesytem-azure-bridge": "self.version", - "flow-php/monolog-http-bridge": "self.version", - "flow-php/parquet": "self.version", - "flow-php/parquet-viewer": "self.version", - "flow-php/rdsl": "self.version", - "flow-php/snappy": "self.version" + "extra": { + "google/apiclient-services": [ + "Sheets" + ] }, "scripts": { "build": [ @@ -278,12 +289,5 @@ "composer update --working-dir=./tools/psalm", "composer update --working-dir=./tools/phpunit" ] - }, - "extra": { - "google/apiclient-services": [ - "Sheets" - ] - }, - "minimum-stability": "dev", - "prefer-stable": true + } } diff --git a/composer.lock b/composer.lock index c74a35532..097b62743 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": "1dca31d78dafb7522f660262cdf1928e", + "content-hash": "796ddb9ea52075cec8c9425cae7d69a1", "packages": [ { "name": "aeon-php/calendar", @@ -519,16 +519,16 @@ }, { "name": "google/apiclient-services", - "version": "v0.373.0", + "version": "v0.374.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "88ee17077a2048ba0b2c637754b599be0523fe36" + "reference": "5f6060df419f4f72dcc970197f9a9b1613cecc62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/88ee17077a2048ba0b2c637754b599be0523fe36", - "reference": "88ee17077a2048ba0b2c637754b599be0523fe36", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/5f6060df419f4f72dcc970197f9a9b1613cecc62", + "reference": "5f6060df419f4f72dcc970197f9a9b1613cecc62", "shasum": "" }, "require": { @@ -557,9 +557,9 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.373.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.374.0" }, - "time": "2024-09-16T00:56:51+00:00" + "time": "2024-09-23T01:02:23+00:00" }, { "name": "google/auth", @@ -1605,16 +1605,16 @@ }, { "name": "php-http/httplug", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/php-http/httplug.git", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67" + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", - "reference": "625ad742c360c8ac580fcc647a1541d29e257f67", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", "shasum": "" }, "require": { @@ -1656,9 +1656,9 @@ ], "support": { "issues": "https://github.com/php-http/httplug/issues", - "source": "https://github.com/php-http/httplug/tree/2.4.0" + "source": "https://github.com/php-http/httplug/tree/2.4.1" }, - "time": "2023-04-14T15:10:03+00:00" + "time": "2024-09-23T11:39:58+00:00" }, { "name": "php-http/promise", @@ -2231,16 +2231,16 @@ }, { "name": "symfony/console", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -2305,7 +2305,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.11" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -2321,7 +2321,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:29+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2390,6 +2390,83 @@ ], "time": "2024-04-18T09:32:20+00:00" }, + { + "name": "symfony/http-foundation", + "version": "v6.4.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "133ac043875f59c26c55e79cf074562127cce4d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", + "reference": "133ac043875f59c26c55e79cf074562127cce4d2", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" + }, + "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": "2024-09-20T08:18:25+00:00" + }, { "name": "symfony/polyfill-ctype", "version": "v1.31.0", @@ -2940,6 +3017,82 @@ ], "time": "2024-09-09T11:45:10+00:00" }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "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.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.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": "2024-09-09T11:45:10+00:00" + }, { "name": "symfony/service-contracts", "version": "v3.5.0", @@ -3025,16 +3178,16 @@ }, { "name": "symfony/string", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -3091,7 +3244,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.11" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -3107,20 +3260,20 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/translation", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9" + "reference": "cf8360b8352b086be620fae8342c4d96e391a489" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/94041203f8ac200ae9e7c6a18fa6137814ccecc9", - "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9", + "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", + "reference": "cf8360b8352b086be620fae8342c4d96e391a489", "shasum": "" }, "require": { @@ -3186,7 +3339,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.10" + "source": "https://github.com/symfony/translation/tree/v6.4.12" }, "funding": [ { @@ -3202,7 +3355,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-16T06:02:54+00:00" }, { "name": "symfony/translation-contracts", @@ -3284,16 +3437,16 @@ }, { "name": "symfony/yaml", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "be37e7f13195e05ab84ca5269365591edd240335" + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335", - "reference": "be37e7f13195e05ab84ca5269365591edd240335", + "url": "https://api.github.com/repos/symfony/yaml/zipball/762ee56b2649659380e0ef4d592d807bc17b7971", + "reference": "762ee56b2649659380e0ef4d592d807bc17b7971", "shasum": "" }, "require": { @@ -3336,7 +3489,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.11" + "source": "https://github.com/symfony/yaml/tree/v6.4.12" }, "funding": [ { @@ -3352,7 +3505,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "webmozart/glob", @@ -3716,16 +3869,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v4.19.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45", "shasum": "" }, "require": { @@ -3766,9 +3919,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2024-09-17T19:36:00+00:00" }, { "name": "nyholm/psr7", @@ -3850,16 +4003,16 @@ }, { "name": "php-http/client-common", - "version": "2.7.1", + "version": "2.7.2", "source": { "type": "git", "url": "https://github.com/php-http/client-common.git", - "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" + "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", - "reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", + "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46", + "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46", "shasum": "" }, "require": { @@ -3913,9 +4066,9 @@ ], "support": { "issues": "https://github.com/php-http/client-common/issues", - "source": "https://github.com/php-http/client-common/tree/2.7.1" + "source": "https://github.com/php-http/client-common/tree/2.7.2" }, - "time": "2023-11-30T10:31:25+00:00" + "time": "2024-09-24T06:21:48+00:00" }, { "name": "php-http/curl-client", @@ -4296,16 +4449,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "36daef8fce88fe0b9a4f8cf4c342ced5c05616dc" + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/36daef8fce88fe0b9a4f8cf4c342ced5c05616dc", - "reference": "36daef8fce88fe0b9a4f8cf4c342ced5c05616dc", + "url": "https://api.github.com/repos/symfony/cache/zipball/a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", + "reference": "a463451b7f6ac4a47b98dbfc78ec2d3560c759d8", "shasum": "" }, "require": { @@ -4372,7 +4525,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.11" + "source": "https://github.com/symfony/cache/tree/v6.4.12" }, "funding": [ { @@ -4388,7 +4541,7 @@ "type": "tidelift" } ], - "time": "2024-08-05T07:40:31+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/cache-contracts", @@ -4468,16 +4621,16 @@ }, { "name": "symfony/dotenv", - "version": "v6.4.10", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "2ae0c84cc9be0dc1eeb86016970b63c764d8472e" + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/2ae0c84cc9be0dc1eeb86016970b63c764d8472e", - "reference": "2ae0c84cc9be0dc1eeb86016970b63c764d8472e", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/815284236cab7d8e1280f53bf562c07a4dfe5954", + "reference": "815284236cab7d8e1280f53bf562c07a4dfe5954", "shasum": "" }, "require": { @@ -4522,7 +4675,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.10" + "source": "https://github.com/symfony/dotenv/tree/v6.4.12" }, "funding": [ { @@ -4538,7 +4691,7 @@ "type": "tidelift" } ], - "time": "2024-07-09T18:29:35+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", @@ -4752,16 +4905,16 @@ }, { "name": "symfony/uid", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "6a0394ad707de386547223948fac1e0f2805bc0b" + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/6a0394ad707de386547223948fac1e0f2805bc0b", - "reference": "6a0394ad707de386547223948fac1e0f2805bc0b", + "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", "shasum": "" }, "require": { @@ -4806,7 +4959,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.11" + "source": "https://github.com/symfony/uid/tree/v6.4.12" }, "funding": [ { @@ -4822,7 +4975,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-20T08:32:26+00:00" }, { "name": "symfony/var-exporter", diff --git a/docs/components/bridges/symfony-http-foundation-bridge.md b/docs/components/bridges/symfony-http-foundation-bridge.md new file mode 100644 index 000000000..91a42018d --- /dev/null +++ b/docs/components/bridges/symfony-http-foundation-bridge.md @@ -0,0 +1,110 @@ +# Symfony Http Foundation Bridge + +- [⬅️️ Back](../../introduction.md) + +Http Foundation Bridge provides seamless integration between Symfony Http Foundation and Flow PHP. + +`FlowStreamedResponse` is a Symfony Streamed Response that can: + +- stream to one of the available formats (CSV, JSON, Parquet, XML) +- apply transformations on the fly +- stream large datasets that normally would not fit in memory +- use ETL to convert data on the fly + +## Installation + +``` +composer require flow-php/symfony-http-foundation-bridge +``` + +## Usage + +Stream a large parquet file converting it on the fly to CSV format. +Since Flow is extracting data from datasets in chunk, FlowStreamedResponse allows to stream +files that normally would not fit in memory. + +```php +withColumn('time', \time()); + } + } +); +``` + +Above example will add a new column `time` to the dataset with the current timestamp. + +Predefined Transformations: + +- `Flow\Bridge\Symfony\HttpFoundation\Transformation\MaskColumns` - mask columns with `*****` value. + +```php + src/adapter/**/**/**/**/**/**/Tests/Unit - src/bridge/**/**/**/**/**/**/Tests/Unit + src/bridge/**/**/**/**/**/**/**/Tests/Unit src/core/etl/tests/Flow/ETL/Tests/Unit src/lib/**/**/**/**/Tests/Unit src/lib/doctrine-dbal-bulk/tests/Flow/Doctrine/Bulk/Tests/Unit src/adapter/**/**/**/**/**/**/Tests/Integration - src/bridge/**/**/**/**/**/**/Tests/Integration + src/bridge/**/**/**/**/**/**/**/Tests/Integration src/core/etl/tests/Flow/ETL/Tests/Integration src/lib/**/**/**/**/Tests/Integration src/tools/**/**/**/**/Tests/Integration diff --git a/src/adapter/etl-adapter-csv/src/Flow/ETL/Adapter/CSV/functions.php b/src/adapter/etl-adapter-csv/src/Flow/ETL/Adapter/CSV/functions.php index 60a1eb5df..aff7d706a 100644 --- a/src/adapter/etl-adapter-csv/src/Flow/ETL/Adapter/CSV/functions.php +++ b/src/adapter/etl-adapter-csv/src/Flow/ETL/Adapter/CSV/functions.php @@ -9,8 +9,8 @@ use Flow\ETL\{Attribute\DocumentationDSL, Attribute\DocumentationExample, Attribute\Module, - Attribute\Type as DSLType, - Loader}; + Attribute\Type as DSLType +}; use Flow\Filesystem\{Path, SourceStream}; /** @@ -78,7 +78,7 @@ function to_csv( string $escape = '\\', string $new_line_separator = PHP_EOL, string $datetime_format = \DateTimeInterface::ATOM, -) : Loader { +) : CSVLoader { return (new CSVLoader(\is_string($uri) ? Path::realpath($uri) : $uri)) ->withHeader($with_header) ->withSeparator($separator) diff --git a/src/adapter/etl-adapter-parquet/src/Flow/ETL/Adapter/Parquet/functions.php b/src/adapter/etl-adapter-parquet/src/Flow/ETL/Adapter/Parquet/functions.php index 1d888060f..6c3309e19 100644 --- a/src/adapter/etl-adapter-parquet/src/Flow/ETL/Adapter/Parquet/functions.php +++ b/src/adapter/etl-adapter-parquet/src/Flow/ETL/Adapter/Parquet/functions.php @@ -8,8 +8,8 @@ use Flow\ETL\{Attribute\DocumentationDSL, Attribute\DocumentationExample, Attribute\Module, - Attribute\Type as DSLType, - Loader}; + Attribute\Type as DSLType +}; use Flow\Filesystem\Path; use Flow\Parquet\ParquetFile\Compressions; use Flow\Parquet\{ByteOrder, Options}; @@ -50,8 +50,6 @@ function from_parquet( * @param null|Options $options - @deprecated use `withOptions` method instead * @param Compressions $compressions - @deprecated use `withCompressions` method instead * @param null|Schema $schema - @deprecated use `withSchema` method instead - * - * @return Loader */ #[DocumentationDSL(module: Module::PARQUET, type: DSLType::LOADER)] #[DocumentationExample(topic: 'data_sink', example: 'parquet')] @@ -60,7 +58,7 @@ function to_parquet( ?Options $options = null, Compressions $compressions = Compressions::SNAPPY, ?Schema $schema = null, -) : Loader { +) : ParquetLoader { $loader = (new ParquetLoader(\is_string($path) ? Path::realpath($path) : $path)) ->withCompressions($compressions); diff --git a/src/bridge/filesystem/azure/tests/Flow/Filesystem/Bridge/Azure/Tests/Integration/AzureBlobServiceTestCase.php b/src/bridge/filesystem/azure/tests/Flow/Filesystem/Bridge/Azure/Tests/Integration/AzureBlobServiceTestCase.php index ca0136e24..8bdf0936b 100644 --- a/src/bridge/filesystem/azure/tests/Flow/Filesystem/Bridge/Azure/Tests/Integration/AzureBlobServiceTestCase.php +++ b/src/bridge/filesystem/azure/tests/Flow/Filesystem/Bridge/Azure/Tests/Integration/AzureBlobServiceTestCase.php @@ -5,7 +5,7 @@ namespace Flow\Filesystem\Bridge\Azure\Tests\Integration; use function Flow\Azure\SDK\DSL\{azure_blob_service, azure_blob_service_config, azure_http_factory, azure_shared_key_authorization_factory, azurite_url_factory}; -use Flow\Azure\SDK\{BlobService}; +use Flow\Azure\SDK\{BlobService, Exception\AzureException}; use Http\Discovery\{Psr17FactoryDiscovery, Psr18ClientDiscovery}; use PHPUnit\Framework\TestCase; @@ -19,7 +19,10 @@ abstract class AzureBlobServiceTestCase extends TestCase protected function tearDown() : void { foreach ($this->containers as $container) { - $this->blobService($container)->deleteContainer(); + try { + $this->blobService($container)->deleteContainer(); + } catch (AzureException $e) { + } } } diff --git a/src/bridge/symfony/http-foundation/.gitattributes b/src/bridge/symfony/http-foundation/.gitattributes new file mode 100644 index 000000000..e02097205 --- /dev/null +++ b/src/bridge/symfony/http-foundation/.gitattributes @@ -0,0 +1,9 @@ +*.php text eol=lf + +/.github export-ignore +/tests export-ignore + +/README.md export-ignore + +/.gitattributes export-ignore +/.gitignore export-ignore diff --git a/src/bridge/symfony/http-foundation/.github/workflows/readonly.yaml b/src/bridge/symfony/http-foundation/.github/workflows/readonly.yaml new file mode 100644 index 000000000..da596bcdd --- /dev/null +++ b/src/bridge/symfony/http-foundation/.github/workflows/readonly.yaml @@ -0,0 +1,17 @@ +name: Readonly + +on: + pull_request_target: + types: [opened] + +jobs: + run: + runs-on: ubuntu-latest + steps: + - uses: superbrothers/close-pull-request@v3 + with: + comment: | + Hi, thank you for your contribution. + Unfortunately, this repository is read-only. It's a split from our main monorepo repository. + In order to proceed with this PR please open it against https://github.com/flow-php/flow repository. + Thank you. \ No newline at end of file diff --git a/src/bridge/symfony/http-foundation/CONTRIBUTING.md b/src/bridge/symfony/http-foundation/CONTRIBUTING.md new file mode 100644 index 000000000..a2d0671c7 --- /dev/null +++ b/src/bridge/symfony/http-foundation/CONTRIBUTING.md @@ -0,0 +1,6 @@ +## Contributing + +This repo is **READ ONLY**, in order to contribute to Flow PHP project, please +open PR against [flow](https://github.com/flow-php/flow) monorepo. + +Changes merged to monorepo are automatically propagated into sub repositories. \ No newline at end of file diff --git a/src/bridge/symfony/http-foundation/LICENSE b/src/bridge/symfony/http-foundation/LICENSE new file mode 100644 index 000000000..bc3cc4d08 --- /dev/null +++ b/src/bridge/symfony/http-foundation/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-present Flow PHP + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/bridge/symfony/http-foundation/README.md b/src/bridge/symfony/http-foundation/README.md new file mode 100644 index 000000000..77cc449af --- /dev/null +++ b/src/bridge/symfony/http-foundation/README.md @@ -0,0 +1,9 @@ +# Symfony HTTP Foundation Bridge + + +> [!IMPORTANT] +> This repository is a subtree split from our monorepo. If you'd like to contribute, please visit our main monorepo [flow-php/flow](https://github.com/flow-php/flow). + +- 📜 [Documentation](https://github.com/flow-php/flow/blob/1.x/docs/components/bridges/symfony-http-foundation-bridge.md) +- ➡️ [Installation](https://github.com/flow-php/flow/blob/1.x/docs/installation.md) +- 🛠️ [Contributing](https://github.com/flow-php/flow/blob/1.x/CONTRIBUTING.md) \ No newline at end of file diff --git a/src/bridge/symfony/http-foundation/composer.json b/src/bridge/symfony/http-foundation/composer.json new file mode 100644 index 000000000..9307f2437 --- /dev/null +++ b/src/bridge/symfony/http-foundation/composer.json @@ -0,0 +1,40 @@ +{ + "name": "flow-php/symfony-http-foundation", + "type": "library", + "description": "PHP ETL - Symfony HTTP foundation bridge", + "keywords": [ + "symfony", + "http", + "foundation", + "bridge", + "streamed", + "response" + ], + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "symfony/http-foundation": "~5.4.0 || ~6.4.0 || ~7", + "flow-php/etl": "^0.9.0 || 1.x-dev" + }, + "require-dev": { + "nyholm/psr7": "^1.8" + }, + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "license": "MIT", + "autoload": { + "psr-4": { + "Flow\\": [ + "src/Flow" + ] + } + }, + "autoload-dev": { + "psr-4": { + "Flow\\": "tests/Flow" + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/FlowStreamedResponse.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/FlowStreamedResponse.php new file mode 100644 index 000000000..d56695168 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/FlowStreamedResponse.php @@ -0,0 +1,44 @@ +config = $config ?? Config::default(); + + parent::__construct($this->stream(...), $status, $headers); + + if (!$this->headers->get('Content-Type')) { + $this->headers->set('Content-Type', $this->output->type()->toContentTypeHeader()); + } + } + + private function stream() : void + { + df($this->config) + ->read($this->extractor) + ->transform($this->transformations) + ->write($this->output->loader()) + ->run(); + } +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output.php new file mode 100644 index 000000000..cc845b675 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output.php @@ -0,0 +1,15 @@ + 'output'])) + ->withHeader($this->withHeader) + ->withSeparator($this->separator) + ->withEnclosure($this->enclosure) + ->withEscape($this->escape) + ->withNewLineSeparator($this->newLineSeparator) + ->withDateTimeFormat($this->datetimeFormat); + } + + public function type() : Type + { + return Type::CSV; + } +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/JsonOutput.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/JsonOutput.php new file mode 100644 index 000000000..3d920fa01 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/JsonOutput.php @@ -0,0 +1,38 @@ + 'output'])) + ->withFlags($this->flags) + ->withDateTimeFormat($this->dateTimeFormat) + ->withRowsInNewLines($this->putRowsInNewLines); + } + + public function type() : Type + { + return Type::JSON; + } +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/ParquetOutput.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/ParquetOutput.php new file mode 100644 index 000000000..d5e6824e8 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/ParquetOutput.php @@ -0,0 +1,47 @@ + 'output'])) + ->withCompressions($this->compressions); + + if ($this->options !== null) { + $loader->withOptions($this->options); + } + + if ($this->schema !== null) { + $loader->withSchema($this->schema); + } + + return $loader; + } + + public function type() : Type + { + return Type::PARQUET; + } +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/Type.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/Type.php new file mode 100644 index 000000000..c29636a86 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/Type.php @@ -0,0 +1,25 @@ + 'application/json', + self::CSV => 'text/csv', + self::XML => 'application/xml', + self::PARQUET => 'application/parquet', + self::TEXT => 'text/plain', + }; + } +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/XMLOutput.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/XMLOutput.php new file mode 100644 index 000000000..a09d54ef4 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Output/XMLOutput.php @@ -0,0 +1,42 @@ + 'output']), xml_writer: $this->xmlWriter) + ->withRootElementName($this->rootElementName) + ->withRowElementName($this->rowElementName) + ->withAttributePrefix($this->attributePrefix) + ->withDateTimeFormat($this->dateTimeFormat); + } + + public function type() : Type + { + return Type::XML; + } +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/MaskColumns.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/MaskColumns.php new file mode 100644 index 000000000..8bb143961 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/MaskColumns.php @@ -0,0 +1,24 @@ +columns as $column) { + $dataFrame->withEntry($column, lit($this->mask)); + } + + return $dataFrame; + } +} diff --git a/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/Transformations.php b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/Transformations.php new file mode 100644 index 000000000..dfd1b68b7 --- /dev/null +++ b/src/bridge/symfony/http-foundation/src/Flow/Bridge/Symfony/HttpFoundation/Transformation/Transformations.php @@ -0,0 +1,29 @@ +transformations = $transformations; + } + + public function transform(DataFrame $dataFrame) : DataFrame + { + foreach ($this->transformations as $transformation) { + $dataFrame = $transformation->transform($dataFrame); + } + + return $dataFrame; + } +} diff --git a/src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Integration/FlowStreamedResponseTest.php b/src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Integration/FlowStreamedResponseTest.php new file mode 100644 index 000000000..2c1bb4c58 --- /dev/null +++ b/src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Integration/FlowStreamedResponseTest.php @@ -0,0 +1,83 @@ + 1, 'size' => 'XL', 'color' => 'red', 'ean' => '1234567890123'], + ['id' => 2, 'size' => 'M', 'color' => 'blue', 'ean' => '1234567890124'], + ['id' => 3, 'size' => 'S', 'color' => 'green', 'ean' => '1234567890125'], + ]), + new CSVOutput() + ); + + self::assertEquals(<<<'CSV' +id,size,color,ean +1,XL,red,1234567890123 +2,M,blue,1234567890124 +3,S,green,1234567890125 + +CSV + , $this->sendResponse($response)); + } + + public function test_streaming_array_response_to_json() : void + { + $response = new FlowStreamedResponse( + from_array([ + ['id' => 1, 'size' => 'XL', 'color' => 'red', 'ean' => '1234567890123'], + ['id' => 2, 'size' => 'M', 'color' => 'blue', 'ean' => '1234567890124'], + ['id' => 3, 'size' => 'S', 'color' => 'green', 'ean' => '1234567890125'], + ]), + new JsonOutput() + ); + + self::assertEquals(<<<'JSON' +[{"id":1,"size":"XL","color":"red","ean":"1234567890123"},{"id":2,"size":"M","color":"blue","ean":"1234567890124"},{"id":3,"size":"S","color":"green","ean":"1234567890125"}] +JSON + , $this->sendResponse($response)); + } + + public function test_streaming_array_response_to_xml() : void + { + $response = new FlowStreamedResponse( + from_array([ + ['id' => 1, 'size' => 'XL', 'color' => 'red', 'ean' => '1234567890123'], + ['id' => 2, 'size' => 'M', 'color' => 'blue', 'ean' => '1234567890124'], + ['id' => 3, 'size' => 'S', 'color' => 'green', 'ean' => '1234567890125'], + ]), + new XMLOutput() + ); + + self::assertEquals(<<<'XML' + + +1XLred1234567890123 +2Mblue1234567890124 +3Sgreen1234567890125 + +XML + , $this->sendResponse($response)); + } + + private function sendResponse(FlowStreamedResponse $response) : string + { + ob_start(); + $response->send(); + + return ob_get_clean(); + } +} diff --git a/src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Unit/Transformation/MaskColumnTransformationTest.php b/src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Unit/Transformation/MaskColumnTransformationTest.php new file mode 100644 index 000000000..f2b434cfa --- /dev/null +++ b/src/bridge/symfony/http-foundation/tests/Flow/Bridge/Symfony/HttpFoundation/Tests/Unit/Transformation/MaskColumnTransformationTest.php @@ -0,0 +1,36 @@ +read(from_array([ + ['id' => 1, 'name' => 'John Doe', 'salary' => 7000, 'currency' => 'USD'], + ['id' => 2, 'name' => 'Jane Doe', 'salary' => 8000, 'currency' => 'USD'], + ['id' => 3, 'name' => 'John Smith', 'salary' => 9000, 'currency' => 'USD'], + ['id' => 4, 'name' => 'Jane Smith', 'salary' => 10000, 'currency' => 'USD'], + ])) + ->transform(new MaskColumns(['salary'])) + ->fetch() + ->toArray(); + + self::assertEquals( + [ + ['id' => 1, 'name' => 'John Doe', 'salary' => '******', 'currency' => 'USD'], + ['id' => 2, 'name' => 'Jane Doe', 'salary' => '******', 'currency' => 'USD'], + ['id' => 3, 'name' => 'John Smith', 'salary' => '******', 'currency' => 'USD'], + ['id' => 4, 'name' => 'Jane Smith', 'salary' => '******', 'currency' => 'USD'], + ], + $output + ); + } +} diff --git a/src/core/etl/tests/Flow/ETL/Tests/Integration/Filesystem/FilesystemStreams/FilesystemStreamsTest.php b/src/core/etl/tests/Flow/ETL/Tests/Integration/Filesystem/FilesystemStreams/FilesystemStreamsTest.php index 417b5be2f..fb5e18316 100644 --- a/src/core/etl/tests/Flow/ETL/Tests/Integration/Filesystem/FilesystemStreams/FilesystemStreamsTest.php +++ b/src/core/etl/tests/Flow/ETL/Tests/Integration/Filesystem/FilesystemStreams/FilesystemStreamsTest.php @@ -36,8 +36,8 @@ public function test_open_two_write_streams_to_stdout() : void $this->expectExceptionMessage('Only one stdout filesystem stream can be open at the same time'); $streams = $this->streams(); - $streams->writeTo(path_stdout('json')); - $streams->writeTo(path_stdout('json')); + $streams->writeTo(path_stdout()); + $streams->writeTo(path_stdout()); } @@ -129,7 +129,7 @@ public function test_scan() : void public function test_write_to_stdout() : void { $streams = $this->streams(); - $streams->writeTo(path_stdout('json')); + $streams->writeTo(path_stdout()); self::assertCount(1, $streams); } diff --git a/src/lib/azure-sdk/src/Flow/Azure/SDK/Exception/AzureException.php b/src/lib/azure-sdk/src/Flow/Azure/SDK/Exception/AzureException.php index 96c1ff684..cfbda708c 100644 --- a/src/lib/azure-sdk/src/Flow/Azure/SDK/Exception/AzureException.php +++ b/src/lib/azure-sdk/src/Flow/Azure/SDK/Exception/AzureException.php @@ -10,6 +10,6 @@ final class AzureException extends Exception { public function __construct(string $endpoint, public readonly RequestInterface $request, public readonly ResponseInterface $response) { - parent::__construct(\sprintf('Azure SDK Exception: %s', $endpoint)); + parent::__construct(\sprintf('Azure SDK Exception: %s, %d, %s', $endpoint, $this->response->getStatusCode(), $this->response->getBody()->getContents())); } } diff --git a/src/lib/filesystem/src/Flow/Filesystem/DSL/functions.php b/src/lib/filesystem/src/Flow/Filesystem/DSL/functions.php index 432dbe0a1..5cfaf0ec5 100644 --- a/src/lib/filesystem/src/Flow/Filesystem/DSL/functions.php +++ b/src/lib/filesystem/src/Flow/Filesystem/DSL/functions.php @@ -47,11 +47,15 @@ function path(string $path, array $options = []) : Path /** * Create a path to php stdout stream. + * + * @param null|array{'stream': 'output'|'stderr'|'stdout'} $options + * + * @return Path */ #[DocumentationDSL(module: Module::FILESYSTEM, type: Type::HELPER)] -function path_stdout() : Path +function path_stdout(?array $options = null) : Path { - return new Path('stdout://' . \bin2hex(random_bytes(16)) . '.stdout'); + return new Path('stdout://' . \bin2hex(\random_bytes(16)) . '.stdout', $options ?? []); } /** @@ -87,7 +91,7 @@ function fstab(Filesystem ...$filesystems) : FilesystemTable { if (!\count($filesystems)) { $filesystems[] = native_local_filesystem(); - $filesystems[] = new StdOutFilesystem(); + $filesystems[] = stdout_filesystem(); } return new FilesystemTable(...$filesystems); diff --git a/src/lib/filesystem/src/Flow/Filesystem/Local/StdOut/StdOutDestinationStream.php b/src/lib/filesystem/src/Flow/Filesystem/Local/StdOut/StdOutDestinationStream.php index 1dea800ec..0382d349b 100644 --- a/src/lib/filesystem/src/Flow/Filesystem/Local/StdOut/StdOutDestinationStream.php +++ b/src/lib/filesystem/src/Flow/Filesystem/Local/StdOut/StdOutDestinationStream.php @@ -4,7 +4,7 @@ namespace Flow\Filesystem\Local\StdOut; -use Flow\Filesystem\{DestinationStream, Path}; +use Flow\Filesystem\{DestinationStream, Exception\InvalidArgumentException, Path}; final class StdOutDestinationStream implements DestinationStream { @@ -15,12 +15,26 @@ final class StdOutDestinationStream implements DestinationStream public function __construct(private readonly Path $path, ?\php_user_filter $filter = null) { + /** + * @psalm-suppress PossiblyNullArgument + * + * @phpstan-ignore-next-line + */ + $outputStream = \mb_strtolower($this->path->options()->getAsString('stream', 'stdout')); + + if (!\in_array($outputStream, ['stdout', 'stderr', 'output'], true)) { + throw new InvalidArgumentException('Invalid output stream, allowed values are "stdout", "stderr" and "output", given: ' . $outputStream); + } + if ($filter !== null) { - stream_filter_register('stdout', $filter::class); - $this->handle = \STDOUT; + stream_filter_register($outputStream, $filter::class); + /** @phpstan-ignore-next-line */ + $this->handle = fopen('php://' . $outputStream, 'wb'); + /** @phpstan-ignore-next-line */ stream_filter_append($this->handle, 'stdout'); } else { - $this->handle = STDOUT; + /** @phpstan-ignore-next-line */ + $this->handle = fopen('php://' . $outputStream, 'wb'); } } diff --git a/src/lib/filesystem/src/Flow/Filesystem/Path.php b/src/lib/filesystem/src/Flow/Filesystem/Path.php index 47c76ed3c..dfd80d45e 100644 --- a/src/lib/filesystem/src/Flow/Filesystem/Path.php +++ b/src/lib/filesystem/src/Flow/Filesystem/Path.php @@ -5,6 +5,7 @@ namespace Flow\Filesystem; use Flow\Filesystem\Exception\{InvalidArgumentException, RuntimeException}; +use Flow\Filesystem\Path\Options; use Flow\Filesystem\Stream\ResourceContext; final class Path @@ -17,6 +18,8 @@ final class Path private ?bool $isPattern = null; + private Options $options; + private ?Partitions $partitions = null; private string $path; @@ -24,9 +27,9 @@ final class Path private Protocol $protocol; /** - * @param array $options + * @param array|Options $options */ - public function __construct(string $uri, private readonly array $options = []) + public function __construct(string $uri, array|Options $options = []) { $scheme = \preg_match('/^([a-zA-Z0-9+-]+):\/\//', $uri, $matches) ? $matches[1] : 'file'; @@ -40,20 +43,21 @@ public function __construct(string $uri, private readonly array $options = []) $this->path = $path; $this->protocol = new Protocol($scheme); - $this->extension = \array_key_exists('extension', $pathInfo) ? $pathInfo['extension'] : false; + $this->extension = \array_key_exists('extension', $pathInfo) ? \strtolower($pathInfo['extension']) : false; $this->filename = $pathInfo['filename']; $this->basename = $pathInfo['basename']; + $this->options = \is_array($options) ? new Options($options) : $options; } /** * Turn relative path into absolute paths even when path does not exists or it's glob pattern. * - * @param array $options + * @param array|Options $options * * @throws InvalidArgumentException * @throws RuntimeException */ - public static function realpath(string $path, array $options = []) : self + public static function realpath(string $path, array|Options $options = []) : self { // "" - empty path is current, local directory if ('' === $path) { @@ -179,7 +183,7 @@ public function filename() : bool|string public function isEqual(self $path) : bool { return $this->uri() === $path->uri() - && $this->options === $path->options(); + && $this->options->toArray() === $path->options()->toArray(); } public function isLocal() : bool @@ -211,10 +215,7 @@ public function matches(self $path) : bool return $this->fnmatch($this->path, $path->path); } - /** - * @return array - */ - public function options() : array + public function options() : Options { return $this->options; } diff --git a/src/lib/filesystem/src/Flow/Filesystem/Path/Options.php b/src/lib/filesystem/src/Flow/Filesystem/Path/Options.php new file mode 100644 index 000000000..95eee2771 --- /dev/null +++ b/src/lib/filesystem/src/Flow/Filesystem/Path/Options.php @@ -0,0 +1,43 @@ + + */ + private array $options; + + public function __construct(array $options) + { + $normalizedOptions = []; + + foreach ($options as $option => $value) { + $normalizedOptions[\mb_strtolower((string) $option)] = $value; + } + + $this->options = $normalizedOptions; + } + + public function getAsString(string $option, ?string $default = null) : ?string + { + if ($this->has($option)) { + return (string) $this->options[$option]; + } + + return $default; + } + + public function has(string $option) : bool + { + return isset($this->options[\mb_strtolower($option)]); + } + + public function toArray() : array + { + return $this->options; + } +} diff --git a/src/lib/filesystem/src/Flow/Filesystem/Stream/ResourceContext.php b/src/lib/filesystem/src/Flow/Filesystem/Stream/ResourceContext.php index a4665a5f9..ecb063b84 100644 --- a/src/lib/filesystem/src/Flow/Filesystem/Stream/ResourceContext.php +++ b/src/lib/filesystem/src/Flow/Filesystem/Stream/ResourceContext.php @@ -17,7 +17,7 @@ private function __construct(private readonly string $scheme, private readonly a public static function from(Path $path) : self { - return new self($path->protocol()->scheme(), $path->options()); + return new self($path->protocol()->scheme(), $path->options()->toArray()); } /** diff --git a/src/lib/filesystem/tests/Flow/Filesystem/Tests/Integration/StdOutFilesystemTest.php b/src/lib/filesystem/tests/Flow/Filesystem/Tests/Integration/StdOutFilesystemTest.php index 9a5d33116..fe14ea346 100644 --- a/src/lib/filesystem/tests/Flow/Filesystem/Tests/Integration/StdOutFilesystemTest.php +++ b/src/lib/filesystem/tests/Flow/Filesystem/Tests/Integration/StdOutFilesystemTest.php @@ -36,6 +36,22 @@ public function test_it_can_append_to_stdout() : void $filter::$buffer = ''; } + public function test_it_can_write_to_output() : void + { + $filesystem = new StdOutFilesystem(); + + $destination = $filesystem->writeTo(new Path('stdout://', ['stream' => 'output'])); + + ob_start(); + $destination->append('Hello'); + $destination->append(' '); + $destination->append('World!'); + + $output = ob_get_clean(); + + self::assertSame('Hello World!', $output); + } + public function test_it_can_write_to_stdout() : void { $filesystem = new StdOutFilesystem($filter = new Intercept()); @@ -51,11 +67,20 @@ public function test_it_can_write_to_stdout() : void $filter::$buffer = ''; } + public function test_it_cant_write_to_memory() : void + { + $filesystem = new StdOutFilesystem(); + + $this->expectExceptionMessage('Invalid output stream, allowed values are "stdout", "stderr" and "output", given: memory'); + + $destination = $filesystem->writeTo(new Path('stdout://', ['stream' => 'memory'])); + } + public function test_list() : void { $filesystem = new StdOutFilesystem(); - $paths = iterator_to_array($filesystem->list(path_stdout('json'))); + $paths = iterator_to_array($filesystem->list(path_stdout())); self::assertCount(0, $paths); } @@ -66,7 +91,7 @@ public function test_mv() : void $this->expectExceptionMessage('Cannot move files around in stdout'); - $filesystem->mv(path_stdout('json'), path_stdout('json')); + $filesystem->mv(path_stdout(), path_stdout()); } public function test_protocol() : void @@ -82,7 +107,7 @@ public function test_read_from() : void $this->expectExceptionMessage('Cannot read from stdout'); - $filesystem->readFrom(path_stdout('json')); + $filesystem->readFrom(path_stdout()); } public function test_rm() : void @@ -91,13 +116,13 @@ public function test_rm() : void $this->expectExceptionMessage('Cannot read from stdout'); - $filesystem->rm(path_stdout('json')); + $filesystem->rm(path_stdout()); } public function test_status() : void { $filesystem = new StdOutFilesystem(); - self::assertNull($filesystem->status(path_stdout('json'))); + self::assertNull($filesystem->status(path_stdout())); } } diff --git a/src/lib/filesystem/tests/Flow/Filesystem/Tests/Unit/PathTest.php b/src/lib/filesystem/tests/Flow/Filesystem/Tests/Unit/PathTest.php index ca70a5f08..bfd04a0ad 100644 --- a/src/lib/filesystem/tests/Flow/Filesystem/Tests/Unit/PathTest.php +++ b/src/lib/filesystem/tests/Flow/Filesystem/Tests/Unit/PathTest.php @@ -125,6 +125,11 @@ public function test_extension() : void self::assertFalse((new Path(__DIR__))->extension()); } + public function test_extension_uppercase() : void + { + self::assertSame('php', (new Path('/var/file/code.PhP'))->extension()); + } + public function test_file_prefix() : void { $path = new Path('flow-file://var/dir/file.csv', []); diff --git a/tools/blackfire/composer.lock b/tools/blackfire/composer.lock index 96f6ff6c3..b847c8262 100644 --- a/tools/blackfire/composer.lock +++ b/tools/blackfire/composer.lock @@ -85,16 +85,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" + "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/48a792895a2b7a6ee65dd5442c299d7b835b6137", + "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137", "shasum": "" }, "require": { @@ -104,8 +104,8 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", @@ -141,7 +141,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.1" + "source": "https://github.com/composer/ca-bundle/tree/1.5.2" }, "funding": [ { @@ -157,7 +157,7 @@ "type": "tidelift" } ], - "time": "2024-07-08T15:28:20+00:00" + "time": "2024-09-25T07:49:53+00:00" } ], "aliases": [], diff --git a/tools/box/composer.lock b/tools/box/composer.lock index 7c164c76c..289f0eb16 100644 --- a/tools/box/composer.lock +++ b/tools/box/composer.lock @@ -633,24 +633,24 @@ }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -694,7 +694,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -710,7 +710,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", @@ -1291,16 +1291,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.4", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81" + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", "shasum": "" }, "require": { @@ -1348,7 +1348,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-08-02T07:48:17+00:00" + "time": "2024-09-23T13:33:08+00:00" }, { "name": "nikic/iter", @@ -1404,16 +1404,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v4.19.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45", "shasum": "" }, "require": { @@ -1454,9 +1454,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2024-09-17T19:36:00+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -1702,16 +1702,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.30.1", + "version": "1.32.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "51b95ec8670af41009e2b2b56873bad96682413e" + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/51b95ec8670af41009e2b2b56873bad96682413e", - "reference": "51b95ec8670af41009e2b2b56873bad96682413e", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4", + "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4", "shasum": "" }, "require": { @@ -1743,9 +1743,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0" }, - "time": "2024-09-07T20:13:05+00:00" + "time": "2024-09-26T07:23:32+00:00" }, { "name": "psr/container", @@ -2032,16 +2032,16 @@ }, { "name": "symfony/console", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -2106,7 +2106,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.11" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -2122,7 +2122,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:29+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2269,16 +2269,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -2315,7 +2315,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -2331,7 +2331,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", @@ -2797,16 +2797,16 @@ }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -2838,7 +2838,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -2854,7 +2854,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/service-contracts", @@ -2941,16 +2941,16 @@ }, { "name": "symfony/string", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -3007,7 +3007,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.11" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -3023,7 +3023,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/var-dumper", diff --git a/tools/cs-fixer/composer.lock b/tools/cs-fixer/composer.lock index f897e984e..f88353e65 100644 --- a/tools/cs-fixer/composer.lock +++ b/tools/cs-fixer/composer.lock @@ -152,24 +152,24 @@ }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -213,7 +213,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -229,7 +229,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/xdebug-handler", @@ -1260,16 +1260,16 @@ }, { "name": "symfony/console", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -1334,7 +1334,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.11" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -1350,7 +1350,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:29+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1577,16 +1577,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -1623,7 +1623,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -1639,7 +1639,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", @@ -2248,16 +2248,16 @@ }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -2289,7 +2289,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -2305,7 +2305,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/service-contracts", @@ -2454,16 +2454,16 @@ }, { "name": "symfony/string", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -2520,7 +2520,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.11" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -2536,7 +2536,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-20T08:15:52+00:00" } ], "aliases": [], diff --git a/tools/infection/composer.lock b/tools/infection/composer.lock index 8963ca576..9b94532a6 100644 --- a/tools/infection/composer.lock +++ b/tools/infection/composer.lock @@ -678,16 +678,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v4.19.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ed4c8949a32986043e977dbe14776c14d644c45", + "reference": "0ed4c8949a32986043e977dbe14776c14d644c45", "shasum": "" }, "require": { @@ -728,9 +728,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.2" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2024-09-17T19:36:00+00:00" }, { "name": "ondram/ci-detector", @@ -1111,16 +1111,16 @@ }, { "name": "symfony/console", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -1185,7 +1185,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.11" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -1201,7 +1201,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:29+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1272,16 +1272,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -1318,7 +1318,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -1334,7 +1334,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", @@ -1720,16 +1720,16 @@ }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -1761,7 +1761,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -1777,7 +1777,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/service-contracts", @@ -1864,16 +1864,16 @@ }, { "name": "symfony/string", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -1930,7 +1930,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.11" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -1946,7 +1946,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "thecodingmachine/safe", diff --git a/tools/phpbench/composer.lock b/tools/phpbench/composer.lock index dce1d9654..a1ebfe665 100644 --- a/tools/phpbench/composer.lock +++ b/tools/phpbench/composer.lock @@ -579,16 +579,16 @@ }, { "name": "symfony/console", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", - "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", + "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", "shasum": "" }, "require": { @@ -653,7 +653,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.11" + "source": "https://github.com/symfony/console/tree/v6.4.12" }, "funding": [ { @@ -669,7 +669,7 @@ "type": "tidelift" } ], - "time": "2024-08-15T22:48:29+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -740,16 +740,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/f810e3cbdf7fdc35983968523d09f349fa9ada12", + "reference": "f810e3cbdf7fdc35983968523d09f349fa9ada12", "shasum": "" }, "require": { @@ -786,7 +786,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.12" }, "funding": [ { @@ -802,7 +802,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-09-16T16:01:33+00:00" }, { "name": "symfony/finder", @@ -1255,16 +1255,16 @@ }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", "shasum": "" }, "require": { @@ -1296,7 +1296,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.12" }, "funding": [ { @@ -1312,7 +1312,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-17T12:47:12+00:00" }, { "name": "symfony/service-contracts", @@ -1399,16 +1399,16 @@ }, { "name": "symfony/string", - "version": "v6.4.11", + "version": "v6.4.12", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b" + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b", - "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b", + "url": "https://api.github.com/repos/symfony/string/zipball/f8a1ccebd0997e16112dfecfd74220b78e5b284b", + "reference": "f8a1ccebd0997e16112dfecfd74220b78e5b284b", "shasum": "" }, "require": { @@ -1465,7 +1465,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.11" + "source": "https://github.com/symfony/string/tree/v6.4.12" }, "funding": [ { @@ -1481,7 +1481,7 @@ "type": "tidelift" } ], - "time": "2024-08-12T09:55:28+00:00" + "time": "2024-09-20T08:15:52+00:00" }, { "name": "webmozart/glob", diff --git a/tools/phpstan/composer.lock b/tools/phpstan/composer.lock index 5c77e4557..558c39f9f 100644 --- a/tools/phpstan/composer.lock +++ b/tools/phpstan/composer.lock @@ -9,16 +9,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.12.4", + "version": "1.12.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "ffa517cb918591b93acc9b95c0bebdcd0e4538bd" + "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ffa517cb918591b93acc9b95c0bebdcd0e4538bd", - "reference": "ffa517cb918591b93acc9b95c0bebdcd0e4538bd", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", + "reference": "7e6c6cb7cecb0a6254009a1a8a7d54ec99812b17", "shasum": "" }, "require": { @@ -63,7 +63,7 @@ "type": "github" } ], - "time": "2024-09-19T07:58:01+00:00" + "time": "2024-09-26T12:45:22+00:00" } ], "aliases": [], diff --git a/tools/phpunit/composer.lock b/tools/phpunit/composer.lock index 4c1a2f4be..843f47071 100644 --- a/tools/phpunit/composer.lock +++ b/tools/phpunit/composer.lock @@ -566,16 +566,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.34", + "version": "10.5.35", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3c69d315bdf79080c8e115b69d1961c6905b0e18" + "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3c69d315bdf79080c8e115b69d1961c6905b0e18", - "reference": "3c69d315bdf79080c8e115b69d1961c6905b0e18", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7ac8b4e63f456046dcb4c9787da9382831a1874b", + "reference": "7ac8b4e63f456046dcb4c9787da9382831a1874b", "shasum": "" }, "require": { @@ -647,7 +647,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.34" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.35" }, "funding": [ { @@ -663,7 +663,7 @@ "type": "tidelift" } ], - "time": "2024-09-13T05:19:38+00:00" + "time": "2024-09-19T10:52:21+00:00" }, { "name": "sebastian/cli-parser",