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 @@
+
+
scripts/
prod
@@ -11,6 +13,9 @@
id
ls -ahl
.env
+
+
+
envpath/
diff --git a/tests/Acceptance/_app/glib b/tests/Acceptance/_app/glib
new file mode 100644
index 0000000..18887ad
--- /dev/null
+++ b/tests/Acceptance/_app/glib
@@ -0,0 +1 @@
+test it is ignored as an import
\ No newline at end of file
diff --git a/tests/Acceptance/_app/glob/.psh.xml b/tests/Acceptance/_app/glob/.psh.xml
new file mode 100644
index 0000000..4d91de3
--- /dev/null
+++ b/tests/Acceptance/_app/glob/.psh.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/Acceptance/_app/glob/.psh.xml.override b/tests/Acceptance/_app/glob/.psh.xml.override
new file mode 100644
index 0000000..bfade2a
--- /dev/null
+++ b/tests/Acceptance/_app/glob/.psh.xml.override
@@ -0,0 +1,8 @@
+
+
+
+
+ actions/
+
+
\ No newline at end of file
diff --git a/tests/Acceptance/_app/glob/actions/glob.sh b/tests/Acceptance/_app/glob/actions/glob.sh
new file mode 100644
index 0000000..a686e45
--- /dev/null
+++ b/tests/Acceptance/_app/glob/actions/glob.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+echo "glob"
\ No newline at end of file
diff --git a/tests/Acceptance/_app_missing_requirement/.psh.xml b/tests/Acceptance/_app_missing_requirement/.psh.xml
new file mode 100644
index 0000000..ddf27db
--- /dev/null
+++ b/tests/Acceptance/_app_missing_requirement/.psh.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+ scripts/
+
diff --git a/tests/Acceptance/_app_missing_requirement/scripts/simple.sh b/tests/Acceptance/_app_missing_requirement/scripts/simple.sh
new file mode 100644
index 0000000..1c9aa61
--- /dev/null
+++ b/tests/Acceptance/_app_missing_requirement/scripts/simple.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+echo "__FOO__"
\ No newline at end of file
diff --git a/tests/Acceptance/_app_missing_requirement/templates/test.tpl b/tests/Acceptance/_app_missing_requirement/templates/test.tpl
new file mode 100644
index 0000000..4761c29
--- /dev/null
+++ b/tests/Acceptance/_app_missing_requirement/templates/test.tpl
@@ -0,0 +1 @@
+test __BAR__
\ No newline at end of file
diff --git a/tests/Acceptance/_override_app/.psh.xml b/tests/Acceptance/_override_app/.psh.xml
index 63696d5..d9c32f7 100644
--- a/tests/Acceptance/_override_app/.psh.xml
+++ b/tests/Acceptance/_override_app/.psh.xml
@@ -1,6 +1,7 @@
+
actions/
\ No newline at end of file
diff --git a/tests/Acceptance/_override_app/foo/.psh.xml b/tests/Acceptance/_override_app/foo/.psh.xml
new file mode 100644
index 0000000..4d91de3
--- /dev/null
+++ b/tests/Acceptance/_override_app/foo/.psh.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/Acceptance/_override_app/foo/actions/glob.sh b/tests/Acceptance/_override_app/foo/actions/glob.sh
new file mode 100644
index 0000000..a686e45
--- /dev/null
+++ b/tests/Acceptance/_override_app/foo/actions/glob.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+echo "glob"
\ No newline at end of file
diff --git a/tests/BlackholeLogger.php b/tests/BlackholeLogger.php
index 9ad51b9..e8e7106 100644
--- a/tests/BlackholeLogger.php
+++ b/tests/BlackholeLogger.php
@@ -9,48 +9,30 @@
class BlackholeLogger implements Logger
{
public $errors = [];
+
public $output = [];
+ public $successes = 0;
+
+ public $failures = 0;
- /**
- * @param Script $script
- */
- public function startScript(Script $script)
+ public function startScript(Script $script): void
{
}
-
- /**
- * @param Script $script
- */
- public function finishScript(Script $script)
+ public function finishScript(Script $script): void
{
}
- /**
- * @return void
- */
- public function logWait()
+ public function logWait(): void
{
}
- /**
- * @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
{
}
- /**
- * @param LogMessage $logMessage
- * @return mixed
- */
- public function log(LogMessage $logMessage)
+ public function log(LogMessage $logMessage): void
{
if ($logMessage->isError()) {
$this->errors[] = $logMessage->getMessage();
@@ -59,19 +41,17 @@ public function log(LogMessage $logMessage)
}
}
- public function logSuccess()
+ public function logSuccess(): void
{
+ $this->successes++;
}
- public function logFailure()
+ public function logFailure(): void
{
+ $this->failures++;
}
- /**
- * @param string $message
- * @return mixed
- */
- public function warn(string $message)
+ public function warn(string $message): void
{
// TODO: Implement warn() method.
}
diff --git a/tests/Integration/Config/ConfigFileFinderTest.php b/tests/Integration/Config/ConfigFileFinderTest.php
index 8fe8eff..2330121 100644
--- a/tests/Integration/Config/ConfigFileFinderTest.php
+++ b/tests/Integration/Config/ConfigFileFinderTest.php
@@ -1,77 +1,90 @@
expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$loader->discoverFiles(sys_get_temp_dir());
}
- public function test_config_loader_returns_file_if_found()
+ public function test_config_loader_returns_file_if_found(): void
{
$loader = new ConfigFileFinder();
$file = $loader->discoverFiles(__DIR__ . '/_configFileFinderFixtures/dist/sub/sub2/sub3');
- $this->assertEquals([__DIR__ . '/_configFileFinderFixtures/dist/.psh.xml'], $file);
+ self::assertEquals([__DIR__ . '/_configFileFinderFixtures/dist/.psh.xml'], $file);
}
- public function test_config_loader_returns_file_in_same_directory_if_found()
+ public function test_config_loader_returns_file_in_same_directory_if_found(): void
{
$loader = new ConfigFileFinder();
$file = $loader->discoverFiles(__DIR__ . '/_configFileFinderFixtures/dist');
- $this->assertEquals([__DIR__ . '/_configFileFinderFixtures/dist/.psh.xml'], $file);
+ self::assertEquals([__DIR__ . '/_configFileFinderFixtures/dist/.psh.xml'], $file);
}
- public function test_config_loader_prefers_original_over_dist_file()
+ public function test_config_loader_prefers_original_over_dist_file(): void
{
$loader = new ConfigFileFinder();
$file = $loader->discoverFiles(__DIR__ . '/_configFileFinderFixtures/dist');
- $this->assertEquals([__DIR__ . '/_configFileFinderFixtures/dist/.psh.xml'], $file);
+ self::assertEquals([__DIR__ . '/_configFileFinderFixtures/dist/.psh.xml'], $file);
}
- public function test_config_loader_returns_override_file()
+ public function test_config_loader_returns_override_file(): void
{
$loader = new ConfigFileFinder();
$files = $loader->discoverFiles(__DIR__ . '/_configFileFinderFixtures/override');
- $this->assertEquals([
+ self::assertEquals([
__DIR__ . '/_configFileFinderFixtures/override/.psh.xml',
- __DIR__ . '/_configFileFinderFixtures/override/.psh.xml.override'
+ __DIR__ . '/_configFileFinderFixtures/override/.psh.xml.override',
], $files);
}
- public function test_config_loader_returns_dist_and_override_file()
+ public function test_config_loader_returns_dist_and_override_file(): void
{
$loader = new ConfigFileFinder();
$files = $loader->discoverFiles(__DIR__ . '/_configFileFinderFixtures/override_and_dist');
- $this->assertEquals([
- __DIR__ .'/_configFileFinderFixtures/override_and_dist/.psh.xml.dist',
- __DIR__ .'/_configFileFinderFixtures/override_and_dist/.psh.xml.override',
+ self::assertEquals([
+ __DIR__ . '/_configFileFinderFixtures/override_and_dist/.psh.xml.dist',
+ __DIR__ . '/_configFileFinderFixtures/override_and_dist/.psh.xml.override',
], $files);
}
- public function test_config_loader_returns_dist_xml_and_override_yaml_file()
+ public function test_config_loader_returns_dist_xml_and_override_yaml_file(): void
{
$loader = new ConfigFileFinder();
$files = $loader->discoverFiles(__DIR__ . '/_configFileFinderFixtures/override_yml_and_dist_xml');
- $this->assertEquals([
- __DIR__ .'/_configFileFinderFixtures/override_yml_and_dist_xml/.psh.xml.dist',
- __DIR__ .'/_configFileFinderFixtures/override_yml_and_dist_xml/.psh.yaml.override',
+ self::assertEquals([
+ __DIR__ . '/_configFileFinderFixtures/override_yml_and_dist_xml/.psh.xml.dist',
+ __DIR__ . '/_configFileFinderFixtures/override_yml_and_dist_xml/.psh.yaml.override',
], $files);
}
+
+ public function test_discover_config_in_directory_does_not_recurse(): void
+ {
+ $loader = new ConfigFileFinder();
+
+ $file = $loader->discoverConfigInDirectory(__DIR__ . '/_configFileFinderFixtures/dist/sub/sub2/sub3');
+ self::assertEquals([], $file);
+
+ $file = $loader->discoverConfigInDirectory(__DIR__ . '/_configFileFinderFixtures/dist');
+ self::assertEquals([__DIR__ . '/_configFileFinderFixtures/dist/.psh.xml'], $file);
+ }
}
diff --git a/tests/Integration/Listing/ScriptFinderTest.php b/tests/Integration/Listing/ScriptFinderTest.php
index a930b82..f84678a 100644
--- a/tests/Integration/Listing/ScriptFinderTest.php
+++ b/tests/Integration/Listing/ScriptFinderTest.php
@@ -1,35 +1,35 @@
assertInstanceOf(ScriptFinder::class, $finder);
- $this->assertInternalType('array', $finder->getAllScripts());
+ self::assertInstanceOf(ScriptFinder::class, $finder);
+ self::assertIsArray($finder->getAllScripts());
}
- public function test_script_finder_finds_scripts_if_one_directory_is_passed()
+ public function test_script_finder_finds_scripts_if_one_directory_is_passed(): void
{
$finder = new ScriptFinder(
[$this->createScriptsPath(__DIR__ . '/_scripts')],
new DescriptionReader()
);
- $this->assertInstanceOf(ScriptFinder::class, $finder);
- $this->assertCount(4, $finder->getAllScripts());
+ self::assertInstanceOf(ScriptFinder::class, $finder);
+ self::assertCount(4, $finder->getAllScripts());
}
- public function test_script_finder_finds_scripts_if_two_directories_are_passed_and_filters_noise()
+ public function test_script_finder_finds_scripts_if_two_directories_are_passed_and_filters_noise(): void
{
$finder = new ScriptFinder(
[$this->createScriptsPath(__DIR__ . '/_scripts'), $this->createScriptsPath(__DIR__ . '/_scripts_with_misc_stuff')],
@@ -37,52 +37,52 @@ public function test_script_finder_finds_scripts_if_two_directories_are_passed_a
);
$scripts = $finder->getAllScripts();
- $this->assertInstanceOf(ScriptFinder::class, $finder);
- $this->assertCount(6, $scripts);
- $this->assertContainsOnlyInstancesOf(Script::class, $finder->getAllScripts());
+ self::assertInstanceOf(ScriptFinder::class, $finder);
+ self::assertCount(6, $scripts);
+ self::assertContainsOnlyInstancesOf(Script::class, $finder->getAllScripts());
- $this->assertFalse($scripts['test']->isHidden());
- $this->assertTrue($scripts['.hidden']->isHidden());
+ self::assertFalse($scripts['test']->isHidden());
+ self::assertTrue($scripts['.hidden']->isHidden());
}
- public function test_script_finder_finds_script_by_name_if_two_directories_are_passed_and_filters_noise()
+ public function test_script_finder_finds_script_by_name_if_two_directories_are_passed_and_filters_noise(): void
{
$finder = new ScriptFinder(
[$this->createScriptsPath(__DIR__ . '/_scripts'), $this->createScriptsPath(__DIR__ . '/_scripts_with_misc_stuff')],
new DescriptionReader()
);
- $this->assertInstanceOf(ScriptFinder::class, $finder);
+ self::assertInstanceOf(ScriptFinder::class, $finder);
$script = $finder->findScriptByName('foo');
- $this->assertInstanceOf(Script::class, $script);
- $this->assertEquals('foo', $script->getName());
+ self::assertInstanceOf(Script::class, $script);
+ self::assertEquals('foo', $script->getName());
}
- public function test_script_finder_prefixes_script_names_with_namespace_if_present()
+ public function test_script_finder_prefixes_script_names_with_namespace_if_present(): void
{
$finder = new ScriptFinder(
[$this->createScriptsPath(__DIR__ . '/_scripts'), $this->createScriptsPath(__DIR__ . '/_scripts_with_misc_stuff', 'biz')],
new DescriptionReader()
);
- $this->assertInstanceOf(ScriptFinder::class, $finder);
+ self::assertInstanceOf(ScriptFinder::class, $finder);
$script = $finder->findScriptByName('biz:test');
- $this->assertInstanceOf(Script::class, $script);
- $this->assertEquals('biz:test', $script->getName());
+ self::assertInstanceOf(Script::class, $script);
+ self::assertEquals('biz:test', $script->getName());
}
- public function test_script_finder_throws_exception_if_path_is_not_valid()
+ public function test_script_finder_throws_exception_if_path_is_not_valid(): void
{
$finder = new ScriptFinder(
[$this->createScriptsPath(__DIR__ . '/_scripts_not_valid_directory')],
new DescriptionReader()
);
-
+
$this->expectException(ScriptPathNotValidException::class);
$finder->getAllScripts();
}
- public function test_script_finder_adds_description_to_script()
+ public function test_script_finder_adds_description_to_script(): void
{
$finder = new ScriptFinder(
[$this->createScriptsPath(__DIR__ . '/_scripts')],
@@ -90,22 +90,22 @@ public function test_script_finder_adds_description_to_script()
);
$script = $finder->findScriptByName('description');
- $this->assertSame('My description', $script->getDescription());
+ self::assertSame('My description', $script->getDescription());
}
- public function test_script_finder_finds_partial_name()
+ public function test_script_finder_finds_partial_name(): void
{
$finder = new ScriptFinder(
[$this->createScriptsPath(__DIR__ . '/_scripts'), $this->createScriptsPath(__DIR__ . '/_scripts_with_misc_stuff')],
new DescriptionReader()
);
- $this->assertInstanceOf(ScriptFinder::class, $finder);
- $this->assertCount(2, $finder->findScriptsByPartialName('test'));
- $this->assertContainsOnlyInstancesOf(Script::class, $finder->getAllScripts());
+ self::assertInstanceOf(ScriptFinder::class, $finder);
+ self::assertCount(2, $finder->findScriptsByPartialName('test'));
+ self::assertContainsOnlyInstancesOf(Script::class, $finder->getAllScripts());
}
- private function createScriptsPath(string $path, string $namespace = null): ScriptsPath
+ private function createScriptsPath(string $path, ?string $namespace = null): ScriptsPath
{
return new ScriptsPath($path, false, $namespace);
}
diff --git a/tests/Integration/ScriptRuntime/ProcessExecutorTest.php b/tests/Integration/ScriptRuntime/ProcessExecutorTest.php
index 1f36f2a..3de8b5b 100644
--- a/tests/Integration/ScriptRuntime/ProcessExecutorTest.php
+++ b/tests/Integration/ScriptRuntime/ProcessExecutorTest.php
@@ -2,10 +2,15 @@
namespace Shopware\Psh\Test\Unit\Integration\ScriptRuntime;
+use InvalidArgumentException;
+use PHPUnit\Framework\TestCase;
+use RuntimeException;
+use Shopware\Psh\Config\EnvironmentResolver;
use Shopware\Psh\Listing\DescriptionReader;
use Shopware\Psh\Listing\Script;
-use Shopware\Psh\ScriptRuntime\BashCommand;
use Shopware\Psh\Listing\ScriptFinder;
+use Shopware\Psh\ScriptRuntime\BashCommand;
+use Shopware\Psh\ScriptRuntime\Command;
use Shopware\Psh\ScriptRuntime\DeferredProcessCommand;
use Shopware\Psh\ScriptRuntime\Execution\ExecutionErrorException;
use Shopware\Psh\ScriptRuntime\Execution\ProcessEnvironment;
@@ -17,8 +22,16 @@
use Shopware\Psh\ScriptRuntime\ScriptLoader\ScriptLoader;
use Shopware\Psh\ScriptRuntime\WaitCommand;
use Shopware\Psh\Test\BlackholeLogger;
-
-class ProcessExecutorTest extends \PHPUnit_Framework_TestCase
+use function chmod;
+use function count;
+use function file_get_contents;
+use function implode;
+use function json_decode;
+use function microtime;
+use function trim;
+use function unlink;
+
+class ProcessExecutorTest extends TestCase
{
const DEFERED_FILES = [
__DIR__ . '/1.json',
@@ -27,14 +40,14 @@ class ProcessExecutorTest extends \PHPUnit_Framework_TestCase
__DIR__ . '/4.json',
];
- protected function tearDown()
+ protected function tearDown(): void
{
foreach (self::DEFERED_FILES as $file) {
@unlink($file);
}
}
- public function test_environment_and_export_work()
+ public function test_environment_and_export_work(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'environment.sh');
$commands = $this->loadCommands($script);
@@ -49,11 +62,11 @@ public function test_environment_and_export_work()
$executor->execute($script, $commands);
- $this->assertEmpty($logger->errors, count($logger->errors) . ' stderr: ' . implode("\n", $logger->errors));
- $this->assertEquals('', trim($logger->output[0]), count($logger->output) . ' stdout: ' . implode("\n", $logger->output));
+ self::assertEmpty($logger->errors, count($logger->errors) . ' stderr: ' . implode("\n", $logger->errors));
+ self::assertEquals('', trim($logger->output[0]), count($logger->output) . ' stdout: ' . implode("\n", $logger->output));
}
- public function test_root_dir_is_application_directory()
+ public function test_root_dir_is_application_directory(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'root-dir.sh');
$commands = $this->loadCommands($script);
@@ -68,24 +81,23 @@ public function test_root_dir_is_application_directory()
$executor->execute($script, $commands);
- $this->assertEmpty($logger->errors, count($logger->errors) . ' stderr: ' . implode("\n", $logger->errors));
- $this->assertEquals(__DIR__, trim($logger->output[0]), count($logger->output) . ' stdout: ' . implode("\n", $logger->output));
+ self::assertEmpty($logger->errors, count($logger->errors) . ' stderr: ' . implode("\n", $logger->errors));
+ self::assertEquals(__DIR__, trim($logger->output[0]), count($logger->output) . ' stdout: ' . implode("\n", $logger->output));
}
- public function test_template_engine_works_with_template_destinations()
+ public function test_template_engine_works_with_template_destinations(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'root-dir.sh');
$commands = $this->loadCommands($script);
$logger = new BlackholeLogger();
$executor = new ProcessExecutor(
- new ProcessEnvironment([
+ new ProcessEnvironment((new EnvironmentResolver())->resolveConstants([
'VAR' => 'value',
- ], [], [ [
+ ]), [], (new EnvironmentResolver())->resolveTemplates([[
'source' => __DIR__ . '/_test_read.tpl',
- 'destination' => __DIR__ . '/_test__VAR__.tpl'
- ]
- ], []),
+ 'destination' => __DIR__ . '/_test__VAR__.tpl',
+ ]]), []),
$this->createTemplateEngine(),
$logger,
__DIR__
@@ -93,10 +105,10 @@ public function test_template_engine_works_with_template_destinations()
$executor->execute($script, $commands);
- $this->assertFileExists(__DIR__ . '/_testvalue.tpl');
+ self::assertFileExists(__DIR__ . '/_testvalue.tpl');
}
- public function test_executor_recognises_template_commands()
+ public function test_executor_recognises_template_commands(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'template.sh');
$commands = $this->loadCommands($script);
@@ -111,35 +123,35 @@ public function test_executor_recognises_template_commands()
$executor->execute($script, $commands);
- $this->assertFileExists(__DIR__ . '/_testvalue.tpl');
+ self::assertFileExists(__DIR__ . '/_testvalue.tpl');
}
- public function test_non_executable_bash_commands_throw()
+ public function test_non_executable_bash_commands_throw(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'bash-non-executable.sh');
- $this->expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$this->loadCommands($script);
}
- public function test_non_writable_bash_commands_throw()
+ public function test_non_writable_bash_commands_throw(): void
{
chmod(__DIR__ . '/_non_writable', 0555);
$script = $this->createScript(__DIR__ . '/_non_writable', 'bash.sh');
- $this->expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$this->loadCommands($script);
}
- public function test_executor_recognises_bash_commands()
+ public function test_executor_recognises_bash_commands(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'bash.sh');
$commands = $this->loadCommands($script);
$logger = new BlackholeLogger();
- $this->assertCount(1, $commands);
- $this->assertInstanceOf(BashCommand::class, $commands[0]);
- $this->assertTrue($commands[0]->hasWarning());
+ self::assertCount(1, $commands);
+ self::assertInstanceOf(BashCommand::class, $commands[0]);
+ self::assertTrue($commands[0]->hasWarning());
$executor = new ProcessExecutor(
$this->createProcessEnvironment(),
@@ -149,20 +161,20 @@ public function test_executor_recognises_bash_commands()
);
$executor->execute($script, $commands);
- $this->assertFileNotExists($script->getTmpPath());
+ self::assertFileNotExists($script->getTmpPath());
- $this->assertStringEndsWith('/psh/tests/Integration/ScriptRuntimeBAR', trim(implode('', $logger->output)));
+ self::assertStringEndsWith('/psh/tests/Integration/ScriptRuntimeBAR', trim(implode('', $logger->output)));
}
- public function test_executor_recognises_secure_bash_commands()
+ public function test_executor_recognises_secure_bash_commands(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'better_bash.sh');
$commands = $this->loadCommands($script);
$logger = new BlackholeLogger();
- $this->assertCount(1, $commands);
- $this->assertInstanceOf(BashCommand::class, $commands[0]);
- $this->assertFalse($commands[0]->hasWarning());
+ self::assertCount(1, $commands);
+ self::assertInstanceOf(BashCommand::class, $commands[0]);
+ self::assertFalse($commands[0]->hasWarning());
$executor = new ProcessExecutor(
$this->createProcessEnvironment(),
@@ -172,20 +184,20 @@ public function test_executor_recognises_secure_bash_commands()
);
$executor->execute($script, $commands);
- $this->assertFileNotExists($script->getTmpPath());
+ self::assertFileNotExists($script->getTmpPath());
- $this->assertCount(1, $logger->output);
- $this->assertStringEndsWith('/psh/tests/Integration/ScriptRuntimeBAR', trim(implode('', $logger->output)));
+ self::assertCount(1, $logger->output);
+ self::assertStringEndsWith('/psh/tests/Integration/ScriptRuntimeBAR', trim(implode('', $logger->output)));
}
- public function test_executor_recognises_defered_commands()
+ public function test_executor_recognises_defered_commands(): void
{
$script = $this->createScript(__DIR__ . '/_scripts', 'deferred.sh');
$commands = $this->loadCommands($script);
- $this->assertCount(5, $commands);
- $this->assertInstanceOf(WaitCommand::class, $commands[2]);
- $this->assertInstanceOf(DeferredProcessCommand::class, $commands[0]);
+ self::assertCount(5, $commands);
+ self::assertInstanceOf(WaitCommand::class, $commands[2]);
+ self::assertInstanceOf(DeferredProcessCommand::class, $commands[0]);
$logger = new BlackholeLogger();
@@ -202,29 +214,22 @@ public function test_executor_recognises_defered_commands()
// check a wait occurred
$totalWait = 0;
foreach (self::DEFERED_FILES as $file) {
- $this->assertFileExists($file);
-
- $data = json_decode(file_get_contents($file), true);
-
- $currentWait = $data['after'] - $data['before'];
- $totalWait += $currentWait;
-
- $this->assertGreaterThan(0.0001, $currentWait);
+ $totalWait = $this->assertDeferredFile($file, $totalWait);
}
//assert total duration was less then total wait -> Then it just becomes a problem of more processes on travis if necessary
- $this->assertLessThan($executionTime * 0.75, $totalWait);
- $this->assertCount(0, $logger->errors);
- $this->assertEquals(["Done\n", "Done\n", "Done\n", "Done\n"], $logger->output);
+ self::assertLessThan($executionTime * 0.75, $totalWait);
+ self::assertCount(0, $logger->errors);
+ self::assertEquals(["Done\n", "Done\n", "Done\n", "Done\n"], $logger->output);
}
- public function test_deferred_commands_get_executed_even_with_error_in_between()
+ public function test_deferred_commands_get_executed_even_with_sync_error_in_between(): void
{
- $script = $this->createScript(__DIR__ . '/_scripts', 'deferred_with_error.sh');
+ $script = $this->createScript(__DIR__ . '/_scripts', 'deferred_with_sync_error.sh');
$commands = $this->loadCommands($script);
- $this->assertCount(4, $commands);
- $this->assertInstanceOf(DeferredProcessCommand::class, $commands[0]);
+ self::assertCount(4, $commands);
+ self::assertInstanceOf(DeferredProcessCommand::class, $commands[0]);
$logger = new BlackholeLogger();
@@ -247,55 +252,100 @@ public function test_deferred_commands_get_executed_even_with_error_in_between()
// check a wait occurred
$totalWait = 0;
foreach ([self::DEFERED_FILES[0], self::DEFERED_FILES[1]] as $file) {
- $this->assertFileExists($file);
+ $totalWait = $this->assertDeferredFile($file, $totalWait);
+ }
+
+ //assert total duration was less then total wait -> Then it just becomes a problem of more processes on travis if necessary
+ self::assertLessThan($executionTime, $totalWait);
+ self::assertCount(0, $logger->errors);
+ self::assertEquals(["Done\n", "Done\n"], $logger->output);
+ }
+
+ public function test_deferred_commands_get_executed_even_with_deferred_error_in_between(): void
+ {
+ $script = $this->createScript(__DIR__ . '/_scripts', 'deferred_with_deferred_error.sh');
+ $commands = $this->loadCommands($script);
+
+ self::assertCount(4, $commands);
+ self::assertInstanceOf(DeferredProcessCommand::class, $commands[0]);
- $data = json_decode(file_get_contents($file), true);
+ $logger = new BlackholeLogger();
+
+ $executor = new ProcessExecutor(
+ $this->createProcessEnvironment(),
+ $this->createTemplateEngine(),
+ $logger,
+ __DIR__
+ );
- $currentWait = $data['after'] - $data['before'];
- $totalWait += $currentWait;
+ $beginExecution = microtime(true);
- $this->assertGreaterThan(0.0001, $currentWait);
+ try {
+ $executor->execute($script, $commands);
+ } catch (ExecutionErrorException $e) {
}
+ $executionTime = microtime(true) - $beginExecution;
+ self::assertInstanceOf(ExecutionErrorException::class, $e);
+
+ // check a wait occurred
+ $totalWait = 0;
+ $totalWait = $this->assertDeferredFile(self::DEFERED_FILES[0], $totalWait);
+ self::assertFileNotExists(self::DEFERED_FILES[1]);
+ self::assertFileNotExists(self::DEFERED_FILES[2]);
//assert total duration was less then total wait -> Then it just becomes a problem of more processes on travis if necessary
- $this->assertLessThan($executionTime, $totalWait);
- $this->assertCount(0, $logger->errors);
- $this->assertEquals(["Done\n", "Done\n"], $logger->output);
+ self::assertLessThan($executionTime, $totalWait);
+ self::assertCount(0, $logger->errors);
+ self::assertSame(2, $logger->failures);
+ self::assertSame(2, $logger->successes);
+ self::assertEquals(["Done\n", "Done\n"], $logger->output);
+ }
+
+ public function test_unkbownh_command_throws(): void
+ {
+ $script = $this->createScript(__DIR__ . '/_scripts', 'deferred_with_deferred_error.sh');
+ $commands = [new class() implements Command {
+ public function getLineNumber(): int
+ {
+ return PHP_INT_MAX;
+ }
+ }];
+
+ $executor = new ProcessExecutor(
+ $this->createProcessEnvironment(),
+ $this->createTemplateEngine(),
+ new BlackholeLogger(),
+ __DIR__
+ );
+
+ $this->expectException(InvalidArgumentException::class);
+ $executor->execute($script, $commands);
}
/**
* @before
* @after
*/
- public function removeState()
+ public function removeState(): void
{
@unlink(__DIR__ . '/_testvalue.tpl');
}
- /**
- * @param Script $script
- * @return mixed
- */
- private function loadCommands(Script $script)
+ private function loadCommands(Script $script): array
{
$loader = new ScriptLoader(
new BashScriptParser(),
new PshScriptParser(new CommandBuilder(), new ScriptFinder([], new DescriptionReader()))
);
+
return $loader->loadScript($script);
}
- /**
- * @return ProcessEnvironment
- */
private function createProcessEnvironment(): ProcessEnvironment
{
return new ProcessEnvironment([], [], [], []);
}
- /**
- * @return TemplateEngine
- */
private function createTemplateEngine(): TemplateEngine
{
return new TemplateEngine();
@@ -305,4 +355,18 @@ private function createScript(string $directory, string $scriptName): Script
{
return new Script($directory, $scriptName, false);
}
+
+ private function assertDeferredFile(string $file, float $totalWait): float
+ {
+ self::assertFileExists($file);
+
+ $data = json_decode(file_get_contents($file), true);
+
+ $currentWait = $data['after'] - $data['before'];
+ $totalWait += $currentWait;
+
+ self::assertGreaterThan(0.0001, $currentWait);
+
+ return $totalWait;
+ }
}
diff --git a/tests/Integration/ScriptRuntime/TemplateTest.php b/tests/Integration/ScriptRuntime/TemplateTest.php
index 6306e24..49be518 100644
--- a/tests/Integration/ScriptRuntime/TemplateTest.php
+++ b/tests/Integration/ScriptRuntime/TemplateTest.php
@@ -1,40 +1,41 @@
expectException(TemplateNotValidException::class);
$template->getContent();
}
- public function test_it_reads_a_files_content()
+ public function test_it_reads_a_files_content(): void
{
$template = new Template(__DIR__ . '/_test_read.tpl', '**');
- $this->assertEquals('foo::bar::baz', $template->getContent());
+ self::assertEquals('foo::bar::baz', $template->getContent());
}
- public function test_it_dumps_the_contents_then()
+ public function test_it_dumps_the_contents_then(): void
{
$template = new Template(__DIR__ . '/_test_write.tpl', __DIR__ . '/_test_write.tpl');
$template->setContents('test');
- $this->assertEquals('test', $template->getContent());
+ self::assertEquals('test', $template->getContent());
}
/**
* @before
* @after
*/
- public function removeState()
+ public function removeState(): void
{
@unlink(__DIR__ . '/_test_write.tpl');
}
diff --git a/tests/Integration/ScriptRuntime/_scripts/deferred_with_deferred_error.sh b/tests/Integration/ScriptRuntime/_scripts/deferred_with_deferred_error.sh
new file mode 100644
index 0000000..a4acfac
--- /dev/null
+++ b/tests/Integration/ScriptRuntime/_scripts/deferred_with_deferred_error.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+D: php -r "\$before = microtime(true); usleep(100); file_put_contents(__DIR__(sic!) . '/1.json', json_encode(['before' => \$before, 'after' => microtime(true)]));" && echo Done
+D: php -r "exit(1);"
+
+WAIT:
+
+D: php -r "\$before = microtime(true); usleep(100); file_put_contents(__DIR__(sic!) . '/4.json', json_encode(['before' => \$before, 'after' => microtime(true)]));" && echo Done
\ No newline at end of file
diff --git a/tests/Integration/ScriptRuntime/_scripts/deferred_with_error.sh b/tests/Integration/ScriptRuntime/_scripts/deferred_with_sync_error.sh
similarity index 100%
rename from tests/Integration/ScriptRuntime/_scripts/deferred_with_error.sh
rename to tests/Integration/ScriptRuntime/_scripts/deferred_with_sync_error.sh
diff --git a/tests/Unit/Application/ApplicationFactoryTest.php b/tests/Unit/Application/ApplicationFactoryTest.php
index 7118c30..c36af6f 100644
--- a/tests/Unit/Application/ApplicationFactoryTest.php
+++ b/tests/Unit/Application/ApplicationFactoryTest.php
@@ -1,14 +1,16 @@
- '--filter aaaa',
];
- $this->assertEquals($expectedResult, $parsedParams);
+ self::assertEquals($expectedResult, $parsedParams);
}
- public function test_createConfig_with_invalid_config_file()
+ public function test_createConfig_with_invalid_config_file(): void
{
$testParams = [
'./psh',
- 'unit'
+ 'unit',
];
$factory = $this->getApplicationFactory();
- $this->expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$factory->createConfig(
+ $this->prophesize(ConfigLogger::class)->reveal(),
__DIR__ . '/_fixtures_with_invalid_config_files/config/.psh.not-supported',
$testParams
);
}
- public function test_reformatParams_expects_exception()
+ public function test_reformatParams_expects_exception(): void
{
$paramParser = new ParameterParser();
- $this->expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$paramParser->parseParams(['./psh', 'unit', 'someFalseParameter']);
}
- public function test_reformatParams_expects_array()
+ public function test_reformatParams_expects_array(): void
{
$paramParser = new ParameterParser();
$testParams = [
@@ -68,7 +71,6 @@ public function test_reformatParams_expects_array()
'--env6="gh""t=tg"',
];
-
$result = $paramParser->parseParams($testParams);
$expectedResult = [
@@ -80,12 +82,9 @@ public function test_reformatParams_expects_array()
'ENV6' => 'gh""t=tg',
];
- $this->assertEquals($expectedResult, $result);
+ self::assertEquals($expectedResult, $result);
}
- /**
- * @return ApplicationFactory
- */
private function getApplicationFactory(): ApplicationFactory
{
return new ApplicationFactory();
diff --git a/tests/Unit/Application/ClimateLoggerTest.php b/tests/Unit/Application/ClimateLoggerTest.php
index 53354c0..01e1d77 100644
--- a/tests/Unit/Application/ClimateLoggerTest.php
+++ b/tests/Unit/Application/ClimateLoggerTest.php
@@ -1,38 +1,39 @@
-logSuccess();
- self::assertContains("Executed Successfully", MockWriter::$content);
+ self::assertStringContainsString('Executed Successfully', MockWriter::$content);
}
- public function test_error_output()
+ public function test_error_output(): void
{
$cliMateLogger = new ClimateLogger(new CLImate(), new Duration());
MockWriter::addToClimateLogger($cliMateLogger);
$cliMateLogger->logFailure();
- self::assertContains("Executed with failure", MockWriter::$content);
+ self::assertStringContainsString('Executed with failure', MockWriter::$content);
}
- public function test_warn_output()
+ public function test_warn_output(): void
{
$cliMateLogger = new ClimateLogger(new CLImate(), new Duration());
MockWriter::addToClimateLogger($cliMateLogger);
$cliMateLogger->warn('FOOOOOOOOOOOOOOOOO');
- self::assertContains("FOOOOOOOOOOOOOOOOO", MockWriter::$content);
+ self::assertStringContainsString('FOOOOOOOOOOOOOOOOO', MockWriter::$content);
}
}
diff --git a/tests/Unit/Config/ConfigFileFinderTest.php b/tests/Unit/Config/ConfigFileFinderTest.php
index 62fbd1e..c6046da 100644
--- a/tests/Unit/Config/ConfigFileFinderTest.php
+++ b/tests/Unit/Config/ConfigFileFinderTest.php
@@ -1,18 +1,18 @@
assertInstanceOf(ConfigFileFinder::class, new ConfigFileFinder());
+ self::assertInstanceOf(ConfigFileFinder::class, new ConfigFileFinder());
}
- public function test_file_discovery_default_case()
+ public function test_file_discovery_default_case(): void
{
$finder = new ConfigFileFinder();
$result = $finder->determineResultInDirectory([
@@ -22,7 +22,7 @@ public function test_file_discovery_default_case()
self::assertEquals([__DIR__ . '/.psh.does-not-matter'], $result);
}
- public function test_file_discovery_with_dist_file_only()
+ public function test_file_discovery_with_dist_file_only(): void
{
$finder = new ConfigFileFinder();
$result = $finder->determineResultInDirectory([
@@ -32,7 +32,7 @@ public function test_file_discovery_with_dist_file_only()
self::assertEquals([__DIR__ . '/.psh.does-not-matter.dist'], $result);
}
- public function test_file_discovery_with_dist_file_and_default_file()
+ public function test_file_discovery_with_dist_file_and_default_file(): void
{
$finder = new ConfigFileFinder();
$result = $finder->determineResultInDirectory([
@@ -43,7 +43,7 @@ public function test_file_discovery_with_dist_file_and_default_file()
self::assertEquals([__DIR__ . '/.psh.does-not-matter'], $result);
}
- public function test_file_discovery_with_dist_file_and_default_file_and_override_file()
+ public function test_file_discovery_with_dist_file_and_default_file_and_override_file(): void
{
$finder = new ConfigFileFinder();
$result = $finder->determineResultInDirectory([
@@ -58,7 +58,7 @@ public function test_file_discovery_with_dist_file_and_default_file_and_override
], $result);
}
- public function test_file_discovery_with_default_file_and_override_file()
+ public function test_file_discovery_with_default_file_and_override_file(): void
{
$finder = new ConfigFileFinder();
$result = $finder->determineResultInDirectory([
@@ -72,7 +72,7 @@ public function test_file_discovery_with_default_file_and_override_file()
], $result);
}
- public function test_file_discovery_with_dist_file__and_override_file()
+ public function test_file_discovery_with_dist_file__and_override_file(): void
{
$finder = new ConfigFileFinder();
$result = $finder->determineResultInDirectory([
diff --git a/tests/Unit/Config/ConfigMergerTest.php b/tests/Unit/Config/ConfigMergerTest.php
index 8170912..1ab1653 100644
--- a/tests/Unit/Config/ConfigMergerTest.php
+++ b/tests/Unit/Config/ConfigMergerTest.php
@@ -6,268 +6,310 @@
use Shopware\Psh\Config\Config;
use Shopware\Psh\Config\ConfigEnvironment;
use Shopware\Psh\Config\ConfigMerger;
+use Shopware\Psh\Config\EnvironmentResolver;
+use Shopware\Psh\Config\SimpleValueProvider;
class ConfigMergerTest extends TestCase
{
const DEFAULT_ENV = 'env';
- public function test_it_can_be_created()
+ public function test_it_can_be_created(): void
{
- $this->assertInstanceOf(ConfigMerger::class, new ConfigMerger());
+ self::assertInstanceOf(ConfigMerger::class, new ConfigMerger());
}
- public function test_it_should_return_config()
+ public function test_it_should_return_config(): void
{
- $config = new Config('my header', '', [], []);
+ $config = new Config(new EnvironmentResolver(), '', [], [], 'my header');
$merger = new ConfigMerger();
- $result = $merger->merge($config);
+ $result = $merger->mergeOverride($config);
- $this->assertInstanceOf(Config::class, $config);
- $this->assertEquals($config, $result);
+ self::assertInstanceOf(Config::class, $config);
+ self::assertEquals($config, $result);
}
- public function test_it_should_override_header()
+ public function test_it_should_override_header(): void
{
- $config = new Config('my header', '', [], []);
- $override = new Config('override', '', [], []);
+ $config = new Config(new EnvironmentResolver(), '', [], [], 'my header');
+ $override = new Config(new EnvironmentResolver(), '', [], [], 'override');
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
- $this->assertInstanceOf(Config::class, $result);
- $this->assertEquals('override', $result->getHeader());
+ self::assertInstanceOf(Config::class, $result);
+ self::assertEquals('override', $result->getHeader());
}
- public function test_it_should_override_default_environment()
+ public function test_it_should_override_default_environment(): void
{
- $config = new Config('', 'default env', [], []);
- $override = new Config('', 'default env override', [], []);
+ $config = new Config(new EnvironmentResolver(), 'default env', [], []);
+ $override = new Config(new EnvironmentResolver(), 'default env override', [], []);
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
- $this->assertInstanceOf(Config::class, $result);
- $this->assertEquals('default env override', $result->getDefaultEnvironment());
+ self::assertInstanceOf(Config::class, $result);
+ self::assertEquals('default env override', $result->getDefaultEnvironment());
}
- public function test_it_should_use_original_config_if_override_is_empty()
+ public function test_it_should_use_original_config_if_override_is_empty(): void
{
- $config = new Config('my header', 'default env', [self::DEFAULT_ENV => new ConfigEnvironment(false)], []);
- $override = new Config('', '', [], []);
+ $config = new Config(new EnvironmentResolver(), 'default env', [self::DEFAULT_ENV => new ConfigEnvironment(false)], [], 'my header');
+ $override = new Config(new EnvironmentResolver(), '', [], [], '');
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
- $this->assertEquals('my header', $result->getHeader());
- $this->assertEquals('default env', $result->getDefaultEnvironment());
- $this->assertEquals([self::DEFAULT_ENV => new ConfigEnvironment(false)], $result->getEnvironments());
+ self::assertEquals('my header', $result->getHeader());
+ self::assertEquals('default env', $result->getDefaultEnvironment());
+ self::assertEquals([self::DEFAULT_ENV => new ConfigEnvironment(false)], $result->getEnvironments());
}
- public function test_it_should_add_environment_from_override()
+ public function test_it_should_add_environment_from_override(): void
{
$envs = [self::DEFAULT_ENV => new ConfigEnvironment(false, ['actions'], [], ['foo' => 'bar'])];
$newEnv = ['newEnv' => new ConfigEnvironment(false, ['actions'])];
- $config = new Config('', self::DEFAULT_ENV, $envs, []);
- $override = new Config('', '', $newEnv, []);
+ $config = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $envs, []);
+ $override = new Config(new EnvironmentResolver(), '', $newEnv, []);
$merger = new ConfigMerger();
- $mergedConfig = $merger->merge($config, $override);
+ $mergedConfig = $merger->mergeOverride($config, $override);
- $this->assertInstanceOf(Config::class, $mergedConfig);
+ self::assertInstanceOf(Config::class, $mergedConfig);
- $this->assertArrayHasKey(self::DEFAULT_ENV, $mergedConfig->getEnvironments());
- $this->assertArrayHasKey('newEnv', $mergedConfig->getEnvironments());
- $this->assertEquals(['foo' => 'bar'], $mergedConfig->getConstants());
+ self::assertArrayHasKey(self::DEFAULT_ENV, $mergedConfig->getEnvironments());
+ self::assertArrayHasKey('newEnv', $mergedConfig->getEnvironments());
+ self::assertArrayHasKey('foo', $mergedConfig->getConstants());
+ self::assertContainsOnlyInstancesOf(SimpleValueProvider::class, $mergedConfig->getConstants());
}
- public function test_it_should_use_original_environments()
+ public function test_it_should_use_original_environments(): void
{
$envs = [self::DEFAULT_ENV => new ConfigEnvironment(false, ['actions'])];
- $config = new Config('', '', $envs, []);
- $override = new Config('', '', [], []);
+ $config = new Config(new EnvironmentResolver(), '', $envs, []);
+ $override = new Config(new EnvironmentResolver(), '', [], []);
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
- $this->assertInstanceOf(Config::class, $result);
- $this->assertEquals('actions', $result->getAllScriptsPaths()[0]->getPath());
+ self::assertInstanceOf(Config::class, $result);
+ self::assertEquals('actions', $result->getAllScriptsPaths()[0]->getPath());
}
- public function test_it_should_override_environment_paths()
+ public function test_it_should_override_environment_paths(): void
{
$envs = [self::DEFAULT_ENV => new ConfigEnvironment(false, ['actions'])];
$overrideEnvs = [self::DEFAULT_ENV => new ConfigEnvironment(false, ['override/actions'])];
- $config = new Config('', self::DEFAULT_ENV, $envs, []);
- $override = new Config('', self::DEFAULT_ENV, $overrideEnvs, []);
+ $config = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $envs, []);
+ $override = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $overrideEnvs, []);
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
- $this->assertInstanceOf(Config::class, $result);
- $this->assertEquals('override/actions', $result->getAllScriptsPaths()[0]->getPath());
+ self::assertInstanceOf(Config::class, $result);
+ self::assertEquals('override/actions', $result->getAllScriptsPaths()[0]->getPath());
}
- public function test_it_should_override_environment_dynamic_values()
+ public function test_it_should_override_environment_dynamic_values(): void
{
$envs = [self::DEFAULT_ENV => new ConfigEnvironment(false, [], ['DYNAMIC_VAR' => 'dynamic value'])];
$overrideEnvs = [self::DEFAULT_ENV => new ConfigEnvironment(false, [], ['DYNAMIC_VAR' => 'dynamic value override'])];
- $config = new Config('', self::DEFAULT_ENV, $envs, []);
- $override = new Config('', self::DEFAULT_ENV, $overrideEnvs, []);
+ $config = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $envs, []);
+ $override = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $overrideEnvs, []);
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
- $this->assertEquals([
- 'DYNAMIC_VAR' => 'dynamic value override'
- ], $result->getDynamicVariables(self::DEFAULT_ENV));
+ self::assertArrayHasKey('DYNAMIC_VAR', $result->getDynamicVariables(self::DEFAULT_ENV));
+ self::assertSame('dynamic value override', $result->getDynamicVariables(self::DEFAULT_ENV)['DYNAMIC_VAR']->getCommand());
}
- public function test_it_should_add_dynamic_values()
+ public function test_it_should_add_dynamic_values(): void
{
$envs = [self::DEFAULT_ENV => new ConfigEnvironment(false, [], ['DYNAMIC_VAR' => 'dynamic value', 'DYNAMIC_VAR2' => 'dynamic value 2'])];
$overrideEnvs = [self::DEFAULT_ENV => new ConfigEnvironment(false, [], ['DYNAMIC_VAR' => 'dynamic value override', 'DYNAMIC_OVERRIDE_VAR' => 'dynamic override value'])];
- $config = new Config('', self::DEFAULT_ENV, $envs, []);
- $override = new Config('', self::DEFAULT_ENV, $overrideEnvs, []);
+ $config = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $envs, []);
+ $override = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $overrideEnvs, []);
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
- $this->assertEquals([
- 'DYNAMIC_VAR' => 'dynamic value override',
- 'DYNAMIC_VAR2' => 'dynamic value 2',
- 'DYNAMIC_OVERRIDE_VAR' => 'dynamic override value'
- ], $result->getDynamicVariables(self::DEFAULT_ENV));
+ self::assertCount(3, $result->getDynamicVariables(self::DEFAULT_ENV));
+
+ self::assertArrayHasKey('DYNAMIC_VAR', $result->getDynamicVariables(self::DEFAULT_ENV));
+ self::assertSame('dynamic value override', $result->getDynamicVariables(self::DEFAULT_ENV)['DYNAMIC_VAR']->getCommand());
+
+ self::assertArrayHasKey('DYNAMIC_VAR2', $result->getDynamicVariables(self::DEFAULT_ENV));
+ self::assertSame('dynamic value 2', $result->getDynamicVariables(self::DEFAULT_ENV)['DYNAMIC_VAR2']->getCommand());
+
+ self::assertArrayHasKey('DYNAMIC_OVERRIDE_VAR', $result->getDynamicVariables(self::DEFAULT_ENV));
+ self::assertSame('dynamic override value', $result->getDynamicVariables(self::DEFAULT_ENV)['DYNAMIC_OVERRIDE_VAR']->getCommand());
}
- public function test_it_should_add_and_override_constant_values()
+ public function test_it_should_add_and_override_constant_values(): void
{
$envs = [
self::DEFAULT_ENV => new ConfigEnvironment(false, [], [], [
'CONST' => 'constant value',
- 'ORIGINAL_CONST' => 'original constant value'
- ])
+ 'ORIGINAL_CONST' => 'original constant value',
+ ]),
];
$overrideEnvs = [
self::DEFAULT_ENV => new ConfigEnvironment(false, [], [], [
'CONST' => 'override constant value',
- 'ADDED_CONST' => 'override constant'
- ])
+ 'ADDED_CONST' => 'override constant',
+ ]),
];
- $config = new Config('', self::DEFAULT_ENV, $envs, []);
- $override = new Config('', self::DEFAULT_ENV, $overrideEnvs, []);
+ $config = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $envs, []);
+ $override = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $overrideEnvs, []);
$merger = new ConfigMerger();
- $result = $merger->merge($config, $override);
+ $result = $merger->mergeOverride($config, $override);
+
+ self::assertCount(3, $result->getConstants(self::DEFAULT_ENV));
+
+ self::assertArrayHasKey('CONST', $result->getConstants(self::DEFAULT_ENV));
+ self::assertSame('override constant value', $result->getConstants(self::DEFAULT_ENV)['CONST']->getValue());
- $this->assertEquals([
- 'CONST' => 'override constant value',
- 'ORIGINAL_CONST' => 'original constant value',
- 'ADDED_CONST' => 'override constant'
- ], $result->getConstants(self::DEFAULT_ENV));
+ self::assertArrayHasKey('ORIGINAL_CONST', $result->getConstants(self::DEFAULT_ENV));
+ self::assertSame('original constant value', $result->getConstants(self::DEFAULT_ENV)['ORIGINAL_CONST']->getValue());
+
+ self::assertArrayHasKey('ADDED_CONST', $result->getConstants(self::DEFAULT_ENV));
+ self::assertSame('override constant', $result->getConstants(self::DEFAULT_ENV)['ADDED_CONST']->getValue());
}
- public function test_it_should_override_templates()
+ public function test_it_should_override_templates(): void
{
$envs = [
self::DEFAULT_ENV => new ConfigEnvironment(false, [], [], [], [
- [ 'source' => '/tmp/template.tpl', 'destination' => '/tmp/template.php' ]
- ])
+ ['source' => '/tmp/template.tpl', 'destination' => '/tmp/template.php'],
+ ]),
];
$overrideEnvs = [
self::DEFAULT_ENV => new ConfigEnvironment(false, [], [], [], [
- [ 'source' => '/tmp/override.tpl', 'destination' => '/tmp/override.php' ]
- ])
+ ['source' => '/tmp/override.tpl', 'destination' => '/tmp/override.php'],
+ ]),
];
- $config = new Config('', self::DEFAULT_ENV, $envs, []);
- $overrideConfig = new Config('', self::DEFAULT_ENV, $overrideEnvs, []);
+ $config = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $envs, []);
+ $overrideConfig = new Config(new EnvironmentResolver(), self::DEFAULT_ENV, $overrideEnvs, []);
$merger = new ConfigMerger();
- $result = $merger->merge($config, $overrideConfig);
+ $result = $merger->mergeOverride($config, $overrideConfig);
- $this->assertEquals(
- [ 'source' => '/tmp/override.tpl', 'destination' => '/tmp/override.php' ],
+ self::assertEquals(
+ ['source' => '/tmp/override.tpl', 'destination' => '/tmp/override.php'],
$result->getEnvironments()[self::DEFAULT_ENV]->getTemplates()[0]
);
}
- public function test_dotenv_paths()
+ public function test_dotenv_paths(): void
{
- $configMerge = (new ConfigMerger())->merge(
- new Config('', self::DEFAULT_ENV, [
+ $configMerge = (new ConfigMerger())->mergeOverride(
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
self::DEFAULT_ENV => new ConfigEnvironment(false, [], [], [], [], [
'.a' => 'first/.a',
'.b' => 'first/.b',
- ])
+ ]),
], []),
- new Config('', self::DEFAULT_ENV, [
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
self::DEFAULT_ENV => new ConfigEnvironment(false, [], [], [], [], [
'.a' => 'overwrite/.a',
'.c' => 'overwrite/.c',
- ])
+ ]),
], [])
);
- $this->assertCount(3, $configMerge->getDotenvPaths());
+ self::assertCount(3, $configMerge->getDotenvPaths());
$paths = $configMerge->getDotenvPaths();
- $this->assertEquals('overwrite/.a', $paths['.a']->getPath());
- $this->assertEquals('first/.b', $paths['.b']->getPath());
- $this->assertEquals('overwrite/.c', $paths['.c']->getPath());
+ self::assertEquals('overwrite/.a', $paths['.a']->getPath());
+ self::assertEquals('first/.b', $paths['.b']->getPath());
+ self::assertEquals('overwrite/.c', $paths['.c']->getPath());
+ }
+
+ public function test_hidden_override_with_both_false(): void
+ {
+ $configMerge = (new ConfigMerger())->mergeOverride(
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(false),
+ ], []),
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(false),
+ ], [])
+ );
+
+ self::assertFalse($configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->isHidden());
}
- public function test_hidden_override_with_both_false()
+ public function test_hidden_override_with_hidden_base(): void
{
- $configMerge = (new ConfigMerger())->merge(
- new Config('', self::DEFAULT_ENV, [
- self::DEFAULT_ENV => new ConfigEnvironment(false)
+ $configMerge = (new ConfigMerger())->mergeOverride(
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(true),
], []),
- new Config('', self::DEFAULT_ENV, [
- self::DEFAULT_ENV => new ConfigEnvironment(false)
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(false),
], [])
);
- $this->assertFalse($configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->isHidden());
+ self::assertTrue($configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->isHidden());
}
- public function test_hidden_override_with_hidden_base()
+ public function test_hidden_override_with_hidden_override(): void
{
- $configMerge = (new ConfigMerger())->merge(
- new Config('', self::DEFAULT_ENV, [
- self::DEFAULT_ENV => new ConfigEnvironment(true)
+ $configMerge = (new ConfigMerger())->mergeOverride(
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(false),
], []),
- new Config('', self::DEFAULT_ENV, [
- self::DEFAULT_ENV => new ConfigEnvironment(false)
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(true),
], [])
);
- $this->assertTrue($configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->isHidden());
+ self::assertTrue($configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->isHidden());
+ }
+
+ public function test_merge_override_with_a_single_argument_just_returns_it(): void
+ {
+ $config = new Config(new EnvironmentResolver(), '', [], []);
+
+ $mergedConfig = (new ConfigMerger())->mergeImport($config);
+
+ self::assertSame($config, $mergedConfig);
}
- public function test_hidden_override_with_hidden_override()
+ public function test_merge_import_shows_a_different_behaviour(): void
{
- $configMerge = (new ConfigMerger())->merge(
- new Config('', self::DEFAULT_ENV, [
- self::DEFAULT_ENV => new ConfigEnvironment(false)
+ $configMerge = (new ConfigMerger())->mergeImport(
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(false, ['foo'], [], [], [['source' => 'baz', 'destination' => 'buz']]),
], []),
- new Config('', self::DEFAULT_ENV, [
- self::DEFAULT_ENV => new ConfigEnvironment(true)
+ new Config(new EnvironmentResolver(), self::DEFAULT_ENV, [
+ self::DEFAULT_ENV => new ConfigEnvironment(true, ['bar'], [], [], [['source' => 'biz', 'destination' => 'bez']]),
], [])
);
- $this->assertTrue($configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->isHidden());
+ self::assertSame(
+ ['foo', 'bar'],
+ $configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->getAllScriptsPaths()
+ );
+ self::assertSame(
+ [['source' => 'baz', 'destination' => 'buz'], ['source' => 'biz', 'destination' => 'bez']],
+ $configMerge->getEnvironments()[$configMerge->getDefaultEnvironment()]->getTemplates()
+ );
}
}
diff --git a/tests/Unit/Config/XmlConfigFileLoaderTest.php b/tests/Unit/Config/XmlConfigFileLoaderTest.php
index aeaa36e..d4c7f62 100644
--- a/tests/Unit/Config/XmlConfigFileLoaderTest.php
+++ b/tests/Unit/Config/XmlConfigFileLoaderTest.php
@@ -2,13 +2,21 @@
namespace Shopware\Psh\Test\Unit\Config;
+use InvalidArgumentException;
+use PHPUnit\Framework\TestCase;
use Shopware\Psh\Config\Config;
use Shopware\Psh\Config\ConfigBuilder;
-use Shopware\Psh\Config\ConfigLoader;
+use Shopware\Psh\Config\ConfigFileLoader;
use Shopware\Psh\Config\ScriptsPath;
+use Shopware\Psh\Config\Template;
use Shopware\Psh\Config\XmlConfigFileLoader;
+use function count;
+use function file_put_contents;
+use function print_r;
+use function sprintf;
+use function unlink;
-class XmlConfigFileLoaderTest extends \PHPUnit_Framework_TestCase
+class XmlConfigFileLoaderTest extends TestCase
{
const CONFIG_TEMPLATE = <<
@@ -21,12 +29,12 @@ class XmlConfigFileLoaderTest extends \PHPUnit_Framework_TestCase
const TEMP_FILE = __DIR__ . '/xml_test_file';
- protected function tearDown()
+ protected function tearDown(): void
{
@unlink(self::TEMP_FILE);
}
- private function writeTempFile(string $content)
+ private function writeTempFile(string $content): void
{
file_put_contents(self::TEMP_FILE, sprintf(self::CONFIG_TEMPLATE, $content));
}
@@ -36,27 +44,27 @@ private function createConfigLoader(): XmlConfigFileLoader
return new XmlConfigFileLoader(new ConfigBuilder(), __DIR__);
}
- public function test_it_can_be_instantiated()
+ public function test_it_can_be_instantiated(): void
{
$loader = $this->createConfigLoader();
- $this->assertInstanceOf(XmlConfigFileLoader::class, $loader);
- $this->assertInstanceOf(ConfigLoader::class, $loader);
+ self::assertInstanceOf(XmlConfigFileLoader::class, $loader);
+ self::assertInstanceOf(ConfigFileLoader::class, $loader);
}
- public function test_it_supports_yaml_files()
+ public function test_it_supports_yaml_files(): void
{
$loader = $this->createConfigLoader();
- $this->assertTrue($loader->isSupported('.psh.xml'));
- $this->assertTrue($loader->isSupported('.psh.xml.dist'));
- $this->assertTrue($loader->isSupported('.psh.xml.override'));
+ self::assertTrue($loader->isSupported('.psh.xml'));
+ self::assertTrue($loader->isSupported('.psh.xml.dist'));
+ self::assertTrue($loader->isSupported('.psh.xml.override'));
- $this->assertFalse($loader->isSupported('fo.txt'));
- $this->assertFalse($loader->isSupported('.psh.yml'));
- $this->assertFalse($loader->isSupported('fo.yaml.bar'));
+ self::assertFalse($loader->isSupported('fo.txt'));
+ self::assertFalse($loader->isSupported('.psh.yml'));
+ self::assertFalse($loader->isSupported('fo.yaml.bar'));
}
- public function test_it_works_if_no_paths_are_present()
+ public function test_it_works_if_no_paths_are_present(): void
{
$this->writeTempFile(<<
@@ -68,10 +76,10 @@ public function test_it_works_if_no_paths_are_present()
$loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertEquals(['filesystem' => 'ls -al'], $config->getDynamicVariables());
+ $this->assertVariables($config, ['filesystem' => 'ls -al']);
}
- public function test_it_works_if_no_dynamics_are_present()
+ public function test_it_works_if_no_dynamics_are_present(): void
{
$dir = __DIR__;
@@ -87,10 +95,10 @@ public function test_it_works_if_no_dynamics_are_present()
$loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertEquals([ 'FOO' => 'bar'], $config->getConstants());
+ $this->assertConstants($config, ['FOO' => 'bar']);
}
- public function test_it_works_if_no_consts_are_present()
+ public function test_it_works_if_no_consts_are_present(): void
{
$dir = __DIR__;
@@ -107,13 +115,13 @@ public function test_it_works_if_no_consts_are_present()
$config = $loader->load(self::TEMP_FILE, []);
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
}
- public function test_it_creates_a_valid_config_file_if_all_required_params_are_present()
+ public function test_it_creates_a_valid_config_file_if_all_required_params_are_present(): void
{
$dir = __DIR__;
@@ -130,10 +138,10 @@ public function test_it_creates_a_valid_config_file_if_all_required_params_are_p
$loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
}
- public function test_it_creates_a_valid_config_file_if_all_params_are_present()
+ public function test_it_creates_a_valid_config_file_if_all_params_are_present(): void
{
$dir = __DIR__;
@@ -151,11 +159,10 @@ public function test_it_creates_a_valid_config_file_if_all_params_are_present()
$loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
}
-
- public function test_environment_paths_do_not_influence_default_environment()
+ public function test_environment_paths_do_not_influence_default_environment(): void
{
$dir = __DIR__;
@@ -171,28 +178,28 @@ public function test_environment_paths_do_not_influence_default_environment()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
+ $this->assertVariables($config, [
'filesystem' => 'ls -al',
- ], $config->getDynamicVariables());
+ ]);
- $this->assertEquals([
+ $this->assertConstants($config, [
'FOO' => 'bar',
- ], $config->getConstants());
+ ]);
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
- $this->assertEquals('namespace', $scripts[1]->getNamespace());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertEquals('namespace', $scripts[1]->getNamespace());
}
- public function test_environment_hidden_get_loaded()
+ public function test_environment_hidden_get_loaded(): void
{
$dir = __DIR__;
@@ -204,16 +211,16 @@ public function test_environment_hidden_get_loaded()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertTrue($config->getEnvironments()['namespace']->isHidden());
+ self::assertTrue($config->getEnvironments()['namespace']->isHidden());
- $this->assertFalse($config->getAllScriptsPaths()[0]->isHidden());
- $this->assertTrue($config->getAllScriptsPaths()[1]->isHidden());
+ self::assertFalse($config->getAllScriptsPaths()[0]->isHidden());
+ self::assertTrue($config->getAllScriptsPaths()[1]->isHidden());
}
- public function test_it_loads_environment_paths()
+ public function test_it_loads_environment_paths(): void
{
$dir = __DIR__;
@@ -229,29 +236,29 @@ public function test_it_loads_environment_paths()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
+ $this->assertVariables($config, [
'filesystem' => 'ls -al',
- ], $config->getDynamicVariables('namespace'));
+ ]);
- $this->assertEquals([
+ $this->assertConstants($config, [
'FOO' => 'bar',
- ], $config->getConstants('namespace'));
+ ]);
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
- $this->assertEquals('namespace', $scripts[1]->getNamespace());
- $this->assertFalse($config->getEnvironments()['namespace']->isHidden());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertEquals('namespace', $scripts[1]->getNamespace());
+ self::assertFalse($config->getEnvironments()['namespace']->isHidden());
}
- public function test_it_loads_environments_with_vars()
+ public function test_it_loads_environments_with_vars(): void
{
$dir = __DIR__;
@@ -271,60 +278,60 @@ public function test_it_loads_environments_with_vars()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
+ $this->assertVariables($config, [
'filesystem' => 'ls -al',
- 'booh' => 'bar'
- ], $config->getDynamicVariables('namespace'));
+ 'booh' => 'bar',
+ ], 'namespace');
- $this->assertEquals([
+ $this->assertConstants($config, [
'FOO' => 'bar',
- 'booh' => 'hah'
- ], $config->getConstants('namespace'));
+ 'booh' => 'hah',
+ ], 'namespace');
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
- $this->assertEquals('namespace', $scripts[1]->getNamespace());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertEquals('namespace', $scripts[1]->getNamespace());
}
- public function test_it_loads_templates()
+ public function test_it_loads_templates(): void
{
$this->writeTempFile(<<
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
- ['source' => __DIR__ . '/_the_template.tpl', 'destination' => __DIR__ . '/the_destination.txt']
+ self::assertEquals([
+ new Template(__DIR__ . '/_the_template.tpl', __DIR__ . '/the_destination.txt'),
], $config->getTemplates());
}
- public function test_invalid_format()
+ public function test_invalid_format(): void
{
$this->writeTempFile(<<
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
$loader->load(self::TEMP_FILE, []);
}
- public function test_multiple_placeholder_elements_are_supported()
+ public function test_multiple_placeholder_elements_are_supported(): void
{
$this->writeTempFile(<<
@@ -336,12 +343,12 @@ public function test_multiple_placeholder_elements_are_supported()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertCount(2, $config->getConstants());
+ self::assertCount(2, $config->getConstants());
}
- public function test_multiple_header_work_although_they_overwrite_each_other()
+ public function test_multiple_header_work_although_they_overwrite_each_other(): void
{
$this->writeTempFile(<<NO
@@ -349,12 +356,12 @@ public function test_multiple_header_work_although_they_overwrite_each_other()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertSame('YES', $config->getHeader());
+ self::assertSame('YES', $config->getHeader());
}
- public function test_it_loads_dotenv_files()
+ public function test_it_loads_dotenv_files(): void
{
$this->writeTempFile(<<
@@ -364,14 +371,14 @@ public function test_it_loads_dotenv_files()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertCount(2, $config->getDotenvPaths(), print_r($config->getDotenvPaths(), true));
- $this->assertEquals(__DIR__ . '/.fiz', $config->getDotenvPaths()['.fiz']->getPath());
- $this->assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths()['.baz']->getPath());
+ self::assertCount(2, $config->getDotenvPaths(), print_r($config->getDotenvPaths(), true));
+ self::assertEquals(__DIR__ . '/.fiz', $config->getDotenvPaths()['.fiz']->getPath());
+ self::assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths()['.baz']->getPath());
}
- public function test_it_loads_dotenv_files_from_environments_overwritten()
+ public function test_it_loads_dotenv_files_from_environments_overwritten(): void
{
$this->writeTempFile(<<
@@ -387,12 +394,32 @@ public function test_it_loads_dotenv_files_from_environments_overwritten()
EOD
);
- $loader =$this->createConfigLoader();
+ $loader = $this->createConfigLoader();
$config = $loader->load(self::TEMP_FILE, []);
- $this->assertCount(3, $config->getDotenvPaths('env'));
- $this->assertEquals(__DIR__ . '/_foo/.fiz', $config->getDotenvPaths('env')['.fiz']->getPath());
- $this->assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths('env')['.baz']->getPath());
- $this->assertEquals(__DIR__ . '/_foo/.buz', $config->getDotenvPaths('env')['.buz']->getPath());
+ self::assertCount(3, $config->getDotenvPaths('env'));
+ self::assertEquals(__DIR__ . '/_foo/.fiz', $config->getDotenvPaths('env')['.fiz']->getPath());
+ self::assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths('env')['.baz']->getPath());
+ self::assertEquals(__DIR__ . '/_foo/.buz', $config->getDotenvPaths('env')['.buz']->getPath());
+ }
+
+ private function assertConstants(Config $config, array $keyValues, ?string $environment = null): void
+ {
+ foreach ($keyValues as $key => $value) {
+ self::assertArrayHasKey($key, $config->getConstants($environment));
+ self::assertSame($value, $config->getConstants($environment)[$key]->getValue());
+ }
+
+ self::assertCount(count($keyValues), $config->getConstants($environment));
+ }
+
+ private function assertVariables(Config $config, array $keyValues, ?string $environment = null): void
+ {
+ foreach ($keyValues as $key => $value) {
+ self::assertArrayHasKey($key, $config->getDynamicVariables($environment));
+ self::assertSame($value, $config->getDynamicVariables($environment)[$key]->getCommand());
+ }
+
+ self::assertCount(count($keyValues), $config->getDynamicVariables($environment));
}
}
diff --git a/tests/Unit/Config/YamlConfigFileLoaderTest.php b/tests/Unit/Config/YamlConfigFileLoaderTest.php
index 7304430..cef74c8 100644
--- a/tests/Unit/Config/YamlConfigFileLoaderTest.php
+++ b/tests/Unit/Config/YamlConfigFileLoaderTest.php
@@ -2,16 +2,21 @@
namespace Shopware\Psh\Test\Unit\Config;
+use InvalidArgumentException;
+use PHPUnit\Framework\TestCase;
+use ReflectionMethod;
use Shopware\Psh\Config\Config;
use Shopware\Psh\Config\ConfigBuilder;
-use Shopware\Psh\Config\ConfigLoader;
+use Shopware\Psh\Config\ConfigFileLoader;
use Shopware\Psh\Config\ScriptsPath;
+use Shopware\Psh\Config\Template;
use Shopware\Psh\Config\YamlConfigFileLoader;
use Symfony\Component\Yaml\Parser;
+use function count;
-class YamlConfigFileLoaderTest extends \PHPUnit_Framework_TestCase
+class YamlConfigFileLoaderTest extends TestCase
{
- private function createConfigLoader(Parser $parser = null)
+ private function createConfigLoader(?Parser $parser = null): YamlConfigFileLoader
{
if (!$parser) {
$parser = new Parser();
@@ -20,30 +25,29 @@ private function createConfigLoader(Parser $parser = null)
return new YamlConfigFileLoader($parser, new ConfigBuilder(), __DIR__);
}
- public function test_it_can_be_instantiated()
+ public function test_it_can_be_instantiated(): void
{
$loader = $this->createConfigLoader();
- $this->assertInstanceOf(YamlConfigFileLoader::class, $loader);
- $this->assertInstanceOf(ConfigLoader::class, $loader);
+ self::assertInstanceOf(ConfigFileLoader::class, $loader);
}
- public function test_it_supports_yaml_files()
+ public function test_it_supports_yaml_files(): void
{
$loader = $this->createConfigLoader();
- $this->assertTrue($loader->isSupported('.psh.yaml'));
- $this->assertTrue($loader->isSupported('.psh.yml'));
- $this->assertTrue($loader->isSupported('.psh.yml.dist'));
- $this->assertTrue($loader->isSupported('.psh.yaml.dist'));
- $this->assertTrue($loader->isSupported('.psh.yml.override'));
- $this->assertTrue($loader->isSupported('.psh.yaml.override'));
+ self::assertTrue($loader->isSupported('.psh.yaml'));
+ self::assertTrue($loader->isSupported('.psh.yml'));
+ self::assertTrue($loader->isSupported('.psh.yml.dist'));
+ self::assertTrue($loader->isSupported('.psh.yaml.dist'));
+ self::assertTrue($loader->isSupported('.psh.yml.override'));
+ self::assertTrue($loader->isSupported('.psh.yaml.override'));
- $this->assertFalse($loader->isSupported('fo.txt'));
- $this->assertFalse($loader->isSupported('fo.yml'));
- $this->assertFalse($loader->isSupported('fo.yaml.bar'));
+ self::assertFalse($loader->isSupported('fo.txt'));
+ self::assertFalse($loader->isSupported('fo.yml'));
+ self::assertFalse($loader->isSupported('fo.yaml.bar'));
}
- public function test_it_works_if_no_paths_are_present()
+ public function test_it_works_if_no_paths_are_present(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
@@ -57,10 +61,10 @@ public function test_it_works_if_no_paths_are_present()
$loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertEquals(['filesystem' => 'ls -al'], $config->getDynamicVariables());
+ $this->assertVariables($config, ['filesystem' => 'ls -al']);
}
- public function test_it_works_if_no_dynamics_are_present()
+ public function test_it_works_if_no_dynamics_are_present(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
@@ -76,10 +80,10 @@ public function test_it_works_if_no_dynamics_are_present()
$loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertEquals([ 'FOO' => 'bar'], $config->getConstants());
+ $this->assertConstants($config, ['FOO' => 'bar']);
}
- public function test_it_works_if_no_consts_are_present()
+ public function test_it_works_if_no_consts_are_present(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
@@ -97,13 +101,13 @@ public function test_it_works_if_no_consts_are_present()
$config = $loader->load(__DIR__ . '/_test.txt', []);
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
}
- public function test_it_creates_a_valid_config_file_if_all_required_params_are_present()
+ public function test_it_creates_a_valid_config_file_if_all_required_params_are_present(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
@@ -119,14 +123,13 @@ public function test_it_creates_a_valid_config_file_if_all_required_params_are_p
],
]);
-
$loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
}
- public function test_it_creates_a_valid_config_file_if_all_params_are_present()
+ public function test_it_creates_a_valid_config_file_if_all_params_are_present(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
@@ -146,22 +149,21 @@ public function test_it_creates_a_valid_config_file_if_all_params_are_present()
$loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
}
-
- public function test_environment_paths_do_not_influence_default_environment()
+ public function test_environment_paths_do_not_influence_default_environment(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
'paths' => [
- __DIR__ . '/_foo'
+ __DIR__ . '/_foo',
],
'environments' => [
'namespace' => [
'paths' => [
__DIR__ . '/_bar',
- ]
+ ],
],
],
'dynamic' => [
@@ -172,39 +174,39 @@ public function test_environment_paths_do_not_influence_default_environment()
],
]);
- $loader =$this->createConfigLoader($yamlMock->reveal());
+ $loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
+ $this->assertVariables($config, [
'filesystem' => 'ls -al',
- ], $config->getDynamicVariables());
+ ]);
- $this->assertEquals([
+ $this->assertConstants($config, [
'FOO' => 'bar',
- ], $config->getConstants());
+ ]);
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
- $this->assertEquals('namespace', $scripts[1]->getNamespace());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertEquals('namespace', $scripts[1]->getNamespace());
}
- public function test_it_loads_environment_paths()
+ public function test_it_loads_environment_paths(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
'paths' => [
- __DIR__ . '/_foo'
+ __DIR__ . '/_foo',
],
'environments' => [
'namespace' => [
'paths' => [
__DIR__ . '/_bar',
- ]
+ ],
],
],
'dynamic' => [
@@ -215,33 +217,33 @@ public function test_it_loads_environment_paths()
],
]);
- $loader =$this->createConfigLoader($yamlMock->reveal());
+ $loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
+ $this->assertVariables($config, [
'filesystem' => 'ls -al',
- ], $config->getDynamicVariables('namespace'));
+ ], 'namespace');
- $this->assertEquals([
+ $this->assertConstants($config, [
'FOO' => 'bar',
- ], $config->getConstants('namespace'));
+ ], 'namespace');
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
- $this->assertEquals('namespace', $scripts[1]->getNamespace());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertEquals('namespace', $scripts[1]->getNamespace());
}
- public function test_it_loads_environments_with_vars()
+ public function test_it_loads_environments_with_vars(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
'paths' => [
- __DIR__ . '/_foo'
+ __DIR__ . '/_foo',
],
'environments' => [
'namespace' => [
@@ -249,11 +251,11 @@ public function test_it_loads_environments_with_vars()
__DIR__ . '/_bar',
],
'dynamic' => [
- 'booh' => 'bar'
+ 'booh' => 'bar',
],
'const' => [
'booh' => 'hah',
- ]
+ ],
],
],
'dynamic' => [
@@ -264,51 +266,51 @@ public function test_it_loads_environments_with_vars()
],
]);
- $loader =$this->createConfigLoader($yamlMock->reveal());
+ $loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
+ $this->assertVariables($config, [
'filesystem' => 'ls -al',
- 'booh' => 'bar'
- ], $config->getDynamicVariables('namespace'));
+ 'booh' => 'bar',
+ ], 'namespace');
- $this->assertEquals([
+ $this->assertConstants($config, [
'FOO' => 'bar',
- 'booh' => 'hah'
- ], $config->getConstants('namespace'));
+ 'booh' => 'hah',
+ ], 'namespace');
$scripts = $config->getAllScriptsPaths();
- $this->assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
- $this->assertCount(2, $scripts);
- $this->assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
- $this->assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
- $this->assertEquals('namespace', $scripts[1]->getNamespace());
+ self::assertContainsOnlyInstancesOf(ScriptsPath::class, $scripts);
+ self::assertCount(2, $scripts);
+ self::assertEquals(__DIR__ . '/_foo', $scripts[0]->getPath());
+ self::assertEquals(__DIR__ . '/_bar', $scripts[1]->getPath());
+ self::assertEquals('namespace', $scripts[1]->getNamespace());
}
- public function test_it_loads_templates()
+ public function test_it_loads_templates(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
'paths' => [
],
'templates' => [
- ['source' => '_the_template.tpl', 'destination' => 'the_destination.txt']
- ]
+ ['source' => '_the_template.tpl', 'destination' => 'the_destination.txt'],
+ ],
]);
- $loader =$this->createConfigLoader($yamlMock->reveal());
+ $loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertInstanceOf(Config::class, $config);
+ self::assertInstanceOf(Config::class, $config);
- $this->assertEquals([
- ['source' => __DIR__ . '/_the_template.tpl', 'destination' => __DIR__ . '/the_destination.txt']
+ self::assertEquals([
+ new Template(__DIR__ . '/_the_template.tpl', __DIR__ . '/the_destination.txt'),
], $config->getTemplates());
}
- public function test_it_loads_dotenv_files()
+ public function test_it_loads_dotenv_files(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
@@ -316,18 +318,18 @@ public function test_it_loads_dotenv_files()
'dotenv' => [
'.fiz',
'.baz',
- ]
+ ],
]);
- $loader =$this->createConfigLoader($yamlMock->reveal());
+ $loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertCount(2, $config->getDotenvPaths());
- $this->assertEquals(__DIR__ . '/.fiz', $config->getDotenvPaths()['.fiz']->getPath());
- $this->assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths()['.baz']->getPath());
+ self::assertCount(2, $config->getDotenvPaths());
+ self::assertEquals(__DIR__ . '/.fiz', $config->getDotenvPaths()['.fiz']->getPath());
+ self::assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths()['.baz']->getPath());
}
- public function test_it_loads_dotenv_files_from_environments_overwritten()
+ public function test_it_loads_dotenv_files_from_environments_overwritten(): void
{
$yamlMock = $this->prophesize(Parser::class);
$yamlMock->parse('foo')->willReturn([
@@ -340,29 +342,49 @@ public function test_it_loads_dotenv_files_from_environments_overwritten()
'env' => [
'dotenv' => [
'_foo/.fiz',
- '_foo/.buz'
- ]
- ]]
+ '_foo/.buz',
+ ],
+ ], ],
]);
- $loader =$this->createConfigLoader($yamlMock->reveal());
+ $loader = $this->createConfigLoader($yamlMock->reveal());
$config = $loader->load(__DIR__ . '/_test.txt', []);
- $this->assertCount(3, $config->getDotenvPaths('env'));
- $this->assertEquals(__DIR__ . '/_foo/.fiz', $config->getDotenvPaths('env')['.fiz']->getPath());
- $this->assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths('env')['.baz']->getPath());
- $this->assertEquals(__DIR__ . '/_foo/.buz', $config->getDotenvPaths('env')['.buz']->getPath());
+ self::assertCount(3, $config->getDotenvPaths('env'));
+ self::assertEquals(__DIR__ . '/_foo/.fiz', $config->getDotenvPaths('env')['.fiz']->getPath());
+ self::assertEquals(__DIR__ . '/.baz', $config->getDotenvPaths('env')['.baz']->getPath());
+ self::assertEquals(__DIR__ . '/_foo/.buz', $config->getDotenvPaths('env')['.buz']->getPath());
}
- public function test_fixPath_throws_exception()
+ public function test_fixPath_throws_exception(): void
{
$loader = $this->createConfigLoader();
- $method = new \ReflectionMethod(YamlConfigFileLoader::class, 'fixPath');
+ $method = new ReflectionMethod(YamlConfigFileLoader::class, 'fixPath');
$method->setAccessible(true);
- $this->expectException(\InvalidArgumentException::class);
+ $this->expectException(InvalidArgumentException::class);
$method->invoke($loader, __DIR__, 'absoluteOrRelativePath', 'baseFile');
}
+
+ private function assertConstants(Config $config, array $keyValues, ?string $environment = null): void
+ {
+ foreach ($keyValues as $key => $value) {
+ self::assertArrayHasKey($key, $config->getConstants($environment));
+ self::assertSame($value, $config->getConstants($environment)[$key]->getValue());
+ }
+
+ self::assertCount(count($keyValues), $config->getConstants($environment));
+ }
+
+ private function assertVariables(Config $config, array $keyValues, ?string $environment = null): void
+ {
+ foreach ($keyValues as $key => $value) {
+ self::assertArrayHasKey($key, $config->getDynamicVariables($environment));
+ self::assertSame($value, $config->getDynamicVariables($environment)[$key]->getCommand());
+ }
+
+ self::assertCount(count($keyValues), $config->getDynamicVariables($environment));
+ }
}
diff --git a/tests/Unit/Listing/DescriptionReaderTest.php b/tests/Unit/Listing/DescriptionReaderTest.php
index e90e6ea..7c91faf 100644
--- a/tests/Unit/Listing/DescriptionReaderTest.php
+++ b/tests/Unit/Listing/DescriptionReaderTest.php
@@ -2,40 +2,41 @@
namespace Shopware\Psh\Test\Unit\Listing;
+use PHPUnit\Framework\TestCase;
use Shopware\Psh\Listing\DescriptionReader;
-class DescriptionReaderTest extends \PHPUnit_Framework_TestCase
+class DescriptionReaderTest extends TestCase
{
- public function test_it_can_be_created()
+ public function test_it_can_be_created(): void
{
- $this->assertInstanceOf(DescriptionReader::class, new DescriptionReader());
+ self::assertInstanceOf(DescriptionReader::class, new DescriptionReader());
}
- public function test_it_reads_description_with_hashtag()
+ public function test_it_reads_description_with_hashtag(): void
{
$reader = new DescriptionReader();
$result = $reader->read(__DIR__ . '/_fixtures/description.sh');
- $this->assertSame('My desc.', $result);
+ self::assertSame('My desc.', $result);
}
- public function test_it_should_not_read_a_description()
+ public function test_it_should_not_read_a_description(): void
{
$reader = new DescriptionReader();
$result = $reader->read(__DIR__ . '/_fixtures/no_description.sh');
- $this->assertSame('', $result);
+ self::assertSame('', $result);
}
- public function test_it_should_not_parse_description_if_is_not_in_a_comment()
+ public function test_it_should_not_parse_description_if_is_not_in_a_comment(): void
{
$reader = new DescriptionReader();
$result = $reader->read(__DIR__ . '/_fixtures/no_description.sh');
- $this->assertSame('', $result);
+ self::assertSame('', $result);
}
- public function test_it_should_remove_whitespace_characters()
+ public function test_it_should_remove_whitespace_characters(): void
{
$reader = new DescriptionReader();
$result = $reader->read(__DIR__ . '/_fixtures/remove_whitespace.sh');
- $this->assertSame('My desc.', $result);
+ self::assertSame('My desc.', $result);
}
}
diff --git a/tests/Unit/Listing/ScriptFinderTest.php b/tests/Unit/Listing/ScriptFinderTest.php
index ab46f94..cfa8ca2 100644
--- a/tests/Unit/Listing/ScriptFinderTest.php
+++ b/tests/Unit/Listing/ScriptFinderTest.php
@@ -2,15 +2,16 @@
namespace Shopware\Psh\Test\Unit\Listing;
+use PHPUnit\Framework\TestCase;
use Shopware\Psh\Listing\DescriptionReader;
use Shopware\Psh\Listing\ScriptFinder;
-class ScriptFinderTest extends \PHPUnit_Framework_TestCase
+class ScriptFinderTest extends TestCase
{
- public function test_script_finder_holds_contract_if_no_paths_present()
+ public function test_script_finder_holds_contract_if_no_paths_present(): void
{
$finder = new ScriptFinder([], new DescriptionReader());
- $this->assertInstanceOf(ScriptFinder::class, $finder);
- $this->assertInternalType('array', $finder->getAllScripts());
+ self::assertInstanceOf(ScriptFinder::class, $finder);
+ self::assertIsArray($finder->getAllScripts());
}
}
diff --git a/tests/Unit/ScriptRuntime/ProcessEnvironmentTest.php b/tests/Unit/ScriptRuntime/ProcessEnvironmentTest.php
index 1a6daee..802e1b0 100644
--- a/tests/Unit/ScriptRuntime/ProcessEnvironmentTest.php
+++ b/tests/Unit/ScriptRuntime/ProcessEnvironmentTest.php
@@ -1,82 +1,84 @@
'BAR'], [], [], []);
- $this->assertEquals(['FOO' => new SimpleValueProvider('BAR')], $env->getAllValues());
+ $env = new ProcessEnvironment((new EnvironmentResolver())->resolveConstants(['FOO' => 'BAR']), [], [], []);
+ self::assertEquals(['FOO' => new SimpleValueProvider('BAR')], $env->getAllValues());
}
- public function test_it_creates_processes()
+ public function test_it_creates_processes(): void
{
$env = new ProcessEnvironment([], [], [], []);
- $this->assertInstanceOf(Process::class, $env->createProcess('foo'));
- $this->assertEquals('foo', $env->createProcess('foo')->getCommandLine());
+ self::assertInstanceOf(Process::class, $env->createProcess('foo'));
+ self::assertEquals('foo', $env->createProcess('foo')->getCommandLine());
}
- public function test_it_resolves_variables()
+ public function test_it_resolves_variables(): void
{
- $env = new ProcessEnvironment([], [
+ $env = new ProcessEnvironment([], (new EnvironmentResolver())->resolveVariables([
'FOO' => 'ls',
- 'BAR' => 'echo "HEY"'
- ], [], []);
+ 'BAR' => 'echo "HEY"',
+ ]), [], []);
$resolvedValues = $env->getAllValues();
- $this->assertContainsOnlyInstancesOf(ValueProvider::class, $resolvedValues);
- $this->assertCount(2, $resolvedValues);
+ self::assertContainsOnlyInstancesOf(ValueProvider::class, $resolvedValues);
+ self::assertCount(2, $resolvedValues);
foreach ($resolvedValues as $value) {
- $this->assertEquals(trim($value->getValue()), $value->getValue());
+ self::assertEquals(trim($value->getValue()), $value->getValue());
}
}
- public function test_it_creates_templates()
+ public function test_it_creates_templates(): void
{
- $env = new ProcessEnvironment([], [], [
- ['source' => __DIR__ . '_foo.tpl', 'destination' => 'bar.txt']
- ], []);
+ $env = new ProcessEnvironment([], [], (new EnvironmentResolver())->resolveTemplates([
+ ['source' => __DIR__ . '_foo.tpl', 'destination' => 'bar.txt'],
+ ]), []);
$templates = $env->getTemplates();
- $this->assertContainsOnlyInstancesOf(Template::class, $templates);
- $this->assertCount(1, $templates);
+ self::assertContainsOnlyInstancesOf(Template::class, $templates);
+ self::assertCount(1, $templates);
}
- public function test_dotenv_can_be_overwritten_by_existing_env_vars()
+ public function test_dotenv_can_be_overwritten_by_existing_env_vars(): void
{
putenv('FOO=baz');
- $env = new ProcessEnvironment([], [], [], [
- new DotenvFile(__DIR__ . '/_dotenv/simple.env')
- ]);
+ $env = new ProcessEnvironment([], [], [], (new EnvironmentResolver())->resolveDotenvVariables([
+ new DotenvFile(__DIR__ . '/_dotenv/simple.env'),
+ ]));
- $this->assertSame('baz', $env->getAllValues()['FOO']->getValue());
+ self::assertSame('baz', $env->getAllValues()['FOO']->getValue());
}
- public function test_dotenv_file_variables()
+ public function test_dotenv_file_variables(): void
{
- $env = new ProcessEnvironment([], [], [], [
- new DotenvFile(__DIR__ . '/_dotenv/simple.env')
- ]);
+ $env = new ProcessEnvironment([], [], [], (new EnvironmentResolver())->resolveDotenvVariables([
+ new DotenvFile(__DIR__ . '/_dotenv/simple.env'),
+ ]));
- $this->assertCount(1, $env->getAllValues());
- $this->assertSame('bar', $env->getAllValues()['FOO']->getValue());
+ self::assertCount(1, $env->getAllValues());
+ self::assertSame('bar', $env->getAllValues()['FOO']->getValue());
}
}
diff --git a/tests/Unit/ScriptRuntime/PshScriptParserTest.php b/tests/Unit/ScriptRuntime/PshScriptParserTest.php
index 82c95e5..2772fc9 100644
--- a/tests/Unit/ScriptRuntime/PshScriptParserTest.php
+++ b/tests/Unit/ScriptRuntime/PshScriptParserTest.php
@@ -2,143 +2,146 @@
namespace Shopware\Psh\Test\Unit\ScriptRuntime;
+use PHPUnit\Framework\TestCase;
+use RuntimeException;
use Shopware\Psh\Config\ScriptsPath;
use Shopware\Psh\Listing\DescriptionReader;
use Shopware\Psh\Listing\Script;
use Shopware\Psh\Listing\ScriptFinder;
use Shopware\Psh\ScriptRuntime\Command;
-use Shopware\Psh\ScriptRuntime\ScriptLoader\ScriptLoader;
-use Shopware\Psh\ScriptRuntime\SynchronusProcessCommand;
use Shopware\Psh\ScriptRuntime\ScriptLoader\CommandBuilder;
use Shopware\Psh\ScriptRuntime\ScriptLoader\PshScriptParser;
+use Shopware\Psh\ScriptRuntime\ScriptLoader\ScriptLoader;
+use Shopware\Psh\ScriptRuntime\SynchronusProcessCommand;
use Shopware\Psh\ScriptRuntime\TemplateCommand;
+use function array_pop;
+use function file_get_contents;
-class PshScriptParserTest extends \PHPUnit_Framework_TestCase
+class PshScriptParserTest extends TestCase
{
- public function test_it_loads_all_simple_commands_from_a_script()
+ public function test_it_loads_all_simple_commands_from_a_script(): void
{
$commands = $this->createCommands($this->createScript(__DIR__ . '/_scripts', 'simple.sh'));
- $this->assertCount(3, $commands);
- $this->assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
+ self::assertCount(3, $commands);
+ self::assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
$lastCommand = array_pop($commands);
- $this->assertEquals(5, $lastCommand->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
- $this->assertFalse($lastCommand->isIgnoreError());
+ self::assertEquals(5, $lastCommand->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
+ self::assertFalse($lastCommand->isIgnoreError());
}
- public function test_it_concatenates_commands()
+ public function test_it_concatenates_commands(): void
{
$commands = $this->createCommands($this->createScript(__DIR__ . '/_scripts', 'concatenate.sh'));
- $this->assertCount(2, $commands);
- $this->assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
+ self::assertCount(2, $commands);
+ self::assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
$lastCommand = array_pop($commands);
- $this->assertEquals(5, $lastCommand->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
- $this->assertFalse($lastCommand->isIgnoreError());
+ self::assertEquals(5, $lastCommand->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
+ self::assertFalse($lastCommand->isIgnoreError());
}
- public function test_it_sets_ignore_error()
+ public function test_it_sets_ignore_error(): void
{
$commands = $this->createCommands($this->createScript(__DIR__ . '/_scripts', 'ignore_error.sh'));
- $this->assertCount(3, $commands);
- $this->assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
+ self::assertCount(3, $commands);
+ self::assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
$lastCommand = array_pop($commands);
- $this->assertEquals(5, $lastCommand->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
- $this->assertTrue($lastCommand->isIgnoreError());
+ self::assertEquals(5, $lastCommand->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
+ self::assertTrue($lastCommand->isIgnoreError());
}
- public function test_it_sets_tty()
+ public function test_it_sets_tty(): void
{
$commands = $this->createCommands($this->createScript(__DIR__ . '/_scripts', 'tty.sh'));
- $this->assertCount(1, $commands);
- $this->assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
+ self::assertCount(1, $commands);
+ self::assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
$lastCommand = array_pop($commands);
- $this->assertEquals(2, $lastCommand->getLineNumber());
- $this->assertEquals('ls -al', $lastCommand->getShellCommand());
- $this->assertTrue($lastCommand->isTty());
+ self::assertEquals(2, $lastCommand->getLineNumber());
+ self::assertEquals('ls -al', $lastCommand->getShellCommand());
+ self::assertTrue($lastCommand->isTty());
}
- public function test_includes_with_local_commands()
+ public function test_includes_with_local_commands(): void
{
$commands = $this->createCommands($this->createScript(__DIR__ . '/_scripts', 'local_include.sh'));
- $this->assertCount(8, $commands);
- $this->assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
+ self::assertCount(8, $commands);
+ self::assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
- $this->assertEquals(2, $commands[0]->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $commands[0]->getShellCommand());
- $this->assertFalse($commands[0]->isIgnoreError());
+ self::assertEquals(2, $commands[0]->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $commands[0]->getShellCommand());
+ self::assertFalse($commands[0]->isIgnoreError());
$lastCommand = array_pop($commands);
- $this->assertEquals(5, $lastCommand->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
- $this->assertFalse($lastCommand->isIgnoreError());
+ self::assertEquals(5, $lastCommand->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
+ self::assertFalse($lastCommand->isIgnoreError());
}
- public function test_include_throws_exception()
+ public function test_include_throws_exception(): void
{
- $this->expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$this->createCommands($this->createScript(__DIR__ . '/_scripts', 'exception_include.sh'));
}
- public function test_action_with_local_commands()
+ public function test_action_with_local_commands(): void
{
$commands = $this->createCommands($this->createScript(__DIR__ . '/_scripts', 'local_action.sh'), [
new ScriptsPath(__DIR__ . '/_scripts/', false),
new ScriptsPath(__DIR__ . '/_scripts/', false, 'env'),
]);
- $this->assertCount(8, $commands);
- $this->assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
+ self::assertCount(8, $commands);
+ self::assertContainsOnlyInstancesOf(SynchronusProcessCommand::class, $commands);
- $this->assertEquals(2, $commands[0]->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $commands[0]->getShellCommand());
- $this->assertFalse($commands[0]->isIgnoreError());
+ self::assertEquals(2, $commands[0]->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $commands[0]->getShellCommand());
+ self::assertFalse($commands[0]->isIgnoreError());
$lastCommand = array_pop($commands);
- $this->assertEquals(5, $lastCommand->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
- $this->assertFalse($lastCommand->isIgnoreError());
+ self::assertEquals(5, $lastCommand->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
+ self::assertFalse($lastCommand->isIgnoreError());
}
- public function test_action_throws_exception()
+ public function test_action_throws_exception(): void
{
- $this->expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$this->createCommands($this->createScript(__DIR__ . '/_scripts', 'exception_action.sh'));
}
- public function test_renders_templates_on_demand()
+ public function test_renders_templates_on_demand(): void
{
$commands = $this->createCommands($this->createScript(__DIR__ . '/_scripts', 'template.sh'));
- $this->assertCount(3, $commands);
- $this->assertContainsOnlyInstancesOf(Command::class, $commands);
+ self::assertCount(3, $commands);
+ self::assertContainsOnlyInstancesOf(Command::class, $commands);
- $this->assertEquals(2, $commands[0]->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $commands[0]->getShellCommand());
- $this->assertFalse($commands[0]->isIgnoreError());
+ self::assertEquals(2, $commands[0]->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $commands[0]->getShellCommand());
+ self::assertFalse($commands[0]->isIgnoreError());
- $this->assertInstanceOf(TemplateCommand::class, $commands[1]);
- $this->assertEquals(__DIR__ . '/_scripts/complex.sh', $commands[1]->createTemplate()->getDestination());
- $this->assertEquals(file_get_contents(__DIR__ . '/_scripts/simple.sh'), $commands[1]->createTemplate()->getContent());
+ self::assertInstanceOf(TemplateCommand::class, $commands[1]);
+ self::assertEquals(__DIR__ . '/_scripts/complex.sh', $commands[1]->createTemplate()->getDestination());
+ self::assertEquals(file_get_contents(__DIR__ . '/_scripts/simple.sh'), $commands[1]->createTemplate()->getContent());
$lastCommand = array_pop($commands);
- $this->assertEquals(4, $lastCommand->getLineNumber());
- $this->assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
- $this->assertFalse($lastCommand->isIgnoreError());
+ self::assertEquals(4, $lastCommand->getLineNumber());
+ self::assertEquals('bin/phpunit --debug --verbose', $lastCommand->getShellCommand());
+ self::assertFalse($lastCommand->isIgnoreError());
}
/**
- * @param Script $script
* @return SynchronusProcessCommand[]
*/
public function createCommands(Script $script, array $availableSubScripts = []): array
diff --git a/tests/Unit/ScriptRuntime/ScriptLoaderTest.php b/tests/Unit/ScriptRuntime/ScriptLoaderTest.php
index 1cb3fe2..33a19c7 100644
--- a/tests/Unit/ScriptRuntime/ScriptLoaderTest.php
+++ b/tests/Unit/ScriptRuntime/ScriptLoaderTest.php
@@ -9,7 +9,7 @@
class ScriptLoaderTest extends TestCase
{
- public function test_no_parser_equals_no_support()
+ public function test_no_parser_equals_no_support(): void
{
$loader = new ScriptLoader();
diff --git a/tests/Unit/ScriptRuntime/TemplateEngineTest.php b/tests/Unit/ScriptRuntime/TemplateEngineTest.php
index f9dde56..f129445 100644
--- a/tests/Unit/ScriptRuntime/TemplateEngineTest.php
+++ b/tests/Unit/ScriptRuntime/TemplateEngineTest.php
@@ -1,12 +1,14 @@
3,
@@ -17,78 +19,77 @@ class TemplateEngineTest extends \PHPUnit_Framework_TestCase
'curl http://__APP_HOST____APP_PATH__' => 2,
];
- public function test_regex_matches_fixtures()
+ public function test_regex_matches_fixtures(): void
{
foreach ($this->fixtures as $fixture => $expectedOccurrences) {
preg_match_all(TemplateEngine::REGEX, $fixture, $matches);
- $this->assertCount($expectedOccurrences, $matches[0]);
+ self::assertCount($expectedOccurrences, $matches[0]);
}
}
-
- public function test_it_renders_successfully_with_no_placeholders()
+ public function test_it_renders_successfully_with_no_placeholders(): void
{
$engine = new TemplateEngine();
- $this->assertEquals('foo', $engine->render('foo', []));
- $this->assertEquals('foo', $engine->render('foo', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo', $engine->render('foo', []));
+ self::assertEquals('foo', $engine->render('foo', ['BAR' => new SimpleValueProvider('baz')]));
}
- public function test_it_replaces_a_value()
+ public function test_it_replaces_a_value(): void
{
$engine = new TemplateEngine();
- $this->assertEquals('foo baz', $engine->render('foo __BAR__', ['BAR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo baz', $engine->render('foo __BAR_1__', ['BAR_1' => new SimpleValueProvider('baz')]));
- $this->assertEquals('baz foo', $engine->render('__BAR__ foo', ['BAR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo baz foo', $engine->render('foo __BAR__ foo', ['BAR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo baz foo', $engine->render('foo __FO-BAR__ foo', ['FO-BAR' => new SimpleValueProvider('baz')]));
-
- $this->assertEquals('foo __BAR__', $engine->render('foo __BAR__(sic!)', ['BAR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('__BAR__ foo', $engine->render('__BAR__(sic!) foo', ['BAR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('__BAR_1__ foo', $engine->render('__BAR_1__(sic!) foo', ['BAR_1' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo __BAR__ foo', $engine->render('foo __BAR__(sic!) foo', ['BAR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo __FO-BAR__ foo', $engine->render('foo __FO-BAR__(sic!) foo', ['FO-BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz', $engine->render('foo __BAR__', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz', $engine->render('foo __BAR_1__', ['BAR_1' => new SimpleValueProvider('baz')]));
+ self::assertEquals('baz foo', $engine->render('__BAR__ foo', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz foo', $engine->render('foo __BAR__ foo', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz foo', $engine->render('foo __FO-BAR__ foo', ['FO-BAR' => new SimpleValueProvider('baz')]));
+
+ self::assertEquals('foo __BAR__', $engine->render('foo __BAR__(sic!)', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('__BAR__ foo', $engine->render('__BAR__(sic!) foo', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('__BAR_1__ foo', $engine->render('__BAR_1__(sic!) foo', ['BAR_1' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo __BAR__ foo', $engine->render('foo __BAR__(sic!) foo', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo __FO-BAR__ foo', $engine->render('foo __FO-BAR__(sic!) foo', ['FO-BAR' => new SimpleValueProvider('baz')]));
}
- public function test_values_can_be_set_case_insensitive()
+ public function test_values_can_be_set_case_insensitive(): void
{
$engine = new TemplateEngine();
- $this->assertEquals('foo baz', $engine->render('foo __BAR__', ['BAR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo baz', $engine->render('foo __BAR__', ['Bar' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo baz', $engine->render('foo __BAR__', ['bar' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo baz', $engine->render('foo __BAR__', ['baR' => new SimpleValueProvider('baz')]));
- $this->assertEquals('foo baz', $engine->render('foo __BAR__', ['bAr' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz', $engine->render('foo __BAR__', ['BAR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz', $engine->render('foo __BAR__', ['Bar' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz', $engine->render('foo __BAR__', ['bar' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz', $engine->render('foo __BAR__', ['baR' => new SimpleValueProvider('baz')]));
+ self::assertEquals('foo baz', $engine->render('foo __BAR__', ['bAr' => new SimpleValueProvider('baz')]));
}
- public function test_it_throw_exceptions_for_missing_values()
+ public function test_it_throw_exceptions_for_missing_values(): void
{
$engine = new TemplateEngine();
- $this->expectException(\RuntimeException::class);
+ $this->expectException(RuntimeException::class);
$engine->render('foo __BAR__, __BUZ__', ['BAR' => new SimpleValueProvider('baz')]);
}
- public function test_it_replaces_multiple_values()
+ public function test_it_replaces_multiple_values(): void
{
$engine = new TemplateEngine();
- $this->assertEquals(
+ self::assertEquals(
'ssh -u foo -pfoo th_db',
$engine->render(
'ssh -u __USER__ -p__PASSWORD__ __DATABASE__',
[
'user' => new SimpleValueProvider('foo'),
'password' => new SimpleValueProvider('foo'),
- 'database' => new SimpleValueProvider('th_db')
+ 'database' => new SimpleValueProvider('th_db'),
]
)
);
}
- public function test_values_can_be_concatenated()
+ public function test_values_can_be_concatenated(): void
{
$engine = new TemplateEngine();
- $this->assertEquals(
+ self::assertEquals(
'curl http://shopware.com/shopware/__MYKEY__',
$engine->render(
'curl http://__APP_HOST____APP_PATH____MYKEY__(sic!)',
@@ -99,7 +100,7 @@ public function test_values_can_be_concatenated()
)
);
- $this->assertEquals(
+ self::assertEquals(
'curl http://shopware.com/shopware/__MYKEY__',
$engine->render(
'curl http://__APP-HOST____APP-PATH____MYKEY__(sic!)',
diff --git a/tests/test-actions/test-env.sh b/tests/test-actions/test-env.sh
new file mode 100755
index 0000000..5dacbf7
--- /dev/null
+++ b/tests/test-actions/test-env.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo __ENV__
+
+echo $PWD
+echo $FOO
+
diff --git a/actions/test.sh b/tests/test-actions/test.sh
similarity index 100%
rename from actions/test.sh
rename to tests/test-actions/test.sh
diff --git a/vendor-bin/box/composer.json b/vendor-bin/box/composer.json
new file mode 100644
index 0000000..98a58e8
--- /dev/null
+++ b/vendor-bin/box/composer.json
@@ -0,0 +1,10 @@
+{
+ "require-dev": {
+ "humbug/box": ">=3.8"
+ },
+ "config": {
+ "platform": {
+ "php": "7.4"
+ }
+ }
+}
diff --git a/vendor-bin/box/composer.lock b/vendor-bin/box/composer.lock
new file mode 100644
index 0000000..3687acc
--- /dev/null
+++ b/vendor-bin/box/composer.lock
@@ -0,0 +1,3968 @@
+{
+ "_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#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "f65001a24cccbb78ad951f28fd55b342",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "amphp/amp",
+ "version": "v2.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/amp.git",
+ "reference": "f220a51458bf4dd0dedebb171ac3457813c72bbc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/amp/zipball/f220a51458bf4dd0dedebb171ac3457813c72bbc",
+ "reference": "f220a51458bf4dd0dedebb171ac3457813c72bbc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1",
+ "ext-json": "*",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^6.0.9 | ^7",
+ "psalm/phar": "^3.11@dev",
+ "react/promise": "^2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Amp\\": "lib"
+ },
+ "files": [
+ "lib/functions.php",
+ "lib/Internal/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@php.net"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A non-blocking concurrency framework for PHP applications.",
+ "homepage": "http://amphp.org/amp",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "awaitable",
+ "concurrency",
+ "event",
+ "event-loop",
+ "future",
+ "non-blocking",
+ "promise"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/amp/issues",
+ "source": "https://github.com/amphp/amp/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-14T21:47:18+00:00"
+ },
+ {
+ "name": "amphp/byte-stream",
+ "version": "v1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/byte-stream.git",
+ "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/byte-stream/zipball/f0c20cf598a958ba2aa8c6e5a71c697d652c7088",
+ "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1.4",
+ "friendsofphp/php-cs-fixer": "^2.3",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^6 || ^7 || ^8",
+ "psalm/phar": "^3.11.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Amp\\ByteStream\\": "lib"
+ },
+ "files": [
+ "lib/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A stream abstraction to make working with non-blocking I/O simple.",
+ "homepage": "http://amphp.org/byte-stream",
+ "keywords": [
+ "amp",
+ "amphp",
+ "async",
+ "io",
+ "non-blocking",
+ "stream"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/byte-stream/issues",
+ "source": "https://github.com/amphp/byte-stream/tree/master"
+ },
+ "time": "2020-06-29T18:35:05+00:00"
+ },
+ {
+ "name": "amphp/parallel",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/parallel.git",
+ "reference": "2c1039bf7ca137eae4d954b14c09a7535d7d4e1c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/parallel/zipball/2c1039bf7ca137eae4d954b14c09a7535d7d4e1c",
+ "reference": "2c1039bf7ca137eae4d954b14c09a7535d7d4e1c",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2",
+ "amphp/byte-stream": "^1.6.1",
+ "amphp/parser": "^1",
+ "amphp/process": "^1",
+ "amphp/serialization": "^1",
+ "amphp/sync": "^1.0.1",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1.1",
+ "phpunit/phpunit": "^8 || ^7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Parallel\\": "lib"
+ },
+ "files": [
+ "lib/Context/functions.php",
+ "lib/Sync/functions.php",
+ "lib/Worker/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Stephen Coakley",
+ "email": "me@stephencoakley.com"
+ }
+ ],
+ "description": "Parallel processing component for Amp.",
+ "homepage": "https://github.com/amphp/parallel",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "concurrent",
+ "multi-processing",
+ "multi-threading"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/parallel/issues",
+ "source": "https://github.com/amphp/parallel/tree/master"
+ },
+ "time": "2020-04-27T15:12:37+00:00"
+ },
+ {
+ "name": "amphp/parallel-functions",
+ "version": "v0.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/parallel-functions.git",
+ "reference": "12e6c602e067b02f78ddf5b720c17e9aa01ad4b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/parallel-functions/zipball/12e6c602e067b02f78ddf5b720c17e9aa01ad4b4",
+ "reference": "12e6c602e067b02f78ddf5b720c17e9aa01ad4b4",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2.0.3",
+ "amphp/parallel": "^0.1.8 || ^0.2 || ^1",
+ "opis/closure": "^3.0.7",
+ "php": ">=7"
+ },
+ "require-dev": {
+ "amphp/phpunit-util": "^1.0",
+ "friendsofphp/php-cs-fixer": "^2.9",
+ "phpunit/phpunit": "^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\ParallelFunctions\\": "src"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "Parallel processing made simple.",
+ "support": {
+ "issues": "https://github.com/amphp/parallel-functions/issues",
+ "source": "https://github.com/amphp/parallel-functions/tree/master"
+ },
+ "time": "2018-10-28T15:29:02+00:00"
+ },
+ {
+ "name": "amphp/parser",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/parser.git",
+ "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/parser/zipball/f83e68f03d5b8e8e0365b8792985a7f341c57ae1",
+ "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.3",
+ "phpunit/phpunit": "^6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Parser\\": "lib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ }
+ ],
+ "description": "A generator parser to make streaming parsers simple.",
+ "homepage": "https://github.com/amphp/parser",
+ "keywords": [
+ "async",
+ "non-blocking",
+ "parser",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/parser/issues",
+ "source": "https://github.com/amphp/parser/tree/is-valid"
+ },
+ "time": "2017-06-06T05:29:10+00:00"
+ },
+ {
+ "name": "amphp/process",
+ "version": "v1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/process.git",
+ "reference": "355b1e561b01c16ab3d78fada1ad47ccc96df70e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/process/zipball/355b1e561b01c16ab3d78fada1ad47ccc96df70e",
+ "reference": "355b1e561b01c16ab3d78fada1ad47ccc96df70e",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2",
+ "amphp/byte-stream": "^1.4",
+ "php": ">=7"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1",
+ "phpunit/phpunit": "^6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Process\\": "lib"
+ },
+ "files": [
+ "lib/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ }
+ ],
+ "description": "Asynchronous process manager.",
+ "homepage": "https://github.com/amphp/process",
+ "support": {
+ "issues": "https://github.com/amphp/process/issues",
+ "source": "https://github.com/amphp/process/tree/master"
+ },
+ "time": "2019-02-26T16:33:03+00:00"
+ },
+ {
+ "name": "amphp/serialization",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/serialization.git",
+ "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1",
+ "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "phpunit/phpunit": "^9 || ^8 || ^7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Serialization\\": "src"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "Serialization tools for IPC and data storage in PHP.",
+ "homepage": "https://github.com/amphp/serialization",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "serialization",
+ "serialize"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/serialization/issues",
+ "source": "https://github.com/amphp/serialization/tree/master"
+ },
+ "time": "2020-03-25T21:39:07+00:00"
+ },
+ {
+ "name": "amphp/sync",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/sync.git",
+ "reference": "613047ac54c025aa800a9cde5b05c3add7327ed4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/sync/zipball/613047ac54c025aa800a9cde5b05c3add7327ed4",
+ "reference": "613047ac54c025aa800a9cde5b05c3add7327ed4",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2.2",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1.1",
+ "phpunit/phpunit": "^9 || ^8 || ^7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Amp\\Sync\\": "src"
+ },
+ "files": [
+ "src/functions.php",
+ "src/ConcurrentIterator/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Stephen Coakley",
+ "email": "me@stephencoakley.com"
+ }
+ ],
+ "description": "Mutex, Semaphore, and other synchronization tools for Amp.",
+ "homepage": "https://github.com/amphp/sync",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "mutex",
+ "semaphore",
+ "synchronization"
+ ],
+ "support": {
+ "issues": "https://github.com/amphp/sync/issues",
+ "source": "https://github.com/amphp/sync/tree/v1.4.0"
+ },
+ "time": "2020-05-07T18:57:50+00:00"
+ },
+ {
+ "name": "beberlei/assert",
+ "version": "v3.2.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/beberlei/assert.git",
+ "reference": "d63a6943fc4fd1a2aedb65994e3548715105abcf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/beberlei/assert/zipball/d63a6943fc4fd1a2aedb65994e3548715105abcf",
+ "reference": "d63a6943fc4fd1a2aedb65994e3548715105abcf",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "php": "^7"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "*",
+ "phpstan/phpstan-shim": "*",
+ "phpunit/phpunit": ">=6.0.0 <8"
+ },
+ "suggest": {
+ "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Assert\\": "lib/Assert"
+ },
+ "files": [
+ "lib/Assert/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Richard Quadling",
+ "email": "rquadling@gmail.com",
+ "role": "Collaborator"
+ }
+ ],
+ "description": "Thin assertion library for input validation in business models.",
+ "keywords": [
+ "assert",
+ "assertion",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/beberlei/assert/issues",
+ "source": "https://github.com/beberlei/assert/tree/v3"
+ },
+ "time": "2019-12-19T17:51:41+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.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "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": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "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": "2020-09-27T13:13:07+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "1.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/composer/xdebug-handler/zipball/6e076a124f7ee146f2487554a94b6a19a74887ba",
+ "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0",
+ "psr/log": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "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"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-24T12:39:10+00:00"
+ },
+ {
+ "name": "hoa/compiler",
+ "version": "3.17.08.08",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Compiler.git",
+ "reference": "aa09caf0bf28adae6654ca6ee415ee2f522672de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Compiler/zipball/aa09caf0bf28adae6654ca6ee415ee2f522672de",
+ "reference": "aa09caf0bf28adae6654ca6ee415ee2f522672de",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/file": "~1.0",
+ "hoa/iterator": "~2.0",
+ "hoa/math": "~1.0",
+ "hoa/protocol": "~1.0",
+ "hoa/regex": "~1.0",
+ "hoa/visitor": "~2.0"
+ },
+ "require-dev": {
+ "hoa/json": "~2.0",
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Compiler\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Compiler library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "algebraic",
+ "ast",
+ "compiler",
+ "context-free",
+ "coverage",
+ "exhaustive",
+ "grammar",
+ "isotropic",
+ "language",
+ "lexer",
+ "library",
+ "ll1",
+ "llk",
+ "parser",
+ "pp",
+ "random",
+ "regular",
+ "rule",
+ "sampler",
+ "syntax",
+ "token",
+ "trace",
+ "uniform"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Compiler",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Compiler/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Compiler"
+ },
+ "time": "2017-08-08T07:44:07+00:00"
+ },
+ {
+ "name": "hoa/consistency",
+ "version": "1.17.05.02",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Consistency.git",
+ "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Consistency/zipball/fd7d0adc82410507f332516faf655b6ed22e4c2f",
+ "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/exception": "~1.0",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "hoa/stream": "~1.0",
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Consistency\\": "."
+ },
+ "files": [
+ "Prelude.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Consistency library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "autoloader",
+ "callable",
+ "consistency",
+ "entity",
+ "flex",
+ "keyword",
+ "library"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Consistency",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Consistency/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Consistency"
+ },
+ "time": "2017-05-02T12:18:12+00:00"
+ },
+ {
+ "name": "hoa/event",
+ "version": "1.17.01.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Event.git",
+ "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Event/zipball/6c0060dced212ffa3af0e34bb46624f990b29c54",
+ "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Event\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Event library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "event",
+ "library",
+ "listener",
+ "observer"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Event",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Event/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Event"
+ },
+ "time": "2017-01-13T15:30:50+00:00"
+ },
+ {
+ "name": "hoa/exception",
+ "version": "1.17.01.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Exception.git",
+ "reference": "091727d46420a3d7468ef0595651488bfc3a458f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Exception/zipball/091727d46420a3d7468ef0595651488bfc3a458f",
+ "reference": "091727d46420a3d7468ef0595651488bfc3a458f",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/event": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Exception\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Exception library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "exception",
+ "library"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Exception",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Exception/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Exception"
+ },
+ "time": "2017-01-16T07:53:27+00:00"
+ },
+ {
+ "name": "hoa/file",
+ "version": "1.17.07.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/File.git",
+ "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/File/zipball/35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
+ "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/event": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/iterator": "~2.0",
+ "hoa/stream": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\File\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\File library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "Socket",
+ "directory",
+ "file",
+ "finder",
+ "library",
+ "link",
+ "temporary"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/File",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/File/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/File"
+ },
+ "time": "2017-07-11T07:42:15+00:00"
+ },
+ {
+ "name": "hoa/iterator",
+ "version": "2.17.01.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Iterator.git",
+ "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Iterator/zipball/d1120ba09cb4ccd049c86d10058ab94af245f0cc",
+ "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Iterator\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Iterator library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "iterator",
+ "library"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Iterator",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Iterator/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Iterator"
+ },
+ "time": "2017-01-10T10:34:47+00:00"
+ },
+ {
+ "name": "hoa/math",
+ "version": "1.17.05.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Math.git",
+ "reference": "7150785d30f5d565704912116a462e9f5bc83a0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Math/zipball/7150785d30f5d565704912116a462e9f5bc83a0c",
+ "reference": "7150785d30f5d565704912116a462e9f5bc83a0c",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/compiler": "~3.0",
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/iterator": "~2.0",
+ "hoa/protocol": "~1.0",
+ "hoa/zformat": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Math\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Math library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "arrangement",
+ "combination",
+ "combinatorics",
+ "counting",
+ "library",
+ "math",
+ "permutation",
+ "sampler",
+ "set"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Math",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Math/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Math"
+ },
+ "time": "2017-05-16T08:02:17+00:00"
+ },
+ {
+ "name": "hoa/protocol",
+ "version": "1.17.01.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Protocol.git",
+ "reference": "5c2cf972151c45f373230da170ea015deecf19e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Protocol/zipball/5c2cf972151c45f373230da170ea015deecf19e2",
+ "reference": "5c2cf972151c45f373230da170ea015deecf19e2",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Protocol\\": "."
+ },
+ "files": [
+ "Wrapper.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Protocol library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "protocol",
+ "resource",
+ "stream",
+ "wrapper"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Protocol",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Protocol/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Protocol"
+ },
+ "time": "2017-01-14T12:26:10+00:00"
+ },
+ {
+ "name": "hoa/regex",
+ "version": "1.17.01.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Regex.git",
+ "reference": "7e263a61b6fb45c1d03d8e5ef77668518abd5bec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Regex/zipball/7e263a61b6fb45c1d03d8e5ef77668518abd5bec",
+ "reference": "7e263a61b6fb45c1d03d8e5ef77668518abd5bec",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/math": "~1.0",
+ "hoa/protocol": "~1.0",
+ "hoa/ustring": "~4.0",
+ "hoa/visitor": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Regex\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Regex library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "compiler",
+ "library",
+ "regex"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Regex",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Regex/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Regex"
+ },
+ "time": "2017-01-13T16:10:24+00:00"
+ },
+ {
+ "name": "hoa/stream",
+ "version": "1.17.02.21",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Stream.git",
+ "reference": "3293cfffca2de10525df51436adf88a559151d82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Stream/zipball/3293cfffca2de10525df51436adf88a559151d82",
+ "reference": "3293cfffca2de10525df51436adf88a559151d82",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/event": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/protocol": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Stream\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Stream library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "Context",
+ "bucket",
+ "composite",
+ "filter",
+ "in",
+ "library",
+ "out",
+ "protocol",
+ "stream",
+ "wrapper"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Stream",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Stream/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Stream"
+ },
+ "time": "2017-02-21T16:01:06+00:00"
+ },
+ {
+ "name": "hoa/ustring",
+ "version": "4.17.01.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Ustring.git",
+ "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Ustring/zipball/e6326e2739178799b1fe3fdd92029f9517fa17a0",
+ "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "suggest": {
+ "ext-iconv": "ext/iconv must be present (or a third implementation) to use Hoa\\Ustring::transcode().",
+ "ext-intl": "To get a better Hoa\\Ustring::toAscii() and Hoa\\Ustring::compareTo()."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Ustring\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Ustring library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "search",
+ "string",
+ "unicode"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Ustring",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Ustring/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Ustring"
+ },
+ "time": "2017-01-16T07:08:25+00:00"
+ },
+ {
+ "name": "hoa/visitor",
+ "version": "2.17.01.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Visitor.git",
+ "reference": "c18fe1cbac98ae449e0d56e87469103ba08f224a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Visitor/zipball/c18fe1cbac98ae449e0d56e87469103ba08f224a",
+ "reference": "c18fe1cbac98ae449e0d56e87469103ba08f224a",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Visitor\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Visitor library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "structure",
+ "visit",
+ "visitor"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Visitor",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Visitor/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Visitor"
+ },
+ "time": "2017-01-16T07:02:03+00:00"
+ },
+ {
+ "name": "hoa/zformat",
+ "version": "1.17.01.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Zformat.git",
+ "reference": "522c381a2a075d4b9dbb42eb4592dd09520e4ac2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/hoaproject/Zformat/zipball/522c381a2a075d4b9dbb42eb4592dd09520e4ac2",
+ "reference": "522c381a2a075d4b9dbb42eb4592dd09520e4ac2",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Zformat\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Zformat library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "parameter",
+ "zformat"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Zformat",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Zformat/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Zformat"
+ },
+ "time": "2017-01-10T10:39:54+00:00"
+ },
+ {
+ "name": "humbug/box",
+ "version": "3.8.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/humbug/box.git",
+ "reference": "43f13dee00a5ddc706d90a64fd7c5916e1588bde"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/humbug/box/zipball/43f13dee00a5ddc706d90a64fd7c5916e1588bde",
+ "reference": "43f13dee00a5ddc706d90a64fd7c5916e1588bde",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/parallel-functions": "^0.1.3",
+ "beberlei/assert": "^3.2",
+ "composer/semver": "^1.5",
+ "composer/xdebug-handler": "^1.3.2",
+ "ext-phar": "*",
+ "hoa/compiler": "^3.17",
+ "humbug/php-scoper": "^0.12",
+ "justinrainbow/json-schema": "^5.2.9",
+ "nikic/iter": "^2.0",
+ "nikic/php-parser": "^4.2",
+ "ocramius/package-versions": "^1.4",
+ "opis/closure": "^3.2",
+ "paragonie/pharaoh": "^0.5",
+ "php": "^7.2",
+ "phpseclib/phpseclib": "^2.0",
+ "psr/log": "^1.0",
+ "seld/jsonlint": "^1.7",
+ "symfony/console": "^4.3.5",
+ "symfony/filesystem": "^4.2",
+ "symfony/finder": "^4.0",
+ "symfony/process": "^4.2",
+ "symfony/var-dumper": "^4.2",
+ "webmozart/path-util": "^2.3"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.3",
+ "infection/infection": "^0.10",
+ "mikey179/vfsstream": "^1.6",
+ "phpunit/phpunit": "^8.1",
+ "symfony/phpunit-bridge": "^4.2"
+ },
+ "suggest": {
+ "ext-openssl": "To accelerate private key generation."
+ },
+ "bin": [
+ "bin/box"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ },
+ "bamarni-bin": {
+ "bin-links": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "KevinGH\\Box\\": "src"
+ },
+ "files": [
+ "src/FileSystem/file_system.php",
+ "src/consts.php",
+ "src/functions.php"
+ ],
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Herrera",
+ "email": "kevin@herrera.io",
+ "homepage": "http://kevin.herrera.io"
+ },
+ {
+ "name": "Théo Fidry",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Fast, zero config application bundler with PHARs.",
+ "keywords": [
+ "phar"
+ ],
+ "support": {
+ "issues": "https://github.com/humbug/box/issues",
+ "source": "https://github.com/humbug/box/tree/3.8.3"
+ },
+ "time": "2019-11-03T17:04:02+00:00"
+ },
+ {
+ "name": "humbug/php-scoper",
+ "version": "0.12.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/humbug/php-scoper.git",
+ "reference": "e69999927460a403f8f07bc91b1db2ff2fe934ce"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/humbug/php-scoper/zipball/e69999927460a403f8f07bc91b1db2ff2fe934ce",
+ "reference": "e69999927460a403f8f07bc91b1db2ff2fe934ce",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.0",
+ "ocramius/package-versions": "^1.1",
+ "php": "^7.2",
+ "roave/better-reflection": "^3.5",
+ "symfony/console": "^3.2 || ^4.0",
+ "symfony/filesystem": "^3.2 || ^4.0",
+ "symfony/finder": "^3.2 || ^4.0"
+ },
+ "replace": {
+ "humbug/php-scoper": "self.version"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.1",
+ "humbug/box": "^3.8",
+ "phpunit/phpunit": "^8.0"
+ },
+ "bin": [
+ "bin/php-scoper"
+ ],
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": false
+ },
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php",
+ "src/json.php"
+ ],
+ "psr-4": {
+ "Humbug\\PhpScoper\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ },
+ {
+ "name": "Théo Fidry",
+ "email": "theo.fidry@gmail.com"
+ },
+ {
+ "name": "PĂĄdraic Brady",
+ "email": "padraic.brady@gmail.com"
+ }
+ ],
+ "description": "Prefixes all PHP namespaces in a file or directory.",
+ "support": {
+ "issues": "https://github.com/humbug/php-scoper/issues",
+ "source": "https://github.com/humbug/php-scoper/tree/master"
+ },
+ "time": "2019-06-09T17:44:41+00:00"
+ },
+ {
+ "name": "jetbrains/phpstorm-stubs",
+ "version": "v2019.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JetBrains/phpstorm-stubs.git",
+ "reference": "9e309771f362e979ecfb429303ad7a402c657234"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/JetBrains/phpstorm-stubs/zipball/9e309771f362e979ecfb429303ad7a402c657234",
+ "reference": "9e309771f362e979ecfb429303ad7a402c657234",
+ "shasum": ""
+ },
+ "require-dev": {
+ "nikic/php-parser": "v4.0.1",
+ "php": "^7.1",
+ "phpdocumentor/reflection-docblock": "^4.3",
+ "phpunit/phpunit": "7.1.4"
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "PHP runtime & extensions header files for PhpStorm",
+ "homepage": "https://www.jetbrains.com/phpstorm",
+ "keywords": [
+ "autocomplete",
+ "code",
+ "inference",
+ "inspection",
+ "jetbrains",
+ "phpstorm",
+ "stubs",
+ "type"
+ ],
+ "support": {
+ "source": "https://github.com/JetBrains/phpstorm-stubs/tree/v2019.1"
+ },
+ "time": "2019-03-25T16:59:23+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "5.2.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/justinrainbow/json-schema.git",
+ "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+ "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+ "json-schema/json-schema-test-suite": "1.2.0",
+ "phpunit/phpunit": "^4.8.35"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/justinrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "support": {
+ "issues": "https://github.com/justinrainbow/json-schema/issues",
+ "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10"
+ },
+ "time": "2020-05-27T16:41:55+00:00"
+ },
+ {
+ "name": "nikic/iter",
+ "version": "v2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/iter.git",
+ "reference": "a7f3aa313c1315e14cf1d7e520c0f781f584a42f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/nikic/iter/zipball/a7f3aa313c1315e14cf1d7e520c0f781f584a42f",
+ "reference": "a7f3aa313c1315e14cf1d7e520c0f781f584a42f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/iter.func.php",
+ "src/iter.php",
+ "src/iter.rewindable.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov",
+ "email": "nikic@php.net"
+ }
+ ],
+ "description": "Iteration primitives using generators",
+ "keywords": [
+ "functional",
+ "generator",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/iter/issues",
+ "source": "https://github.com/nikic/iter/tree/v2.1.0"
+ },
+ "time": "2020-09-19T15:58:13+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "658f1be311a230e0907f5dfe0213742aff0596de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/nikic/PHP-Parser/zipball/658f1be311a230e0907f5dfe0213742aff0596de",
+ "reference": "658f1be311a230e0907f5dfe0213742aff0596de",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.2"
+ },
+ "time": "2020-09-26T10:30:38+00:00"
+ },
+ {
+ "name": "ocramius/package-versions",
+ "version": "1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Ocramius/PackageVersions.git",
+ "reference": "94c9d42a466c57f91390cdd49c81313264f49d85"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/Ocramius/PackageVersions/zipball/94c9d42a466c57f91390cdd49c81313264f49d85",
+ "reference": "94c9d42a466c57f91390cdd49c81313264f49d85",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.1.0 || ^2.0",
+ "php": "^7.4.0"
+ },
+ "require-dev": {
+ "composer/composer": "^1.9.3 || ^2.0@dev",
+ "doctrine/coding-standard": "^7.0.2",
+ "ext-zip": "^1.15.0",
+ "infection/infection": "^0.15.3",
+ "phpunit/phpunit": "^9.1.1",
+ "vimeo/psalm": "^3.9.3"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PackageVersions\\Installer",
+ "branch-alias": {
+ "dev-master": "1.99.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PackageVersions\\": "src/PackageVersions"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "support": {
+ "issues": "https://github.com/Ocramius/PackageVersions/issues",
+ "source": "https://github.com/Ocramius/PackageVersions/tree/1.9.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Ocramius",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ocramius/package-versions",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-06-22T14:15:44+00:00"
+ },
+ {
+ "name": "opis/closure",
+ "version": "3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/opis/closure.git",
+ "reference": "c547f8262a5fa9ff507bd06cc394067b83a75085"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/opis/closure/zipball/c547f8262a5fa9ff507bd06cc394067b83a75085",
+ "reference": "c547f8262a5fa9ff507bd06cc394067b83a75085",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.4 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "jeremeamia/superclosure": "^2.0",
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Opis\\Closure\\": "src/"
+ },
+ "files": [
+ "functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marius Sarca",
+ "email": "marius.sarca@gmail.com"
+ },
+ {
+ "name": "Sorin Sarca",
+ "email": "sarca_sorin@hotmail.com"
+ }
+ ],
+ "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
+ "homepage": "https://opis.io/closure",
+ "keywords": [
+ "anonymous functions",
+ "closure",
+ "function",
+ "serializable",
+ "serialization",
+ "serialize"
+ ],
+ "support": {
+ "issues": "https://github.com/opis/closure/issues",
+ "source": "https://github.com/opis/closure/tree/3.6.0"
+ },
+ "time": "2020-10-11T21:42:15+00:00"
+ },
+ {
+ "name": "paragonie/constant_time_encoding",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/constant_time_encoding.git",
+ "reference": "47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/paragonie/constant_time_encoding/zipball/47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2",
+ "reference": "47a1cedd2e4d52688eb8c96469c05ebc8fd28fa2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7|^8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6|^7",
+ "vimeo/psalm": "^1|^2|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParagonIE\\ConstantTime\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com",
+ "role": "Maintainer"
+ },
+ {
+ "name": "Steve 'Sc00bz' Thomas",
+ "email": "steve@tobtu.com",
+ "homepage": "https://www.tobtu.com",
+ "role": "Original Developer"
+ }
+ ],
+ "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
+ "keywords": [
+ "base16",
+ "base32",
+ "base32_decode",
+ "base32_encode",
+ "base64",
+ "base64_decode",
+ "base64_encode",
+ "bin2hex",
+ "encoding",
+ "hex",
+ "hex2bin",
+ "rfc4648"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/constant_time_encoding/issues",
+ "source": "https://github.com/paragonie/constant_time_encoding"
+ },
+ "time": "2019-11-06T19:20:29+00:00"
+ },
+ {
+ "name": "paragonie/pharaoh",
+ "version": "v0.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/pharaoh.git",
+ "reference": "060418e946de2f39a3618ad70d9b6d0a61437b83"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/paragonie/pharaoh/zipball/060418e946de2f39a3618ad70d9b6d0a61437b83",
+ "reference": "060418e946de2f39a3618ad70d9b6d0a61437b83",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "^2",
+ "paragonie/sodium_compat": "^1.3",
+ "php": "^7",
+ "ulrichsg/getopt-php": "^3"
+ },
+ "require-dev": {
+ "vimeo/psalm": "^1|^2"
+ },
+ "bin": [
+ "pharaoh"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParagonIE\\Pharaoh\\": "src/Pharaoh/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Scott Arciszewski",
+ "email": "scott@paragonie.com",
+ "homepage": "https://paragonie.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Compare PHARs from the Command Line",
+ "keywords": [
+ "auditing",
+ "diff",
+ "phar",
+ "security",
+ "tool",
+ "utility"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/pharaoh/issues",
+ "source": "https://github.com/paragonie/pharaoh"
+ },
+ "time": "2018-11-02T16:45:56+00:00"
+ },
+ {
+ "name": "paragonie/random_compat",
+ "version": "v9.99.100",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">= 7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "keywords": [
+ "csprng",
+ "polyfill",
+ "pseudorandom",
+ "random"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/random_compat/issues",
+ "source": "https://github.com/paragonie/random_compat"
+ },
+ "time": "2020-10-15T08:29:30+00:00"
+ },
+ {
+ "name": "paragonie/sodium_compat",
+ "version": "v1.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/sodium_compat.git",
+ "reference": "bbade402cbe84c69b718120911506a3aa2bae653"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/paragonie/sodium_compat/zipball/bbade402cbe84c69b718120911506a3aa2bae653",
+ "reference": "bbade402cbe84c69b718120911506a3aa2bae653",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/random_compat": ">=1",
+ "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^3|^4|^5|^6|^7"
+ },
+ "suggest": {
+ "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.",
+ "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "autoload.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com"
+ },
+ {
+ "name": "Frank Denis",
+ "email": "jedisct1@pureftpd.org"
+ }
+ ],
+ "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists",
+ "keywords": [
+ "Authentication",
+ "BLAKE2b",
+ "ChaCha20",
+ "ChaCha20-Poly1305",
+ "Chapoly",
+ "Curve25519",
+ "Ed25519",
+ "EdDSA",
+ "Edwards-curve Digital Signature Algorithm",
+ "Elliptic Curve Diffie-Hellman",
+ "Poly1305",
+ "Pure-PHP cryptography",
+ "RFC 7748",
+ "RFC 8032",
+ "Salpoly",
+ "Salsa20",
+ "X25519",
+ "XChaCha20-Poly1305",
+ "XSalsa20-Poly1305",
+ "Xchacha20",
+ "Xsalsa20",
+ "aead",
+ "cryptography",
+ "ecdh",
+ "elliptic curve",
+ "elliptic curve cryptography",
+ "encryption",
+ "libsodium",
+ "php",
+ "public-key cryptography",
+ "secret-key cryptography",
+ "side-channel resistant"
+ ],
+ "support": {
+ "issues": "https://github.com/paragonie/sodium_compat/issues",
+ "source": "https://github.com/paragonie/sodium_compat/tree/v1.13.0"
+ },
+ "time": "2020-03-20T21:48:09+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.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/master"
+ },
+ "time": "2017-09-11T18:02:19+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "4.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c",
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
+ "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.0.5",
+ "mockery/mockery": "^1.0",
+ "phpdocumentor/type-resolver": "0.4.*",
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.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": "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/release/4.x"
+ },
+ "time": "2019-12-28T18:55:12+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5 || ^7.0",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.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"
+ }
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/master"
+ },
+ "time": "2017-07-14T14:27:02+00:00"
+ },
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "2.0.29",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "497856a8d997f640b4a516062f84228a772a48a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/phpseclib/phpseclib/zipball/497856a8d997f640b4a516062f84228a772a48a8",
+ "reference": "497856a8d997f640b4a516062f84228a772a48a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phing/phing": "~2.7",
+ "phpunit/phpunit": "^4.8.35|^5.7|^6.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "suggest": {
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib\\": "phpseclib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-JĂŒrgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "support": {
+ "issues": "https://github.com/phpseclib/phpseclib/issues",
+ "source": "https://github.com/phpseclib/phpseclib/tree/2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-08T04:24:43+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/master"
+ },
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.3"
+ },
+ "time": "2020-03-23T09:12:05+00:00"
+ },
+ {
+ "name": "roave/better-reflection",
+ "version": "3.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Roave/BetterReflection.git",
+ "reference": "a93d26f6f08add54943d752dad1da64c464c2e69"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/Roave/BetterReflection/zipball/a93d26f6f08add54943d752dad1da64c464c2e69",
+ "reference": "a93d26f6f08add54943d752dad1da64c464c2e69",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "jetbrains/phpstorm-stubs": "2019.1",
+ "nikic/php-parser": "^4.2.1",
+ "php": ">=7.2.0,<7.5.0",
+ "phpdocumentor/reflection-docblock": "^4.1.1",
+ "phpdocumentor/type-resolver": "^0.4.0",
+ "roave/signature": "^1.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^6.0",
+ "phpunit/phpunit": "^8.1.0"
+ },
+ "suggest": {
+ "composer/composer": "Required to use the ComposerSourceLocator"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Roave\\BetterReflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "James Titcumb",
+ "email": "james@asgrim.com",
+ "homepage": "https://github.com/asgrim"
+ },
+ {
+ "name": "Gary Hockin",
+ "email": "gary@roave.com",
+ "homepage": "https://github.com/geeh"
+ },
+ {
+ "name": "Jaroslav HanslĂk",
+ "email": "kukulich@kukulich.cz",
+ "homepage": "https://github.com/kukulich"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "Better Reflection - an improved code reflection API",
+ "support": {
+ "issues": "https://github.com/Roave/BetterReflection/issues",
+ "source": "https://github.com/Roave/BetterReflection/tree/3.5.0"
+ },
+ "time": "2019-05-28T00:00:03+00:00"
+ },
+ {
+ "name": "roave/signature",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Roave/Signature.git",
+ "reference": "bbbcc317dfe3a750e27231c5d2130153aa4c41b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/Roave/Signature/zipball/bbbcc317dfe3a750e27231c5d2130153aa4c41b3",
+ "reference": "bbbcc317dfe3a750e27231c5d2130153aa4c41b3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "7.4.*"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.1",
+ "infection/infection": "^0.17.5",
+ "phpunit/phpunit": "^9.3",
+ "vimeo/psalm": "^3.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Roave\\Signature\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Sign and verify stuff",
+ "support": {
+ "issues": "https://github.com/Roave/Signature/issues",
+ "source": "https://github.com/Roave/Signature/tree/1.3.0"
+ },
+ "time": "2020-10-01T08:35:57+00:00"
+ },
+ {
+ "name": "seld/jsonlint",
+ "version": "1.8.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/jsonlint.git",
+ "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/Seldaek/jsonlint/zipball/590cfec960b77fd55e39b7d9246659e95dd6d337",
+ "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "bin": [
+ "bin/jsonlint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "JSON Linter",
+ "keywords": [
+ "json",
+ "linter",
+ "parser",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/jsonlint/issues",
+ "source": "https://github.com/Seldaek/jsonlint/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-08-25T06:56:57+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v4.4.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "20f73dd143a5815d475e0838ff867bce1eebd9d5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/console/zipball/20f73dd143a5815d475e0838ff867bce1eebd9d5",
+ "reference": "20f73dd143a5815d475e0838ff867bce1eebd9d5",
+ "shasum": ""
+ },
+ "require": {
+ "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": {
+ "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",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v4.4.16"
+ },
+ "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-24T11:50:19+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v4.4.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "e74b873395b7213d44d1397bd4a605cd1632a68a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/filesystem/zipball/e74b873395b7213d44d1397bd4a605cd1632a68a",
+ "reference": "e74b873395b7213d44d1397bd4a605cd1632a68a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v4.4.16"
+ },
+ "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-24T11:50:19+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v4.4.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/finder/zipball/26f63b8d4e92f2eecd90f6791a563ebb001abe31",
+ "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v4.4.16"
+ },
+ "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-24T11:50:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "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\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "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-php72",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930",
+ "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930",
+ "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\\Php72\\": ""
+ },
+ "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 backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "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/polyfill-php73",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "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\\Php73\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "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-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": "v4.4.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "2f4b049fb80ca5e9874615a2a85dc2a502090f05"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/process/zipball/2f4b049fb80ca5e9874615a2a85dc2a502090f05",
+ "reference": "2f4b049fb80ca5e9874615a2a85dc2a502090f05",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v4.4.16"
+ },
+ "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-24T11:50:19+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v4.4.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "3718e18b68d955348ad860e505991802c09f5f73"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/var-dumper/zipball/3718e18b68d955348ad860e505991802c09f5f73",
+ "reference": "3718e18b68d955348ad860e505991802c09f5f73",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php72": "~1.5",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+ "symfony/console": "<3.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^3.4|^4.0|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "twig/twig": "^1.34|^2.4|^3.0"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v4.4.16"
+ },
+ "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-26T20:47:51+00:00"
+ },
+ {
+ "name": "ulrichsg/getopt-php",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/getopt-php/getopt-php.git",
+ "reference": "9121d7c2c51a6a59ee407c49a13b4d8cfae71075"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/getopt-php/getopt-php/zipball/9121d7c2c51a6a59ee407c49a13b4d8cfae71075",
+ "reference": "9121d7c2c51a6a59ee407c49a13b4d8cfae71075",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8",
+ "squizlabs/php_codesniffer": "^2.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "GetOpt\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ulrich Schmidt-Goertz",
+ "email": "ulrich@schmidt-goertz.de"
+ },
+ {
+ "name": "Thomas Flori",
+ "email": "thflori@gmail.com"
+ }
+ ],
+ "description": "Command line arguments parser for PHP 5.4 - 7.3",
+ "homepage": "http://getopt-php.github.io/getopt-php",
+ "support": {
+ "issues": "https://github.com/getopt-php/getopt-php/issues",
+ "source": "https://github.com/getopt-php/getopt-php/tree/v3.4.0"
+ },
+ "time": "2020-07-14T06:09:04+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": ""
+ },
+ "require": {
+ "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.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozart/assert/issues",
+ "source": "https://github.com/webmozart/assert/tree/master"
+ },
+ "time": "2020-07-08T17:02:28+00:00"
+ },
+ {
+ "name": "webmozart/path-util",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/path-util.git",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "webmozart/assert": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\PathUtil\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.",
+ "support": {
+ "issues": "https://github.com/webmozart/path-util/issues",
+ "source": "https://github.com/webmozart/path-util/tree/2.3.0"
+ },
+ "time": "2015-12-17T08:42:14+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "platform-overrides": {
+ "php": "7.4"
+ },
+ "plugin-api-version": "2.0.0"
+}
diff --git a/vendor-bin/infection/composer.json b/vendor-bin/infection/composer.json
new file mode 100644
index 0000000..cd1819d
--- /dev/null
+++ b/vendor-bin/infection/composer.json
@@ -0,0 +1,10 @@
+{
+ "require": {
+ "infection/infection": ">=0.15.0"
+ },
+ "config": {
+ "platform": {
+ "php": "7.4"
+ }
+ }
+}
diff --git a/vendor-bin/infection/composer.lock b/vendor-bin/infection/composer.lock
new file mode 100644
index 0000000..0413f0b
--- /dev/null
+++ b/vendor-bin/infection/composer.lock
@@ -0,0 +1,2072 @@
+{
+ "_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#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "455c0255c255c92418d51ee024c94da5",
+ "packages": [
+ {
+ "name": "composer/xdebug-handler",
+ "version": "1.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/composer/xdebug-handler/zipball/6e076a124f7ee146f2487554a94b6a19a74887ba",
+ "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0",
+ "psr/log": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "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"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-24T12:39:10+00:00"
+ },
+ {
+ "name": "infection/abstract-testframework-adapter",
+ "version": "0.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/infection/abstract-testframework-adapter.git",
+ "reference": "c52539339f28d6b67625ff24496289b3e6d66025"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/infection/abstract-testframework-adapter/zipball/c52539339f28d6b67625ff24496289b3e6d66025",
+ "reference": "c52539339f28d6b67625ff24496289b3e6d66025",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3 || ^8.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.8",
+ "friendsofphp/php-cs-fixer": "^2.16",
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Infection\\AbstractTestFramework\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Maks Rafalko",
+ "email": "maks.rafalko@gmail.com"
+ }
+ ],
+ "description": "Abstract Test Framework Adapter for Infection",
+ "support": {
+ "issues": "https://github.com/infection/abstract-testframework-adapter/issues",
+ "source": "https://github.com/infection/abstract-testframework-adapter/tree/0.3"
+ },
+ "time": "2020-08-30T13:50:12+00:00"
+ },
+ {
+ "name": "infection/extension-installer",
+ "version": "0.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/infection/extension-installer.git",
+ "reference": "ff30c0adffcdbc747c96adf92382ccbe271d0afd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/infection/extension-installer/zipball/ff30c0adffcdbc747c96adf92382ccbe271d0afd",
+ "reference": "ff30c0adffcdbc747c96adf92382ccbe271d0afd",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.1 || ^2.0"
+ },
+ "require-dev": {
+ "composer/composer": "^1.9",
+ "friendsofphp/php-cs-fixer": "^2.16",
+ "infection/infection": "^0.15.2",
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.10",
+ "phpstan/phpstan-phpunit": "^0.12.6",
+ "phpstan/phpstan-strict-rules": "^0.12.2",
+ "phpstan/phpstan-webmozart-assert": "^0.12.2",
+ "phpunit/phpunit": "^8.5",
+ "vimeo/psalm": "^3.8"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Infection\\ExtensionInstaller\\Plugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "Infection\\ExtensionInstaller\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Maks Rafalko",
+ "email": "maks.rafalko@gmail.com"
+ }
+ ],
+ "description": "Infection Extension Installer",
+ "support": {
+ "issues": "https://github.com/infection/extension-installer/issues",
+ "source": "https://github.com/infection/extension-installer/tree/0.1.1"
+ },
+ "time": "2020-04-25T22:40:05+00:00"
+ },
+ {
+ "name": "infection/include-interceptor",
+ "version": "0.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/infection/include-interceptor.git",
+ "reference": "e3cf9317a7fd554ab60a5587f028b16418cc4264"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/infection/include-interceptor/zipball/e3cf9317a7fd554ab60a5587f028b16418cc4264",
+ "reference": "e3cf9317a7fd554ab60a5587f028b16418cc4264",
+ "shasum": ""
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.16",
+ "infection/infection": "^0.15.0",
+ "phan/phan": "^2.4 || ^3",
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpstan/phpstan": "^0.12.8",
+ "phpunit/phpunit": "^8.5",
+ "vimeo/psalm": "^3.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Infection\\StreamWrapper\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Maks Rafalko",
+ "email": "maks.rafalko@gmail.com"
+ }
+ ],
+ "description": "Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.",
+ "support": {
+ "issues": "https://github.com/infection/include-interceptor/issues",
+ "source": "https://github.com/infection/include-interceptor/tree/0.2.4"
+ },
+ "time": "2020-08-07T22:40:37+00:00"
+ },
+ {
+ "name": "infection/infection",
+ "version": "0.19.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/infection/infection.git",
+ "reference": "46c17a7fdba19ad05bec7b10e006ce2f00d954a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/infection/infection/zipball/46c17a7fdba19ad05bec7b10e006ce2f00d954a1",
+ "reference": "46c17a7fdba19ad05bec7b10e006ce2f00d954a1",
+ "shasum": ""
+ },
+ "require": {
+ "composer/xdebug-handler": "^1.3.3",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "infection/abstract-testframework-adapter": "^0.3.1",
+ "infection/extension-installer": "^0.1.0",
+ "infection/include-interceptor": "^0.2.4",
+ "justinrainbow/json-schema": "^5.2",
+ "nikic/php-parser": "^4.10.2",
+ "ocramius/package-versions": "^1.2 || ^2.0",
+ "ondram/ci-detector": "^3.3.0",
+ "php": "^7.4 || ^8.0",
+ "sanmai/pipeline": "^3.1 || ^5.0",
+ "sebastian/diff": "^3.0.2 || ^4.0",
+ "seld/jsonlint": "^1.7",
+ "symfony/console": "^3.4.29 || ^4.1.19 || ^5.0",
+ "symfony/filesystem": "^3.4.29 || ^4.1.19 || ^5.0",
+ "symfony/finder": "^3.4.29 || ^4.1.19 || ^5.0",
+ "symfony/process": "^3.4.29 || ^4.1.19 || ^5.0",
+ "thecodingmachine/safe": "^1.0",
+ "webmozart/assert": "^1.3",
+ "webmozart/path-util": "^2.3"
+ },
+ "conflict": {
+ "phpunit/php-code-coverage": ">9 <9.1.4",
+ "symfony/console": "=4.1.5"
+ },
+ "require-dev": {
+ "ext-simplexml": "*",
+ "helmich/phpunit-json-assert": "^3.0",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.8",
+ "phpstan/phpstan-phpunit": "^0.12.6",
+ "phpstan/phpstan-webmozart-assert": "^0.12.2",
+ "phpunit/phpunit": "^9.3.11",
+ "symfony/phpunit-bridge": "^4.4.14 || ^5.1.6",
+ "symfony/yaml": "^5.0",
+ "thecodingmachine/phpstan-safe-rule": "^1.0",
+ "vimeo/psalm": "^4.0"
+ },
+ "bin": [
+ "bin/infection"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Infection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Maks Rafalko",
+ "email": "maks.rafalko@gmail.com",
+ "homepage": "https://twitter.com/maks_rafalko"
+ },
+ {
+ "name": "Oleg Zhulnev",
+ "homepage": "https://github.com/sidz"
+ },
+ {
+ "name": "Gert de Pagter",
+ "homepage": "https://github.com/BackEndTea"
+ },
+ {
+ "name": "Théo FIDRY",
+ "email": "theo.fidry@gmail.com",
+ "homepage": "https://twitter.com/tfidry"
+ },
+ {
+ "name": "Alexey Kopytko",
+ "email": "alexey@kopytko.com",
+ "homepage": "https://www.alexeykopytko.com"
+ },
+ {
+ "name": "Andreas Möller",
+ "email": "am@localheinz.com",
+ "homepage": "https://localheinz.com"
+ }
+ ],
+ "description": "Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.",
+ "keywords": [
+ "coverage",
+ "mutant",
+ "mutation framework",
+ "mutation testing",
+ "testing",
+ "unit testing"
+ ],
+ "support": {
+ "issues": "https://github.com/infection/infection/issues",
+ "source": "https://github.com/infection/infection/tree/0.19.1"
+ },
+ "time": "2020-10-28T09:21:52+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "5.2.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/justinrainbow/json-schema.git",
+ "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+ "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+ "json-schema/json-schema-test-suite": "1.2.0",
+ "phpunit/phpunit": "^4.8.35"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/justinrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "support": {
+ "issues": "https://github.com/justinrainbow/json-schema/issues",
+ "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10"
+ },
+ "time": "2020-05-27T16:41:55+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "658f1be311a230e0907f5dfe0213742aff0596de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/nikic/PHP-Parser/zipball/658f1be311a230e0907f5dfe0213742aff0596de",
+ "reference": "658f1be311a230e0907f5dfe0213742aff0596de",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.2"
+ },
+ "time": "2020-09-26T10:30:38+00:00"
+ },
+ {
+ "name": "ocramius/package-versions",
+ "version": "1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Ocramius/PackageVersions.git",
+ "reference": "94c9d42a466c57f91390cdd49c81313264f49d85"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/Ocramius/PackageVersions/zipball/94c9d42a466c57f91390cdd49c81313264f49d85",
+ "reference": "94c9d42a466c57f91390cdd49c81313264f49d85",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.1.0 || ^2.0",
+ "php": "^7.4.0"
+ },
+ "require-dev": {
+ "composer/composer": "^1.9.3 || ^2.0@dev",
+ "doctrine/coding-standard": "^7.0.2",
+ "ext-zip": "^1.15.0",
+ "infection/infection": "^0.15.3",
+ "phpunit/phpunit": "^9.1.1",
+ "vimeo/psalm": "^3.9.3"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PackageVersions\\Installer",
+ "branch-alias": {
+ "dev-master": "1.99.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PackageVersions\\": "src/PackageVersions"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "support": {
+ "issues": "https://github.com/Ocramius/PackageVersions/issues",
+ "source": "https://github.com/Ocramius/PackageVersions/tree/1.9.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Ocramius",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ocramius/package-versions",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-06-22T14:15:44+00:00"
+ },
+ {
+ "name": "ondram/ci-detector",
+ "version": "3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/OndraM/ci-detector.git",
+ "reference": "594e61252843b68998bddd48078c5058fe9028bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/OndraM/ci-detector/zipball/594e61252843b68998bddd48078c5058fe9028bd",
+ "reference": "594e61252843b68998bddd48078c5058fe9028bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.2",
+ "lmc/coding-standard": "^1.3 || ^2.0",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpstan/extension-installer": "^1.0.3",
+ "phpstan/phpstan": "^0.12.0",
+ "phpstan/phpstan-phpunit": "^0.12.1",
+ "phpunit/phpunit": "^7.1 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "OndraM\\CiDetector\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "OndĆej Machulda",
+ "email": "ondrej.machulda@gmail.com"
+ }
+ ],
+ "description": "Detect continuous integration environment and provide unified access to properties of current build",
+ "keywords": [
+ "CircleCI",
+ "Codeship",
+ "Wercker",
+ "adapter",
+ "appveyor",
+ "aws",
+ "aws codebuild",
+ "bamboo",
+ "bitbucket",
+ "buddy",
+ "ci-info",
+ "codebuild",
+ "continuous integration",
+ "continuousphp",
+ "drone",
+ "github",
+ "gitlab",
+ "interface",
+ "jenkins",
+ "teamcity",
+ "travis"
+ ],
+ "support": {
+ "issues": "https://github.com/OndraM/ci-detector/issues",
+ "source": "https://github.com/OndraM/ci-detector/tree/main"
+ },
+ "time": "2020-09-04T11:21:14+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/master"
+ },
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.3"
+ },
+ "time": "2020-03-23T09:12:05+00:00"
+ },
+ {
+ "name": "sanmai/pipeline",
+ "version": "v5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sanmai/pipeline.git",
+ "reference": "f935e10ddcb758c89829e7b69cfb1dc2b2638518"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/sanmai/pipeline/zipball/f935e10ddcb758c89829e7b69cfb1dc2b2638518",
+ "reference": "f935e10ddcb758c89829e7b69cfb1dc2b2638518",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.8",
+ "friendsofphp/php-cs-fixer": "^2.16",
+ "infection/infection": ">=0.10.5",
+ "league/pipeline": "^1.0 || ^0.3",
+ "phan/phan": "^1.1 || ^2.0 || ^3.0",
+ "php-coveralls/php-coveralls": "^2.4.1",
+ "phpstan/phpstan": ">=0.10",
+ "phpunit/phpunit": "^7.4 || ^8.1 || ^9.4",
+ "vimeo/psalm": "^2.0 || ^3.0 || ^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "v5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Pipeline\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Alexey Kopytko",
+ "email": "alexey@kopytko.com"
+ }
+ ],
+ "description": "General-purpose collections pipeline",
+ "support": {
+ "issues": "https://github.com/sanmai/pipeline/issues",
+ "source": "https://github.com/sanmai/pipeline/tree/v5.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sanmai",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-25T15:20:56+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "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"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "seld/jsonlint",
+ "version": "1.8.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/jsonlint.git",
+ "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/Seldaek/jsonlint/zipball/590cfec960b77fd55e39b7d9246659e95dd6d337",
+ "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "bin": [
+ "bin/jsonlint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "JSON Linter",
+ "keywords": [
+ "json",
+ "linter",
+ "parser",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/jsonlint/issues",
+ "source": "https://github.com/Seldaek/jsonlint/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-08-25T06:56:57+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/console/zipball/e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e",
+ "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.8",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/string": "^5.1"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^4.4|^5.0",
+ "symfony/lock": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/var-dumper": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v5.1.8"
+ },
+ "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-24T12:01:57+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v5.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "df08650ea7aee2d925380069c131a66124d79177"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/filesystem/zipball/df08650ea7aee2d925380069c131a66124d79177",
+ "reference": "df08650ea7aee2d925380069c131a66124d79177",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v5.1.8"
+ },
+ "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-24T12:01:57+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v5.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "e70eb5a69c2ff61ea135a13d2266e8914a67b3a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/finder/zipball/e70eb5a69c2ff61ea135a13d2266e8914a67b3a0",
+ "reference": "e70eb5a69c2ff61ea135a13d2266e8914a67b3a0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v5.1.8"
+ },
+ "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-24T12:01:57+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "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\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "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-intl-grapheme",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+ "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "727d1096295d807c309fb01a851577302394c897"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897",
+ "reference": "727d1096295d807c309fb01a851577302394c897",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.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-php73",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "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\\Php73\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "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-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": "v5.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "f00872c3f6804150d6a0f73b4151daab96248101"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/process/zipball/f00872c3f6804150d6a0f73b4151daab96248101",
+ "reference": "f00872c3f6804150d6a0f73b4151daab96248101",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v5.1.8"
+ },
+ "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-24T12:01:57+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v5.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/string/zipball/a97573e960303db71be0dd8fda9be3bca5e0feea",
+ "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/http-client": "^4.4|^5.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "files": [
+ "Resources/functions.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony String component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v5.1.8"
+ },
+ "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-24T12:01:57+00:00"
+ },
+ {
+ "name": "thecodingmachine/safe",
+ "version": "v1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thecodingmachine/safe.git",
+ "reference": "72d9fee55e14e07a6283c9b3e28c09e85923a148"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/thecodingmachine/safe/zipball/72d9fee55e14e07a6283c9b3e28c09e85923a148",
+ "reference": "72d9fee55e14e07a6283c9b3e28c09e85923a148",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12",
+ "squizlabs/php_codesniffer": "^3.2",
+ "thecodingmachine/phpstan-strict-rules": "^0.12"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Safe\\": [
+ "lib/",
+ "deprecated/",
+ "generated/"
+ ]
+ },
+ "files": [
+ "deprecated/apc.php",
+ "deprecated/libevent.php",
+ "deprecated/mssql.php",
+ "deprecated/stats.php",
+ "lib/special_cases.php",
+ "generated/apache.php",
+ "generated/apcu.php",
+ "generated/array.php",
+ "generated/bzip2.php",
+ "generated/calendar.php",
+ "generated/classobj.php",
+ "generated/com.php",
+ "generated/cubrid.php",
+ "generated/curl.php",
+ "generated/datetime.php",
+ "generated/dir.php",
+ "generated/eio.php",
+ "generated/errorfunc.php",
+ "generated/exec.php",
+ "generated/fileinfo.php",
+ "generated/filesystem.php",
+ "generated/filter.php",
+ "generated/fpm.php",
+ "generated/ftp.php",
+ "generated/funchand.php",
+ "generated/gmp.php",
+ "generated/gnupg.php",
+ "generated/hash.php",
+ "generated/ibase.php",
+ "generated/ibmDb2.php",
+ "generated/iconv.php",
+ "generated/image.php",
+ "generated/imap.php",
+ "generated/info.php",
+ "generated/ingres-ii.php",
+ "generated/inotify.php",
+ "generated/json.php",
+ "generated/ldap.php",
+ "generated/libxml.php",
+ "generated/lzf.php",
+ "generated/mailparse.php",
+ "generated/mbstring.php",
+ "generated/misc.php",
+ "generated/msql.php",
+ "generated/mysql.php",
+ "generated/mysqli.php",
+ "generated/mysqlndMs.php",
+ "generated/mysqlndQc.php",
+ "generated/network.php",
+ "generated/oci8.php",
+ "generated/opcache.php",
+ "generated/openssl.php",
+ "generated/outcontrol.php",
+ "generated/password.php",
+ "generated/pcntl.php",
+ "generated/pcre.php",
+ "generated/pdf.php",
+ "generated/pgsql.php",
+ "generated/posix.php",
+ "generated/ps.php",
+ "generated/pspell.php",
+ "generated/readline.php",
+ "generated/rpminfo.php",
+ "generated/rrd.php",
+ "generated/sem.php",
+ "generated/session.php",
+ "generated/shmop.php",
+ "generated/simplexml.php",
+ "generated/sockets.php",
+ "generated/sodium.php",
+ "generated/solr.php",
+ "generated/spl.php",
+ "generated/sqlsrv.php",
+ "generated/ssdeep.php",
+ "generated/ssh2.php",
+ "generated/stream.php",
+ "generated/strings.php",
+ "generated/swoole.php",
+ "generated/uodbc.php",
+ "generated/uopz.php",
+ "generated/url.php",
+ "generated/var.php",
+ "generated/xdiff.php",
+ "generated/xml.php",
+ "generated/xmlrpc.php",
+ "generated/yaml.php",
+ "generated/yaz.php",
+ "generated/zip.php",
+ "generated/zlib.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHP core functions that throw exceptions instead of returning FALSE on error",
+ "support": {
+ "issues": "https://github.com/thecodingmachine/safe/issues",
+ "source": "https://github.com/thecodingmachine/safe/tree/v1.3.2"
+ },
+ "time": "2020-10-22T09:17:04+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": ""
+ },
+ "require": {
+ "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.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozart/assert/issues",
+ "source": "https://github.com/webmozart/assert/tree/master"
+ },
+ "time": "2020-07-08T17:02:28+00:00"
+ },
+ {
+ "name": "webmozart/path-util",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/path-util.git",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "webmozart/assert": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\PathUtil\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.",
+ "support": {
+ "issues": "https://github.com/webmozart/path-util/issues",
+ "source": "https://github.com/webmozart/path-util/tree/2.3.0"
+ },
+ "time": "2015-12-17T08:42:14+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "platform-overrides": {
+ "php": "7.4"
+ },
+ "plugin-api-version": "2.0.0"
+}
diff --git a/vendor-bin/psalm/composer.json b/vendor-bin/psalm/composer.json
new file mode 100644
index 0000000..630bf7b
--- /dev/null
+++ b/vendor-bin/psalm/composer.json
@@ -0,0 +1,11 @@
+{
+ "require": {
+ "vimeo/psalm": ">=3.17"
+ },
+ "config": {
+ "platform": {
+ "php": "7.4"
+ }
+ }
+
+}
diff --git a/vendor-bin/psalm/composer.lock b/vendor-bin/psalm/composer.lock
new file mode 100644
index 0000000..72ed613
--- /dev/null
+++ b/vendor-bin/psalm/composer.lock
@@ -0,0 +1,2022 @@
+{
+ "_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#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "dcf2aa0ff96ae1bda275c0a3eca08dd3",
+ "packages": [
+ {
+ "name": "amphp/amp",
+ "version": "v2.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/amp.git",
+ "reference": "f220a51458bf4dd0dedebb171ac3457813c72bbc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/amp/zipball/f220a51458bf4dd0dedebb171ac3457813c72bbc",
+ "reference": "f220a51458bf4dd0dedebb171ac3457813c72bbc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1",
+ "ext-json": "*",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^6.0.9 | ^7",
+ "psalm/phar": "^3.11@dev",
+ "react/promise": "^2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Amp\\": "lib"
+ },
+ "files": [
+ "lib/functions.php",
+ "lib/Internal/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Lowrey",
+ "email": "rdlowrey@php.net"
+ },
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Bob Weinand",
+ "email": "bobwei9@hotmail.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A non-blocking concurrency framework for PHP applications.",
+ "homepage": "http://amphp.org/amp",
+ "keywords": [
+ "async",
+ "asynchronous",
+ "awaitable",
+ "concurrency",
+ "event",
+ "event-loop",
+ "future",
+ "non-blocking",
+ "promise"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/amp/issues",
+ "source": "https://github.com/amphp/amp/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/amphp",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-14T21:47:18+00:00"
+ },
+ {
+ "name": "amphp/byte-stream",
+ "version": "v1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/amphp/byte-stream.git",
+ "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/amphp/byte-stream/zipball/f0c20cf598a958ba2aa8c6e5a71c697d652c7088",
+ "reference": "f0c20cf598a958ba2aa8c6e5a71c697d652c7088",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "amphp/php-cs-fixer-config": "dev-master",
+ "amphp/phpunit-util": "^1.4",
+ "friendsofphp/php-cs-fixer": "^2.3",
+ "jetbrains/phpstorm-stubs": "^2019.3",
+ "phpunit/phpunit": "^6 || ^7 || ^8",
+ "psalm/phar": "^3.11.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Amp\\ByteStream\\": "lib"
+ },
+ "files": [
+ "lib/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Aaron Piotrowski",
+ "email": "aaron@trowski.com"
+ },
+ {
+ "name": "Niklas Keller",
+ "email": "me@kelunik.com"
+ }
+ ],
+ "description": "A stream abstraction to make working with non-blocking I/O simple.",
+ "homepage": "http://amphp.org/byte-stream",
+ "keywords": [
+ "amp",
+ "amphp",
+ "async",
+ "io",
+ "non-blocking",
+ "stream"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/amphp",
+ "issues": "https://github.com/amphp/byte-stream/issues",
+ "source": "https://github.com/amphp/byte-stream/tree/master"
+ },
+ "time": "2020-06-29T18:35:05+00:00"
+ },
+ {
+ "name": "composer/package-versions-deprecated",
+ "version": "1.11.99",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/package-versions-deprecated.git",
+ "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/composer/package-versions-deprecated/zipball/c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855",
+ "reference": "c8c9aa8a14cc3d3bec86d0a8c3fa52ea79936855",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.1.0 || ^2.0",
+ "php": "^7 || ^8"
+ },
+ "replace": {
+ "ocramius/package-versions": "1.11.99"
+ },
+ "require-dev": {
+ "composer/composer": "^1.9.3 || ^2.0@dev",
+ "ext-zip": "^1.13",
+ "phpunit/phpunit": "^6.5 || ^7"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PackageVersions\\Installer",
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PackageVersions\\": "src/PackageVersions"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "support": {
+ "issues": "https://github.com/composer/package-versions-deprecated/issues",
+ "source": "https://github.com/composer/package-versions-deprecated/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-08-25T05:50:16+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "4089fddb67bcf6bf860d91b979e95be303835002"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/composer/semver/zipball/4089fddb67bcf6bf860d91b979e95be303835002",
+ "reference": "4089fddb67bcf6bf860d91b979e95be303835002",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.19",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "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": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "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/3.2.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-14T08:51:15+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "1.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/composer/xdebug-handler/zipball/6e076a124f7ee146f2487554a94b6a19a74887ba",
+ "reference": "6e076a124f7ee146f2487554a94b6a19a74887ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0",
+ "psr/log": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "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"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-24T12:39:10+00:00"
+ },
+ {
+ "name": "dnoegel/php-xdg-base-dir",
+ "version": "v0.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "XdgBaseDir\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "implementation of xdg base directory specification for php",
+ "support": {
+ "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues",
+ "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1"
+ },
+ "time": "2019-12-04T15:06:13+00:00"
+ },
+ {
+ "name": "felixfbecker/advanced-json-rpc",
+ "version": "v3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
+ "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/felixfbecker/php-advanced-json-rpc/zipball/0ed363f8de17d284d479ec813c9ad3f6834b5c40",
+ "reference": "0ed363f8de17d284d479ec813c9ad3f6834b5c40",
+ "shasum": ""
+ },
+ "require": {
+ "netresearch/jsonmapper": "^1.0 || ^2.0",
+ "php": ">=7.0",
+ "phpdocumentor/reflection-docblock": "^4.0.0 || ^5.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "AdvancedJsonRpc\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Felix Becker",
+ "email": "felix.b@outlook.com"
+ }
+ ],
+ "description": "A more advanced JSONRPC implementation",
+ "support": {
+ "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
+ "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/master"
+ },
+ "time": "2020-03-11T15:21:41+00:00"
+ },
+ {
+ "name": "felixfbecker/language-server-protocol",
+ "version": "v1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
+ "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/felixfbecker/php-language-server-protocol/zipball/85e83cacd2ed573238678c6875f8f0d7ec699541",
+ "reference": "85e83cacd2ed573238678c6875f8f0d7ec699541",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "*",
+ "squizlabs/php_codesniffer": "^3.1",
+ "vimeo/psalm": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "LanguageServerProtocol\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "ISC"
+ ],
+ "authors": [
+ {
+ "name": "Felix Becker",
+ "email": "felix.b@outlook.com"
+ }
+ ],
+ "description": "PHP classes for the Language Server Protocol",
+ "keywords": [
+ "language",
+ "microsoft",
+ "php",
+ "server"
+ ],
+ "support": {
+ "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
+ "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.0"
+ },
+ "time": "2020-10-23T13:55:30+00:00"
+ },
+ {
+ "name": "netresearch/jsonmapper",
+ "version": "v2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cweiske/jsonmapper.git",
+ "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/cweiske/jsonmapper/zipball/e0f1e33a71587aca81be5cffbb9746510e1fe04e",
+ "reference": "e0f1e33a71587aca81be5cffbb9746510e1fe04e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8.35 || ~5.7 || ~6.4 || ~7.0",
+ "squizlabs/php_codesniffer": "~3.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "JsonMapper": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "OSL-3.0"
+ ],
+ "authors": [
+ {
+ "name": "Christian Weiske",
+ "email": "cweiske@cweiske.de",
+ "homepage": "http://github.com/cweiske/jsonmapper/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Map nested JSON structures onto PHP classes",
+ "support": {
+ "email": "cweiske@cweiske.de",
+ "issues": "https://github.com/cweiske/jsonmapper/issues",
+ "source": "https://github.com/cweiske/jsonmapper/tree/master"
+ },
+ "time": "2020-04-16T18:48:43+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "658f1be311a230e0907f5dfe0213742aff0596de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/nikic/PHP-Parser/zipball/658f1be311a230e0907f5dfe0213742aff0596de",
+ "reference": "658f1be311a230e0907f5dfe0213742aff0596de",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.2"
+ },
+ "time": "2020-09-26T10:30:38+00:00"
+ },
+ {
+ "name": "openlss/lib-array2xml",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nullivex/lib-array2xml.git",
+ "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
+ "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "LSS": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Bryan Tong",
+ "email": "bryan@nullivex.com",
+ "homepage": "https://www.nullivex.com"
+ },
+ {
+ "name": "Tony Butler",
+ "email": "spudz76@gmail.com",
+ "homepage": "https://www.nullivex.com"
+ }
+ ],
+ "description": "Array2XML conversion library credit to lalit.org",
+ "homepage": "https://www.nullivex.com",
+ "keywords": [
+ "array",
+ "array conversion",
+ "xml",
+ "xml conversion"
+ ],
+ "support": {
+ "issues": "https://github.com/nullivex/lib-array2xml/issues",
+ "source": "https://github.com/nullivex/lib-array2xml/tree/master"
+ },
+ "time": "2019-03-29T20:06:56+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": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/master"
+ },
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.3"
+ },
+ "time": "2020-03-23T09:12:05+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "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"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/console/zipball/e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e",
+ "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.8",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/string": "^5.1"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^4.4|^5.0",
+ "symfony/lock": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/var-dumper": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v5.1.8"
+ },
+ "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-24T12:01:57+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "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\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "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-intl-grapheme",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+ "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "727d1096295d807c309fb01a851577302394c897"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897",
+ "reference": "727d1096295d807c309fb01a851577302394c897",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.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-php73",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "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\\Php73\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "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-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/service-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/master"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v5.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/symfony/string/zipball/a97573e960303db71be0dd8fda9be3bca5e0feea",
+ "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/http-client": "^4.4|^5.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "files": [
+ "Resources/functions.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony String component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v5.1.8"
+ },
+ "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-24T12:01:57+00:00"
+ },
+ {
+ "name": "vimeo/psalm",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vimeo/psalm.git",
+ "reference": "b1e2e30026936ef8d5bf6a354d1c3959b6231f44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/vimeo/psalm/zipball/b1e2e30026936ef8d5bf6a354d1c3959b6231f44",
+ "reference": "b1e2e30026936ef8d5bf6a354d1c3959b6231f44",
+ "shasum": ""
+ },
+ "require": {
+ "amphp/amp": "^2.1",
+ "amphp/byte-stream": "^1.5",
+ "composer/package-versions-deprecated": "^1.8.0",
+ "composer/semver": "^1.4 || ^2.0 || ^3.0",
+ "composer/xdebug-handler": "^1.1",
+ "dnoegel/php-xdg-base-dir": "^0.1.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "felixfbecker/advanced-json-rpc": "^3.0.3",
+ "felixfbecker/language-server-protocol": "^1.4",
+ "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0",
+ "nikic/php-parser": "^4.10.1",
+ "openlss/lib-array2xml": "^1.0",
+ "php": "^7.3|^8",
+ "sebastian/diff": "^3.0 || ^4.0",
+ "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0",
+ "webmozart/glob": "^4.1",
+ "webmozart/path-util": "^2.3"
+ },
+ "provide": {
+ "psalm/psalm": "self.version"
+ },
+ "require-dev": {
+ "amphp/amp": "^2.4.2",
+ "bamarni/composer-bin-plugin": "^1.2",
+ "brianium/paratest": "^4.0.0",
+ "ext-curl": "*",
+ "phpdocumentor/reflection-docblock": "^5",
+ "phpmyadmin/sql-parser": "5.1.0",
+ "phpspec/prophecy": ">=1.9.0",
+ "phpunit/phpunit": "^9.0",
+ "psalm/plugin-phpunit": "^0.13",
+ "slevomat/coding-standard": "^5.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "symfony/process": "^4.3",
+ "weirdan/prophecy-shim": "^1.0 || ^2.0"
+ },
+ "suggest": {
+ "ext-igbinary": "^2.0.5"
+ },
+ "bin": [
+ "psalm",
+ "psalm-language-server",
+ "psalm-plugin",
+ "psalm-refactor",
+ "psalter"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev",
+ "dev-3.x": "3.x-dev",
+ "dev-2.x": "2.x-dev",
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psalm\\": "src/Psalm/"
+ },
+ "files": [
+ "src/functions.php",
+ "src/spl_object_id.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matthew Brown"
+ }
+ ],
+ "description": "A static analysis tool for finding errors in PHP applications",
+ "keywords": [
+ "code",
+ "inspection",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/vimeo/psalm/issues",
+ "source": "https://github.com/vimeo/psalm/tree/4.0.1"
+ },
+ "time": "2020-10-20T13:40:17+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": ""
+ },
+ "require": {
+ "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.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozart/assert/issues",
+ "source": "https://github.com/webmozart/assert/tree/master"
+ },
+ "time": "2020-07-08T17:02:28+00:00"
+ },
+ {
+ "name": "webmozart/glob",
+ "version": "4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/glob.git",
+ "reference": "3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/webmozart/glob/zipball/3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe",
+ "reference": "3cbf63d4973cf9d780b93d2da8eec7e4a9e63bbe",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3|^7.0",
+ "webmozart/path-util": "^2.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1",
+ "symfony/filesystem": "^2.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Glob\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "A PHP implementation of Ant's glob.",
+ "support": {
+ "issues": "https://github.com/webmozart/glob/issues",
+ "source": "https://github.com/webmozart/glob/tree/master"
+ },
+ "time": "2015-12-29T11:14:33+00:00"
+ },
+ {
+ "name": "webmozart/path-util",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/path-util.git",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://github.com/gitapi/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "webmozart/assert": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\PathUtil\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.",
+ "support": {
+ "issues": "https://github.com/webmozart/path-util/issues",
+ "source": "https://github.com/webmozart/path-util/tree/2.3.0"
+ },
+ "time": "2015-12-17T08:42:14+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "platform-overrides": {
+ "php": "7.4"
+ },
+ "plugin-api-version": "2.0.0"
+}