diff --git a/.gitignore b/.gitignore index 9d917c1..d9ccd00 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ vendor bin #externals -humbuglog.txt \ No newline at end of file +.box_dump +.php_cs.cache +.phpunit.result.cache \ No newline at end of file diff --git a/.php_cs b/.php_cs index 8201f49..b9e835f 100644 --- a/.php_cs +++ b/.php_cs @@ -1,15 +1,96 @@ -ignoreUnreadableDirs() ->exclude([ - __DIR__ . '/tests/Integration/ScriptRuntime/_non_writable' + __DIR__ . '/tests/Integration/ScriptRuntime/_non_writable', ]) ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') -; + ->append([__FILE__]); + +return PhpCsFixer\Config::create() + ->setRules([ + '@Symfony' => true, + + // Fix declare style + 'blank_line_after_opening_tag' => false, -return Symfony\CS\Config\Config::create() - ->level(Symfony\CS\FixerInterface::PSR2_LEVEL) - ->finder($finder) - ; \ No newline at end of file + // override @Symonfy + 'phpdoc_align' => false, + 'phpdoc_separation' => false, + 'yoda_style' => false, + 'phpdoc_summary' => false, + 'increment_style' => false, + 'php_unit_fqcn_annotation' => false, + 'single_line_throw' => false, + + 'array_syntax' => [ + 'syntax' => 'short', + ], + 'class_definition' => [ + 'single_line' => true, + ], + 'comment_to_phpdoc' => true, + 'concat_space' => [ + 'spacing' => 'one', + ], + 'declare_strict_types' => true, + 'dir_constant' => true, + 'is_null' => true, + 'no_null_property_initialization' => true, + 'no_superfluous_phpdoc_tags' => true, + 'no_useless_return' => true, + 'no_useless_else' => true, + 'multiline_whitespace_before_semicolons' => true, + 'mb_str_functions' => true, + 'ordered_class_elements' => false, + 'ordered_imports' => [ + 'imports_order' => [ + 'class', + 'function', + 'const', + ], + ], + 'native_function_invocation' => [ + 'exclude' => [ + 'call_user_func_array', + ], + ], + 'global_namespace_import' => [ + 'import_classes' => true, + 'import_constants' => false, + 'import_functions' => true, + ], + 'php_unit_ordered_covers' => true, + 'php_unit_namespaced' => true, + 'php_unit_construct' => true, + 'phpdoc_add_missing_param_annotation' => [ + 'only_untyped' => true, + ], + 'phpdoc_order' => true, + 'phpdoc_var_annotation_correct_order' => true, + 'strict_comparison' => true, + 'strict_param' => true, + 'general_phpdoc_annotation_remove' => [ + 'annotations' => ['inheritdoc'], + ], + 'class_attributes_separation' => [ + 'elements' => [ + 'method', + 'property', + ], + ], + 'void_return' => true, + 'php_unit_test_case_static_method_calls' => [ + 'call_type' => 'self', + ], + 'yoda_style' => [ + 'equal' => false, + 'identical' => false, + 'less_and_greater' => false, + ], + 'nullable_type_declaration_for_default_null_value' => true, + ]) + ->setRiskyAllowed(true) + ->setUsingCache(true) + ->setFinder($finder); diff --git a/.psh.xml.dist b/.psh.xml similarity index 87% rename from .psh.xml.dist rename to .psh.xml index f67dc4d..b9aa83a 100644 --- a/.psh.xml.dist +++ b/.psh.xml @@ -15,5 +15,7 @@ |_| ]]> + + actions diff --git a/.travis.yml b/.travis.yml index 233c55d..1f96346 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,17 @@ language: php -php: - - 7.0 - - 7.1 - -sudo: false +jobs: + include: + - php: 7.2 + - php: 7.3 + - php: 7.4 + env: + - FULL_SUITE=true + - php: 8.0 + env: + - UPDATE_PHPUNIT=true + allow_failures: + - php: 8.0 cache: directories: @@ -12,11 +19,22 @@ cache: before_script: - if [[ $TRAVIS_BRANCH == 'master' && $TRAVIS_PULL_REQUEST == 'false' ]]; then openssl aes-256-cbc -K $encrypted_d4931f6d241c_key -iv $encrypted_d4931f6d241c_iv -in .travis/github_deploy_key.enc -out .travis/github_deploy_key -d; fi - - composer self-update + - composer self-update --1 + - if [[ "$UPDATE_PHPUNIT" == "true" ]]; then + composer config platform.php 7.4; + composer require "phpunit/phpunit:^9" --with-all-dependencies; + fi - composer install + - if [[ "$FULL_SUITE" == "true" ]]; then + composer bin all install; + fi script: - - ./psh unit + - if [[ "$FULL_SUITE" == "true" ]]; then + ./psh ci; + else + ./psh unit; + fi after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/README.md b/README.md index 68b153a..39d0256 100644 --- a/README.md +++ b/README.md @@ -27,10 +27,13 @@ Table of contents * [Placeholders](#placeholders) * [Constants](#constants) * [Variables](#variables) + * [Dotenv](#dotenv) + * [Require](#require) * [Templates](#templates) * [Environments](#environments) * [Headers](#headers) * [Overriding configuration file](#overriding-configuration-file) + * [Importing configuration files](#importing-configuration-files) * [PSH-Scripts](#sh-scripts) * [Defining placeholders](#defining-placeholders) * [Including other actions](#including-other-actions) @@ -84,7 +87,6 @@ Download `psh.phar` to your local environment. ```sh wget https://shopwarelabs.github.io/psh/psh.phar # PHP7 Version -# OR wget https://shopwarelabs.github.io/psh/psh56.phar for the PHP5.6 Version chmod +x psh.phar ``` @@ -109,8 +111,7 @@ composer install # assuming you have composer installed globally ./psh build ``` -This will create a release phar in the `build/psh.phar` directory. Although the project itself requires PHP7 a PHP 5.6 -compatible version is currently created with it `build/psh56.phar`. +This will create a release phar in the `build/psh.phar` directory. The project itself requires PHP 7.2+. Usage ------------ @@ -233,6 +234,18 @@ dev-ops/common/actions/test.sh echo __TEST__ ``` +#### Require + +It may be necessary to require a placeholder to be set, but can't set right away. One such example might be a system dependent path. PSH allows you to communicate this to the user by adding this: + +```xml + + + +``` + +Now unless foo is set, it is not possible to execute any psh script. The description is optional and can be omitted. + #### Templates If your application depends on files that are not part of your repository because they differ for different systems (Typically `*.dist` files), @@ -310,6 +323,18 @@ You can place a `.psh.xml.override` inside your directory where the `.psh.xml` i > Notice: You can overwrite a XML config file with a YAML file to ease the migration from one format to the other. +#### Importing configuration files + +You can import environments, actions and placeholders by using the import statement and telling psh to look in another place. + +```xml + +``` + +These directories should contain a `psh.xml` or `psh.xml.dist`. If no file is found a warning is issued but no braking error, since it may very well be that psh is currently installing or downloading the files. You can also use a glob pattern like "tools/**/config" + +> Notice: This happens through merging the different configurations into one. Be aware that you might overwrite base configuration. + ## PSH-Scripts Although most of your existing sh scripts should work just fine, you may find some of the following additions useful or necessary. diff --git a/actions/build.sh b/actions/build.sh index 266dcba..9cb6b87 100644 --- a/actions/build.sh +++ b/actions/build.sh @@ -1,22 +1,8 @@ #!/usr/bin/env bash # DESCRIPTION: Builds phar packages -I: rm -R build/php56 -mkdir build/php56 - -cp psh build/php56 -cp composer.json build/php56 -cp box.json build/php56 -cp box.phar build/php56 -cp -R vendor build/php56 -cp -R resource build/php56 -bin/php-version-transpiler src/ build/php56/src - -cd build/php56 && php box.phar build -mv build/php56/psh.phar build/psh56.phar -chmod +x build/psh56.phar - -php box.phar build +I: rm build/*.phar +php bin/box compile --debug mv psh.phar build/psh.phar chmod +x build/psh.phar -rm -R build/php56 \ No newline at end of file +rm -R .box_dump \ No newline at end of file diff --git a/actions/ci.sh b/actions/ci.sh new file mode 100644 index 0000000..25c9c3a --- /dev/null +++ b/actions/ci.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# DESCRIPTION: Execute full ci suite + +bin/psalm +bin/php-cs-fixer fix +INCLUDE: unit.sh + +phpdbg -qrr bin/infection --min-msi=80 diff --git a/actions/clear.sh b/actions/clear.sh old mode 100644 new mode 100755 index d3db581..2cd824e --- a/actions/clear.sh +++ b/actions/clear.sh @@ -1,4 +1,9 @@ #!/usr/bin/env bash # DESCRIPTION: Remove build artifacts +# +set -euo pipefail -I: rm -R build/* \ No newline at end of file +rm -Rf build/* +rm -Rf vendor-bin/*/vendor +rm -Rf bin +rm -Rf vendor diff --git a/actions/unit.sh b/actions/unit.sh index 56b338d..ce8de04 100644 --- a/actions/unit.sh +++ b/actions/unit.sh @@ -1,9 +1,4 @@ #!/usr/bin/env bash # DESCRIPTION: Execute unit tests -D: bin/php-cs-fixer fix phpdbg -qrr bin/phpunit --coverage-clover=./build/coverage.xml --coverage-html=./build/html-coverage - -WAIT: - -./humbug.phar --no-interaction diff --git a/box.json b/box.json index 39d66d5..0e2c0cc 100644 --- a/box.json +++ b/box.json @@ -1,6 +1,5 @@ { "alias": "psh.phar", - "chmod": "0755", "directories": [ "src", "resource", @@ -9,7 +8,5 @@ "files": [ "psh" ], - "main": "psh", - "output": "psh.phar", "stub": true } \ No newline at end of file diff --git a/box.phar b/box.phar deleted file mode 100755 index 8503550..0000000 Binary files a/box.phar and /dev/null differ diff --git a/composer.json b/composer.json index 1c6e3f8..81798bc 100644 --- a/composer.json +++ b/composer.json @@ -14,21 +14,22 @@ } }, "require": { - "php": ">=7", + "php": "^7.2", "ext-dom": "*", - "symfony/finder": "^3.1", - "symfony/process": "^3.1", - "symfony/filesystem": "^3.1", - "symfony/yaml": "^3.1", - "league/climate": "^3.2", + "symfony/finder": "^4.4", + "symfony/process": "^4.4", + "symfony/filesystem": "^4.4", + "symfony/yaml": "^4.4", + "league/climate": "^3.6", "khill/php-duration": "^1.0", - "vlucas/phpdotenv": "^3.3", - "symfony/config": "^3.3" + "vlucas/phpdotenv": "^5.2", + "symfony/config": "^4.4" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", - "phpunit/phpunit": "^5.4", - "janpiet/php-version-transpiler": "dev-master" + "roave/security-advisories": "dev-master", + "friendsofphp/php-cs-fixer": "^2", + "phpunit/phpunit": "^8", + "bamarni/composer-bin-plugin": "^1.4" }, "license": "MIT", "authors": [ @@ -40,10 +41,10 @@ "config": { "bin-dir": "bin", "platform": { - "php": "7.0" + "php": "7.2.0" } - }, - "minimum-stability": "dev", - "prefer-stable": true + "scripts": { + }, + "minimum-stability": "stable" } diff --git a/composer.lock b/composer.lock index 3f06045..98c0f0f 100644 --- a/composer.lock +++ b/composer.lock @@ -1,11 +1,77 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "aeaea75db4f88b6c89193a8d81529d64", + "content-hash": "816a5feea5c368cf34931d39774b0755", "packages": [ + { + "name": "graham-campbell/result-type", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb", + "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0", + "phpoption/phpoption": "^1.7.3" + }, + "require-dev": { + "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2020-04-13T13:17:36+00:00" + }, { "name": "khill/php-duration", "version": "1.0.6", @@ -54,24 +120,28 @@ "seconds", "time" ], + "support": { + "issues": "https://github.com/kevinkhill/php-duration/issues", + "source": "https://github.com/kevinkhill/php-duration/tree/1.0.6" + }, "time": "2018-07-05T12:10:14+00:00" }, { "name": "league/climate", - "version": "3.4.1", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/thephpleague/climate.git", - "reference": "d657a19837c1f79a891381fb128b755aa3386381" + "reference": "61eecbde7645528a855a3afef65c5354093b27b2" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/thephpleague/climate/zipball/d657a19837c1f79a891381fb128b755aa3386381", - "reference": "d657a19837c1f79a891381fb128b755aa3386381", + "url": "https://github.com/gitapi/repos/thephpleague/climate/zipball/61eecbde7645528a855a3afef65c5354093b27b2", + "reference": "61eecbde7645528a855a3afef65c5354093b27b2", "shasum": "" }, "require": { - "php": "^5.6|^7.0", + "php": "^7.2", "psr/log": "^1.0", "seld/cli-prompt": "^1.0" }, @@ -94,17 +164,17 @@ "MIT" ], "authors": [ - { - "name": "Craig Duncan", - "email": "git@duncanc.co.uk", - "homepage": "https://github.com/duncan3dc", - "role": "Developer" - }, { "name": "Joe Tannenbaum", "email": "hey@joe.codes", "homepage": "http://joe.codes/", "role": "Developer" + }, + { + "name": "Craig Duncan", + "email": "git@duncanc.co.uk", + "homepage": "https://github.com/duncan3dc", + "role": "Developer" } ], "description": "PHP's best friend for the terminal. CLImate allows you to easily output colored text, special formats, and more.", @@ -115,47 +185,56 @@ "php", "terminal" ], - "time": "2018-04-29T16:43:54+00:00" + "support": { + "issues": "https://github.com/thephpleague/climate/issues", + "source": "https://github.com/thephpleague/climate/tree/3.6.0" + }, + "time": "2020-10-04T16:02:59+00:00" }, { "name": "phpoption/phpoption", - "version": "1.5.0", + "version": "1.7.5", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", - "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "url": "https://github.com/gitapi/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^5.5.9 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "4.7.*" + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.7-dev" } }, "autoload": { - "psr-0": { - "PhpOption\\": "src/" + "psr-4": { + "PhpOption\\": "src/PhpOption/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "Apache2" + "Apache-2.0" ], "authors": [ { "name": "Johannes M. Schmitt", "email": "schmittjoh@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" } ], "description": "Option Type for PHP", @@ -165,20 +244,34 @@ "php", "type" ], - "time": "2015-07-25T16:39:46+00:00" + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.7.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2020-07-20T17:29:33+00:00" }, { "name": "psr/log", - "version": "1.1.0", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "url": "https://github.com/gitapi/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -187,7 +280,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -212,7 +305,10 @@ "psr", "psr-3" ], - "time": "2018-11-20T15:27:04+00:00" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" }, { "name": "seld/cli-prompt", @@ -260,34 +356,40 @@ "input", "prompt" ], + "support": { + "issues": "https://github.com/Seldaek/cli-prompt/issues", + "source": "https://github.com/Seldaek/cli-prompt/tree/master" + }, "time": "2017-03-18T11:32:45+00:00" }, { "name": "symfony/config", - "version": "v3.3.6", + "version": "v4.4.15", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "54ee12b0dd60f294132cabae6f5da9573d2e5297" + "reference": "7c5a1002178a612787c291a4f515f87b19176b61" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/config/zipball/54ee12b0dd60f294132cabae6f5da9573d2e5297", - "reference": "54ee12b0dd60f294132cabae6f5da9573d2e5297", + "url": "https://github.com/gitapi/repos/symfony/config/zipball/7c5a1002178a612787c291a4f515f87b19176b61", + "reference": "7c5a1002178a612787c291a4f515f87b19176b61", "shasum": "" }, "require": { - "php": ">=5.5.9", - "symfony/filesystem": "~2.8|~3.0" + "php": ">=7.1.3", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/dependency-injection": "<3.3", - "symfony/finder": "<3.3" + "symfony/finder": "<3.4" }, "require-dev": { - "symfony/dependency-injection": "~3.3", - "symfony/finder": "~3.3", - "symfony/yaml": "~3.0" + "symfony/event-dispatcher": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/messenger": "^4.1|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -295,7 +397,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -322,29 +424,47 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2017-07-19T07:37:29+00:00" + "support": { + "source": "https://github.com/symfony/config/tree/v4.4.15" + }, + "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-02T07:34:48+00:00" }, { "name": "symfony/filesystem", - "version": "v3.3.6", + "version": "v4.4.15", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "427987eb4eed764c3b6e38d52a0f87989e010676" + "reference": "ebc51494739d3b081ea543ed7c462fa73a4f74db" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/filesystem/zipball/427987eb4eed764c3b6e38d52a0f87989e010676", - "reference": "427987eb4eed764c3b6e38d52a0f87989e010676", + "url": "https://github.com/gitapi/repos/symfony/filesystem/zipball/ebc51494739d3b081ea543ed7c462fa73a4f74db", + "reference": "ebc51494739d3b081ea543ed7c462fa73a4f74db", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -371,29 +491,46 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2017-07-11T07:17:58+00:00" + "support": { + "source": "https://github.com/symfony/filesystem/tree/v4.4.15" + }, + "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-27T13:54:16+00:00" }, { "name": "symfony/finder", - "version": "v3.3.6", + "version": "v4.4.15", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4" + "reference": "60d08560f9aa72997c44077c40d47aa28a963230" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/finder/zipball/baea7f66d30854ad32988c11a09d7ffd485810c4", - "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4", + "url": "https://github.com/gitapi/repos/symfony/finder/zipball/60d08560f9aa72997c44077c40d47aa28a963230", + "reference": "60d08560f9aa72997c44077c40d47aa28a963230", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": ">=7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -420,24 +557,41 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2017-06-01T21:01:25+00:00" + "support": { + "source": "https://github.com/symfony/finder/tree/v4.4.15" + }, + "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-02T07:34:48+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.10.0", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://github.com/gitapi/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-ctype": "For best performance" @@ -445,7 +599,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -461,13 +619,13 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", @@ -478,29 +636,209 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "support": { + "source": "https://github.com/symfony/polyfill-ctype/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.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", + "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "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\\Mbstring\\": "" + }, + "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 the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "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-php80", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "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/process", - "version": "v3.3.6", + "version": "v4.4.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a" + "reference": "9b887acc522935f77555ae8813495958c7771ba7" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/process/zipball/07432804942b9f6dd7b7377faf9920af5f95d70a", - "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a", + "url": "https://github.com/gitapi/repos/symfony/process/zipball/9b887acc522935f77555ae8813495958c7771ba7", + "reference": "9b887acc522935f77555ae8813495958c7771ba7", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": ">=7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -527,27 +865,48 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2017-07-13T13:05:09+00:00" + "support": { + "source": "https://github.com/symfony/process/tree/4.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-09-02T16:08:58+00:00" }, { "name": "symfony/yaml", - "version": "v3.3.6", + "version": "v4.4.15", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed" + "reference": "c7885964b1eceb70b0981556d0a9b01d2d97c8d1" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/yaml/zipball/ddc23324e6cfe066f3dd34a37ff494fa80b617ed", - "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed", + "url": "https://github.com/gitapi/repos/symfony/yaml/zipball/c7885964b1eceb70b0981556d0a9b01d2d97c8d1", + "reference": "c7885964b1eceb70b0981556d0a9b01d2d97c8d1", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" }, "require-dev": { - "symfony/console": "~2.8|~3.0" + "symfony/console": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -555,7 +914,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -582,34 +941,60 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2017-07-23T12:43:26+00:00" + "support": { + "source": "https://github.com/symfony/yaml/tree/v4.4.15" + }, + "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:36:23+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v3.3.2", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "1ee9369cfbf26cfcf1f2515d98f15fab54e9647a" + "reference": "fba64139db67123c7a57072e5f8d3db10d160b66" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/vlucas/phpdotenv/zipball/1ee9369cfbf26cfcf1f2515d98f15fab54e9647a", - "reference": "1ee9369cfbf26cfcf1f2515d98f15fab54e9647a", + "url": "https://github.com/gitapi/repos/vlucas/phpdotenv/zipball/fba64139db67123c7a57072e5f8d3db10d160b66", + "reference": "fba64139db67123c7a57072e5f8d3db10d160b66", "shasum": "" }, "require": { - "php": "^5.4 || ^7.0", - "phpoption/phpoption": "^1.5", - "symfony/polyfill-ctype": "^1.9" + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.1", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.7.4", + "symfony/polyfill-ctype": "^1.17", + "symfony/polyfill-mbstring": "^1.17", + "symfony/polyfill-php80": "^1.17" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0" + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.2 || ^9.0" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "5.2-dev" } }, "autoload": { @@ -622,10 +1007,15 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "homepage": "https://gjcampbell.co.uk/" + }, { "name": "Vance Lucas", "email": "vance@vancelucas.com", - "homepage": "http://www.vancelucas.com" + "homepage": "https://vancelucas.com/" } ], "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", @@ -634,43 +1024,103 @@ "env", "environment" ], - "time": "2019-01-30T10:43:17+00:00" + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.2.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2020-09-14T15:57:31+00:00" } ], "packages-dev": [ { - "name": "doctrine/instantiator", - "version": "1.0.5", + "name": "bamarni/composer-bin-plugin", + "version": "1.4.1", "source": { "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + "url": "https://github.com/bamarni/composer-bin-plugin.git", + "reference": "9329fb0fbe29e0e1b2db8f4639a193e4f5406225" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "url": "https://github.com/gitapi/repos/bamarni/composer-bin-plugin/zipball/9329fb0fbe29e0e1b2db8f4639a193e4f5406225", + "reference": "9329fb0fbe29e0e1b2db8f4639a193e4f5406225", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^5.5.9 || ^7.0 || ^8.0" }, "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "composer/composer": "^1.0 || ^2.0", + "symfony/console": "^2.5 || ^3.0 || ^4.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Bamarni\\Composer\\Bin\\Plugin" + }, + "autoload": { + "psr-4": { + "Bamarni\\Composer\\Bin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "No conflicts for your bin dependencies", + "keywords": [ + "composer", + "conflict", + "dependency", + "executable", + "isolation", + "tool" + ], + "support": { + "issues": "https://github.com/bamarni/composer-bin-plugin/issues", + "source": "https://github.com/bamarni/composer-bin-plugin/tree/master" + }, + "time": "2020-05-03T08:27:20+00:00" + }, + { + "name": "composer/semver", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "38276325bd896f90dfcfe30029aa5db40df387a7" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/composer/semver/zipball/38276325bd896f90dfcfe30029aa5db40df387a7", + "reference": "38276325bd896f90dfcfe30029aa5db40df387a7", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -679,58 +1129,74 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" } ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", + "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ - "constructor", - "instantiate" + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/1.7.1" + }, + "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": "2015-06-14T21:17:01+00:00" + "time": "2020-09-27T13:13:07+00:00" }, { - "name": "friendsofphp/php-cs-fixer", - "version": "v1.13.3", + "name": "composer/xdebug-handler", + "version": "1.4.4", "source": { "type": "git", - "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "387e4c86c9dc0e1e4c475291fc114ec45b98e624" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/387e4c86c9dc0e1e4c475291fc114ec45b98e624", - "reference": "387e4c86c9dc0e1e4c475291fc114ec45b98e624", + "url": "https://github.com/gitapi/repos/composer/xdebug-handler/zipball/6e076a124f7ee146f2487554a94b6a19a74887ba", + "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^5.3.6 || >=7.0 <7.2", - "sebastian/diff": "^1.1", - "symfony/console": "^2.3 || ^3.0", - "symfony/event-dispatcher": "^2.1 || ^3.0", - "symfony/filesystem": "^2.1 || ^3.0", - "symfony/finder": "^2.1 || ^3.0", - "symfony/process": "^2.3 || ^3.0", - "symfony/stopwatch": "^2.5 || ^3.0" - }, - "conflict": { - "hhvm": "<3.9" + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" }, "require-dev": { - "phpunit/phpunit": "^4.5|^5", - "satooshi/php-coveralls": "^1.0" + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" }, - "bin": [ - "php-cs-fixer" - ], - "type": "application", + "type": "library", "autoload": { "psr-4": { - "Symfony\\CS\\": "Symfony/CS/" + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -739,49 +1205,70 @@ ], "authors": [ { - "name": "Dariusz RumiƄski", - "email": "dariusz.ruminski@gmail.com" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/1.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" }, { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" } ], - "description": "A tool to automatically fix PHP code style", - "time": "2017-09-11T14:11:16+00:00" + "time": "2020-10-24T12:39:10+00:00" }, { - "name": "janpiet/php-version-transpiler", - "version": "dev-master", + "name": "doctrine/annotations", + "version": "1.11.1", "source": { "type": "git", - "url": "https://github.com/JanPietrzyk/php-version-transpiler.git", - "reference": "0adc25fc4db394bd2d26937342769851536cc176" + "url": "https://github.com/doctrine/annotations.git", + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/JanPietrzyk/php-version-transpiler/zipball/0adc25fc4db394bd2d26937342769851536cc176", - "reference": "0adc25fc4db394bd2d26937342769851536cc176", + "url": "https://github.com/gitapi/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", "shasum": "" }, "require": { - "nikic/php-parser": "^3.0", - "php": ">=7.0.0", - "symfony/console": "^3.0", - "symfony/filesystem": "^3.0", - "symfony/finder": "^3.0" + "doctrine/lexer": "1.*", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^5.3", - "symfony/process": "^3.0" + "doctrine/cache": "1.*", + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, - "bin": [ - "php-version-transpiler" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11.x-dev" + } + }, "autoload": { "psr-4": { - "JanPiet\\": "src" + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", @@ -790,141 +1277,266 @@ ], "authors": [ { - "name": "Jan Pietrzyk", - "email": "mail@jpietrzyk.de" + "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" } ], - "description": "Transpile php 7 code to php 5.6 code", - "time": "2016-12-20T14:38:39+00:00" + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.11.1" + }, + "time": "2020-10-26T10:28:16+00:00" }, { - "name": "myclabs/deep-copy", - "version": "1.7.0", + "name": "doctrine/instantiator", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "url": "https://github.com/gitapi/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^4.1" + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, "autoload": { "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Create deep copies (clones) of your objects", + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" + "constructor", + "instantiate" + ], + "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": "2017-10-19T19:58:43+00:00" + "time": "2020-05-29T17:27:14+00:00" }, { - "name": "nikic/php-parser", - "version": "v3.1.5", + "name": "doctrine/lexer", + "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", + "url": "https://github.com/gitapi/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=5.5" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" }, - "bin": [ - "bin/php-parse" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { "psr-4": { - "PhpParser\\": "lib/PhpParser" + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Nikita Popov" + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" } ], - "description": "A PHP parser written in PHP", + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", "keywords": [ + "annotations", + "docblock", + "lexer", "parser", "php" ], - "time": "2018-02-28T20:30:58+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": "phpdocumentor/reflection-common", - "version": "1.0.1", + "name": "friendsofphp/php-cs-fixer", + "version": "v2.16.4", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "url": "https://github.com/gitapi/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/1023c3458137ab052f6ff1e09621a721bfdeca13", + "reference": "1023c3458137ab052f6ff1e09621a721bfdeca13", "shasum": "" }, "require": { - "php": ">=5.5" + "composer/semver": "^1.4", + "composer/xdebug-handler": "^1.2", + "doctrine/annotations": "^1.2", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^5.6 || ^7.0", + "php-cs-fixer/diff": "^1.3", + "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0", + "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^3.0 || ^4.0 || ^5.0", + "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0", + "symfony/polyfill-php70": "^1.0", + "symfony/polyfill-php72": "^1.4", + "symfony/process": "^3.0 || ^4.0 || ^5.0", + "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0" }, "require-dev": { - "phpunit/phpunit": "^4.6" + "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", + "justinrainbow/json-schema": "^5.0", + "keradus/cli-executor": "^1.2", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.1", + "php-cs-fixer/accessible-object": "^1.0", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1", + "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.1", + "phpunitgoodpractices/traits": "^1.8", + "symfony/phpunit-bridge": "^5.1", + "symfony/yaml": "^3.0 || ^4.0 || ^5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters.", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.", + "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible." }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } + "PhpCsFixer\\": "src/" + }, + "classmap": [ + "tests/Test/AbstractFixerTestCase.php", + "tests/Test/AbstractIntegrationCaseFactory.php", + "tests/Test/AbstractIntegrationTestCase.php", + "tests/Test/Assert/AssertTokensTrait.php", + "tests/Test/IntegrationCase.php", + "tests/Test/IntegrationCaseFactory.php", + "tests/Test/IntegrationCaseFactoryInterface.php", + "tests/Test/InternalIntegrationCaseFactory.php", + "tests/Test/IsIdenticalConstraint.php", + "tests/TestCase.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -932,153 +1544,871 @@ ], "authors": [ { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz RumiƄski", + "email": "dariusz.ruminski@gmail.com" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" + "description": "A tool to automatically fix PHP code style", + "support": { + "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues", + "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v2.16.4" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } ], - "time": "2017-09-11T18:02:19+00:00" + "time": "2020-06-27T23:57:46+00:00" }, { - "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "name": "myclabs/deep-copy", + "version": "1.10.1", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://github.com/gitapi/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" + "php": "^7.1 || ^8.0" + }, + "replace": { + "myclabs/deep-copy": "self.version" }, "require-dev": { - "doctrine/instantiator": "~1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "authors": [ + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.x" + }, + "funding": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-06-29T13:22:24+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/master" + }, + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/PHP-CS-Fixer/diff/zipball/dbd31aeb251639ac0b9e7e29405c1441907f5759", + "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "SpacePossum" + } + ], + "description": "sebastian/diff v2 backport support for PHP5.6", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/diff/issues", + "source": "https://github.com/PHP-CS-Fixer/diff/tree/v1.3.1" + }, + "time": "2020-10-14T08:39:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.2.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, + "time": "2020-09-03T19:13:55+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, + "time": "2020-09-17T18:55:26+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.1", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0 || ^9.0 <9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.12.1" + }, + "time": "2020-09-29T09:10:42+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "7.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.2", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.2" + }, + "suggest": { + "ext-xdebug": "^2.7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.10" + }, + "time": "2019-11-20T13:55:58+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.2" + }, + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + }, + "time": "2019-06-07T04:22:29+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.1" + }, + "abandoned": true, + "time": "2019-09-17T06:23:10+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "0.4.0", + "name": "phpunit/phpunit", + "version": "8.5.8", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "url": "https://github.com/gitapi/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", "shasum": "" }, "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" + "doctrine/instantiator": "^1.2.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.9.1", + "phar-io/manifest": "^1.0.3", + "phar-io/version": "^2.0.1", + "php": "^7.2", + "phpspec/prophecy": "^1.8.1", + "phpunit/php-code-coverage": "^7.0.7", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.2", + "sebastian/exporter": "^3.1.1", + "sebastian/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "8.5-dev" } }, "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5" + }, + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2017-07-14T14:27:02+00:00" + "time": "2020-06-22T07:06:58+00:00" }, { - "name": "phpspec/prophecy", - "version": "1.8.0", + "name": "psr/container", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", - "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "url": "https://github.com/gitapi/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0|^3.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "psr-0": { - "Prophecy\\": "src/" + "psr-4": { + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1087,111 +2417,363 @@ ], "authors": [ { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" } ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" ], - "time": "2018-08-05T17:53:17+00:00" + "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" }, { - "name": "phpunit/php-code-coverage", - "version": "4.0.8", + "name": "roave/security-advisories", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "327370943772f9917bc2dc2aa4263db2d572a112" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "url": "https://github.com/gitapi/repos/Roave/SecurityAdvisories/zipball/327370943772f9917bc2dc2aa4263db2d572a112", + "reference": "327370943772f9917bc2dc2aa4263db2d572a112", "shasum": "" }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^5.6 || ^7.0", - "phpunit/php-file-iterator": "^1.3", - "phpunit/php-text-template": "^1.2", - "phpunit/php-token-stream": "^1.4.2 || ^2.0", - "sebastian/code-unit-reverse-lookup": "^1.0", - "sebastian/environment": "^1.3.2 || ^2.0", - "sebastian/version": "^1.0 || ^2.0" - }, - "require-dev": { - "ext-xdebug": "^2.1.4", - "phpunit/phpunit": "^5.7" - }, - "suggest": { - "ext-xdebug": "^2.5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, + "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": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" } ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" + "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": "2017-04-02T07:44:40+00:00" + "time": "2020-10-19T07:02:45+00:00" }, { - "name": "phpunit/php-file-iterator", - "version": "1.4.5", + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "url": "https://github.com/gitapi/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { @@ -1206,36 +2788,45 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2017-11-27T13:52:08+00:00" + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/master" + }, + "time": "2017-03-04T06:30:41+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "sebastian/comparator", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://github.com/gitapi/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1246,43 +2837,61 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ - "template" + "comparator", + "compare", + "equality" ], - "time": "2015-06-21T13:50:34+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/master" + }, + "time": "2018-07-12T15:12:46+00:00" }, { - "name": "phpunit/php-timer", - "version": "1.0.9", + "name": "sebastian/diff", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "url": "https://github.com/gitapi/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -1295,44 +2904,56 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "timer" + "diff", + "udiff", + "unidiff", + "unified diff" ], - "time": "2017-02-26T11:10:40+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/master" + }, + "time": "2019-02-04T06:01:07+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "2.0.2", + "name": "sebastian/environment", + "version": "4.2.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", + "url": "https://github.com/gitapi/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2.4" + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1350,68 +2971,45 @@ "email": "sebastian@phpunit.de" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ - "tokenizer" + "Xdebug", + "environment", + "hhvm" ], - "time": "2017-11-27T05:48:46+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.3" + }, + "time": "2019-11-20T08:46:58+00:00" }, { - "name": "phpunit/phpunit", - "version": "5.7.27", + "name": "sebastian/exporter", + "version": "3.1.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c" + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", - "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c", + "url": "https://github.com/gitapi/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "~1.3", - "php": "^5.6 || ^7.0", - "phpspec/prophecy": "^1.6.2", - "phpunit/php-code-coverage": "^4.0.4", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "^3.2", - "sebastian/comparator": "^1.2.4", - "sebastian/diff": "^1.4.3", - "sebastian/environment": "^1.3.4 || ^2.0", - "sebastian/exporter": "~2.0", - "sebastian/global-state": "^1.1", - "sebastian/object-enumerator": "~2.0", - "sebastian/resource-operations": "~1.0", - "sebastian/version": "^1.0.6|^2.0.1", - "symfony/yaml": "~2.1|~3.0|~4.0" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2" + "php": "^7.0", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "~1.1" + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "5.7.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -1426,52 +3024,67 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", "keywords": [ - "phpunit", - "testing", - "xunit" + "export", + "exporter" ], - "time": "2018-02-01T05:50:59+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/master" + }, + "time": "2019-09-14T09:02:43+00:00" }, { - "name": "phpunit/phpunit-mock-objects", - "version": "3.4.4", + "name": "sebastian/global-state", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", - "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", + "url": "https://github.com/gitapi/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.6 || ^7.0", - "phpunit/php-text-template": "^1.2", - "sebastian/exporter": "^1.2 || ^2.0" - }, - "conflict": { - "phpunit/phpunit": "<5.4.0" + "php": "^7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "phpunit/phpunit": "^5.4" + "ext-dom": "*", + "phpunit/phpunit": "^8.0" }, "suggest": { - "ext-soap": "*" + "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -1486,43 +3099,46 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ - "mock", - "xunit" + "global state" ], - "abandoned": true, - "time": "2017-06-30T09:13:00+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/master" + }, + "time": "2019-02-01T05:30:01+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", + "name": "sebastian/object-enumerator", + "version": "3.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://github.com/gitapi/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -1540,36 +3156,38 @@ "email": "sebastian@phpunit.de" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master" + }, + "time": "2017-08-03T12:35:26+00:00" }, { - "name": "sebastian/comparator", - "version": "1.2.4", + "name": "sebastian/object-reflector", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "url": "https://github.com/gitapi/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.1-dev" } }, "autoload": { @@ -1582,56 +3200,43 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2017-01-29T09:50:25+00:00" + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/master" + }, + "time": "2017-03-29T09:07:27+00:00" }, { - "name": "sebastian/diff", - "version": "1.4.3", + "name": "sebastian/recursion-context", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "url": "https://github.com/gitapi/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -1645,45 +3250,47 @@ ], "authors": [ { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2017-05-22T07:24:03+00:00" + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" + }, + "time": "2017-03-03T06:23:57+00:00" }, { - "name": "sebastian/environment", - "version": "2.0.0", + "name": "sebastian/resource-operations", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "url": "https://github.com/gitapi/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.0" + "php": "^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1701,41 +3308,38 @@ "email": "sebastian@phpunit.de" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2016-11-26T07:53:53+00:00" + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" + }, + "time": "2018-10-04T04:07:39+00:00" }, { - "name": "sebastian/exporter", - "version": "2.0.0", + "name": "sebastian/type", + "version": "1.1.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "url": "https://github.com/gitapi/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~2.0" + "php": "^7.2" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.1-dev" } }, "autoload": { @@ -1748,62 +3352,41 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2016-11-19T08:54:04+00:00" + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/master" + }, + "time": "2019-07-02T08:10:15+00:00" }, { - "name": "sebastian/global-state", - "version": "1.1.1", + "name": "sebastian/version", + "version": "2.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "url": "https://github.com/gitapi/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", "shasum": "" }, "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" + "php": ">=5.6" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1818,250 +3401,376 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12T03:26:01+00:00" + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, + "time": "2016-10-03T07:35:21+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "2.0.1", + "name": "symfony/console", + "version": "v4.4.15", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" + "url": "https://github.com/symfony/console.git", + "reference": "90933b39c7b312fc3ceaa1ddeac7eb48cb953124" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "url": "https://github.com/gitapi/repos/symfony/console/zipball/90933b39c7b312fc3ceaa1ddeac7eb48cb953124", + "reference": "90933b39c7b312fc3ceaa1ddeac7eb48cb953124", "shasum": "" }, "require": { - "php": ">=5.6", - "sebastian/recursion-context": "~2.0" + "php": ">=7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" }, "require-dev": { - "phpunit/phpunit": "~5" + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "4.4-dev" } }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-02-18T15:18:39+00:00" + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v4.4.15" + }, + "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-15T07:58:55+00:00" }, { - "name": "sebastian/recursion-context", - "version": "2.0.0", + "name": "symfony/event-dispatcher", + "version": "v4.4.15", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "e17bb5e0663dc725f7cdcafc932132735b4725cd" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "url": "https://github.com/gitapi/repos/symfony/event-dispatcher/zipball/e17bb5e0663dc725f7cdcafc932132735b4725cd", + "reference": "e17bb5e0663dc725f7cdcafc932132735b4725cd", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "4.4-dev" } }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Adam Harvey", - "email": "aharvey@php.net" + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-11-19T07:33:16+00:00" + "time": "2020-09-18T14:07:46+00:00" }, { - "name": "sebastian/resource-operations", - "version": "1.0.0", + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.9", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "url": "https://github.com/gitapi/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": ">=7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + }, + "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-07-06T13:19:58+00:00" }, { - "name": "sebastian/version", - "version": "2.0.1", + "name": "symfony/options-resolver", + "version": "v4.4.15", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "url": "https://github.com/symfony/options-resolver.git", + "reference": "02b120a79ff06b779819f1594a300226bfc75105" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://github.com/gitapi/repos/symfony/options-resolver/zipball/02b120a79ff06b779819f1594a300226bfc75105", + "reference": "02b120a79ff06b779819f1594a300226bfc75105", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "4.4-dev" } }, "autoload": { - "classmap": [ - "src/" + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" + "description": "Symfony OptionsResolver Component", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v4.4.15" + }, + "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-24T16:40:22+00:00" }, { - "name": "symfony/console", - "version": "v3.3.6", + "name": "symfony/polyfill-php70", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "b0878233cb5c4391347e5495089c7af11b8e6201" + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/console/zipball/b0878233cb5c4391347e5495089c7af11b8e6201", - "reference": "b0878233cb5c4391347e5495089c7af11b8e6201", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php70/zipball/5f03a781d984aae42cebd18e7912fa80f02ee644", + "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644", "shasum": "" }, "require": { - "php": ">=5.5.9", - "symfony/debug": "~2.8|~3.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.3" + "php": ">=7.1" }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.3", - "symfony/dependency-injection": "~3.3", - "symfony/event-dispatcher": "~2.8|~3.0", - "symfony/filesystem": "~2.8|~3.0", - "symfony/http-kernel": "~2.8|~3.0", - "symfony/process": "~2.8|~3.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/filesystem": "", - "symfony/process": "" - }, - "type": "library", + "type": "metapackage", "extra": { "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" + "dev-main": "1.20-dev" }, - "exclude-from-classmap": [ - "/Tests/" - ] + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2069,54 +3778,74 @@ ], "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 Console Component", + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", "homepage": "https://symfony.com", - "time": "2017-07-29T21:27:59+00:00" + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php70/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/debug", - "version": "v3.3.6", + "name": "symfony/polyfill-php72", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/debug/zipball/7c13ae8ce1e2adbbd574fc39de7be498e1284e13", - "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930", + "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930", "shasum": "" }, "require": { - "php": ">=5.5.9", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/http-kernel": "~2.8|~3.0" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" + "Symfony\\Polyfill\\Php72\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2125,61 +3854,77 @@ ], "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 Debug Component", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", - "time": "2017-07-28T15:27:31+00:00" + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/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/event-dispatcher", - "version": "v3.3.6", + "name": "symfony/polyfill-php73", + "version": "v1.20.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/event-dispatcher/zipball/67535f1e3fd662bdc68d7ba317c93eecd973617e", - "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e", + "url": "https://github.com/gitapi/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", + "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", "shasum": "" }, "require": { - "php": ">=5.5.9" - }, - "conflict": { - "symfony/dependency-injection": "<3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0", - "symfony/dependency-injection": "~3.3", - "symfony/expression-language": "~2.8|~3.0", - "symfony/stopwatch": "~2.8|~3.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" + "Symfony\\Polyfill\\Php73\\": "" }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2188,51 +3933,76 @@ ], "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 EventDispatcher Component", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", - "time": "2017-06-09T14:53:08+00:00" + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "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/polyfill-mbstring", - "version": "v1.10.0", + "name": "symfony/service-contracts", + "version": "v1.1.9", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + "url": "https://github.com/symfony/service-contracts.git", + "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "url": "https://github.com/gitapi/repos/symfony/service-contracts/zipball/b776d18b303a39f56c63747bcb977ad4b27aca26", + "reference": "b776d18b303a39f56c63747bcb977ad4b27aca26", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1.3", + "psr/container": "^1.0" }, "suggest": { - "ext-mbstring": "For best performance" + "symfony/service-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] + "Symfony\\Contracts\\Service\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2248,38 +4018,57 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v1.1.9" + }, + "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": "2018-09-21T13:07:52+00:00" + "time": "2020-07-06T13:19:58+00:00" }, { "name": "symfony/stopwatch", - "version": "v3.3.6", + "version": "v4.4.15", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "602a15299dc01556013b07167d4f5d3a60e90d15" + "reference": "6f89e19772cf61b3c65bab329fe0e318259fbd91" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/symfony/stopwatch/zipball/602a15299dc01556013b07167d4f5d3a60e90d15", - "reference": "602a15299dc01556013b07167d4f5d3a60e90d15", + "url": "https://github.com/gitapi/repos/symfony/stopwatch/zipball/6f89e19772cf61b3c65bab329fe0e318259fbd91", + "reference": "6f89e19772cf61b3c65bab329fe0e318259fbd91", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": ">=7.1.3", + "symfony/service-contracts": "^1.0|^2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -2306,36 +4095,101 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2017-04-12T14:14:56+00:00" + "support": { + "source": "https://github.com/symfony/stopwatch/tree/4.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-09-02T16:08:58+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "75a63c33a8577608444246075ea0af0d052e452a" + }, + "dist": { + "type": "zip", + "url": "https://github.com/gitapi/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2020-07-12T23:59:07+00:00" }, { "name": "webmozart/assert", - "version": "1.4.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" }, "dist": { "type": "zip", - "url": "https://github.com/gitapi/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", - "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", + "url": "https://github.com/gitapi/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0", + "php": "^5.3.3 || ^7.0 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "phpunit/phpunit": "^4.8.36 || ^7.5.13" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -2357,22 +4211,27 @@ "check", "validate" ], - "time": "2018-12-25T11:19:39+00:00" + "support": { + "issues": "https://github.com/webmozart/assert/issues", + "source": "https://github.com/webmozart/assert/tree/master" + }, + "time": "2020-07-08T17:02:28+00:00" } ], "aliases": [], - "minimum-stability": "dev", + "minimum-stability": "stable", "stability-flags": { - "janpiet/php-version-transpiler": 20 + "roave/security-advisories": 20 }, - "prefer-stable": true, + "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7", + "php": "^7.2", "ext-dom": "*" }, "platform-dev": [], "platform-overrides": { - "php": "7.0" - } + "php": "7.2.0" + }, + "plugin-api-version": "2.0.0" } diff --git a/composer.phar b/composer.phar deleted file mode 100755 index 508f9cf..0000000 Binary files a/composer.phar and /dev/null differ diff --git a/deploy.sh b/deploy.sh index 7c4af01..e6541f0 100755 --- a/deploy.sh +++ b/deploy.sh @@ -20,14 +20,10 @@ git checkout -b gh-pages deploy/gh-pages mv build/psh.phar psh.phar sha1sum psh.phar > psh.phar.version -mv build/psh56.phar psh56.phar -sha1sum psh56.phar > psh56.phar.version - -git add psh.phar psh.phar.version psh56.phar psh56.phar.version +git add psh.phar psh.phar.version git status - # Commit and push git commit -m 'Rebuilt phar' git log diff --git a/docker/Dockerfile b/docker/72/Dockerfile similarity index 62% rename from docker/Dockerfile rename to docker/72/Dockerfile index 50e8e64..7a2c961 100644 --- a/docker/Dockerfile +++ b/docker/72/Dockerfile @@ -1,13 +1,14 @@ -FROM php:7.0-cli +FROM php:7.2-cli ENV COMPOSER_CACHE_DIR=/.composer/cache - -ADD php-config.ini /usr/local/etc/php/conf.d/php-config.ini +ENV XDG_CACHE_HOME=/tmp RUN apt-get update -qq && apt-get install -y -qq libbz2-dev unzip zlib1g-dev git \ && docker-php-ext-install bz2 \ - && docker-php-ext-install zip \ - && pecl install xdebug-2.6.0 \ - && docker-php-ext-enable xdebug + && docker-php-ext-install zip + +COPY --from=composer:1 /usr/bin/composer /usr/local/bin/composer + +ADD php-config.ini /usr/local/etc/php/conf.d/php-config.ini WORKDIR /psh \ No newline at end of file diff --git a/docker/php-config.ini b/docker/72/php-config.ini similarity index 100% rename from docker/php-config.ini rename to docker/72/php-config.ini diff --git a/docker/73/Dockerfile b/docker/73/Dockerfile new file mode 100644 index 0000000..e9cd4e8 --- /dev/null +++ b/docker/73/Dockerfile @@ -0,0 +1,14 @@ +FROM php:7.3-cli + +ENV COMPOSER_CACHE_DIR=/.composer/cache +ENV XDG_CACHE_HOME=/tmp + +RUN apt-get update -qq && apt-get install -y -qq libbz2-dev libzip-dev unzip zlib1g-dev git \ + && docker-php-ext-install bz2 \ + && docker-php-ext-install zip + +COPY --from=composer:1 /usr/bin/composer /usr/local/bin/composer + +ADD php-config.ini /usr/local/etc/php/conf.d/php-config.ini + +WORKDIR /psh \ No newline at end of file diff --git a/docker/73/php-config.ini b/docker/73/php-config.ini new file mode 100644 index 0000000..7f716ac --- /dev/null +++ b/docker/73/php-config.ini @@ -0,0 +1,4 @@ +phar.readonly=0 + +max_execution_time=0 +memory_limit=-1 \ No newline at end of file diff --git a/docker/74/Dockerfile b/docker/74/Dockerfile new file mode 100644 index 0000000..f3a8200 --- /dev/null +++ b/docker/74/Dockerfile @@ -0,0 +1,14 @@ +FROM php:7.4-cli + +ENV COMPOSER_CACHE_DIR=/.composer/cache +ENV XDG_CACHE_HOME=/tmp + +RUN apt-get update -qq && apt-get install -y -qq libbz2-dev libzip-dev unzip git \ + && docker-php-ext-install bz2 \ + && docker-php-ext-install zip + +COPY --from=composer:1 /usr/bin/composer /usr/local/bin/composer + +ADD php-config.ini /usr/local/etc/php/conf.d/php-config.ini + +WORKDIR /psh \ No newline at end of file diff --git a/docker/74/php-config.ini b/docker/74/php-config.ini new file mode 100644 index 0000000..7f716ac --- /dev/null +++ b/docker/74/php-config.ini @@ -0,0 +1,4 @@ +phar.readonly=0 + +max_execution_time=0 +memory_limit=-1 \ No newline at end of file diff --git a/docker/latest/Dockerfile b/docker/latest/Dockerfile new file mode 100644 index 0000000..c3b0eac --- /dev/null +++ b/docker/latest/Dockerfile @@ -0,0 +1,14 @@ +FROM php:8.0.0RC2-cli + +ENV COMPOSER_CACHE_DIR=/.composer/cache +ENV XDG_CACHE_HOME=/tmp + +RUN apt-get update -qq && apt-get install -y -qq libbz2-dev libzip-dev unzip git \ + && docker-php-ext-install bz2 \ + && docker-php-ext-install zip + +COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer + +ADD php-config.ini /usr/local/etc/php/conf.d/php-config.ini + +WORKDIR /psh \ No newline at end of file diff --git a/docker/latest/php-config.ini b/docker/latest/php-config.ini new file mode 100644 index 0000000..7f716ac --- /dev/null +++ b/docker/latest/php-config.ini @@ -0,0 +1,4 @@ +phar.readonly=0 + +max_execution_time=0 +memory_limit=-1 \ No newline at end of file diff --git a/humbug.phar b/humbug.phar deleted file mode 100755 index 2436eeb..0000000 Binary files a/humbug.phar and /dev/null differ diff --git a/humbug.phar.pubkey b/humbug.phar.pubkey deleted file mode 100644 index 1d3f1ae..0000000 --- a/humbug.phar.pubkey +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvVyD0uXn7NxXGXrd4oKe -p9UKQcrwaa+iLZA7uL1b12mBVh7DqBK3+DPlvMuk+jIzQ5znllPM+nVweM6vq4v7 -bIUQRhV0ijqaEDVlsvm0p0wHVn+HcmnHU5wtfK+8zyQc+kVbBRMZj84KoSAgUpdA -oGTrAJPPPUml0TXWeBOSF6x5vb7/R95L3lIPpYEzkhqKhjRF5XoEEuwy+Thsk4Nd -/2DMEm/A5HYTliMAFRxtVn+bS6uXOac3t009HxzJvxHiR44LexvqsahDAxnqV9KO -39eIZzF2hkfxPPjk/81cgtkUcVBVNRS8bkMY81l4gvG9Ul9Lu1hk5ZknToVvmtSU -jwIDAQAB ------END PUBLIC KEY----- diff --git a/humbug.json.dist b/infection.json.dist similarity index 52% rename from humbug.json.dist rename to infection.json.dist index 412f220..5e26305 100644 --- a/humbug.json.dist +++ b/infection.json.dist @@ -4,8 +4,10 @@ "src" ] }, - "timeout": 10, "logs": { - "text": "humbuglog.txt" + "text": "build/infection.log" + }, + "mutators": { + "@default": true } } \ No newline at end of file diff --git a/phpunit.xml.dist b/phpunit.xml.dist index c14c58a..f5ee43c 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,5 +1,6 @@ - - - tests/Unit - + + + tests/Unit + - - tests/Integration - + + tests/Integration + - - tests/Acceptance - + + tests/Acceptance + + @@ -26,6 +29,7 @@ tests vendor + vendor-bin bin diff --git a/psalm.xml b/psalm.xml new file mode 100644 index 0000000..4f9c646 --- /dev/null +++ b/psalm.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/resource/config.xsd b/resource/config.xsd index eb993f3..257b53a 100644 --- a/resource/config.xsd +++ b/resource/config.xsd @@ -7,6 +7,7 @@ + @@ -35,6 +36,7 @@ + @@ -52,4 +54,13 @@ + + + + + + + + + diff --git a/run.sh b/run.sh index f60ad39..cc95eb0 100755 --- a/run.sh +++ b/run.sh @@ -2,8 +2,15 @@ set -e +PHPV="7.2" PRES=${1:-""} -docker build -t psh docker/. +docker build -t psh${PHPV} docker/${PHPV}/. -docker run -it --rm -v "$(pwd)":/psh -w /psh -u 1000:1000 psh \ -/bin/bash -c "./psh ${PRES}" +docker run \ + -it \ + --rm \ + --volume source=${HOME}/.composer,target="./composer" \ + -v "$(pwd)":/psh \ + -w /psh \ + -u 1000:1000 psh${PHPV} \ + /bin/bash -c "./psh ${PRES}" diff --git a/src/Application/Application.php b/src/Application/Application.php index bf19dca..11a5a0c 100644 --- a/src/Application/Application.php +++ b/src/Application/Application.php @@ -1,26 +1,30 @@ rootDirectory = $rootDirectory; @@ -57,61 +58,29 @@ public function __construct(string $rootDirectory) /** * Main entry point to execute the application. * - * @param array $inputArgs * @return int exit code */ public function run(array $inputArgs): int { try { - $config = $this->applicationFactory - ->createConfig($this->rootDirectory, $inputArgs); - } catch (InvalidParameterException $e) { - $this->notifyError($e->getMessage() . "\n"); - return self::RESULT_ERROR; - } catch (InvalidArgumentException $e) { - $this->notifyError("\n" . $e->getMessage() . "\n"); - return self::RESULT_ERROR; - } - - if (count($inputArgs) > 1 && $inputArgs[1] === 'bash_autocompletion_dump') { - $this->showAutocompleteListing($config); - return self::RESULT_SUCCESS; - } - - $this->printHeader($config); - - $configFiles = $this->applicationFactory->getConfigFiles($this->rootDirectory); - $this->printConfigFiles($configFiles); + $config = $this->prepare($inputArgs); - $scriptNames = $this->extractScriptNames($inputArgs); - $scriptFinder = $this->applicationFactory->createScriptFinder($config); + $scriptFinder = $this->applicationFactory->createScriptFinder($config); - try { - foreach ($scriptNames as $scriptName) { - $executionExitCode = $this->execute($scriptFinder->findScriptByName($scriptName), $config, $scriptFinder); + $this->executeScript($inputArgs, $scriptFinder, $config); - if ($executionExitCode !== self::RESULT_SUCCESS) { - return $executionExitCode; - } - } + $this->showListing($scriptFinder->getAllVisibleScripts()); - if (count($scriptNames)) { - return self::RESULT_SUCCESS; - } - } catch (ScriptNotFoundException $e) { - $this->showScriptNotFoundListing($e, $scriptNames, $scriptFinder); - return self::RESULT_ERROR; + throw ExitSignal::success(); + } catch (ExitSignal $signal) { + return $signal->signal(); } - - $this->showListing($scriptFinder->getAllVisibleScripts()); - - return self::RESULT_SUCCESS; } /** * @param Script[] $scripts */ - public function showListing(array $scripts) + public function showListing(array $scripts): void { $this->cliMate->green()->bold('Available commands:')->br(); @@ -125,7 +94,7 @@ public function showListing(array $scripts) $scriptEnvironment = false; foreach ($scripts as $script) { - if ($scriptEnvironment !== $script->getEnvironment()) { + if ($script->getEnvironment() !== $scriptEnvironment) { $scriptEnvironment = $script->getEnvironment(); $this->cliMate->green()->br()->bold(($scriptEnvironment ?? 'default') . ':'); } @@ -138,11 +107,7 @@ public function showListing(array $scripts) $this->cliMate->green()->bold("\n" . count($scripts) . " script(s) available\n"); } - /** - * @param array $inputArgs - * @return array - */ - protected function extractScriptNames(array $inputArgs): array + private function extractScriptNames(array $inputArgs): array { if (!isset($inputArgs[1])) { return []; @@ -151,14 +116,7 @@ protected function extractScriptNames(array $inputArgs): array return explode(',', $inputArgs[1]); } - /** - * @param Script $script - * @param Config $config - * @param ScriptFinder $scriptFinder - * - * @return int - */ - protected function execute(Script $script, Config $config, ScriptFinder $scriptFinder): int + private function execute(Script $script, Config $config, ScriptFinder $scriptFinder): void { $commands = $this->applicationFactory ->createCommands($script, $scriptFinder); @@ -171,18 +129,17 @@ protected function execute(Script $script, Config $config, ScriptFinder $scriptF $executor->execute($script, $commands); } catch (ExecutionErrorException $e) { $this->notifyError("\nExecution aborted, a subcommand failed!\n"); - return self::RESULT_ERROR; + + throw ExitSignal::error(); } $this->notifySuccess("All commands successfully executed!\n"); - - return self::RESULT_SUCCESS; } /** * @param $string */ - public function notifySuccess($string) + private function notifySuccess(string $string): void { $this->cliMate->bold()->green($string); } @@ -190,57 +147,24 @@ public function notifySuccess($string) /** * @param $string */ - public function notifyError($string) + public function notifyError(string $string): void { $this->cliMate->bold()->red($string); } - /** - * @param $config - */ - protected function printHeader(Config $config) - { - $this->cliMate->green()->bold()->out("\n###################"); - - if ($config->getHeader()) { - $this->cliMate->out("\n" . $config->getHeader()); - } - } - - protected function printConfigFiles(array $configFiles) - { - $countConfigFiles = count($configFiles); - for ($i = 0; $i < $countConfigFiles; $i++) { - $configFiles[$i] = str_replace($this->rootDirectory."/", "", $configFiles[$i]); - } - - if (count($configFiles) == 1) { - $this->cliMate->yellow()->out(sprintf("Using %s \n", $configFiles[0])); - return; - } - - $this->cliMate->yellow()->out(sprintf("Using %s extended by %s \n", $configFiles[0], $configFiles[1])); - } - - /** - * @param Script[] $scripts - * @return Int - */ - private function getPaddingSize(array $scripts): Int + private function getPaddingSize(array $scripts): int { $maxScriptNameLength = 0; foreach ($scripts as $script) { - if (strlen($script->getName()) > $maxScriptNameLength) { - $maxScriptNameLength = strlen($script->getName()); + if (mb_strlen($script->getName()) > $maxScriptNameLength) { + $maxScriptNameLength = mb_strlen($script->getName()); } } + return $maxScriptNameLength + self::MIN_PADDING_SIZE; } - /** - * @param $config - */ - private function showAutocompleteListing(Config $config) + private function showAutocompleteListing(Config $config): void { $scriptFinder = $this->applicationFactory ->createScriptFinder($config); @@ -254,12 +178,7 @@ private function showAutocompleteListing(Config $config) $this->cliMate->out(implode(' ', $commands)); } - /** - * @param ScriptNotFoundException $ex - * @param array $scriptNames - * @param ScriptFinder $scriptFinder - */ - private function showScriptNotFoundListing(ScriptNotFoundException $ex, array $scriptNames, ScriptFinder $scriptFinder) + private function showScriptNotFoundListing(ScriptNotFoundException $ex, array $scriptNames, ScriptFinder $scriptFinder): void { $this->notifyError("Script with name {$ex->getScriptName()} not found\n"); @@ -274,4 +193,95 @@ private function showScriptNotFoundListing(ScriptNotFoundException $ex, array $s $this->showListing($scripts); } } + + private function printHead(Config $config, ApplicationConfigLogger $logger): void + { + $this->cliMate->green()->bold()->out("\n###################"); + + if ($config->getHeader()) { + $this->cliMate->out("\n" . $config->getHeader()); + } + + $logger->printOut($this->cliMate); + } + + private function validateConfig(Config $config, ?string $environment = null): void + { + $allPlaceholders = $config->getAllPlaceholders($environment); + + $missing = []; + foreach ($config->getRequiredVariables($environment) as $requiredVariable) { + if (!array_key_exists($requiredVariable->getName(), $allPlaceholders)) { + $missing[] = $requiredVariable; + $this->printMissingRequiredVariable($requiredVariable); + } + } + + if (count($missing)) { + $this->cliMate->error("\nPlease define the missing value(s) first\n"); + throw ExitSignal::error(); + } + } + + private function printMissingRequiredVariable(RequiredValue $requiredVariable): void + { + if ($requiredVariable->hasDescription()) { + $this->cliMate->error(sprintf( + "\t - Missing required const or var named %s (%s)", + $requiredVariable->getName(), + $requiredVariable->getDescription() + )); + } else { + $this->cliMate->error(sprintf( + "\t - Missing required const or var named %s", + $requiredVariable->getName() + )); + } + } + + private function prepare(array $inputArgs): Config + { + $configLogger = new ApplicationConfigLogger($this->rootDirectory, $this->cliMate); + + try { + $config = $this->applicationFactory + ->createConfig($configLogger, $this->rootDirectory, $inputArgs); + } catch (InvalidParameterException | InvalidArgumentException $e) { + $this->notifyError("\n" . $e->getMessage() . "\n"); + + throw ExitSignal::error(); + } + + if (count($inputArgs) > 1 && $inputArgs[1] === 'bash_autocompletion_dump') { + $this->showAutocompleteListing($config); + + throw ExitSignal::success(); + } + + $this->printHead($config, $configLogger); + $this->validateConfig($config); + + return $config; + } + + private function executeScript(array $inputArgs, ScriptFinder $scriptFinder, Config $config): void + { + $scriptNames = $this->extractScriptNames($inputArgs); + + if (!count($scriptNames)) { + return; + } + + try { + foreach ($scriptNames as $scriptName) { + $this->execute($scriptFinder->findScriptByName($scriptName), $config, $scriptFinder); + } + } catch (ScriptNotFoundException $e) { + $this->showScriptNotFoundListing($e, $scriptNames, $scriptFinder); + + throw ExitSignal::error(); + } + + throw ExitSignal::success(); + } } diff --git a/src/Application/ApplicationConfigLogger.php b/src/Application/ApplicationConfigLogger.php new file mode 100644 index 0000000..3685fa9 --- /dev/null +++ b/src/Application/ApplicationConfigLogger.php @@ -0,0 +1,79 @@ +rootDirectory = $rootDirectory; + } + + public function mainConfigFiles(string $mainFile, ?string $overrideFile = null): void + { + if ($overrideFile === null) { + $this->print(sprintf('Using %s', $this->cleanUpPath($mainFile))); + + return; + } + + $this->print(sprintf( + 'Using %s extended by %s', + $this->cleanUpPath($mainFile), + $this->cleanUpPath($overrideFile) + )); + } + + public function notifyImportNotFound(string $import): void + { + $this->print(sprintf(' -> NOTICE: No import found for path "%s"', $import)); + } + + public function importConfigFiles(string $import, string $mainFile, ?string $overrideFile = null): void + { + if ($overrideFile === null) { + $this->print(sprintf(' -> Importing %s from "%s" ', $this->cleanUpPath($mainFile), $import)); + + return; + } + + $this->print(sprintf( + ' -> Importing %s extended by %s from "%s"', + $this->cleanUpPath($mainFile), + $this->cleanUpPath($overrideFile), + $import + )); + } + + private function cleanUpPath(string $configFile): string + { + return str_replace($this->rootDirectory . '/', '', $configFile); + } + + private function print(string $message): void + { + $this->output[] = $message; + } + + public function printOut(CLImate $cliMate): void + { + foreach ($this->output as $message) { + $cliMate->yellow()->out($message); + } + $cliMate->out(PHP_EOL); + + $this->output = []; + } +} diff --git a/src/Application/ApplicationFactory.php b/src/Application/ApplicationFactory.php index 031691d..064bab0 100644 --- a/src/Application/ApplicationFactory.php +++ b/src/Application/ApplicationFactory.php @@ -1,11 +1,13 @@ parseParams($params); $configFinder = new ConfigFileFinder(); $configFiles = $configFinder->discoverFiles($rootDirectory); - + $merger = new ConfigMerger(); $configLoaders = [ new YamlConfigFileLoader(new Parser(), new ConfigBuilder(), $rootDirectory), new XmlConfigFileLoader(new ConfigBuilder(), $rootDirectory), ]; + $configFactory = new ConfigFactory($merger, $configFinder, $logger, $configLoaders); - $configs = []; - foreach ($configFiles as $configFile) { - foreach ($configLoaders as $configLoader) { - if (!$configLoader->isSupported($configFile)) { - continue; - } - - $configs[] = $configLoader->load($configFile, $overwrittenConsts); - } - } + $logger->mainConfigFiles(...$configFiles); + $configs = $configFactory->gatherConfigs($configFiles, $overwrittenConsts); if (count($configs) === 0) { - throw new \RuntimeException('Unable to read any configuration from "' . implode(', ', $configFiles) . '"'); + throw new RuntimeException('Unable to read any configuration from "' . implode(', ', $configFiles) . '"'); } - $merger = new ConfigMerger(); - - return $merger->merge(...$configs); + return $configFactory->mergeConfigs($configs); } - /** - * @param Config $config - * @return ScriptFinder - */ public function createScriptFinder(Config $config): ScriptFinder { return new ScriptFinder($config->getAllScriptsPaths(), new DescriptionReader()); } - /** - * @param Script $script - * @param Config $config - * @param Logger $logger - * @param string $rootDirectory - * @return ProcessExecutor - */ public function createProcessExecutor( Script $script, Config $config, @@ -92,7 +73,7 @@ public function createProcessExecutor( $config->getConstants($script->getEnvironment()), $config->getDynamicVariables($script->getEnvironment()), $config->getTemplates($script->getEnvironment()), - $config->getDotenvPaths($script->getEnvironment()) + $config->getDotenvVariables($script->getEnvironment()) ), new TemplateEngine(), $logger, @@ -101,9 +82,6 @@ public function createProcessExecutor( } /** - * @param Script $script - * @param ScriptFinder $scriptFinder - * * @return Command[] */ public function createCommands(Script $script, ScriptFinder $scriptFinder): array @@ -112,15 +90,7 @@ public function createCommands(Script $script, ScriptFinder $scriptFinder): arra new BashScriptParser(), new PshScriptParser(new CommandBuilder(), $scriptFinder) ); - return $scriptLoader->loadScript($script); - } - /** - * @param $directory - * @return array - */ - public function getConfigFiles(string $directory): array - { - return (new ConfigFileFinder())->discoverFiles($directory); + return $scriptLoader->loadScript($script); } } diff --git a/src/Application/ClimateLogger.php b/src/Application/ClimateLogger.php index 981ea03..822a495 100644 --- a/src/Application/ClimateLogger.php +++ b/src/Application/ClimateLogger.php @@ -7,6 +7,9 @@ use Shopware\Psh\Listing\Script; use Shopware\Psh\ScriptRuntime\Execution\Logger; use Shopware\Psh\ScriptRuntime\Execution\LogMessage; +use function sprintf; +use function str_replace; +use function time; /** * A CLImate implementation of the runtime logger @@ -23,7 +26,6 @@ class ClimateLogger implements Logger EOD; - /** * @var CLImate */ @@ -39,29 +41,19 @@ class ClimateLogger implements Logger */ private $duration; - /** - * @param CLImate $cliMate - * @param Duration $duration - */ public function __construct(CLImate $cliMate, Duration $duration) { $this->cliMate = $cliMate; $this->duration = $duration; } - /** - * @param Script $script - */ - public function startScript(Script $script) + public function startScript(Script $script): void { $this->scriptStartTime = time(); $this->cliMate->green()->out("Starting Execution of '" . $script->getName() . "' ('" . $script->getPath() . "')\n"); } - /** - * @param Script $script - */ - public function finishScript(Script $script) + public function finishScript(Script $script): void { $durationInSeconds = time() - $this->scriptStartTime; @@ -69,27 +61,20 @@ public function finishScript(Script $script) $durationInSeconds = 1; } - $this->cliMate->green()->out("\nDuration: " . $this->duration->humanize($durationInSeconds) . ""); + $this->cliMate->green()->out("\nDuration: " . $this->duration->humanize($durationInSeconds) . ''); } - /** - * @param string $response - * @return string - */ - private function formatOutput(string $response) :string + private function formatOutput(string $response): string { return str_replace(PHP_EOL, PHP_EOL . "\t", $response); } - /** - * @return void - */ - public function logWait() + public function logWait(): void { $this->cliMate->green()->bold()->inline("\nWAITING...\n\t"); } - public function log(LogMessage $logMessage) + public function log(LogMessage $logMessage): void { if ($logMessage->isError()) { $this->err($logMessage->getMessage()); @@ -98,47 +83,33 @@ public function log(LogMessage $logMessage) } } - /** - * @param string $response - */ - private function err(string $response) + private function err(string $response): void { $this->cliMate->red()->inline($this->formatOutput($response)); } - /** - * @param string $response - */ - private function out(string $response) + private function out(string $response): void { $this->cliMate->green()->inline($this->formatOutput($response)); } - /** - * @param string $headline - * @param string $subject - * @param int $line - * @param bool $isIgnoreError - * @param int $index - * @param int $max - */ - public function logStart(string $headline, string $subject, int $line, bool $isIgnoreError, int $index, int $max) + public function logStart(string $headline, string $subject, int $line, bool $isIgnoreError, int $index, int $max): void { $index++; $this->cliMate->yellow()->inline("\n({$index}/{$max}) $headline\n> {$subject}\n\t"); } - public function logSuccess() + public function logSuccess(): void { $this->cliMate->green()->bold()->out('Executed Successfully'); } - public function logFailure() + public function logFailure(): void { $this->cliMate->green()->red()->out('Executed with failure'); } - public function warn(string $message) + public function warn(string $message): void { $this->cliMate->out(sprintf(self::WARNING_TEMPLATE, $message)); } diff --git a/src/Application/ExitSignal.php b/src/Application/ExitSignal.php new file mode 100644 index 0000000..871add0 --- /dev/null +++ b/src/Application/ExitSignal.php @@ -0,0 +1,39 @@ +signal = $signal; + } + + public function signal(): int + { + return $this->signal; + } +} diff --git a/src/Application/InvalidParameterException.php b/src/Application/InvalidParameterException.php index 30d2462..d80bd8f 100644 --- a/src/Application/InvalidParameterException.php +++ b/src/Application/InvalidParameterException.php @@ -1,11 +1,12 @@ isEnclosedInAmpersand($value)) { - $value = substr($value, 1, -1); + $value = mb_substr($value, 1, -1); } } else { $i++; @@ -35,39 +40,28 @@ public function parseParams(array $params): array } $key = str_replace('--', '', $key); - $reformattedParams[strtoupper($key)] = $value; + $reformattedParams[mb_strtoupper($key)] = $value; } return $reformattedParams; } - /** - * @param $key - */ - private function testParameterFormat(string $key) + private function testParameterFormat(string $key): void { - if (strpos($key, '--') !== 0) { + if (mb_strpos($key, '--') !== 0) { throw new InvalidParameterException( sprintf('Unable to parse parameter %s. Use -- for correct usage', $key) ); } } - /** - * @param $key - * @return bool|int - */ - private function isKeyValuePair($key) + private function isKeyValuePair(string $key): bool { - return strpos($key, '='); + return mb_strpos($key, '=') !== false; } - /** - * @param $value - * @return bool - */ - private function isEnclosedInAmpersand($value): bool + private function isEnclosedInAmpersand(string $value): bool { - return strpos($value, '"') === 0; + return mb_strpos($value, '"') === 0; } } diff --git a/src/Config/Config.php b/src/Config/Config.php index b76c15c..f6f5c98 100644 --- a/src/Config/Config.php +++ b/src/Config/Config.php @@ -2,11 +2,19 @@ namespace Shopware\Psh\Config; +use function array_map; +use function array_merge; + /** * Represents the global configuration consisting of multiple environments */ class Config { + /** + * @var EnvironmentResolver + */ + private $resolver; + /** * @var string */ @@ -28,21 +36,20 @@ class Config private $params; /** - * @param string|null $header - * @param string $defaultEnvironment * @param ConfigEnvironment[] $environments - * @param array $params */ public function __construct( - string $header = null, + EnvironmentResolver $resolver, string $defaultEnvironment, array $environments, - array $params + array $params, + ?string $header = null ) { - $this->header = $header; + $this->resolver = $resolver; $this->defaultEnvironment = $defaultEnvironment; $this->environments = $environments; $this->params = $params; + $this->header = $header; } /** @@ -65,48 +72,72 @@ public function getAllScriptsPaths(): array return $paths; } - /** - * @param string|null $environment - * @return array - */ - public function getTemplates(string $environment = null): array + public function getTemplates(?string $environment = null): array { - return $this->createResult( + return $this->resolver->resolveTemplates($this->createResult( [$this->getEnvironment(), 'getTemplates'], [$this->getEnvironment($environment), 'getTemplates'] - ); + )); } - /** - * @param string|null $environment - * @return array - */ - public function getDynamicVariables(string $environment = null): array + public function getDynamicVariables(?string $environment = null): array { - return $this->createResult( + return $this->resolver->resolveVariables($this->createResult( [$this->getEnvironment(), 'getDynamicVariables'], [$this->getEnvironment($environment), 'getDynamicVariables'] - ); + )); } - /** - * @param string|null $environment - * @return array - */ - public function getConstants(string $environment = null): array + public function getConstants(?string $environment = null): array { - return $this->createResult( + return $this->resolver->resolveConstants($this->createResult( [$this->getEnvironment(), 'getConstants'], [$this->getEnvironment($environment), 'getConstants'], [$this, 'getParams'] + )); + } + + public function getAllPlaceholders(?string $environment = null): array + { + return array_merge( + $this->getConstants($environment), + $this->getDotenvVariables($environment), + $this->getDynamicVariables($environment) + ); + } + + /** + * @return ValueProvider[] + */ + public function getDotenvVariables(?string $environment = null): array + { + $paths = $this->getDotenvPaths($environment); + + return $this->resolver->resolveDotenvVariables($paths); + } + + /** + * @return RequiredValue[] + */ + public function getRequiredVariables(?string $environment = null): array + { + $requiredValues = $this->createResult( + [$this->getEnvironment(), 'getRequiredVariables'], + [$this->getEnvironment($environment), 'getRequiredVariables'] ); + + $result = []; + foreach ($requiredValues as $name => $description) { + $result[$name] = new RequiredValue($name, $description); + } + + return $result; } /** - * @param string|null $environment * @return DotenvFile[] */ - public function getDotenvPaths(string $environment = null): array + public function getDotenvPaths(?string $environment = null): array { $paths = $this->createResult( [$this->getEnvironment(), 'getDotenvPaths'], @@ -121,7 +152,7 @@ public function getDotenvPaths(string $environment = null): array /** * @return string */ - public function getHeader() + public function getHeader(): ?string { return $this->header; } @@ -134,26 +165,21 @@ public function getEnvironments(): array return $this->environments; } - /** - * @return string - */ public function getDefaultEnvironment(): string { return $this->defaultEnvironment; } - /** - * @return array - */ - public function getParams() : array + public function getParams(): array { return $this->params; } - /** - * @param callable[] ...$valueProviders - * @return array - */ + public function getImports(): array + { + return $this->getEnvironment()->getImports(); + } + private function createResult(callable ...$valueProviders): array { $mergedKeyValues = []; @@ -167,11 +193,7 @@ private function createResult(callable ...$valueProviders): array return $mergedKeyValues; } - /** - * @param string|null $name - * @return ConfigEnvironment - */ - private function getEnvironment(string $name = null): ConfigEnvironment + private function getEnvironment(?string $name = null): ConfigEnvironment { if ($name === null) { return $this->environments[$this->defaultEnvironment]; diff --git a/src/Config/ConfigBuilder.php b/src/Config/ConfigBuilder.php index 6c124ce..e4f8287 100644 --- a/src/Config/ConfigBuilder.php +++ b/src/Config/ConfigBuilder.php @@ -2,6 +2,8 @@ namespace Shopware\Psh\Config; +use function pathinfo; + /** * Builder pattern * @@ -29,21 +31,18 @@ class ConfigBuilder private $hidden; - /** - * @param string|null $header - * @return ConfigBuilder - */ - public function setHeader(string $header = null): ConfigBuilder + private $currentRequiredVariables; + + private $imports; + + public function setHeader(?string $header = null): ConfigBuilder { $this->header = $header; + return $this; } - /** - * @param string|null $environment - * @return ConfigBuilder - */ - public function start(string $environment = null): ConfigBuilder + public function start(?string $environment = null): ConfigBuilder { $this->reset(); if ($environment === null) { @@ -51,110 +50,108 @@ public function start(string $environment = null): ConfigBuilder } $this->currentEnvironment = $environment; + return $this; } - /** - * @param bool $set - * @return ConfigBuilder - */ public function setHidden(bool $set): ConfigBuilder { $this->hidden = $set; + return $this; } - /** - * @param array $commandPaths - * @return ConfigBuilder - */ public function setCommandPaths(array $commandPaths): ConfigBuilder { $this->currentCommandPaths = $commandPaths; + return $this; } /** - * @param array $dotenvPaths - * @return ConfigBuilder + * @deprecated only used by yaml builder */ public function setDotenvPaths(array $dotenvPaths): ConfigBuilder { $this->currentDotenvPaths = []; foreach ($dotenvPaths as $dotenvPath) { - $this->setDotenvPath($dotenvPath); + $this->addDotenvPath($dotenvPath); } return $this; } - /** - * @param string $dotenvPath - * @return ConfigBuilder - */ - public function setDotenvPath(string $dotenvPath): ConfigBuilder + public function addDotenvPath(string $dotenvPath): ConfigBuilder { $this->currentDotenvPaths[pathinfo($dotenvPath, PATHINFO_BASENAME)] = $dotenvPath; return $this; } + public function addRequirePlaceholder(string $name, ?string $description = null): ConfigBuilder + { + $this->currentRequiredVariables[$name] = $description; + + return $this; + } + /** * @deprecated only used by yaml builder - * @param array $dynamicVariables - * @return ConfigBuilder */ public function setDynamicVariables(array $dynamicVariables): ConfigBuilder { $this->currentDynamicVariables = $dynamicVariables; + return $this; } - public function setDynamicVariable(string $key, string $value): ConfigBuilder + public function addDynamicVariable(string $key, string $value): ConfigBuilder { $this->currentDynamicVariables[$key] = $value; + return $this; } /** * @deprecated only used by yaml builder - * @param array $constants - * @return ConfigBuilder */ public function setConstants(array $constants): ConfigBuilder { $this->currentConstants = $constants; + return $this; } - public function setConstVariable(string $key, string $value): ConfigBuilder + public function addConstVariable(string $key, string $value): ConfigBuilder { $this->currentConstants[$key] = $value; + + return $this; + } + + public function addImport(string $path): self + { + $this->imports[] = $path; + return $this; } - /** - * @param array $templates - * @return ConfigBuilder - */ public function setTemplates(array $templates): ConfigBuilder { $this->templates = $templates; + return $this; } - /** - * @return Config - */ public function create(array $params): Config { $this->reset(); - return new Config($this->header, self::DEFAULT_ENV, $this->environments, $params); + return new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $this->environments, $params, $this->header); } - private function reset() + private function reset(): void { if ($this->currentEnvironment) { $this->environments[$this->currentEnvironment] = new ConfigEnvironment( @@ -163,7 +160,9 @@ private function reset() $this->currentDynamicVariables, $this->currentConstants, $this->templates, - $this->currentDotenvPaths + $this->currentDotenvPaths, + $this->currentRequiredVariables, + $this->imports ); } @@ -173,5 +172,7 @@ private function reset() $this->currentConstants = []; $this->templates = []; $this->hidden = false; + $this->currentRequiredVariables = []; + $this->imports = []; } } diff --git a/src/Config/ConfigEnvironment.php b/src/Config/ConfigEnvironment.php index dee4451..95f28f9 100644 --- a/src/Config/ConfigEnvironment.php +++ b/src/Config/ConfigEnvironment.php @@ -1,6 +1,5 @@ hidden = $hidden; $this->commandPaths = $commandPaths; @@ -60,53 +63,47 @@ public function __construct( $this->constants = $constants; $this->templates = $templates; $this->dotenvPaths = $dotenvPaths; + $this->requiredVariables = $requiredVariables; + $this->imports = $imports; } - /** - * @return bool - */ public function isHidden(): bool { return $this->hidden; } - /** - * @return array - */ public function getAllScriptsPaths(): array { return $this->commandPaths; } - /** - * @return array - */ public function getDynamicVariables(): array { return $this->dynamicVariables; } - /** - * @return array - */ public function getConstants(): array { return $this->constants; } - /** - * @return array - */ public function getTemplates(): array { return $this->templates; } - /** - * @return array - */ public function getDotenvPaths(): array { return $this->dotenvPaths; } + + public function getRequiredVariables(): array + { + return $this->requiredVariables; + } + + public function getImports(): array + { + return $this->imports; + } } diff --git a/src/Config/ConfigFactory.php b/src/Config/ConfigFactory.php new file mode 100644 index 0000000..76d13c7 --- /dev/null +++ b/src/Config/ConfigFactory.php @@ -0,0 +1,130 @@ +configMerger = $configMerger; + $this->configFileFinder = $configFileFinder; + $this->configLoaders = $configLoaders; + $this->configLogger = $configLogger; + } + + /** + * @return Config[] + */ + public function gatherConfigs( + array $configFiles, + array $overwrittenConsts + ): array { + $configs = []; + $additionalConfigs = [[]]; + + foreach ($configFiles as $configFile) { + foreach ($this->configLoaders as $configLoader) { + if (!$configLoader->isSupported($configFile)) { + continue; + } + + $config = $configLoader + ->load($configFile, $overwrittenConsts); + + $additionalConfigs[] = $this + ->loadImports($config, dirname($configFile), $overwrittenConsts); + + $configs[] = $config; + } + } + + if (!$configs) { + return []; + } + + $config = $this->configMerger->mergeOverride(...$configs); + + return array_merge([$config], ...array_merge(...$additionalConfigs)); + } + + private function loadImports( + Config $config, + string $fromPath, + array $overwrittenConsts + ): array { + $additionalConfigs = []; + + foreach ($config->getImports() as $importPath) { + $foundSomething = false; + foreach (glob($fromPath . '/' . $importPath) as $foundOccurrence) { + if (!is_dir($foundOccurrence)) { + continue; + } + + $foundConfigFiles = $this->configFileFinder + ->discoverConfigInDirectory($foundOccurrence); + + if (count($foundConfigFiles) === 0) { + continue; + } + + $foundSomething = true; + $this->configLogger->importConfigFiles($importPath, ...$foundConfigFiles); + $additionalConfigs[] = $this + ->gatherConfigs($foundConfigFiles, $overwrittenConsts); + } + + if (!$foundSomething) { + $this->configLogger->notifyImportNotFound($importPath); + } + } + + return $additionalConfigs; + } + + /** + * @param Config[] $configs + */ + public function mergeConfigs(array $configs): Config + { + $mainConfig = array_shift($configs); + + while (count($configs) !== 0) { + $mainConfig = $this->configMerger->mergeImport($mainConfig, array_pop($configs)); + } + + return $mainConfig; + } +} diff --git a/src/Config/ConfigFileFinder.php b/src/Config/ConfigFileFinder.php index d1654e6..4b35c86 100644 --- a/src/Config/ConfigFileFinder.php +++ b/src/Config/ConfigFileFinder.php @@ -1,8 +1,16 @@ determineResultInDirectory($files); } - /** - * @param string $fromDirectory - * @return array - */ - public function findFirstDirectoryWithConfigFile(string $fromDirectory): array + public function discoverConfigInDirectory(string $directory): array + { + $globResult = glob($directory . '/' . self::VALID_FILE_NAME_GLOB); + + if (!is_array($globResult) || count($globResult) === 0) { + return []; + } + + return $this->determineResultInDirectory($globResult); + } + + private function findFirstDirectoryWithConfigFile(string $fromDirectory): array { $currentDirectory = $fromDirectory; @@ -35,32 +50,31 @@ public function findFirstDirectoryWithConfigFile(string $fromDirectory): array $currentDirectory = dirname($currentDirectory); } while ($currentDirectory !== '/'); - throw new \RuntimeException('No config file found, make sure you have created a .psh file'); + throw new RuntimeException('No config file found, make sure you have created a .psh.xml or .psh.xml.dist file'); } /** - * @param array $globResult - * @return array + * @internal */ - public function determineResultInDirectory(array $globResult): array + public function determineResultInDirectory(array $configFileCandidates): array { - if (count($globResult) === 1) { - return $globResult; + if (count($configFileCandidates) === 1) { + return $configFileCandidates; } - $overrideFiles = array_filter($globResult, function (string $file) { + $overrideFiles = array_filter($configFileCandidates, function (string $file) { $extension = pathinfo($file, PATHINFO_EXTENSION); return $extension === 'override'; }); - $distFiles = array_filter($globResult, function (string $file) { + $distFiles = array_filter($configFileCandidates, function (string $file) { $extension = pathinfo($file, PATHINFO_EXTENSION); return $extension === 'dist'; }); - $configFiles = array_filter($globResult, function (string $file) { + $configFiles = array_filter($configFileCandidates, function (string $file) { $extension = pathinfo($file, PATHINFO_EXTENSION); return $extension !== 'override' && $extension !== 'dist'; diff --git a/src/Config/ConfigFileLoader.php b/src/Config/ConfigFileLoader.php index 17c552f..888d0ec 100644 --- a/src/Config/ConfigFileLoader.php +++ b/src/Config/ConfigFileLoader.php @@ -2,54 +2,12 @@ namespace Shopware\Psh\Config; -abstract class ConfigFileLoader implements ConfigLoader +/** + * Load configuration data from a file + */ +interface ConfigFileLoader { - /** - * @param string $file - * @return string - */ - protected function loadFileContents(string $file): string - { - return file_get_contents($file); - } + public function isSupported(string $file): bool; - /** - * @param string $applicationRootDirectory - * @param string $absoluteOrRelativePath - * @param string $baseFile - * @return string - */ - protected function fixPath( - string $applicationRootDirectory, - string $absoluteOrRelativePath, - string $baseFile - ): string { - $possiblyValidFiles = [ - $applicationRootDirectory . '/' . $absoluteOrRelativePath, - $this->makeAbsolutePath($baseFile, $absoluteOrRelativePath), - $absoluteOrRelativePath, - ]; - - foreach ($possiblyValidFiles as $file) { - if (file_exists($file)) { - return $file; - } - } - - throw new \InvalidArgumentException(sprintf( - 'Unable to find a file referenced by "%s", tried: %s', - $absoluteOrRelativePath, - print_r($possiblyValidFiles, true) - )); - } - - /** - * @param string $baseFile - * @param string $path - * @return string - */ - protected function makeAbsolutePath(string $baseFile, string $path): string - { - return pathinfo($baseFile, PATHINFO_DIRNAME) . '/' . $path; - } + public function load(string $file, array $params): Config; } diff --git a/src/Config/ConfigFileLoaderFileSystemHandlers.php b/src/Config/ConfigFileLoaderFileSystemHandlers.php new file mode 100644 index 0000000..e403a8b --- /dev/null +++ b/src/Config/ConfigFileLoaderFileSystemHandlers.php @@ -0,0 +1,47 @@ +makeAbsolutePath($baseFile, $absoluteOrRelativePath), + $absoluteOrRelativePath, + ]; + + foreach ($possiblyValidFiles as $file) { + if (file_exists($file)) { + return $file; + } + } + + throw new InvalidArgumentException(sprintf( + 'Unable to find a file referenced by "%s", tried: %s', + $absoluteOrRelativePath, + print_r($possiblyValidFiles, true) + )); + } + + protected function makeAbsolutePath(string $baseFile, string $path): string + { + return pathinfo($baseFile, PATHINFO_DIRNAME) . '/' . $path; + } +} diff --git a/src/Config/ConfigLoader.php b/src/Config/ConfigLoader.php deleted file mode 100644 index 33d82bd..0000000 --- a/src/Config/ConfigLoader.php +++ /dev/null @@ -1,23 +0,0 @@ -getHeader(); $defaultEnvironment = $config->getDefaultEnvironment(); - $environments = $config->getEnvironments(); if ($override->getHeader()) { $header = $override->getHeader(); } - if ($override->getEnvironments()) { - $environments = $this->mergeConfigEnvironments($config, $override); - } + $environments = $this->mergeOverrideConfigEnvironments($config, $override); if ($override->getDefaultEnvironment()) { $defaultEnvironment = $override->getDefaultEnvironment(); } - return new Config($header, $defaultEnvironment, $environments, $config->getParams()); + return new Config(new EnvironmentResolver(), $defaultEnvironment, $environments, $config->getParams(), $header); } - /** - * @param Config $config - * @param Config $override - * @return array - */ - private function mergeConfigEnvironments(Config $config, Config $override): array + public function mergeImport(Config $config, ?Config $import = null): Config { - $environments = []; - - $foundEnvironments = array_keys(array_merge($config->getEnvironments(), $override->getEnvironments())); - - foreach ($foundEnvironments as $name) { - if (!isset($override->getEnvironments()[$name])) { - $environments[$name] = $config->getEnvironments()[$name]; - - continue; - } + if ($import === null) { + return $config; + } - if (!isset($config->getEnvironments()[$name])) { - $environments[$name] = $override->getEnvironments()[$name]; + $header = $config->getHeader(); + $defaultEnvironment = $config->getDefaultEnvironment(); + $environments = $this->mergeImportConfigEnvironments($config, $import); - continue; - } + return new Config(new EnvironmentResolver(), $defaultEnvironment, $environments, $config->getParams(), $header); + } - $environments[$name] = $this - ->mergeEnvironments($config->getEnvironments()[$name], $override->getEnvironments()[$name]); - } + private function mergeOverrideConfigEnvironments(Config $config, Config $override): array + { + return $this->mapEnvironments($config, $override, function (ConfigEnvironment $environment, ConfigEnvironment $overrideEnvironment) { + return $this + ->mergeEnvironmentsAsOverride($environment, $overrideEnvironment); + }); + } - return $environments; + private function mergeImportConfigEnvironments(Config $config, Config $import): array + { + return $this->mapEnvironments($config, $import, function (ConfigEnvironment $environment, ConfigEnvironment $importEnvironment) { + return $this + ->mergeEnvironmentsAsImport($environment, $importEnvironment); + }); } - private function mergeEnvironments(ConfigEnvironment $original, ConfigEnvironment $override): ConfigEnvironment + private function mergeEnvironmentsAsOverride(ConfigEnvironment $original, ConfigEnvironment $override): ConfigEnvironment { return new ConfigEnvironment( $this->overrideHidden($original, $override), @@ -77,19 +70,24 @@ private function mergeEnvironments(ConfigEnvironment $original, ConfigEnvironmen ); } - /** - * @param ConfigEnvironment $configEnvironment - * @param ConfigEnvironment $overrideEnv - * @return array - */ + private function mergeEnvironmentsAsImport(ConfigEnvironment $original, ConfigEnvironment $import): ConfigEnvironment + { + return new ConfigEnvironment( + $this->overrideHidden($original, $import), + $this->mergeScriptsPaths($original, $import), + $this->mergeDynamicVariables($original, $import), + $this->mergeConstants($original, $import), + $this->mergeTemplates($original, $import), + $this->mergeDotenvPaths($original, $import) + ); + } + private function mergeDynamicVariables(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideEnv): array { return array_merge($configEnvironment->getDynamicVariables(), $overrideEnv->getDynamicVariables()); } /** - * @param ConfigEnvironment $configEnvironment - * @param ConfigEnvironment $overrideConfigEnv * @return ScriptsPath[] */ private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array @@ -98,8 +96,14 @@ private function mergeDotenvPaths(ConfigEnvironment $configEnvironment, ConfigEn } /** - * @param ConfigEnvironment $configEnvironment - * @param ConfigEnvironment $overrideConfigEnv + * @return ScriptsPath[] + */ + private function mergeScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array + { + return array_merge($configEnvironment->getAllScriptsPaths(), $overrideConfigEnv->getAllScriptsPaths()); + } + + /** * @return ScriptsPath[] */ private function overrideScriptsPaths(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array @@ -111,21 +115,11 @@ private function overrideScriptsPaths(ConfigEnvironment $configEnvironment, Conf return $configEnvironment->getAllScriptsPaths(); } - /** - * @param ConfigEnvironment $configEnvironment - * @param ConfigEnvironment $overrideConfigEnv - * @return array - */ private function mergeConstants(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array { return array_merge($configEnvironment->getConstants(), $overrideConfigEnv->getConstants()); } - /** - * @param ConfigEnvironment $configEnvironment - * @param $overrideConfigEnv - * @return array - */ private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array { if ($overrideConfigEnv->getTemplates()) { @@ -135,6 +129,11 @@ private function overrideTemplates(ConfigEnvironment $configEnvironment, ConfigE return $configEnvironment->getTemplates(); } + private function mergeTemplates(ConfigEnvironment $configEnvironment, ConfigEnvironment $overrideConfigEnv): array + { + return array_merge($configEnvironment->getTemplates(), $overrideConfigEnv->getTemplates()); + } + private function overrideHidden(ConfigEnvironment $originalConfigEnv, ConfigEnvironment $overrideEnv): bool { if ($overrideEnv->isHidden()) { @@ -143,4 +142,34 @@ private function overrideHidden(ConfigEnvironment $originalConfigEnv, ConfigEnvi return $originalConfigEnv->isHidden(); } + + private function getAllEnvironmentNames(Config $config, Config $override): array + { + return array_keys(array_merge($config->getEnvironments(), $override->getEnvironments())); + } + + private function mapEnvironments(Config $config, Config $override, callable $closure): array + { + $environments = []; + + $foundEnvironments = $this->getAllEnvironmentNames($config, $override); + + foreach ($foundEnvironments as $name) { + if (!isset($override->getEnvironments()[$name])) { + $environments[$name] = $config->getEnvironments()[$name]; + + continue; + } + + if (!isset($config->getEnvironments()[$name])) { + $environments[$name] = $override->getEnvironments()[$name]; + + continue; + } + + $environments[$name] = $closure($config->getEnvironments()[$name], $override->getEnvironments()[$name]); + } + + return $environments; + } } diff --git a/src/Config/DotenvFile.php b/src/Config/DotenvFile.php index 30972a0..49cd9ff 100644 --- a/src/Config/DotenvFile.php +++ b/src/Config/DotenvFile.php @@ -9,17 +9,11 @@ class DotenvFile */ private $path; - /** - * @param string $path - */ public function __construct(string $path) { $this->path = $path; } - /** - * @return string - */ public function getPath(): string { return $this->path; diff --git a/src/Config/EnvironmentResolver.php b/src/Config/EnvironmentResolver.php new file mode 100644 index 0000000..586718b --- /dev/null +++ b/src/Config/EnvironmentResolver.php @@ -0,0 +1,121 @@ +loadDotenvVariables($dotenvPath); + + foreach ($dotenvVariables as $variableKey => $variableValue) { + $variables[$variableKey] = new SimpleValueProvider($variableValue); + } + } + + return $variables; + } + + private function loadDotenvVariables(DotenvFile $dotenvPath): array + { + $fileData = $this->loadEnvVarsFromDotenvFile($dotenvPath); + + return $this->diffDotenvVarsWithCurrentApplicationEnv($fileData); + } + + private function loadEnvVarsFromDotenvFile(DotenvFile $dotenvPath): array + { + $filePath = $dotenvPath->getPath(); + + $dotenv = Dotenv::createArrayBacked( + pathinfo($filePath, \PATHINFO_DIRNAME), + pathinfo($filePath, \PATHINFO_BASENAME) + ); + + return $dotenv->load(); + } + + private function diffDotenvVarsWithCurrentApplicationEnv(array $fileData): array + { + $fileKeys = array_keys($fileData); + $result = []; + + $reader = new MultiReader([ + PutenvAdapter::create()->get(), + ServerConstAdapter::create()->get(), + ]); + + foreach ($fileKeys as $key) { + $option = $reader->read($key); + + if ($option->isEmpty()) { + $result[$key] = $fileData[$key]; + continue; + } + + $result[$key] = $option->get(); + } + + return $result; + } + + /** + * @return ValueProvider[] + */ + public function resolveConstants(array $constants): array + { + $resolvedValues = []; + foreach ($constants as $name => $value) { + $resolvedValues[$name] = new SimpleValueProvider((string) $value); + } + + return $resolvedValues; + } + + /** + * @return ValueProvider[] + */ + public function resolveVariables(array $variables): array + { + $resolvedVariables = []; + foreach ($variables as $name => $shellCommand) { + $process = $this->createProcess($shellCommand); + $resolvedVariables[$name] = new ProcessValueProvider($process); + } + + return $resolvedVariables; + } + + /** + * @return Template[] + */ + public function resolveTemplates(array $templates): array + { + $resolvedVariables = []; + foreach ($templates as $template) { + $resolvedVariables[] = new Template($template['source'], $template['destination']); + } + + return $resolvedVariables; + } + + private function createProcess(string $shellCommand): Process + { + return new Process($shellCommand); + } +} diff --git a/src/ScriptRuntime/Execution/ProcessValueProvider.php b/src/Config/ProcessValueProvider.php similarity index 75% rename from src/ScriptRuntime/Execution/ProcessValueProvider.php rename to src/Config/ProcessValueProvider.php index 8f23bac..8fab8b1 100644 --- a/src/ScriptRuntime/Execution/ProcessValueProvider.php +++ b/src/Config/ProcessValueProvider.php @@ -1,8 +1,9 @@ process = $process; } - /** - * @return mixed - */ public function getValue(): string { $this->process->mustRun(); return trim($this->process->getOutput()); } + + public function getCommand(): string + { + return $this->process->getCommandLine(); + } } diff --git a/src/Config/RequiredValue.php b/src/Config/RequiredValue.php new file mode 100644 index 0000000..9952738 --- /dev/null +++ b/src/Config/RequiredValue.php @@ -0,0 +1,31 @@ +name = $name; + $this->description = $description; + } + + public function getName(): string + { + return $this->name; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function hasDescription(): bool + { + return (bool) $this->description; + } +} diff --git a/src/Config/ScriptsPath.php b/src/Config/ScriptsPath.php index 1e5f650..792c13e 100644 --- a/src/Config/ScriptsPath.php +++ b/src/Config/ScriptsPath.php @@ -2,6 +2,8 @@ namespace Shopware\Psh\Config; +use function is_dir; + class ScriptsPath { /** @@ -20,14 +22,12 @@ class ScriptsPath private $path; /** - * @param string $path - * @param bool $hidden * @param string $namespace */ public function __construct( string $path, bool $hidden, - string $namespace = null + ?string $namespace = null ) { $this->namespace = $namespace; $this->hidden = $hidden; @@ -42,25 +42,16 @@ public function getNamespace() return $this->namespace; } - /** - * @return string - */ public function getPath(): string { return $this->path; } - /** - * @return bool - */ public function isHidden(): bool { return $this->hidden; } - /** - * @return bool - */ public function isValid(): bool { return is_dir($this->path); diff --git a/src/ScriptRuntime/Execution/SimpleValueProvider.php b/src/Config/SimpleValueProvider.php similarity index 73% rename from src/ScriptRuntime/Execution/SimpleValueProvider.php rename to src/Config/SimpleValueProvider.php index 9beaf9f..803a576 100644 --- a/src/ScriptRuntime/Execution/SimpleValueProvider.php +++ b/src/Config/SimpleValueProvider.php @@ -1,7 +1,6 @@ value = $value; } - /** - * @return string - */ public function getValue(): string { return $this->value; diff --git a/src/ScriptRuntime/Execution/Template.php b/src/Config/Template.php similarity index 70% rename from src/ScriptRuntime/Execution/Template.php rename to src/Config/Template.php index a4a1d28..f91b86b 100644 --- a/src/ScriptRuntime/Execution/Template.php +++ b/src/Config/Template.php @@ -1,7 +1,11 @@ source = $source; $this->destination = $destination; } - /** - * @return string - */ public function getDestination(): string { return $this->destination; } - /** - * @param string $destination - */ - public function setDestination(string $destination) + public function setDestination(string $destination): void { $this->destination = $destination; } /** - * @return string * @throws TemplateNotValidException */ public function getContent(): string @@ -57,10 +50,7 @@ public function getContent(): string return file_get_contents($this->source); } - /** - * @param string $contents - */ - public function setContents(string $contents) + public function setContents(string $contents): void { file_put_contents($this->destination, $contents); } diff --git a/src/ScriptRuntime/Execution/ValueProvider.php b/src/Config/ValueProvider.php similarity index 68% rename from src/ScriptRuntime/Execution/ValueProvider.php rename to src/Config/ValueProvider.php index 4e0de91..ddea530 100644 --- a/src/ScriptRuntime/Execution/ValueProvider.php +++ b/src/Config/ValueProvider.php @@ -1,14 +1,11 @@ configBuilder = $configBuilder; $this->applicationRootDirectory = $applicationRootDirectory; } - /** - * @inheritdoc - */ public function isSupported(string $file): bool { return in_array(pathinfo($file, PATHINFO_BASENAME), ['.psh.xml', '.psh.xml.dist', '.psh.xml.override'], true); } - /** - * @inheritdoc - */ public function load(string $file, array $params): Config { $pshConfigNode = $this->loadXmlRoot($file); $this->configBuilder->start(); $headers = $this->extractNodes(self::NODE_HEADER, $pshConfigNode); - foreach ($headers as $header) { $this->configBuilder ->setHeader($header->nodeValue); } + $imports = $this->extractNodes(self::NODE_IMPORT, $pshConfigNode); + foreach ($imports as $importNode) { + $this->configBuilder->addImport($importNode->getAttribute('path')); + } + $this->setConfigData($file, $pshConfigNode); $environments = $this->extractNodes(self::NODE_ENVIRONMENT, $pshConfigNode); foreach ($environments as $node) { $this->configBuilder->start($node->getAttribute('name')); - $this->configBuilder->setHidden('true' === $node->getAttribute('hidden')); + $this->configBuilder->setHidden($node->getAttribute('hidden') === 'true'); $this->setConfigData($file, $node); } @@ -88,11 +93,7 @@ public function load(string $file, array $params): Config ->create($params); } - /** - * @param string $file - * @param array $pshConfigNode - */ - private function setConfigData(string $file, DOMElement $pshConfigNode) + private function setConfigData(string $file, DOMElement $pshConfigNode): void { $this->configBuilder->setCommandPaths( $this->extractCommandPaths($file, $pshConfigNode) @@ -110,8 +111,6 @@ private function setConfigData(string $file, DOMElement $pshConfigNode) } /** - * @param string $key - * @param DOMElement $parent * @return DOMElement[] */ private function extractNodes(string $key, DOMElement $parent): array @@ -131,11 +130,6 @@ private function extractNodes(string $key, DOMElement $parent): array return $nodes; } - /** - * @param string $file - * @param $pshConfigNode - * @return array - */ private function extractCommandPaths(string $file, DOMElement $pshConfigNode): array { $pathNodes = $this->extractNodes(self::NODE_PATH, $pshConfigNode); @@ -145,11 +139,6 @@ private function extractCommandPaths(string $file, DOMElement $pshConfigNode): a }, $pathNodes); } - /** - * @param string $file - * @param array $pshConfigNodes - * @return array - */ private function extractTemplates(string $file, DOMElement $pshConfigNodes): array { $templates = $this->extractNodes(self::NODE_TEMPLATE, $pshConfigNodes); @@ -164,39 +153,36 @@ private function extractTemplates(string $file, DOMElement $pshConfigNodes): arr 'destination' => $this->makeAbsolutePath( $file, $template->getAttribute(self::NODE_TEMPLATE_DESTINATION) - ) + ), ]; }, $templates); } - /** - * @param DOMElement $placeholder - */ - private function extractPlaceholders(string $file, DOMElement $placeholder) + private function extractPlaceholders(string $file, DOMElement $placeholder): void { foreach ($this->extractNodes(self::NODE_PLACEHOLDER_DYNAMIC, $placeholder) as $dynamic) { - $this->configBuilder->setDynamicVariable($dynamic->getAttribute('name'), $dynamic->nodeValue); + $this->configBuilder->addDynamicVariable($dynamic->getAttribute('name'), $dynamic->nodeValue); } foreach ($this->extractNodes(self::NODE_PLACEHOLDER_CONST, $placeholder) as $const) { - $this->configBuilder->setConstVariable($const->getAttribute('name'), $const->nodeValue); + $this->configBuilder->addConstVariable($const->getAttribute('name'), $const->nodeValue); } foreach ($this->extractNodes(self::NODE_PLACEHOLDER_DOTENV, $placeholder) as $dotenv) { - $this->configBuilder->setDotenvPath($this->fixPath($this->applicationRootDirectory, $dotenv->nodeValue, $file)); + $this->configBuilder->addDotenvPath($this->fixPath($this->applicationRootDirectory, $dotenv->nodeValue, $file)); + } + + foreach ($this->extractNodes(self::NODE_PLACEHOLDER_REQUIRE, $placeholder) as $require) { + $this->configBuilder->addRequirePlaceholder($require->getAttribute('name'), $require->getAttribute('description')); } } - /** - * @param string $file - * @return DOMElement - */ private function loadXmlRoot(string $file): DOMElement { $xml = XmlUtils::loadFile($file, __DIR__ . '/../../resource/config.xsd'); $xPath = new DOMXPath($xml); - /** @var \DOMNodeList $pshConfigNodes */ + /** @var DOMNodeList $pshConfigNodes */ $pshConfigNodes = $xPath->query('//psh'); return $pshConfigNodes[0]; diff --git a/src/Config/YamlConfigFileLoader.php b/src/Config/YamlConfigFileLoader.php index 2293abd..0683a3f 100644 --- a/src/Config/YamlConfigFileLoader.php +++ b/src/Config/YamlConfigFileLoader.php @@ -1,15 +1,20 @@ yamlReader = $yamlReader; @@ -51,17 +51,11 @@ public function __construct(Parser $yamlReader, ConfigBuilder $configBuilder, st $this->applicationRootDirectory = $applicationRootDirectory; } - /** - * @inheritdoc - */ public function isSupported(string $file): bool { return in_array(pathinfo($file, PATHINFO_BASENAME), ['.psh.yaml', '.psh.yml', '.psh.yml.dist', '.psh.yml.override', '.psh.yaml.dist', '.psh.yaml.override'], true); } - /** - * @inheritdoc - */ public function load(string $file, array $params): Config { $contents = $this->loadFileContents($file); @@ -87,11 +81,7 @@ public function load(string $file, array $params): Config ->create($params); } - /** - * @param string $file - * @param array $rawConfigData - */ - private function setConfigData(string $file, array $rawConfigData) + private function setConfigData(string $file, array $rawConfigData): void { $this->configBuilder->setCommandPaths( $this->extractPaths($file, $rawConfigData, self::KEY_COMMAND_PATHS) @@ -115,9 +105,7 @@ private function setConfigData(string $file, array $rawConfigData) } /** - * @param string $key - * @param array $rawConfig - * @param mixed $default + * @param mixed|null $default * @return mixed|null */ private function extractData(string $key, array $rawConfig, $default = false) @@ -129,24 +117,11 @@ private function extractData(string $key, array $rawConfig, $default = false) return $rawConfig[$key]; } - - - /** - * @param string $contents - * @return array - */ private function parseFileContents(string $contents): array { return $this->yamlReader->parse($contents); } - /** - * @param string $file - * @param array $rawConfigData - * @param string $key - * - * @return array - */ private function extractPaths(string $file, array $rawConfigData, string $key): array { $paths = $this->extractData($key, $rawConfigData, []); @@ -156,11 +131,6 @@ private function extractPaths(string $file, array $rawConfigData, string $key): }, $paths); } - /** - * @param string $file - * @param array $rawConfigData - * @return array - */ private function extractTemplates(string $file, array $rawConfigData): array { $templates = $this->extractData(self::KEY_TEMPLATES, $rawConfigData, []); diff --git a/src/Listing/DescriptionReader.php b/src/Listing/DescriptionReader.php index 42adeb3..9cd3ab7 100644 --- a/src/Listing/DescriptionReader.php +++ b/src/Listing/DescriptionReader.php @@ -1,24 +1,26 @@ -directory = $directory; @@ -54,34 +54,21 @@ public function __construct( $this->inHiddenPath = $inHiddenPath; } - /** - * @return string - */ public function getTmpPath(): string { return $this->directory . '/.tmp_' . getmypid() . '_' . $this->scriptName; } - - /** - * @return string - */ public function getPath(): string { return $this->directory . '/' . $this->scriptName; } - /** - * @return string - */ public function getDirectory(): string { return $this->directory; } - /** - * @return string - */ public function getName(): string { $name = pathinfo($this->scriptName, PATHINFO_FILENAME); @@ -101,19 +88,13 @@ public function getEnvironment() return $this->environment; } - /** - * @return string - */ public function getDescription(): string { return $this->description; } - /** - * @return bool - */ public function isHidden(): bool { - return $this->inHiddenPath || strpos($this->scriptName, '.') === 0; + return $this->inHiddenPath || mb_strpos($this->scriptName, '.') === 0; } } diff --git a/src/Listing/ScriptFinder.php b/src/Listing/ScriptFinder.php index 1d1e13a..51fa29d 100644 --- a/src/Listing/ScriptFinder.php +++ b/src/Listing/ScriptFinder.php @@ -1,9 +1,14 @@ getAllVisibleScripts(); return array_filter($scripts, function ($key) use ($query) { - return strpos($key, $query) > -1 || levenshtein($key, $query) < 3; + return mb_strpos($key, $query) > -1 || levenshtein($key, $query) < 3; }, ARRAY_FILTER_USE_KEY); } /** - * @param string $scriptName - * @return Script * @throws ScriptNotFoundException */ public function findScriptByName(string $scriptName): Script @@ -99,7 +97,6 @@ public function findScriptByName(string $scriptName): Script /** * @param $fileName - * @return bool */ private function isValidScript(string $fileName): bool { @@ -108,10 +105,7 @@ private function isValidScript(string $fileName): bool return in_array($extension, self::VALID_EXTENSIONS, true); } - /** - * @param ScriptsPath $path - */ - private function testPathValidity(ScriptsPath $path) + private function testPathValidity(ScriptsPath $path): void { if (!$path->isValid()) { throw new ScriptPathNotValidException("The given script path: '{$path->getPath()}' is not a valid directory"); diff --git a/src/Listing/ScriptNotFoundException.php b/src/Listing/ScriptNotFoundException.php index 82a4cca..25c2e03 100644 --- a/src/Listing/ScriptNotFoundException.php +++ b/src/Listing/ScriptNotFoundException.php @@ -1,23 +1,19 @@ scriptName = $scriptName; @@ -25,9 +21,6 @@ public function setScriptName(string $scriptName): self return $this; } - /** - * @return string - */ public function getScriptName(): string { return $this->scriptName; diff --git a/src/Listing/ScriptPathNotValidException.php b/src/Listing/ScriptPathNotValidException.php index 1c74429..e346e0a 100644 --- a/src/Listing/ScriptPathNotValidException.php +++ b/src/Listing/ScriptPathNotValidException.php @@ -1,11 +1,12 @@ script = $script; $this->warning = $warning; } - /** - * @return Script - */ public function getScript(): Script { return $this->script; } - /** - * @return int - */ public function getLineNumber(): int { return 1; } - /** - * @return boolean - */ public function isIgnoreError(): bool { return false; } - /** - * @return bool - */ public function isTTy(): bool { return false; } - /** - * @return bool - */ public function hasWarning(): bool { - return null !== $this->warning; + return $this->warning !== null; } - /** - * @return string - */ - public function getWarning(): string + public function getWarning(): ?string { return $this->warning; } diff --git a/src/ScriptRuntime/Command.php b/src/ScriptRuntime/Command.php index 5666ea0..6009e95 100644 --- a/src/ScriptRuntime/Command.php +++ b/src/ScriptRuntime/Command.php @@ -4,8 +4,5 @@ interface Command { - /** - * @return int - */ public function getLineNumber(): int; } diff --git a/src/ScriptRuntime/DeferredProcessCommand.php b/src/ScriptRuntime/DeferredProcessCommand.php index d94db9d..05b9500 100644 --- a/src/ScriptRuntime/DeferredProcessCommand.php +++ b/src/ScriptRuntime/DeferredProcessCommand.php @@ -1,6 +1,5 @@ tty = $tty; } - /** - * @return string - */ public function getShellCommand(): string { return $this->shellCommand; } - /** - * @return boolean - */ public function isIgnoreError(): bool { return $this->ignoreError; } - /** - * @return int - */ public function getLineNumber(): int { return $this->lineNumber; } - /** - * @return bool - */ public function isTTy(): bool { return $this->tty; diff --git a/src/ScriptRuntime/Execution/DeferredProcess.php b/src/ScriptRuntime/Execution/DeferredProcess.php index a30699b..b671000 100644 --- a/src/ScriptRuntime/Execution/DeferredProcess.php +++ b/src/ScriptRuntime/Execution/DeferredProcess.php @@ -27,11 +27,6 @@ class DeferredProcess */ private $log = []; - /** - * @param string $parsedCommand - * @param DeferredProcessCommand $command - * @param Process $process - */ public function __construct(string $parsedCommand, DeferredProcessCommand $command, Process $process) { $this->command = $command; @@ -39,34 +34,22 @@ public function __construct(string $parsedCommand, DeferredProcessCommand $comma $this->parsedCommand = $parsedCommand; } - /** - * @return string - */ public function getParsedCommand(): string { return $this->parsedCommand; } - /** - * @return DeferredProcessCommand - */ public function getCommand(): DeferredProcessCommand { return $this->command; } - /** - * @return Process - */ public function getProcess(): Process { return $this->process; } - /** - * @param LogMessage $logMessage - */ - public function log(LogMessage $logMessage) + public function log(LogMessage $logMessage): void { $this->log[] = $logMessage; } diff --git a/src/ScriptRuntime/Execution/ExecutionErrorException.php b/src/ScriptRuntime/Execution/ExecutionErrorException.php index b5e6feb..b30c051 100644 --- a/src/ScriptRuntime/Execution/ExecutionErrorException.php +++ b/src/ScriptRuntime/Execution/ExecutionErrorException.php @@ -1,11 +1,12 @@ message = $message; $this->error = $error; } - /** - * @return string - */ public function getMessage(): string { return $this->message; } - /** - * @return bool - */ public function isError(): bool { return $this->error; diff --git a/src/ScriptRuntime/Execution/Logger.php b/src/ScriptRuntime/Execution/Logger.php index 60ce21e..04f9321 100644 --- a/src/ScriptRuntime/Execution/Logger.php +++ b/src/ScriptRuntime/Execution/Logger.php @@ -1,6 +1,5 @@ constants = $this->initializeConstants($constants); - $this->variables = $this->initializeVariables($variables); - $this->templates = $this->initializeTemplates($templates); - $this->dotenvVariables = $this->initializeDotenvVariables($dotenvPaths); - } - - /** - * @param array $constants - * @return ValueProvider[] - */ - private function initializeConstants(array $constants): array - { - $resolvedValues = []; - foreach ($constants as $name => $value) { - $resolvedValues[$name] = new SimpleValueProvider((string) $value); - } - - return $resolvedValues; - } - - /** - * @param array $variables - * @return ValueProvider[] + * @param ValueProvider[] $constants + * @param ValueProvider[] $variables + * @param Template[] $templates + * @param ValueProvider[] $dotenvVars */ - private function initializeVariables(array $variables): array + public function __construct(array $constants, array $variables, array $templates, array $dotenvVars) { - $resolvedVariables = []; - foreach ($variables as $name => $shellCommand) { - $process = $this->createProcess($shellCommand); - $resolvedVariables[$name] = new ProcessValueProvider($process); - } - - return $resolvedVariables; - } - - /** - * @param DotenvFile[] $dotenvPaths - * @return ValueProvider[] - */ - private function initializeDotenvVariables(array $dotenvPaths): array - { - $variables = []; - - foreach ($dotenvPaths as $dotenvPath) { - $dotenvVariables = $this->loadDotenvVariables($dotenvPath); - - foreach ($dotenvVariables as $variableKey => $variableValue) { - $variables[$variableKey] = new SimpleValueProvider($variableValue); - } - } - - return $variables; - } - - /** - * @param array $templates - * @return Template[] - */ - private function initializeTemplates(array $templates): array - { - $resolvedVariables = []; - foreach ($templates as $template) { - $resolvedVariables[] = new Template($template['source'], $template['destination']); - } - - return $resolvedVariables; + $this->constants = $constants; + $this->variables = $variables; + $this->templates = $templates; + $this->dotenvVariables = $dotenvVars; } /** @@ -132,59 +66,8 @@ public function getTemplates(): array return $this->templates; } - /** - * @param string $shellCommand - * @return Process - */ public function createProcess(string $shellCommand): Process { - return new Process($shellCommand); - } - - /** - * @param DotenvFile $dotenvPath - * @return array - */ - private function loadDotenvVariables(DotenvFile $dotenvPath): array - { - $dotenvFactory = new DotenvFactory(); - - $fileData = $this->loadDotenvFile($dotenvPath, $dotenvFactory); - return $this->diffDotenvVarsWithEnv($fileData, $dotenvFactory); - } - - /** - * @param DotenvFile $dotenvPath - * @param DotenvFactory $dotenvFactory - * @return array - */ - private function loadDotenvFile(DotenvFile $dotenvPath, DotenvFactory $dotenvFactory): array - { - $filePath = $dotenvPath->getPath(); - $dotenv = Dotenv::create( - pathinfo($filePath, PATHINFO_DIRNAME), - pathinfo($filePath, PATHINFO_BASENAME), - $dotenvFactory - ); - - return $dotenv->load(); - } - - /** - * @param array $fileData - * @param DotenvFactory $dotenvFactory - * @return array - */ - private function diffDotenvVarsWithEnv(array $fileData, DotenvFactory $dotenvFactory): array - { - $fileKeys = array_keys($fileData); - $result = []; - - $existingVariables = $dotenvFactory->createImmutable(); - foreach ($fileKeys as $key) { - $result[$key] = $existingVariables->get($key); - } - - return $result; + return Process::fromShellCommandline($shellCommand); } } diff --git a/src/ScriptRuntime/Execution/ProcessExecutor.php b/src/ScriptRuntime/Execution/ProcessExecutor.php index a1b627a..1748ea3 100644 --- a/src/ScriptRuntime/Execution/ProcessExecutor.php +++ b/src/ScriptRuntime/Execution/ProcessExecutor.php @@ -1,8 +1,9 @@ logger->startScript($script); @@ -84,12 +82,7 @@ public function execute(Script $script, array $commands) $this->logger->finishScript($script); } - /** - * @param Command $command - * @param int $index - * @param int $totalCount - */ - private function executeCommand(Command $command, int $index, int $totalCount) + private function executeCommand(Command $command, int $index, int $totalCount): void { switch (true) { case $command instanceof BashCommand: @@ -145,20 +138,18 @@ private function executeCommand(Command $command, int $index, int $totalCount) $this->waitForDeferredProcesses(); break; + default: + throw new InvalidArgumentException('Trying to execute unknown command'); } } - private function executeTemplateRendering() + private function executeTemplateRendering(): void { foreach ($this->environment->getTemplates() as $template) { $this->renderTemplate($template); } } - /** - * @param ParsableCommand $command - * @return string - */ private function getParsedShellCommand(ParsableCommand $command): string { $rawShellCommand = $command->getShellCommand(); @@ -171,42 +162,28 @@ private function getParsedShellCommand(ParsableCommand $command): string return $parsedCommand; } - /** - * @param Process $process - * @param ProcessCommand $command - */ - private function setProcessDefaults(Process $process, ProcessCommand $command) + private function setProcessDefaults(Process $process, ProcessCommand $command): void { $process->setWorkingDirectory($this->applicationDirectory); $process->setTimeout(0); $process->setTty($command->isTTy()); } - /** - * @param Process $process - */ - private function runProcess(Process $process) + private function runProcess(Process $process): void { - $process->run(function ($type, $response) { + $process->run(function (string $type, string $response): void { $this->logger->log(new LogMessage($response, $type === Process::ERR)); }); } - /** - * @param Process $process - * @param ProcessCommand $command - */ - private function testProcessResultValid(Process $process, ProcessCommand $command) + private function testProcessResultValid(Process $process, ProcessCommand $command): void { if (!$this->isProcessResultValid($process, $command)) { throw new ExecutionErrorException('Command exited with Error'); } } - /** - * @param $template - */ - private function renderTemplate(Template $template) + private function renderTemplate(Template $template): void { $renderedTemplateDestination = $this->templateEngine ->render($template->getDestination(), $this->environment->getAllValues()); @@ -219,7 +196,7 @@ private function renderTemplate(Template $template) $template->setContents($renderedTemplateContent); } - private function waitForDeferredProcesses() + private function waitForDeferredProcesses(): void { if (count($this->deferredProcesses) === 0) { return; @@ -250,38 +227,23 @@ private function waitForDeferredProcesses() $this->deferredProcesses = []; } - /** - * @param string $parsedCommand - * @param DeferredProcessCommand $command - * @param Process $process - */ - private function deferProcess(string $parsedCommand, DeferredProcessCommand $command, Process $process) + private function deferProcess(string $parsedCommand, DeferredProcessCommand $command, Process $process): void { $deferredProcess = new DeferredProcess($parsedCommand, $command, $process); - $process->start(function ($type, $response) use ($deferredProcess) { + $process->start(function (string $type, string $response) use ($deferredProcess): void { $deferredProcess->log(new LogMessage($response, $type === Process::ERR)); }); $this->deferredProcesses[] = $deferredProcess; } - /** - * @param Process $process - * @param ProcessCommand $command - * @return bool - */ private function isProcessResultValid(Process $process, ProcessCommand $command): bool { return $command->isIgnoreError() || $process->isSuccessful(); } - /** - * @param WaitCommand $command - * @param int $index - * @param int $totalCount - */ - private function logWaitStart(WaitCommand $command, int $index, int $totalCount) + private function logWaitStart(WaitCommand $command, int $index, int $totalCount): void { $this->logger->logStart( 'Waiting', @@ -293,13 +255,7 @@ private function logWaitStart(WaitCommand $command, int $index, int $totalCount) ); } - /** - * @param TemplateCommand $command - * @param int $index - * @param int $totalCount - * @param Template $template - */ - private function logTemplateStart(TemplateCommand $command, int $index, int $totalCount, Template $template) + private function logTemplateStart(TemplateCommand $command, int $index, int $totalCount, Template $template): void { $this->logger->logStart( 'Template', @@ -311,13 +267,7 @@ private function logTemplateStart(TemplateCommand $command, int $index, int $tot ); } - /** - * @param DeferredProcessCommand $command - * @param int $index - * @param int $totalCount - * @param string $parsedCommand - */ - private function logDeferedStart(DeferredProcessCommand $command, int $index, int $totalCount, string $parsedCommand) + private function logDeferedStart(DeferredProcessCommand $command, int $index, int $totalCount, string $parsedCommand): void { $this->logger->logStart( 'Deferring', @@ -329,13 +279,7 @@ private function logDeferedStart(DeferredProcessCommand $command, int $index, in ); } - /** - * @param ProcessCommand $command - * @param int $index - * @param int $totalCount - * @param string $parsedCommand - */ - private function logSynchronousProcessStart(ProcessCommand $command, int $index, int $totalCount, string $parsedCommand) + private function logSynchronousProcessStart(ProcessCommand $command, int $index, int $totalCount, string $parsedCommand): void { $this->logger->logStart( 'Starting', @@ -347,12 +291,7 @@ private function logSynchronousProcessStart(ProcessCommand $command, int $index, ); } - /** - * @param BashCommand $command - * @param int $index - * @param int $totalCount - */ - private function logBashStart(BashCommand $command, int $index, int $totalCount) + private function logBashStart(BashCommand $command, int $index, int $totalCount): void { $this->logger->logStart( 'Executing', @@ -364,11 +303,7 @@ private function logBashStart(BashCommand $command, int $index, int $totalCount) ); } - /** - * @param DeferredProcess $deferredProcess - * @param $index - */ - private function logDeferredOutputStart(DeferredProcess $deferredProcess, $index) + private function logDeferredOutputStart(DeferredProcess $deferredProcess, int $index): void { $this->logger->logStart( 'Output from', diff --git a/src/ScriptRuntime/Execution/TemplateEngine.php b/src/ScriptRuntime/Execution/TemplateEngine.php index 6924714..27c991b 100644 --- a/src/ScriptRuntime/Execution/TemplateEngine.php +++ b/src/ScriptRuntime/Execution/TemplateEngine.php @@ -1,8 +1,15 @@ getValue(); } } - throw new \RuntimeException('Missing required value for "' . $valueName . '"'); + throw new RuntimeException('Missing required value for "' . $valueName . '"'); } } diff --git a/src/ScriptRuntime/Execution/TemplateNotValidException.php b/src/ScriptRuntime/Execution/TemplateNotValidException.php index b6534c0..4ba73a8 100644 --- a/src/ScriptRuntime/Execution/TemplateNotValidException.php +++ b/src/ScriptRuntime/Execution/TemplateNotValidException.php @@ -1,11 +1,12 @@ '; - const SHOULD_BE_PRESENT = "set -euo pipefail"; + const SHOULD_BE_PRESENT = 'set -euo pipefail'; /** * {@inheritdoc} @@ -29,34 +34,24 @@ public function parseContent(string $content, Script $script, ScriptLoader $load return [new BashCommand($script, $warning)]; } - /** - * @param Script $script - */ - private function testScriptFileFitsRequirements(Script $script) + private function testScriptFileFitsRequirements(Script $script): void { if (!is_executable($script->getPath())) { - throw new \RuntimeException('Bash scripts can only be executed if they are executable please execute chmod +x ' . $script->getPath() . ''); + throw new RuntimeException('Bash scripts can only be executed if they are executable please execute chmod +x ' . $script->getPath() . ''); } if (!is_writable($script->getDirectory())) { - throw new \RuntimeException('Bash scripts can only be executed if they are in a writable directory please execute chmod +w ' . $script->getDirectory() . ''); + throw new RuntimeException('Bash scripts can only be executed if they are in a writable directory please execute chmod +w ' . $script->getDirectory() . ''); } } - /** - * @param string $content - */ - private function testContentContainsMarker(string $content) + private function testContentContainsMarker(string $content): void { - if (strpos($content, self::TYPE_DIRECT_EXECUTE) === false) { + if (mb_strpos($content, self::TYPE_DIRECT_EXECUTE) === false) { throw new ScriptNotSupportedByParser('Marker for execution missing'); } } - /** - * @param string $content - * @return bool - */ private function shouldWarnAboutBestPractice(string $content): bool { $firstLines = explode("\n", $content, 5); diff --git a/src/ScriptRuntime/ScriptLoader/CommandBuilder.php b/src/ScriptRuntime/ScriptLoader/CommandBuilder.php index 15653a8..59ddcba 100644 --- a/src/ScriptRuntime/ScriptLoader/CommandBuilder.php +++ b/src/ScriptRuntime/ScriptLoader/CommandBuilder.php @@ -1,6 +1,5 @@ reset(); } - private function reset() + private function reset(): void { $this->ignoreError = false; $this->tty = false; @@ -52,11 +51,6 @@ private function reset() $this->deferred = false; } - /** - * @param string $shellCommand - * @param int $startLine - * @return CommandBuilder - */ public function addProcessCommand(string $shellCommand, int $startLine): CommandBuilder { if ($this->deferred) { @@ -81,9 +75,6 @@ public function addProcessCommand(string $shellCommand, int $startLine): Command } /** - * @param string $source - * @param string $destination - * @param int $lineNumber * @return $this */ public function addTemplateCommand(string $source, string $destination, int $lineNumber): CommandBuilder @@ -99,10 +90,6 @@ public function addTemplateCommand(string $source, string $destination, int $lin return $this; } - /** - * @param int $lineNumber - * @return CommandBuilder - */ public function addWaitCommand(int $lineNumber): CommandBuilder { $this->reset(); @@ -111,10 +98,6 @@ public function addWaitCommand(int $lineNumber): CommandBuilder return $this; } - /** - * @param bool $set - * @return CommandBuilder - */ public function setIgnoreError(bool $set = true): CommandBuilder { $this->ignoreError = $set; @@ -122,10 +105,6 @@ public function setIgnoreError(bool $set = true): CommandBuilder return $this; } - /** - * @param bool $set - * @return CommandBuilder - */ public function setTty(bool $set = true): CommandBuilder { $this->tty = $set; @@ -133,10 +112,6 @@ public function setTty(bool $set = true): CommandBuilder return $this; } - /** - * @param bool $set - * @return CommandBuilder - */ public function setDeferredExecution(bool $set = true): CommandBuilder { $this->deferred = $set; @@ -144,10 +119,6 @@ public function setDeferredExecution(bool $set = true): CommandBuilder return $this; } - /** - * @param array $commands - * @return CommandBuilder - */ public function replaceCommands(array $commands): CommandBuilder { $this->allCommands = $commands; @@ -156,7 +127,7 @@ public function replaceCommands(array $commands): CommandBuilder } /** - * @return SynchronusProcessCommand[] + * @return Command[] */ public function getAll(): array { diff --git a/src/ScriptRuntime/ScriptLoader/PshScriptParser.php b/src/ScriptRuntime/ScriptLoader/PshScriptParser.php index cf59ae9..a5ce93f 100644 --- a/src/ScriptRuntime/ScriptLoader/PshScriptParser.php +++ b/src/ScriptRuntime/ScriptLoader/PshScriptParser.php @@ -1,13 +1,18 @@ commandBuilder = $commandBuilder; @@ -115,7 +116,6 @@ private function createTokenHandler(ScriptLoader $loader): array $this->commandBuilder ->addWaitCommand($lineNumber); - return ''; }, @@ -146,11 +146,6 @@ private function createTokenHandler(ScriptLoader $loader): array ]; } - /** - * @param Script $fromScript - * @param string $includeStatement - * @return string - */ private function findInclude(Script $fromScript, string $includeStatement): string { if (file_exists($includeStatement)) { @@ -161,13 +156,9 @@ private function findInclude(Script $fromScript, string $includeStatement): stri return $fromScript->getDirectory() . '/' . $includeStatement; } - throw new \RuntimeException('Unable to parse include statement "' . $includeStatement . '" in "' . $fromScript->getPath() . '"'); + throw new RuntimeException('Unable to parse include statement "' . $includeStatement . '" in "' . $fromScript->getPath() . '"'); } - /** - * @param string $command - * @return bool - */ private function isExecutableLine(string $command): bool { $command = trim($command); @@ -183,28 +174,17 @@ private function isExecutableLine(string $command): bool return true; } - /** - * @param string $needle - * @param string $haystack - * @return string - */ private function removeFromStart(string $needle, string $haystack): string { - return substr($haystack, strlen($needle)); + return mb_substr($haystack, mb_strlen($needle)); } - /** - * @param string $needle - * @param string $haystack - * @return bool - */ private function startsWith(string $needle, string $haystack): bool { - return (self::TOKEN_WILDCARD === $needle && $haystack !== '') || strpos($haystack, $needle) === 0; + return ($needle === self::TOKEN_WILDCARD && $haystack !== '') || mb_strpos($haystack, $needle) === 0; } /** - * @param string $contents * @return string[] */ private function splitIntoLines(string $contents): array @@ -221,7 +201,7 @@ private function splitIntoLines(string $contents): array if ($this->startsWith(self::CONCATENATE_PREFIX, $line)) { $lastValue = array_pop($lines); - $lines[] = $lastValue . ' ' . trim($line); + $lines[] = $lastValue . ' ' . trim($line); continue; } diff --git a/src/ScriptRuntime/ScriptLoader/ScriptLoader.php b/src/ScriptRuntime/ScriptLoader/ScriptLoader.php index 8dd9a98..61785a7 100644 --- a/src/ScriptRuntime/ScriptLoader/ScriptLoader.php +++ b/src/ScriptRuntime/ScriptLoader/ScriptLoader.php @@ -1,10 +1,10 @@ parsers = $parsers; } /** - * @param Script $script * @return Command[] */ public function loadScript(Script $script): array @@ -43,11 +42,7 @@ public function loadScript(Script $script): array throw new ScriptNotSupportedByParser('Can not find a parser able to parse ' . $script->getPath()); } - /** - * @param string $file - * @return string - */ - protected function loadFileContents(string $file): string + private function loadFileContents(string $file): string { return file_get_contents($file); } diff --git a/src/ScriptRuntime/ScriptLoader/ScriptNotSupportedByParser.php b/src/ScriptRuntime/ScriptLoader/ScriptNotSupportedByParser.php index 7740734..3d1aa1b 100644 --- a/src/ScriptRuntime/ScriptLoader/ScriptNotSupportedByParser.php +++ b/src/ScriptRuntime/ScriptLoader/ScriptNotSupportedByParser.php @@ -2,6 +2,8 @@ namespace Shopware\Psh\ScriptRuntime\ScriptLoader; -class ScriptNotSupportedByParser extends \RuntimeException +use RuntimeException; + +class ScriptNotSupportedByParser extends RuntimeException { } diff --git a/src/ScriptRuntime/ScriptLoader/ScriptParser.php b/src/ScriptRuntime/ScriptLoader/ScriptParser.php index 79ab452..185e391 100644 --- a/src/ScriptRuntime/ScriptLoader/ScriptParser.php +++ b/src/ScriptRuntime/ScriptLoader/ScriptParser.php @@ -1,4 +1,4 @@ -tty = $tty; } - /** - * @return string - */ public function getShellCommand(): string { return $this->shellCommand; } - /** - * @return boolean - */ public function isIgnoreError(): bool { return $this->ignoreError; } - /** - * @return int - */ public function getLineNumber(): int { return $this->lineNumber; } - /** - * @return bool - */ public function isTTy(): bool { return $this->tty; diff --git a/src/ScriptRuntime/TemplateCommand.php b/src/ScriptRuntime/TemplateCommand.php index 632741c..03e2882 100644 --- a/src/ScriptRuntime/TemplateCommand.php +++ b/src/ScriptRuntime/TemplateCommand.php @@ -2,7 +2,7 @@ namespace Shopware\Psh\ScriptRuntime; -use Shopware\Psh\ScriptRuntime\Execution\Template; +use Shopware\Psh\Config\Template; class TemplateCommand implements Command { @@ -21,11 +21,6 @@ class TemplateCommand implements Command */ private $lineNumber; - /** - * @param string $source - * @param string $destination - * @param int $lineNumber - */ public function __construct( string $source, string $destination, @@ -36,17 +31,11 @@ public function __construct( $this->lineNumber = $lineNumber; } - /** - * @return int - */ public function getLineNumber(): int { return $this->lineNumber; } - /** - * @return Template - */ public function createTemplate(): Template { return new Template( diff --git a/src/ScriptRuntime/WaitCommand.php b/src/ScriptRuntime/WaitCommand.php index 4900571..463c773 100644 --- a/src/ScriptRuntime/WaitCommand.php +++ b/src/ScriptRuntime/WaitCommand.php @@ -9,17 +9,11 @@ class WaitCommand implements Command */ private $lineNumber; - /** - * @param int $lineNumber - */ public function __construct(int $lineNumber) { $this->lineNumber = $lineNumber; } - /** - * @return int - */ public function getLineNumber(): int { return $this->lineNumber; diff --git a/tests/.psh.xml b/tests/.psh.xml new file mode 100644 index 0000000..dbf5331 --- /dev/null +++ b/tests/.psh.xml @@ -0,0 +1,7 @@ + + + + + test-actions + diff --git a/tests/Acceptance/ApplicationTest.php b/tests/Acceptance/ApplicationTest.php index 5b2406b..0a67f5f 100644 --- a/tests/Acceptance/ApplicationTest.php +++ b/tests/Acceptance/ApplicationTest.php @@ -1,22 +1,26 @@ run([]); $this->assertNoErrorExitCode($exitCode); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertContains('test:env', MockWriter::$content); - $this->assertContains('test:env2', MockWriter::$content); - $this->assertContains('6 script(s) available', MockWriter::$content); - $this->assertNotContains('Duration:', MockWriter::$content); - $this->assertNotContains('test:.hidden', MockWriter::$content); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString('Available commands:', MockWriter::$content); + self::assertStringContainsString('test:env', MockWriter::$content); + self::assertStringContainsString('test:env2', MockWriter::$content); + self::assertStringContainsString('7 script(s) available', MockWriter::$content); + self::assertStringNotContainsString('Duration:', MockWriter::$content); + self::assertStringNotContainsString('test:.hidden', MockWriter::$content); } - public function test_hidden_execution() + public function test_hidden_execution(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); @@ -42,7 +47,7 @@ public function test_hidden_execution() $this->assertSimpleScript($exitCode, 'test'); } - public function test_application_execution() + public function test_application_execution(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); @@ -52,7 +57,7 @@ public function test_application_execution() $this->assertSimpleScript($exitCode, 'prod'); } - public function test_environment_application_execution() + public function test_environment_application_execution(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); @@ -62,7 +67,7 @@ public function test_environment_application_execution() $this->assertSimpleScript($exitCode, 'test'); } - public function test_hidden_environment_application_execution() + public function test_hidden_environment_application_execution(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); @@ -72,7 +77,7 @@ public function test_hidden_environment_application_execution() $this->assertSimpleScript($exitCode, 'hidden'); } - public function test_environment_deferred_application_execution() + public function test_environment_deferred_application_execution(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); @@ -80,185 +85,217 @@ public function test_environment_deferred_application_execution() $exitCode = $application->run(['', 'test:deferred']); $this->assertNoErrorExitCode($exitCode); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertContains('(1/3) Deferring', MockWriter::$content); - $this->assertContains('(2/3) Waiting', MockWriter::$content); - $this->assertContains('WAITING...', MockWriter::$content); - $this->assertContains('(1/1) Output from', MockWriter::$content); - $this->assertNotContains('echo "__ENV__"', MockWriter::$content); - $this->assertContains('(3/3) Deferring', MockWriter::$content); - $this->assertContains(' echo "test"', MockWriter::$content); - $this->assertContains('All commands successfully executed!', MockWriter::$content); - $this->assertContains('Duration:', MockWriter::$content); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString('(1/3) Deferring', MockWriter::$content); + self::assertStringContainsString('(2/3) Waiting', MockWriter::$content); + self::assertStringContainsString('WAITING...', MockWriter::$content); + self::assertStringContainsString('(1/1) Output from', MockWriter::$content); + self::assertStringNotContainsString('echo "__ENV__"', MockWriter::$content); + self::assertStringContainsString('(3/3) Deferring', MockWriter::$content); + self::assertStringContainsString(' echo "test"', MockWriter::$content); + self::assertStringContainsString('All commands successfully executed!', MockWriter::$content); + self::assertStringContainsString('Duration:', MockWriter::$content); self::assertStringEqualsFile(__DIR__ . '/_app/result.txt', 'test'); } - public function test_error_application_execution() + public function test_error_application_execution(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'error']); - $this->assertEquals(Application::RESULT_ERROR, $exitCode); - $this->assertNotEquals(0, $exitCode); + self::assertEquals(ExitSignal::RESULT_ERROR, $exitCode); + self::assertNotEquals(0, $exitCode); } - public function test_chain_two_commands_with_a_comma_executes_both() + public function test_chain_two_commands_with_a_comma_executes_both(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'simple,test:env']); $this->assertNoErrorExitCode($exitCode); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertContains(' echo "prod"', MockWriter::$content); - $this->assertContains(' echo "test"', MockWriter::$content); - $this->assertContains('All commands successfully executed!', MockWriter::$content); - $this->assertNotContains('3 script(s) available', MockWriter::$content); - $this->assertContains('Duration:', MockWriter::$content); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString(' echo "prod"', MockWriter::$content); + self::assertStringContainsString(' echo "test"', MockWriter::$content); + self::assertStringContainsString('All commands successfully executed!', MockWriter::$content); + self::assertStringNotContainsString('3 script(s) available', MockWriter::$content); + self::assertStringContainsString('Duration:', MockWriter::$content); self::assertStringEqualsFile(__DIR__ . '/_app/result.txt', 'test'); } - public function test_chain_two_commands_with_a_comma_executes_both_unless_an_error_occures() + public function test_chain_two_commands_with_a_comma_executes_both_unless_an_error_occures(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'error,test:env']); - $this->assertEquals(Application::RESULT_ERROR, $exitCode); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertNotContains(' echo "test"', MockWriter::$content); - $this->assertNotContains('All commands successfully executed!', MockWriter::$content); - $this->assertNotContains('3 script(s) available', MockWriter::$content); + self::assertEquals(ExitSignal::RESULT_ERROR, $exitCode); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringNotContainsString(' echo "test"', MockWriter::$content); + self::assertStringNotContainsString('All commands successfully executed!', MockWriter::$content); + self::assertStringNotContainsString('3 script(s) available', MockWriter::$content); } - public function test_psh_config_override_should_override_existing_psh_configuration() + public function test_psh_config_override_should_override_existing_psh_configuration(): void { $application = new Application(__DIR__ . '/_override_app'); MockWriter::addToApplication($application); $exitCode = $application->run([]); - $this->assertEquals(Application::RESULT_SUCCESS, $exitCode); - $this->assertContains('Using .psh.xml extended by .psh.xml.override', MockWriter::$content); - $this->assertContains('override', MockWriter::$content); - $this->assertContains('override-app', MockWriter::$content); + self::assertEquals(ExitSignal::RESULT_SUCCESS, $exitCode); + self::assertStringContainsString('Using .psh.xml extended by .psh.xml.override', MockWriter::$content); + self::assertStringContainsString('override', MockWriter::$content); + self::assertStringContainsString('override-app', MockWriter::$content); } - public function test_psh_config_override_should_override_existing_psh_configuration_executes_with_override_params() + public function test_psh_config_override_should_override_existing_psh_configuration_executes_with_override_params(): void { $application = new Application(__DIR__ . '/_override_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'override-app', '--external_param', 'foo-content']); - $this->assertEquals(Application::RESULT_SUCCESS, $exitCode); - $this->assertContains('Using .psh.xml extended by .psh.xml.override', MockWriter::$content); - $this->assertContains('override', MockWriter::$content); - $this->assertContains('override-app', MockWriter::$content); - $this->assertNotContains('_EXTERNAL_PARAM_', MockWriter::$content); - $this->assertContains('foo-content', MockWriter::$content); + self::assertEquals(ExitSignal::RESULT_SUCCESS, $exitCode); + self::assertStringContainsString('Using .psh.xml extended by .psh.xml.override', MockWriter::$content); + self::assertStringContainsString('Importing foo/.psh.xml from "foo"', MockWriter::$content); + + self::assertStringContainsString('override', MockWriter::$content); + self::assertStringContainsString('override-app', MockWriter::$content); + self::assertStringNotContainsString('_EXTERNAL_PARAM_', MockWriter::$content); + self::assertStringContainsString('foo-content', MockWriter::$content); } - public function test_psh_groups_commands_by_environment() + public function test_psh_groups_commands_by_environment(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['']); - $this->assertEquals(Application::RESULT_SUCCESS, $exitCode); + self::assertEquals(ExitSignal::RESULT_SUCCESS, $exitCode); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertContains('default:', MockWriter::$content); - $this->assertContains('test:', MockWriter::$content); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString('default:', MockWriter::$content); + self::assertStringContainsString('test:', MockWriter::$content); } - public function test_bash_autocomplete_listing() + public function test_bash_autocomplete_listing(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'bash_autocompletion_dump']); - $this->assertEquals(Application::RESULT_SUCCESS, $exitCode); + self::assertEquals(ExitSignal::RESULT_SUCCESS, $exitCode); - $this->assertNotContains('Using .psh.xml', MockWriter::$content); - $this->assertContains('error simple test:env test:env2', MockWriter::$content); + self::assertStringNotContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString('error simple test:env test:env2', MockWriter::$content); } - public function test_script_not_found_listing_with_guess() + public function test_script_not_found_listing_with_guess(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'sĂŒmple']); - $this->assertEquals(Application::RESULT_ERROR, $exitCode); + self::assertEquals(ExitSignal::RESULT_ERROR, $exitCode); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertContains('Have you been looking for this?', MockWriter::$content); - $this->assertContains('- simple', MockWriter::$content); - $this->assertContains('1 script(s) available', MockWriter::$content); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString('Have you been looking for this?', MockWriter::$content); + self::assertStringContainsString('- simple', MockWriter::$content); + self::assertStringContainsString('1 script(s) available', MockWriter::$content); } - public function test_script_not_found_listing_without_guess() + public function test_script_not_found_listing_without_guess(): void { $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'pkdi']); - $this->assertEquals(Application::RESULT_ERROR, $exitCode); + self::assertEquals(ExitSignal::RESULT_ERROR, $exitCode); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertContains('Script with name pkdi not found', MockWriter::$content); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString('Script with name pkdi not found', MockWriter::$content); } - public function test_showListings_returns_no_scripts_available() + public function test_showListings_returns_no_scripts_available(): void { $application = new Application(__DIR__); MockWriter::addToApplication($application); $application->showListing([]); - $this->assertContains('Currently no scripts available', MockWriter::$content); + self::assertStringContainsString('Currently no scripts available', MockWriter::$content); + } + + public function test_it_throws_exception_InvalidArgumentException_and_it_is_catched(): void + { + $application = new Application(__DIR__ . '/_app_invalid_template'); + MockWriter::addToApplication($application); + + $exitCode = $application->run(['', 'simple']); + + self::assertStringContainsString('Unable to find a file referenced by "templates/testa.tpl', MockWriter::$content); + self::assertEquals(ExitSignal::RESULT_ERROR, $exitCode); } - public function test_it_throws_exception_InvalidArgumentException_and_it_is_catched() + public function test_it_exits_early_without_all_requirements_met(): void { - $application = new Application(__DIR__.'/_app_invalid_template'); + $application = new Application(__DIR__ . '/_app_missing_requirement'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'simple']); - $this->assertContains('Unable to find a file referenced by "templates/testa.tpl', MockWriter::$content); - $this->assertEquals(Application::RESULT_ERROR, $exitCode); + self::assertFileNotExists(__DIR__ . '/_app_missing_requirement/result.txt'); + + self::assertStringContainsString('- Missing required const or var named FOO (needs_foo)', MockWriter::$content); + self::assertStringContainsString('- Missing required const or var named BAR', MockWriter::$content); + self::assertEquals(ExitSignal::RESULT_ERROR, $exitCode); } - public function test_it_throws_exception_InvalidParameterException_and_it_is_catched() + public function test_requirements_can_be_overwritten_by_param(): void { - $application = new Application(__DIR__.'/_app'); + $application = new Application(__DIR__ . '/_app_missing_requirement'); + MockWriter::addToApplication($application); + + $exitCode = $application->run(['', 'simple', '--foo=foho', '--bar=bahar']); + + self::assertFileExists(__DIR__ . '/_app_missing_requirement/result.txt'); + self::assertSame('test bahar', file_get_contents(__DIR__ . '/_app_missing_requirement/result.txt')); + + self::assertStringContainsString('echo "foho"', MockWriter::$content); + self::assertEquals(ExitSignal::RESULT_SUCCESS, $exitCode); + } + + public function test_it_throws_exception_InvalidParameterException_and_it_is_catched(): void + { + $application = new Application(__DIR__ . '/_app'); MockWriter::addToApplication($application); $exitCode = $application->run(['', 'simple', '-param']); - $this->assertContains('Unable to parse parameter -param', MockWriter::$content); - $this->assertEquals(Application::RESULT_ERROR, $exitCode); + self::assertStringContainsString('Unable to parse parameter -param', MockWriter::$content); + self::assertEquals(ExitSignal::RESULT_ERROR, $exitCode); } - private function assertNoErrorExitCode(int $exitCode) + private function assertNoErrorExitCode(int $exitCode): void { - $this->assertEquals(0, $exitCode, 'Application errored unexpextedly: ' . MockWriter::$content); + self::assertEquals(0, $exitCode, 'Application errored unexpextedly: ' . MockWriter::$content); } - private function assertSimpleScript(int $exitCode, string $envName) + private function assertSimpleScript(int $exitCode, string $envName): void { $this->assertNoErrorExitCode($exitCode); - $this->assertContains('ls -al', MockWriter::$content); - $this->assertContains('Using .psh.xml', MockWriter::$content); - $this->assertContains('(1/4) Starting', MockWriter::$content); - $this->assertContains('(2/4) Starting', MockWriter::$content); - $this->assertContains('(3/4) Starting', MockWriter::$content); - $this->assertContains('(4/4) Deferring', MockWriter::$content); - $this->assertContains('WAITING...', MockWriter::$content); - $this->assertContains('(1/1) Output from', MockWriter::$content); - $this->assertContains(' echo "' . $envName . '"', MockWriter::$content); - $this->assertContains('All commands successfully executed!', MockWriter::$content); - $this->assertContains('Duration:', MockWriter::$content); + self::assertStringContainsString('ls -al', MockWriter::$content); + self::assertStringContainsString('Using .psh.xml', MockWriter::$content); + self::assertStringContainsString('Importing glob/.psh.xml extended by glob/.psh.xml.override from "gl*b"', MockWriter::$content); + self::assertStringContainsString('NOTICE: No import found for path "foo/"', MockWriter::$content); + self::assertStringContainsString('(1/4) Starting', MockWriter::$content); + self::assertStringContainsString('(2/4) Starting', MockWriter::$content); + self::assertStringContainsString('(3/4) Starting', MockWriter::$content); + self::assertStringContainsString('(4/4) Deferring', MockWriter::$content); + self::assertStringContainsString('WAITING...', MockWriter::$content); + self::assertStringContainsString('(1/1) Output from', MockWriter::$content); + self::assertStringContainsString(' echo "' . $envName . '"', MockWriter::$content); + self::assertStringContainsString('All commands successfully executed!', MockWriter::$content); + self::assertStringContainsString('Duration:', MockWriter::$content); self::assertStringEqualsFile(__DIR__ . '/_app/result.txt', $envName); } diff --git a/tests/Acceptance/MinApplicationTest.php b/tests/Acceptance/MinApplicationTest.php index 7cb7de7..3882569 100644 --- a/tests/Acceptance/MinApplicationTest.php +++ b/tests/Acceptance/MinApplicationTest.php @@ -1,19 +1,20 @@ run([]); - $this->assertNotFalse(strpos(MockWriter::$content, '1 script(s) available')); + self::assertNotFalse(mb_strpos(MockWriter::$content, '1 script(s) available')); } } diff --git a/tests/Acceptance/MockWriter.php b/tests/Acceptance/MockWriter.php index 4b1274c..eecd512 100644 --- a/tests/Acceptance/MockWriter.php +++ b/tests/Acceptance/MockWriter.php @@ -12,14 +12,13 @@ class MockWriter implements WriterInterface /** * @param string $content - * @return void */ - public function write($content) + public function write($content): void { self::$content .= $content; } - public static function addToApplication(Application $application) + public static function addToApplication(Application $application): void { self::$content = ''; @@ -29,7 +28,7 @@ public static function addToApplication(Application $application) $application->cliMate->output->defaultTo('out'); } - public static function addToClimateLogger(ClimateLogger $climateLogger) + public static function addToClimateLogger(ClimateLogger $climateLogger): void { self::$content = ''; diff --git a/tests/Acceptance/_app/.psh.xml b/tests/Acceptance/_app/.psh.xml index 2ca2a18..07c772c 100644 --- a/tests/Acceptance/_app/.psh.xml +++ b/tests/Acceptance/_app/.psh.xml @@ -4,6 +4,8 @@
SHOPWARE PHP-SH