diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 000000000..606316e39 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,31 @@ +engines: + phpcodesniffer: + enabled: true + config: + file_extensions: "php,inc,lib" + standard: "PSR1,PSR2,Yii2" + ignore_warnings: true + encoding: utf-8 + duplication: + enabled: true + config: + languages: + - javascript + - php + eslint: + enabled: true + fixme: + enabled: true + phpmd: + enabled: true + config: + rulesets: "codesize,design,unusedcode,phpmd.xml" +ratings: + paths: + - "**.js" + - "**.php" +exclude_paths: +- views/ +- tests/ +- docs/ +- requirements.php diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..a1a3832f6 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +SMTP_PASS=123abc123 diff --git a/.gitattributes b/.gitattributes index 3e9092c68..f4da8fbbe 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,5 +2,4 @@ /.github export-ignore /.gitattributes export-ignore /.scrutinizer.yml export-ignore -/.travis.yml export-ignore /docs export-ignore diff --git a/.gitignore b/.gitignore index 5bd9be80b..a8761e341 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,13 @@ phpunit.phar tests/_output/* tests/_support/_generated +tests/chromedriver #vagrant folder -/.vagrant \ No newline at end of file +/.vagrant + +# codesniffer cache +.php_cs.cache + +# local environment variables +.env diff --git a/.php_cs.dist b/.php_cs.dist new file mode 100644 index 000000000..a3de02c63 --- /dev/null +++ b/.php_cs.dist @@ -0,0 +1,139 @@ +exclude(['views', 'tests', 'templates']) + ->in(__DIR__); + +return PhpCsFixer\Config::create() + ->setUsingCache(true) + ->setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => [ + 'syntax' => 'short', + ], + 'binary_operator_spaces' => [ + 'align_double_arrow' => false, + 'align_equals' => false, + ], + 'blank_line_after_opening_tag' => true, + 'braces' => [ + 'allow_single_line_closure' => true, + ], + 'cast_spaces' => true, + 'concat_space' => [ + 'spacing' => 'one', + ], + 'dir_constant' => true, + 'ereg_to_preg' => true, + 'function_typehint_space' => true, + 'hash_to_slash_comment' => true, + 'include' => true, + 'heredoc_to_nowdoc' => true, + 'is_null' => [ + 'use_yoda_style' => false, + ], + 'linebreak_after_opening_tag' => true, + 'lowercase_cast' => true, + 'magic_constant_casing' => true, +// 'mb_str_functions' => true, // needs more discussion +// 'method_separation' => true, // conflicts with current Yii style with double line between properties and methods + 'modernize_types_casting' => true, + 'native_function_casing' => true, + 'new_with_braces' => true, + 'no_alias_functions' => true, + 'no_blank_lines_after_class_opening' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_empty_comment' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_extra_consecutive_blank_lines' => [ + 'tokens' => [ + 'break', + 'continue', +// 'extra', // conflicts with current Yii style with double line between properties and methods + 'return', + 'throw', + 'use', + 'use_trait', +// 'curly_brace_block', // breaks namespaces blocks + 'parenthesis_brace_block', + 'square_brace_block', + ], + ], + 'no_leading_import_slash' => true, + 'no_leading_namespace_whitespace' => true, + 'no_mixed_echo_print' => true, + 'no_multiline_whitespace_around_double_arrow' => true, + 'no_multiline_whitespace_before_semicolons' => true, + 'no_php4_constructor' => true, + 'no_short_bool_cast' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_spaces_around_offset' => true, + 'no_trailing_comma_in_list_call' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_unneeded_control_parentheses' => true, + 'no_unused_imports' => true, + 'no_useless_else' => true, + 'no_useless_return' => true, + 'no_whitespace_before_comma_in_array' => true, + 'no_whitespace_in_blank_line' => true, + 'non_printable_character' => true, + 'normalize_index_brace' => true, + 'object_operator_without_whitespace' => true, +// 'ordered_class_elements' => [ // needs more discussion +// 'order' => [ +// 'use_trait', +// 'constant_public', +// 'constant_protected', +// 'constant_private', +// 'property_public', +// 'property_protected', +// 'property_private', +// 'construct', +// 'destruct', +// 'magic', +// ], +// ], + 'ordered_imports' => [ + 'sortAlgorithm' => 'alpha', + 'importsOrder' => [ + 'const', + 'function', + 'class', + ], + ], + 'php_unit_construct' => true, + 'php_unit_dedicate_assert' => true, + 'php_unit_fqcn_annotation' => true, +// 'php_unit_strict' => true, // needs more attention + 'phpdoc_add_missing_param_annotation' => true, + 'phpdoc_indent' => true, +// 'phpdoc_inline_tag' => true, // see https://github.com/yiisoft/yii2/issues/11635 + 'phpdoc_no_access' => true, + 'phpdoc_no_empty_return' => true, + 'phpdoc_no_package' => true, + 'phpdoc_no_useless_inheritdoc' => true, +// 'phpdoc_order', // may be useful, but should be configurable: https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues/1602 + 'phpdoc_return_self_reference' => true, + 'phpdoc_scalar' => true, + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_summary' => true, +// 'phpdoc_to_comment' => true, // breaks phpdoc for define('CONSTANT', $value); + 'phpdoc_trim' => true, + 'phpdoc_types' => true, + 'phpdoc_var_without_name' => true, + 'protected_to_private' => true, + 'psr4' => true, + 'self_accessor' => true, + 'short_scalar_cast' => true, + 'single_blank_line_before_namespace' => true, + 'single_quote' => true, + 'standardize_not_equals' => true, + 'ternary_operator_spaces' => true, + 'trailing_comma_in_multiline_array' => true, + 'trim_array_spaces' => true, + 'unary_operator_spaces' => true, + 'whitespace_after_comma_in_array' => true, + ]) + ->setFinder($finder); diff --git a/.travis.yml b/.travis.yml index 4583c1bf4..78f795c81 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,46 +1,45 @@ -language: php +# Travis CI configuration file. + +dist: xenial -matrix: - fast_finish: true - include: - - php: "7.3" - - php: "7.2" - - php: "7.1" - - php: "7.0" - - php: "5.6" # faster builds on new travis setup not using sudo sudo: false -# cache vendor dirs -cache: - directories: - - $HOME/.composer/cache +language: php + +php: + - 7.3 services: - - mysql + - postgresql -before_install: - - mysql -e 'CREATE DATABASE IF NOT EXISTS yii2_basic_tests;' +addons: + postgresql: 10 + chrome: stable + +before_install: phpenv config-rm xdebug.ini install: - - travis_retry composer self-update && composer --version - - travis_retry composer update --dev --prefer-dist --no-interaction - # install php extensions - - | - if (php --version | grep -i HipHop > /dev/null); then - echo "Skipping imagick and gmagick tests on HHVM" - else - pear config-set preferred_state beta - printf "\n" | pecl install imagick - # gmagick is not installed on travis currently - #printf "\n" | pecl install gmagick - fi -# setup application: - - | - sed -i "s/'cookieValidationKey' => ''/'cookieValidationKey' => 'testkey'/" config/web.php + - composer install --no-interaction + +before_script: + - db/create.sh travis + - tests/bin/yii migrate/up --interactive=0 + - db/load.sh test + - tests/download-chromedriver.sh + - tests/run-acceptance.sh + - sleep 3 script: - - | - php -S localhost:8080 -t web > /dev/null 2>&1 & - vendor/bin/codecept run + - vendor/bin/codecept run + - vendor/bin/phpcs + +notifications: + email: false + +# # Cache folder, you can delete cache from Travis CI web interface +# cache: +# directories: +# - vendor +# - $HOME/.composer/cache diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..9b5d07d63 --- /dev/null +++ b/Makefile @@ -0,0 +1,59 @@ +.PHONY: help test tests codecept fastcs fast cs phpcs doc docs \ + api guia guide install psql + +help: ## Muestra este mensaje de ayuda + @echo "Uso: make [\033[36mcomando\033[0m]\n\nComandos:\n" + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-10s\033[0m %s\n", $$1, $$2}' + +test: ## Ejecuta todos los tests y pasa CodeSniffer +tests: ## Ídem +test tests: codecept phpcs + +codecept: ## Ejecuta los tests unitarios, funcionales y de aceptación +codecept: + @tests/bin/yii migrate/up --interactive=0 + @db/load.sh test + @tests/run-acceptance.sh + vendor/bin/codecept run || true + @tests/run-acceptance.sh -d + +fastcs: ## Ejecuta los tests unitarios y funcionales y pasa CodeSniffer +fastcs: fast cs + +fast: ## Ejecuta los tests unitarios y funcionales +fast: + vendor/bin/codecept run unit,functional + +cs: ## Pasa CodeSniffer +phpcs: ## Ídem +cs phpcs: + vendor/bin/phpcs + +doc: ## Genera toda la documentación (guía + API) +docs: ## Ídem +doc docs: + guia/scripts/publish-docs.sh + +api: ## Genera sólo el API del proyecto + guia/scripts/publish-docs.sh -a + +guia: ## Genera sólo la guía del proyecto +guide: ## Ídem +guia guide: + guia/scripts/publish-docs.sh -g + +serve: ## Arranca el servidor web integrado + ./yii serve + +install: ## Ejecuta la post-instalación + composer install + composer run-script post-create-project-cmd + +psql: ## Arranca una consola SQL en la BD principal + db/psql.sh + +psql_test: ## Arranca una consola SQL en la BD de pruebas + db/psql.sh test + +issues: ## Actualiza incidencias en GitHub + cd guia && make diff --git a/Procfile b/Procfile new file mode 100644 index 000000000..bc8bafcd4 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: vendor/bin/heroku-php-apache2 web/ diff --git a/assets/AppAsset.php b/assets/AppAsset.php index 47932b165..13c23f0a8 100644 --- a/assets/AppAsset.php +++ b/assets/AppAsset.php @@ -26,6 +26,8 @@ class AppAsset extends AssetBundle ]; public $depends = [ 'yii\web\YiiAsset', - 'yii\bootstrap\BootstrapAsset', + 'yii\bootstrap4\BootstrapAsset', + 'yii\bootstrap4\BootstrapPluginAsset', + 'xtetis\bootstrap4glyphicons\assets\GlyphiconAsset', ]; } diff --git a/codeception.yml b/codeception.yml index d5aecb308..cb1a3f0aa 100644 --- a/codeception.yml +++ b/codeception.yml @@ -12,6 +12,11 @@ modules: config: Yii2: configFile: 'config/test.php' + enabled: + - Db: + dsn: 'pgsql:host=localhost;dbname=proyecto_test' + user: 'proyecto' + password: 'proyecto' # To enable code coverage: #coverage: diff --git a/components/HerokuTarget.php b/components/HerokuTarget.php new file mode 100644 index 000000000..644df4df9 --- /dev/null +++ b/components/HerokuTarget.php @@ -0,0 +1,23 @@ +messages)) . "\n"; + $stdout = fopen('php://stdout', 'w'); + if ($stdout === false) { + throw new InvalidConfigException('Unable to open stdout stream'); + } + fwrite($stdout, $messages); + fclose($stdout); + } +} diff --git a/composer.json b/composer.json index 324bd02ea..f01877a42 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,12 @@ { - "name": "yiisoft/yii2-app-basic", + "name": "ricpelo/yii2-app-basic", "description": "Yii 2 Basic Project Template", - "keywords": ["yii2", "framework", "basic", "project template"], + "keywords": [ + "yii2", + "framework", + "basic", + "project template" + ], "homepage": "http://www.yiiframework.com/", "type": "project", "license": "BSD-3-Clause", @@ -12,24 +17,38 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { - "php": ">=5.4.0", - "yiisoft/yii2": "~2.0.14", - "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" + "php": "^7.3.0", + "ext-gd": "*", + "ext-intl": "*", + "yiisoft/yii2": "~2.0.17", + "yiisoft/yii2-bootstrap4": "^2.0.0", + "yiisoft/yii2-swiftmailer": "~2.1.0", + "xtetis/yii2-bootstrap4-glyphicons": "dev-master" }, "require-dev": { "yiisoft/yii2-debug": "~2.1.0", "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - "codeception/codeception": "4.0.x-dev | ^4.0", - "codeception/verify": "~0.5.0 || ~1.1.0", + "yiisoft/yii2-shell": "~2.0.2", + "yiisoft/yii2-apidoc": "dev-project", + "codeception/codeception": "^4.0", + "codeception/verify": "dev-patch-1", "codeception/specify": "~0.4.6", "symfony/browser-kit": ">=2.7 <=4.2.4", "codeception/module-filesystem": "^1.0.0", "codeception/module-yii2": "^1.0.0", - "codeception/module-asserts": "^1.0.0" + "codeception/module-asserts": "^1.0.0", + "codeception/module-db": "^1.0", + "codeception/module-webdriver": "^1.0", + "squizlabs/php_codesniffer": "^2.0", + "yiisoft/yii2-coding-standards": "^2.0", + "friendsofphp/php-cs-fixer": "^2.8", + "phpoffice/phpspreadsheet": "^1.1", + "symfony/dotenv": "^4.0", + "knplabs/github-api": "^2.11", + "php-http/guzzle6-adapter": "^1.1" }, "config": { "process-timeout": 1800, @@ -43,6 +62,7 @@ ], "post-create-project-cmd": [ "yii\\composer\\Installer::postCreateProject", + "[ -f setup.sh ] && ./setup.sh || true", "yii\\composer\\Installer::postInstall" ] }, @@ -66,6 +86,14 @@ { "type": "composer", "url": "https://asset-packagist.org/" + }, + { + "type": "vcs", + "url": "https://github.com/ricpelo/yii2-apidoc" + }, + { + "type": "vcs", + "url": "https://github.com/ricpelo/Verify" } ] } diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..95f79e7e1 --- /dev/null +++ b/composer.lock @@ -0,0 +1,6910 @@ +{ + "_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": "43f441f5a09b1f4848ad8bb119f5a6ee", + "packages": [ + { + "name": "bower-asset/inputmask", + "version": "3.3.11", + "source": { + "type": "git", + "url": "https://github.com/RobinHerbots/Inputmask.git", + "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/RobinHerbots/Inputmask/zipball/5e670ad62f50c738388d4dcec78d2888505ad77b", + "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b" + }, + "require": { + "bower-asset/jquery": ">=1.7" + }, + "type": "bower-asset", + "license": [ + "http://opensource.org/licenses/mit-license.php" + ] + }, + { + "name": "bower-asset/jquery", + "version": "3.4.1", + "source": { + "type": "git", + "url": "https://github.com/jquery/jquery-dist.git", + "reference": "15bc73803f76bc53b654b9fdbbbc096f56d7c03d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/15bc73803f76bc53b654b9fdbbbc096f56d7c03d", + "reference": "15bc73803f76bc53b654b9fdbbbc096f56d7c03d" + }, + "type": "bower-asset", + "license": [ + "MIT" + ] + }, + { + "name": "bower-asset/punycode", + "version": "v1.3.2", + "source": { + "type": "git", + "url": "https://github.com/bestiejs/punycode.js.git", + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" + }, + "type": "bower-asset" + }, + { + "name": "bower-asset/yii2-pjax", + "version": "2.0.7.1", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/jquery-pjax.git", + "reference": "aef7b953107264f00234902a3880eb50dafc48be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/aef7b953107264f00234902a3880eb50dafc48be", + "reference": "aef7b953107264f00234902a3880eb50dafc48be" + }, + "require": { + "bower-asset/jquery": ">=1.8" + }, + "type": "bower-asset", + "license": [ + "MIT" + ] + }, + { + "name": "cebe/markdown", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown.git", + "reference": "8efb4268c90add2eee0edacf503ae71f22ccc745" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown/zipball/8efb4268c90add2eee0edacf503ae71f22ccc745", + "reference": "8efb4268c90add2eee0edacf503ae71f22ccc745", + "shasum": "" + }, + "require": { + "lib-pcre": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "cebe/indent": "*", + "facebook/xhprof": "*@dev", + "phpunit/phpunit": "3.7.*" + }, + "bin": [ + "bin/markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP", + "homepage": "https://github.com/cebe/markdown#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "markdown", + "markdown-extra" + ], + "time": "2018-03-26T11:15:02+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "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": "2019-10-30T14:39:59+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.14", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "c4b8d12921999d8a561004371701dbc2e05b5ece" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/c4b8d12921999d8a561004371701dbc2e05b5ece", + "reference": "c4b8d12921999d8a561004371701dbc2e05b5ece", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2020-01-05T14:11:20+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.12.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "a617e55bc62a87eec73bd456d146d134ad716f03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/a617e55bc62a87eec73bd456d146d134ad716f03", + "reference": "a617e55bc62a87eec73bd456d146d134ad716f03", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com/" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "time": "2019-10-28T03:44:26+00:00" + }, + { + "name": "npm-asset/bootstrap", + "version": "4.4.1", + "dist": { + "type": "tar", + "url": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz" + }, + "type": "npm-asset", + "license": [ + "MIT" + ] + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.2.3", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "~2.0", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses", + "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com/", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2019-11-12T09:31:26+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/a019efccc03f1a335af6b4f20c30f5ea8060be36", + "reference": "a019efccc03f1a335af6b4f20c30f5ea8060be36", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "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 Iconv extension", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.9" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "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" + ], + "time": "2019-11-27T14:18:11+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "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" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "xtetis/yii2-bootstrap4-glyphicons", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://bitbucket.org/xtetis/yii2-bootstrap4-glyphicons.git", + "reference": "98fa4a8cdcb1b4cc562c536e407a78085550b33b" + }, + "dist": { + "type": "zip", + "url": "https://bitbucket.org/xtetis/yii2-bootstrap4-glyphicons/get/98fa4a8cdcb1b4cc562c536e407a78085550b33b.zip", + "reference": "98fa4a8cdcb1b4cc562c536e407a78085550b33b", + "shasum": "" + }, + "require": { + "yiisoft/yii2": "~2.0.0" + }, + "type": "yii2-extension", + "autoload": { + "psr-4": { + "xtetis\\bootstrap4glyphicons\\": "src\\" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "xtetis", + "email": "tihonenkovaleriy@gmail.com" + } + ], + "description": "How to use Glyphicons with Bootstrap 4", + "homepage": "https://bitbucket.org/xtetis/yii2-bootstrap4-glyphicons", + "keywords": [ + "asset", + "bootstrap4", + "extension", + "glyphicons", + "yii2" + ], + "time": "2019-05-13T16:08:48+00:00" + }, + { + "name": "yiisoft/yii2", + "version": "2.0.31", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-framework.git", + "reference": "0329b2db8bbf9719b1add17d6defd2d6045b4f09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/0329b2db8bbf9719b1add17d6defd2d6045b4f09", + "reference": "0329b2db8bbf9719b1add17d6defd2d6045b4f09", + "shasum": "" + }, + "require": { + "bower-asset/inputmask": "~3.2.2 | ~3.3.5", + "bower-asset/jquery": "3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", + "bower-asset/punycode": "1.3.*", + "bower-asset/yii2-pjax": "~2.0.1", + "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", + "ext-ctype": "*", + "ext-mbstring": "*", + "ezyang/htmlpurifier": "~4.6", + "lib-pcre": "*", + "php": ">=5.4.0", + "yiisoft/yii2-composer": "~2.0.4" + }, + "bin": [ + "yii" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "http://www.yiiframework.com/", + "role": "Founder and project lead" + }, + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "http://rmcreative.ru/", + "role": "Core framework development" + }, + { + "name": "Maurizio Domba", + "homepage": "http://mdomba.info/", + "role": "Core framework development" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Core framework development" + }, + { + "name": "Timur Ruziev", + "email": "resurtm@gmail.com", + "homepage": "http://resurtm.com/", + "role": "Core framework development" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com", + "role": "Core framework development" + }, + { + "name": "Dmitry Naumenko", + "email": "d.naumenko.a@gmail.com", + "role": "Core framework development" + }, + { + "name": "Boudewijn Vahrmeijer", + "email": "info@dynasource.eu", + "homepage": "http://dynasource.eu/", + "role": "Core framework development" + } + ], + "description": "Yii PHP Framework Version 2", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "framework", + "yii2" + ], + "time": "2019-12-18T12:52:03+00:00" + }, + { + "name": "yiisoft/yii2-bootstrap4", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-bootstrap4.git", + "reference": "c67ae3f3624c35d977841f6b18d0d752ebed6420" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap4/zipball/c67ae3f3624c35d977841f6b18d0d752ebed6420", + "reference": "c67ae3f3624c35d977841f6b18d0d752ebed6420", + "shasum": "" + }, + "require": { + "npm-asset/bootstrap": "^4.3", + "yiisoft/yii2": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "<7", + "yiisoft/yii2-coding-standards": "~2.0" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\bootstrap4\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "http://www.yiiframework.com/" + }, + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "http://rmcreative.ru/" + }, + { + "name": "Antonio Ramirez", + "email": "amigo.cobos@gmail.com" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com" + }, + { + "name": "Simon Karlen", + "email": "simi.albi@outlook.com" + } + ], + "description": "The Twitter Bootstrap extension for the Yii framework", + "keywords": [ + "bootstrap", + "bootstrap4", + "yii2" + ], + "time": "2019-10-08T11:01:37+00:00" + }, + { + "name": "yiisoft/yii2-composer", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-composer.git", + "reference": "5c7ca9836cf80b34db265332a7f2f8438eb469b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/5c7ca9836cf80b34db265332a7f2f8438eb469b9", + "reference": "5c7ca9836cf80b34db265332a7f2f8438eb469b9", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0" + }, + "require-dev": { + "composer/composer": "^1.0", + "phpunit/phpunit": "<7" + }, + "type": "composer-plugin", + "extra": { + "class": "yii\\composer\\Plugin", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\composer\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc" + } + ], + "description": "The composer plugin for Yii extension installer", + "keywords": [ + "composer", + "extension installer", + "yii2" + ], + "time": "2019-07-16T13:22:30+00:00" + }, + { + "name": "yiisoft/yii2-swiftmailer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-swiftmailer.git", + "reference": "09659a55959f9e64b8178d842b64a9ffae42b994" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/09659a55959f9e64b8178d842b64a9ffae42b994", + "reference": "09659a55959f9e64b8178d842b64a9ffae42b994", + "shasum": "" + }, + "require": { + "swiftmailer/swiftmailer": "~6.0", + "yiisoft/yii2": ">=2.0.4" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\swiftmailer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com" + } + ], + "description": "The SwiftMailer integration for the Yii framework", + "keywords": [ + "email", + "mail", + "mailer", + "swift", + "swiftmailer", + "yii2" + ], + "time": "2018-09-23T22:00:47+00:00" + } + ], + "packages-dev": [ + { + "name": "behat/gherkin", + "version": "v4.6.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/ab0a02ea14893860bca00f225f5621d351a3ad07", + "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "~4.5|~5", + "symfony/phpunit-bridge": "~2.7|~3|~4", + "symfony/yaml": "~2.3|~3|~4" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com/" + } + ], + "description": "Gherkin DSL parser for PHP 5.3", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "time": "2019-01-16T14:22:17+00:00" + }, + { + "name": "bower-asset/bootstrap", + "version": "v3.4.1", + "source": { + "type": "git", + "url": "git@github.com:twbs/bootstrap.git", + "reference": "68b0d231a13201eb14acd3dc84e51543d16e5f7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/68b0d231a13201eb14acd3dc84e51543d16e5f7e", + "reference": "68b0d231a13201eb14acd3dc84e51543d16e5f7e" + }, + "require": { + "bower-asset/jquery": ">=1.9.1,<4.0" + }, + "type": "bower-asset", + "license": [ + "MIT" + ] + }, + { + "name": "cebe/js-search", + "version": "0.9.3", + "source": { + "type": "git", + "url": "https://github.com/cebe/js-search.git", + "reference": "3756a8b3387f3f7e5c778b964ec681dcf110b098" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/js-search/zipball/3756a8b3387f3f7e5c778b964ec681dcf110b098", + "reference": "3756a8b3387f3f7e5c778b964ec681dcf110b098", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "bin": [ + "bin/jsindex" + ], + "type": "library", + "autoload": { + "psr-4": { + "cebe\\jssearch\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc" + } + ], + "description": "A client side search engine for use on static pages.", + "time": "2016-11-22T12:11:39+00:00" + }, + { + "name": "cebe/markdown-latex", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/cebe/markdown-latex.git", + "reference": "c2b13f5fe8e9417deacb715b9148c4958f941d10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cebe/markdown-latex/zipball/c2b13f5fe8e9417deacb715b9148c4958f941d10", + "reference": "c2b13f5fe8e9417deacb715b9148c4958f941d10", + "shasum": "" + }, + "require": { + "cebe/markdown": "~1.0.0", + "mikevanriel/text-to-latex": "~1.0.0", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "bin": [ + "bin/markdown-latex" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "cebe\\markdown\\latex\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Creator" + } + ], + "description": "A super fast, highly extensible markdown parser for PHP, that converts markdown files into latex", + "homepage": "https://github.com/cebe/markdown-latex#readme", + "keywords": [ + "extensible", + "fast", + "gfm", + "latex", + "markdown", + "markdown-extra" + ], + "time": "2019-05-21T13:27:49+00:00" + }, + { + "name": "clue/stream-filter", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/clue/php-stream-filter.git", + "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", + "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^5.0 || ^4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "time": "2019-04-09T12:31:48+00:00" + }, + { + "name": "codeception/codeception", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "65bb6f8248000d7b8a3e2e98b7a6da6248096b78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/65bb6f8248000d7b8a3e2e98b7a6da6248096b78", + "reference": "65bb6f8248000d7b8a3e2e98b7a6da6248096b78", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.4.0", + "codeception/lib-asserts": "^1.0", + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1", + "codeception/stub": "^2.0 | ^3.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "~1.4", + "php": ">=5.6.0 <8.0", + "symfony/console": ">=2.7 <6.0", + "symfony/css-selector": ">=2.7 <6.0", + "symfony/event-dispatcher": ">=2.7 <6.0", + "symfony/finder": ">=2.7 <6.0", + "symfony/yaml": ">=2.7 <6.0" + }, + "require-dev": { + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", + "codeception/specify": "~0.3", + "codeception/util-universalframework": "*@dev", + "monolog/monolog": "~1.8", + "squizlabs/php_codesniffer": "~2.0", + "symfony/process": ">=2.7 <6.0", + "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "hoa/console": "For interactive console functionality", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/phpunit-bridge": "For phpunit-bridge support" + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": [] + }, + "autoload": { + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com/" + } + ], + "description": "BDD-style testing framework", + "homepage": "http://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "time": "2019-12-21T16:22:15+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "f052dfebad3e9bcafc66c22a7ef39cb1a30cebd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/f052dfebad3e9bcafc66c22a7ef39cb1a30cebd2", + "reference": "f052dfebad3e9bcafc66c22a7ef39cb1a30cebd2", + "shasum": "" + }, + "require": { + "php": ">=7.2.0 <8.0", + "phpunit/phpunit": "^8.4" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com/" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception" + ], + "time": "2019-11-23T20:16:40+00:00" + }, + { + "name": "codeception/lib-innerbrowser", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-innerbrowser.git", + "reference": "289028f011dcc954c530e946ea34bb7ce4ec2721" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/289028f011dcc954c530e946ea34bb7ce4ec2721", + "reference": "289028f011dcc954c530e946ea34bb7ce4ec2721", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "php": ">=5.6.0 <8.0", + "symfony/browser-kit": ">=2.7 <6.0", + "symfony/dom-crawler": ">=2.7 <6.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-universalframework": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com/" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Parent library for all Codeception framework modules and PhpBrowser", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception" + ], + "time": "2019-11-26T16:50:12+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "87c83ca3ccfbc0d79f5effb57e1f82eeaab0cb3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/87c83ca3ccfbc0d79f5effb57e1f82eeaab0cb3e", + "reference": "87c83ca3ccfbc0d79f5effb57e1f82eeaab0cb3e", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^1.0.0", + "php": ">=5.6.0 <8.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-robohelpers": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "http://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "time": "2019-11-13T17:32:27+00:00" + }, + { + "name": "codeception/module-db", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-db.git", + "reference": "13a2b86206d09c50ab2e5375b261df35b650e58f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-db/zipball/13a2b86206d09c50ab2e5375b261df35b650e58f", + "reference": "13a2b86206d09c50ab2e5375b261df35b650e58f", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "php": ">=5.6.0 <8.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-robohelpers": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "WebDriver module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "acceptance-testing", + "browser-testing", + "codeception" + ], + "time": "2019-12-08T17:56:49+00:00" + }, + { + "name": "codeception/module-filesystem", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-filesystem.git", + "reference": "fe3c352479924ec0aaf6a6c3d6825dc14242b81e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-filesystem/zipball/fe3c352479924ec0aaf6a6c3d6825dc14242b81e", + "reference": "fe3c352479924ec0aaf6a6c3d6825dc14242b81e", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "php": ">=5.6.0 <8.0", + "symfony/finder": ">=2.7 <6.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-robohelpers": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing local filesystem", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "filesystem" + ], + "time": "2019-12-04T17:13:39+00:00" + }, + { + "name": "codeception/module-webdriver", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-webdriver.git", + "reference": "e1b9957966c64b2f9f6a6a53f560ceab487cfae0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/e1b9957966c64b2f9f6a6a53f560ceab487cfae0", + "reference": "e1b9957966c64b2f9f6a6a53f560ceab487cfae0", + "shasum": "" + }, + "require": { + "codeception/codeception": "4.0.x-dev | ^4.0", + "facebook/webdriver": "^1.6.0", + "php": ">=5.6.0 <8.0" + }, + "require-dev": { + "codeception/util-robohelpers": "dev-master" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Zaahid Bateson" + } + ], + "description": "WebDriver module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "acceptance-testing", + "browser-testing", + "codeception" + ], + "time": "2019-10-19T14:51:11+00:00" + }, + { + "name": "codeception/module-yii2", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-yii2.git", + "reference": "9796e9a990e80aa5f8b049563071c2825289a6ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-yii2/zipball/9796e9a990e80aa5f8b049563071c2825289a6ff", + "reference": "9796e9a990e80aa5f8b049563071c2825289a6ff", + "shasum": "" + }, + "require": { + "codeception/codeception": "4.0.x-dev | ^4.0", + "codeception/lib-innerbrowser": "^1.0", + "php": ">=5.6.0 <8.0" + }, + "require-dev": { + "codeception/util-robohelpers": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander Makarov" + }, + { + "name": "Sam Mouse" + }, + { + "name": "Michael Bodnarchuk" + } + ], + "description": "Codeception module for Yii2 framework", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "yii2" + ], + "time": "2019-10-25T17:28:12+00:00" + }, + { + "name": "codeception/phpunit-wrapper", + "version": "8.1.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/phpunit-wrapper.git", + "reference": "f1370a15e5fe60e7347b1c60642479b923a7ceef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/f1370a15e5fe60e7347b1c60642479b923a7ceef", + "reference": "f1370a15e5fe60e7347b1c60642479b923a7ceef", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "phpunit/php-code-coverage": "^7.0", + "phpunit/phpunit": "^8.0", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0" + }, + "require-dev": { + "codeception/specify": "*", + "vlucas/phpdotenv": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\PHPUnit\\": "src\\" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + } + ], + "description": "PHPUnit classes used by Codeception", + "time": "2019-12-21T16:08:14+00:00" + }, + { + "name": "codeception/specify", + "version": "0.4.6", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Specify.git", + "reference": "21b586f503ca444aa519dd9cafb32f113a05f286" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Specify/zipball/21b586f503ca444aa519dd9cafb32f113a05f286", + "reference": "21b586f503ca444aa519dd9cafb32f113a05f286", + "shasum": "" + }, + "require": { + "myclabs/deep-copy": "~1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert.php@mailican.com" + } + ], + "description": "BDD code blocks for PHPUnit and Codeception", + "time": "2016-10-21T09:42:00+00:00" + }, + { + "name": "codeception/stub", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "94874f511ab1025b1f4cb927884cdda5004ece64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/94874f511ab1025b1f4cb927884cdda5004ece64", + "reference": "94874f511ab1025b1f4cb927884cdda5004ece64", + "shasum": "" + }, + "require": { + "phpunit/phpunit": "^8.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "time": "2019-11-23T20:11:30+00:00" + }, + { + "name": "codeception/verify", + "version": "dev-patch-1", + "source": { + "type": "git", + "url": "https://github.com/ricpelo/Verify.git", + "reference": "faeb839a3dcd176258d49aec000b1061d61e6d6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ricpelo/Verify/zipball/faeb839a3dcd176258d49aec000b1061d61e6d6e", + "reference": "faeb839a3dcd176258d49aec000b1061d61e6d6e", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": ">6.0.16 <6.1.0 | ^6.7.0 | ^7.7.1 | ^8.0.4", + "php": ">= 7.0", + "phpunit/phpunit": "> 6.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Codeception/function.php" + ], + "psr-4": { + "Codeception\\": "src\\Codeception" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@codeception.com" + } + ], + "description": "BDD assertion library for PHPUnit", + "support": { + "source": "https://github.com/ricpelo/Verify/tree/patch-1" + }, + "time": "2020-01-11T09:38:41+00:00" + }, + { + "name": "composer/semver", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "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" + ], + "time": "2019-03-19T17:25:45+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "cbe23383749496fe0f373345208b79568e4bc248" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", + "reference": "cbe23383749496fe0f373345208b79568e4bc248", + "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" + ], + "time": "2019-11-06T16:40:04+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://api.github.com/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", + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", + "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org/", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2019-10-01T18:55:10+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "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": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "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": [ + "constructor", + "instantiate" + ], + "time": "2019-10-21T16:45:58+00:00" + }, + { + "name": "facebook/webdriver", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/facebook/php-webdriver.git", + "reference": "e43de70f3c7166169d0f14a374505392734160e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/e43de70f3c7166169d0f14a374505392734160e5", + "reference": "e43de70f3c7166169d0f14a374505392734160e5", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-zip": "*", + "php": "^5.6 || ~7.0", + "symfony/process": "^2.8 || ^3.1 || ^4.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.0", + "jakub-onderka/php-parallel-lint": "^0.9.2", + "php-coveralls/php-coveralls": "^2.0", + "php-mock/php-mock-phpunit": "^1.1", + "phpunit/phpunit": "^5.7", + "sebastian/environment": "^1.3.4 || ^2.0 || ^3.0", + "squizlabs/php_codesniffer": "^2.6", + "symfony/var-dumper": "^3.3 || ^4.0" + }, + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-community": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "A PHP client for Selenium WebDriver", + "homepage": "https://github.com/facebook/php-webdriver", + "keywords": [ + "facebook", + "php", + "selenium", + "webdriver" + ], + "time": "2019-06-13T08:02:18+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v2.16.1", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", + "reference": "c8afb599858876e95e8ebfcd97812d383fa23f02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c8afb599858876e95e8ebfcd97812d383fa23f02", + "reference": "c8afb599858876e95e8ebfcd97812d383fa23f02", + "shasum": "" + }, + "require": { + "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": { + "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": "^4.3 || ^5.0", + "symfony/yaml": "^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "ext-mbstring": "For handling non-UTF8 characters in cache signature.", + "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": { + "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/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "time": "2019-11-25T22:10:32+00:00" + }, + { + "name": "fzaninotto/faker", + "version": "v1.9.1", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2019-12-12T13:22:17+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2019-12-23T11:57:10+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "jakub-onderka/php-console-color", + "version": "v0.2", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Color.git", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191", + "reference": "d5deaecff52a0d61ccb613bb3804088da0307191", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "1.0", + "jakub-onderka/php-parallel-lint": "1.0", + "jakub-onderka/php-var-dump-check": "0.*", + "phpunit/phpunit": "~4.3", + "squizlabs/php_codesniffer": "1.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleColor\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "jakub.onderka@gmail.com" + } + ], + "time": "2018-09-29T17:23:10+00:00" + }, + { + "name": "jakub-onderka/php-console-highlighter", + "version": "v0.4", + "source": { + "type": "git", + "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547", + "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "jakub-onderka/php-console-color": "~0.2", + "php": ">=5.4.0" + }, + "require-dev": { + "jakub-onderka/php-code-style": "~1.0", + "jakub-onderka/php-parallel-lint": "~1.0", + "jakub-onderka/php-var-dump-check": "~0.1", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "JakubOnderka\\PhpConsoleHighlighter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jakub Onderka", + "email": "acci@acci.cz", + "homepage": "http://www.acci.cz/" + } + ], + "description": "Highlight PHP code in terminal", + "time": "2018-09-29T18:48:56+00:00" + }, + { + "name": "knplabs/github-api", + "version": "2.12.1", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/php-github-api.git", + "reference": "2665eb80831054d403464c922c9935741af90dc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/2665eb80831054d403464c922c9935741af90dc6", + "reference": "2665eb80831054d403464c922c9935741af90dc6", + "shasum": "" + }, + "require": { + "php": "^7.1", + "php-http/cache-plugin": "^1.4", + "php-http/client-common": "^1.6 || ^2.0", + "php-http/client-implementation": "^1.0", + "php-http/discovery": "^1.0", + "php-http/httplug": "^1.1 || ^2.0", + "psr/cache": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "cache/array-adapter": "^0.4", + "guzzlehttp/psr7": "^1.2", + "php-http/guzzle6-adapter": "^1.0 || ^2.0", + "php-http/mock-client": "^1.2", + "phpunit/phpunit": "^7.0 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Github\\": "lib/Github/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KnpLabs Team", + "homepage": "http://knplabs.com/" + }, + { + "name": "Thibault Duplessis", + "email": "thibault.duplessis@gmail.com", + "homepage": "http://ornicar.github.com/" + } + ], + "description": "GitHub API v3 client", + "homepage": "https://github.com/KnpLabs/php-github-api", + "keywords": [ + "api", + "gh", + "gist", + "github" + ], + "time": "2019-11-07T17:18:26+00:00" + }, + { + "name": "markbaker/complex", + "version": "1.4.7", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/1ea674a8308baf547cbcbd30c5fcd6d301b7c000", + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", + "phpcompatibility/php-compatibility": "^8.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "2.*", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^4.8.35|^5.4.0", + "sebastian/phpcpd": "2.*", + "squizlabs/php_codesniffer": "^3.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "time": "2018-10-13T23:28:42+00:00" + }, + { + "name": "markbaker/matrix", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "5348c5a67e3b75cd209d70103f916a93b1f1ed21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/5348c5a67e3b75cd209d70103f916a93b1f1ed21", + "reference": "5348c5a67e3b75cd209d70103f916a93b1f1ed21", + "shasum": "" + }, + "require": { + "php": "^5.6.0|^7.0.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "dev-master", + "phploc/phploc": "^4", + "phpmd/phpmd": "dev-master", + "phpunit/phpunit": "^5.7", + "sebastian/phpcpd": "^3.0", + "squizlabs/php_codesniffer": "^3.0@dev" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/functions/adjoint.php", + "classes/src/functions/antidiagonal.php", + "classes/src/functions/cofactors.php", + "classes/src/functions/determinant.php", + "classes/src/functions/diagonal.php", + "classes/src/functions/identity.php", + "classes/src/functions/inverse.php", + "classes/src/functions/minors.php", + "classes/src/functions/trace.php", + "classes/src/functions/transpose.php", + "classes/src/operations/add.php", + "classes/src/operations/directsum.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "time": "2019-10-06T11:29:25+00:00" + }, + { + "name": "mikevanriel/text-to-latex", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/mvriel/TextToLatex.git", + "reference": "c9f3a4d6b89f9449782455c848d5fa3dd0e216ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mvriel/TextToLatex/zipball/c9f3a4d6b89f9449782455c848d5fa3dd0e216ba", + "reference": "c9f3a4d6b89f9449782455c848d5fa3dd0e216ba", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "autoload": { + "psr-0": { + "MikeVanRiel": [ + "src/", + "tests/unit/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A converter class that converts normal ASCII text to valid LaTeX", + "time": "2015-12-13T07:33:35+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "579bb7356d91f9456ccd505f24ca8b667966a0a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/579bb7356d91f9456ccd505f24ca8b667966a0a7", + "reference": "579bb7356d91f9456ccd505f24ca8b667966a0a7", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2019-12-15T19:12:40+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "files": [ + "lib/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2015-09-19T14:15:08+00:00" + }, + { + "name": "opis/closure", + "version": "3.5.1", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/93ebc5712cdad8d5f489b500c59d122df2e53969", + "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.5.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" + ], + "time": "2019-11-29T22:36:02+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "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" + ], + "time": "2018-07-02T15:55:56+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://api.github.com/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)", + "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://api.github.com/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", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "php-cs-fixer/diff", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/diff.git", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756", + "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.23 || ^6.4.3", + "symfony/process": "^3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "SpacePossum" + } + ], + "description": "sebastian/diff v2 backport support for PHP5.6", + "homepage": "https://github.com/PHP-CS-Fixer", + "keywords": [ + "diff" + ], + "time": "2018-02-15T16:58:55+00:00" + }, + { + "name": "php-http/cache-plugin", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/cache-plugin.git", + "reference": "d137d46523343297e340cef697747381b6caeb66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/d137d46523343297e340cef697747381b6caeb66", + "reference": "d137d46523343297e340cef697747381b6caeb66", + "shasum": "" + }, + "require": { + "php": "^7.1", + "php-http/client-common": "^1.9 || ^2.0", + "php-http/message-factory": "^1.0", + "psr/cache": "^1.0", + "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\Common\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "PSR-6 Cache plugin for HTTPlug", + "homepage": "http://httplug.io/", + "keywords": [ + "cache", + "http", + "httplug", + "plugin" + ], + "time": "2019-12-26T16:14:58+00:00" + }, + { + "name": "php-http/client-common", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "c0390ae3c8f2ae9d50901feef0127fb9e396f6b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/c0390ae3c8f2ae9d50901feef0127fb9e396f6b4", + "reference": "c0390ae3c8f2ae9d50901feef0127fb9e396f6b4", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0", + "php-http/httplug": "^1.1", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "guzzlehttp/psr7": "^1.4", + "phpspec/phpspec": "^2.5 || ^3.4 || ^4.2" + }, + "suggest": { + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io/", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "time": "2019-11-18T08:54:36+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.7.4", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82dbef649ccffd8e4f22e1953c3a5265992b83c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82dbef649ccffd8e4f22e1953c3a5265992b83c0", + "reference": "82dbef649ccffd8e4f22e1953c3a5265992b83c0", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "akeneo/phpspec-skip-example-extension": "^4.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1", + "puli/composer-plugin": "1.0.0-beta10" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", + "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org/", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" + ], + "time": "2020-01-03T11:25:47+00:00" + }, + { + "name": "php-http/guzzle6-adapter", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/a56941f9dc6110409cfcddc91546ee97039277ab", + "reference": "a56941f9dc6110409cfcddc91546ee97039277ab", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": ">=5.5.0", + "php-http/httplug": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/adapter-integration-tests": "^0.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io/", + "keywords": [ + "Guzzle", + "http" + ], + "time": "2016-05-10T06:13:32+00:00" + }, + { + "name": "php-http/httplug", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "reference": "1c6381726c18579c4ca2ef1ec1498fdae8bdf018", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "php-http/promise": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io/", + "keywords": [ + "client", + "http" + ], + "time": "2016-08-31T08:30:17+00:00" + }, + { + "name": "php-http/message", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "ce8f43ac1e294b54aabf5808515c3554a19c1e1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/ce8f43ac1e294b54aabf5808515c3554a19c1e1c", + "reference": "ce8f43ac1e294b54aabf5808515c3554a19c1e1c", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.4", + "php": "^7.1", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "akeneo/phpspec-skip-example-extension": "^1.0", + "coduo/phpspec-data-provider-extension": "^1.0", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4", + "slim/slim": "^3.0", + "zendframework/zend-diactoros": "^1.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation", + "zendframework/zend-diactoros": "Used with Diactoros Factories" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + }, + "files": [ + "src/filters.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org/", + "keywords": [ + "http", + "message", + "psr-7" + ], + "time": "2019-08-05T06:55:08+00:00" + }, + { + "name": "php-http/message-factory", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org/", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "time": "2015-12-19T14:08:53+00:00" + }, + { + "name": "php-http/promise", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980", + "shasum": "" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io/", + "keywords": [ + "promise" + ], + "time": "2016-01-26T13:27:02+00:00" + }, + { + "name": "phpdocumentor/reflection", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Reflection.git", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.0", + "php": ">=5.3.3", + "phpdocumentor/reflection-docblock": "~2.0", + "psr/log": "~1.0" + }, + "require-dev": { + "behat/behat": "~2.4", + "mockery/mockery": "~0.8", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/", + "tests/mocks/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Reflection library to do Static Analysis for PHP Projects", + "homepage": "http://www.phpdoc.org/", + "keywords": [ + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2016-05-21T08:42:32+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2016-01-25T08:17:30+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "1648dc9ebef6ebe0c5a172e16cf66732918416e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/1648dc9ebef6ebe0c5a172e16cf66732918416e0", + "reference": "1648dc9ebef6ebe0c5a172e16cf66732918416e0", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "markbaker/complex": "^1.4", + "markbaker/matrix": "^1.2", + "php": "^7.1", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "dompdf/dompdf": "^0.8.3", + "friendsofphp/php-cs-fixer": "^2.16", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^8.0", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.5", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.3" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be/" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net/" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net/" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "time": "2019-12-01T23:13:51+00:00" + }, + { + "name": "phpspec/php-diff", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/php-diff.git", + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a", + "shasum": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Diff": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Chris Boulton", + "homepage": "http://github.com/chrisboulton" + } + ], + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", + "time": "2016-04-07T12:29:16+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "cbe1df668b3fe136bcc909126a0f529a78d4cbbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/cbe1df668b3fe136bcc909126a0f529a78d4cbbc", + "reference": "cbe1df668b3fe136bcc909126a0f529a78d4cbbc", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.2.3|^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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.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" + ], + "time": "2019-12-22T21:05:45+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://api.github.com/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" + ], + "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://api.github.com/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" + ], + "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://api.github.com/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" + ], + "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://api.github.com/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" + ], + "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://api.github.com/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" + ], + "time": "2019-09-17T06:23:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "8.5.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/018b6ac3c8ab20916db85fa91bf6465acb64d1e0", + "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0", + "shasum": "" + }, + "require": { + "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": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.5-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": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2020-01-08T08:49:49+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+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://api.github.com/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" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "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" + ], + "time": "2019-11-01T11:05:21+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.9.12", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "90da7f37568aee36b116a030c5f99c915267edd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4", + "reference": "90da7f37568aee36b116a030c5f99c915267edd4", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1.*", + "ext-json": "*", + "ext-tokenizer": "*", + "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*", + "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", + "php": ">=5.4.0", + "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0", + "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "hoa/console": "~2.15|~3.16", + "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", + "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "0.9.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com/" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org/", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2019-12-06T14:19:43+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "scrivo/highlight.php", + "version": "v9.17.1.0", + "source": { + "type": "git", + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "5451a9ad6d638559cf2a092880f935c39776134e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/5451a9ad6d638559cf2a092880f935c39776134e", + "reference": "5451a9ad6d638559cf2a092880f935c39776134e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "symfony/finder": "^3.4", + "symfony/var-dumper": "^3.4" + }, + "suggest": { + "ext-dom": "Needed to make use of the features in the utilities namespace" + }, + "type": "library", + "autoload": { + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" + }, + "files": [ + "HighlightUtilities/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" + }, + { + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io/", + "role": "Maintainer" + }, + { + "name": "Martin Folkers", + "homepage": "https://twobrain.io/", + "role": "Contributor" + } + ], + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", + "keywords": [ + "code", + "highlight", + "highlight.js", + "highlight.php", + "syntax" + ], + "time": "2019-12-13T21:54:06+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.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": "Sebastian Bergmann", + "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" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "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/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "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": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2019-11-20T08:46:58+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "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": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2019-09-14T09:02:43+00:00" + }, + { + "name": "sebastian/global-state", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "shasum": "" + }, + "require": { + "php": "^7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2019-02-01T05:30:01+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/type", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "time": "2019-07-02T08:10:15+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "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": "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" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "2.9.2", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "2acf168de78487db620ab4bc524135a13cfe6745" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/2acf168de78487db620ab4bc524135a13cfe6745", + "reference": "2acf168de78487db620ab4bc524135a13cfe6745", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "scripts/phpcs", + "scripts/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Fixer.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2018-11-07T22:31:41+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v4.2.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "61d85c5af2fc058014c7c89504c3944e73a086f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/61d85c5af2fc058014c7c89504c3944e73a086f0", + "reference": "61d85c5af2fc058014c7c89504c3944e73a086f0", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/dom-crawler": "~3.4|~4.0" + }, + "require-dev": { + "symfony/css-selector": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "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 BrowserKit Component", + "homepage": "https://symfony.com/", + "time": "2019-02-23T15:17:42+00:00" + }, + { + "name": "symfony/console", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "fe6e3cd889ca64172d7a742a2eb058541404ef47" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/fe6e3cd889ca64172d7a742a2eb058541404ef47", + "reference": "fe6e3cd889ca64172d7a742a2eb058541404ef47", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "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", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "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/", + "time": "2019-12-17T13:20:22+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "19d29e7098b7b2c3313cb03902ca30f100dcb837" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/19d29e7098b7b2c3313cb03902ca30f100dcb837", + "reference": "19d29e7098b7b2c3313cb03902ca30f100dcb837", + "shasum": "" + }, + "require": { + "php": "^7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com/", + "time": "2019-11-18T17:27:11+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v4.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "36bbcab9369fc2f583220890efd43bf262d563fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/36bbcab9369fc2f583220890efd43bf262d563fd", + "reference": "36bbcab9369fc2f583220890efd43bf262d563fd", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "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 DomCrawler Component", + "homepage": "https://symfony.com/", + "time": "2019-10-29T11:38:30+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v4.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "c387ab37887f997162a8579d335b38f328d27859" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/c387ab37887f997162a8579d335b38f328d27859", + "reference": "c387ab37887f997162a8579d335b38f328d27859", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/process": "^3.4.2|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "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": "Registers environment variables from a .env file", + "homepage": "https://symfony.com/", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2019-12-19T15:57:49+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "7b738a51645e10f864cc25c24d232fb03f37b475" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7b738a51645e10f864cc25c24d232fb03f37b475", + "reference": "7b738a51645e10f864cc25c24d232fb03f37b475", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/event-dispatcher-contracts": "^2" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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 EventDispatcher Component", + "homepage": "https://symfony.com/", + "time": "2019-11-18T17:27:11+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "af23c2584d4577d54661c434446fb8fbed6025dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/af23c2584d4577d54661c434446fb8fbed6025dd", + "reference": "af23c2584d4577d54661c434446fb8fbed6025dd", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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 dispatching event", + "homepage": "https://symfony.com/", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-11-18T17:27:11+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/1d71f670bc5a07b9ccc97dc44f932177a322d4e6", + "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "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/", + "time": "2019-11-26T23:25:11+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "17874dd8ab9a19422028ad56172fb294287a701b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/17874dd8ab9a19422028ad56172fb294287a701b", + "reference": "17874dd8ab9a19422028ad56172fb294287a701b", + "shasum": "" + }, + "require": { + "php": "^7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "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/", + "time": "2019-11-18T17:27:11+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "1ad3d0ffc00cc1990e5c9c7bb6b81578ec3f5f68" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/1ad3d0ffc00cc1990e5c9c7bb6b81578ec3f5f68", + "reference": "1ad3d0ffc00cc1990e5c9c7bb6b81578ec3f5f68", + "shasum": "" + }, + "require": { + "php": "^7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony OptionsResolver Component", + "homepage": "https://symfony.com/", + "keywords": [ + "config", + "configuration", + "options" + ], + "time": "2019-11-18T17:27:11+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "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" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "af23c7bb26a73b850840823662dda371484926c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/af23c7bb26a73b850840823662dda371484926c4", + "reference": "af23c7bb26a73b850840823662dda371484926c4", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "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.0+ features to lower PHP versions", + "homepage": "https://symfony.com/", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "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" + ], + "time": "2019-11-27T16:25:15+00:00" + }, + { + "name": "symfony/process", + "version": "v4.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "b84501ad50adb72a94fb460a5b5c91f693e99c9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/b84501ad50adb72a94fb460a5b5c91f693e99c9b", + "reference": "b84501ad50adb72a94fb460a5b5c91f693e99c9b", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "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/", + "time": "2019-12-06T10:06:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "144c5e51266b281231e947b51223ba14acf1a749" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749", + "reference": "144c5e51266b281231e947b51223ba14acf1a749", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "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" + ], + "time": "2019-11-18T17:27:11+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "d410282956706e0b08681a5527447a8e6b6f421e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/d410282956706e0b08681a5527447a8e6b6f421e", + "reference": "d410282956706e0b08681a5527447a8e6b6f421e", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/service-contracts": "^1.0|^2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com/", + "time": "2019-11-18T17:27:11+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "be330f919bdb395d1e0c3f2bfb8948512d6bdd99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/be330f919bdb395d1e0c3f2bfb8948512d6bdd99", + "reference": "be330f919bdb395d1e0c3f2bfb8948512d6bdd99", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "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", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "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" + ], + "time": "2019-12-18T13:41:29+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "847661e77afa48d99ecfa508e8b60f0b029a19c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/847661e77afa48d99ecfa508e8b60f0b029a19c0", + "reference": "847661e77afa48d99ecfa508e8b60f0b029a19c0", + "shasum": "" + }, + "require": { + "php": "^7.2.5", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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 Yaml Component", + "homepage": "https://symfony.com/", + "time": "2019-12-10T11:06:55+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^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" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-06-13T22:48:21+00:00" + }, + { + "name": "yiisoft/yii2-apidoc", + "version": "dev-project", + "source": { + "type": "git", + "url": "https://github.com/ricpelo/yii2-apidoc.git", + "reference": "b1ae675408d3159c2f29d6864ef64a74b6837c49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ricpelo/yii2-apidoc/zipball/b1ae675408d3159c2f29d6864ef64a74b6837c49", + "reference": "b1ae675408d3159c2f29d6864ef64a74b6837c49", + "shasum": "" + }, + "require": { + "cebe/js-search": "~0.9.3", + "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0", + "cebe/markdown-latex": "~1.0", + "nikic/php-parser": "^1.0", + "php": ">=5.4", + "phpdocumentor/reflection": "^3.0.1", + "phpdocumentor/reflection-docblock": "^2.0.4", + "scrivo/highlight.php": "~9.13", + "yiisoft/yii2": "~2.0.13", + "yiisoft/yii2-bootstrap": "~2.0.0" + }, + "require-dev": { + "phpunit/phpunit": "<7" + }, + "bin": [ + "apidoc" + ], + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\apidoc\\": "" + } + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc" + } + ], + "description": "API Documentation generator for the Yii framework 2.0", + "keywords": [ + "api", + "apidoc", + "documentation", + "phpdoc", + "yii2" + ], + "support": { + "issues": "https://github.com/yiisoft/yii2-apidoc/issues", + "forum": "http://www.yiiframework.com/forum/", + "wiki": "http://www.yiiframework.com/wiki/", + "irc": "irc://irc.freenode.net/yii", + "source": "https://github.com/yiisoft/yii2-apidoc" + }, + "time": "2019-04-19T16:32:16+00:00" + }, + { + "name": "yiisoft/yii2-bootstrap", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-bootstrap.git", + "reference": "073c9ab0a4eb71f2485d84c96a1967130300d8fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/073c9ab0a4eb71f2485d84c96a1967130300d8fc", + "reference": "073c9ab0a4eb71f2485d84c96a1967130300d8fc", + "shasum": "" + }, + "require": { + "bower-asset/bootstrap": "3.4.* | 3.3.* | 3.2.* | 3.1.*", + "yiisoft/yii2": "~2.0.6" + }, + "require-dev": { + "phpunit/phpunit": "<7" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\bootstrap\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com" + }, + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "http://rmcreative.ru/" + }, + { + "name": "Antonio Ramirez", + "email": "amigo.cobos@gmail.com" + }, + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "http://www.yiiframework.com/" + } + ], + "description": "The Twitter Bootstrap extension for the Yii framework", + "keywords": [ + "bootstrap", + "yii2" + ], + "time": "2019-04-23T13:18:43+00:00" + }, + { + "name": "yiisoft/yii2-coding-standards", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-coding-standards.git", + "reference": "1047aaefcce4cfb83e4987110a573d19706bc50d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-coding-standards/zipball/1047aaefcce4cfb83e4987110a573d19706bc50d", + "reference": "1047aaefcce4cfb83e4987110a573d19706bc50d", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "squizlabs/php_codesniffer": ">=2.3.1 <3.0" + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com", + "homepage": "http://www.yiiframework.com/", + "role": "Founder and project lead" + }, + { + "name": "Alexander Makarov", + "email": "sam@rmcreative.ru", + "homepage": "http://rmcreative.ru/", + "role": "Core framework development" + }, + { + "name": "Maurizio Domba", + "homepage": "http://mdomba.info/", + "role": "Core framework development" + }, + { + "name": "Carsten Brandt", + "email": "mail@cebe.cc", + "homepage": "http://cebe.cc/", + "role": "Core framework development" + }, + { + "name": "Timur Ruziev", + "email": "resurtm@gmail.com", + "homepage": "http://resurtm.com/", + "role": "Core framework development" + }, + { + "name": "Paul Klimov", + "email": "klimov.paul@gmail.com", + "role": "Core framework development" + } + ], + "description": "Yii PHP Framework Version 2 - Coding standard tools", + "homepage": "http://www.yiiframework.com/", + "keywords": [ + "codesniffer", + "framework", + "yii" + ], + "time": "2017-05-12T10:30:45+00:00" + }, + { + "name": "yiisoft/yii2-debug", + "version": "2.1.12", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-debug.git", + "reference": "bf9234ba1369116d12ebe266d98006416a5ae304" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/bf9234ba1369116d12ebe266d98006416a5ae304", + "reference": "bf9234ba1369116d12ebe266d98006416a5ae304", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "opis/closure": "^3.3", + "php": ">=5.4", + "yiisoft/yii2": "~2.0.13" + }, + "require-dev": { + "phpunit/phpunit": "<7", + "yiisoft/yii2-coding-standards": "~2.0", + "yiisoft/yii2-swiftmailer": "*" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\debug\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + }, + { + "name": "Simon Karlen", + "email": "simi.albi@outlook.com" + } + ], + "description": "The debugger extension for the Yii framework", + "keywords": [ + "debug", + "debugger", + "yii2" + ], + "time": "2019-11-19T20:09:08+00:00" + }, + { + "name": "yiisoft/yii2-faker", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-faker.git", + "reference": "3df62b1dcb272a8413f9c6e532c9d73f325ccde1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/3df62b1dcb272a8413f9c6e532c9d73f325ccde1", + "reference": "3df62b1dcb272a8413f9c6e532c9d73f325ccde1", + "shasum": "" + }, + "require": { + "fzaninotto/faker": "~1.4", + "yiisoft/yii2": "~2.0.0" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\faker\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Mark Jebri", + "email": "mark.github@yandex.ru" + } + ], + "description": "Fixture generator. The Faker integration for the Yii framework.", + "keywords": [ + "Fixture", + "faker", + "yii2" + ], + "time": "2018-02-19T20:27:10+00:00" + }, + { + "name": "yiisoft/yii2-gii", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-gii.git", + "reference": "0dcc7d3c66de045f1b560ad4928dc67a6611f6d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/0dcc7d3c66de045f1b560ad4928dc67a6611f6d1", + "reference": "0dcc7d3c66de045f1b560ad4928dc67a6611f6d1", + "shasum": "" + }, + "require": { + "phpspec/php-diff": "^1.1.0", + "yiisoft/yii2": "~2.0.14" + }, + "require-dev": { + "phpunit/phpunit": "<7", + "yiisoft/yii2-coding-standards": "~2.0" + }, + "type": "yii2-extension", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\gii\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Qiang Xue", + "email": "qiang.xue@gmail.com" + } + ], + "description": "The Gii extension for the Yii framework", + "keywords": [ + "code generator", + "gii", + "yii2" + ], + "time": "2019-11-19T20:19:33+00:00" + }, + { + "name": "yiisoft/yii2-shell", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/yiisoft/yii2-shell.git", + "reference": "1d9548d56ef45fb82a39cf32b84d137ddd92dc38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yiisoft/yii2-shell/zipball/1d9548d56ef45fb82a39cf32b84d137ddd92dc38", + "reference": "1d9548d56ef45fb82a39cf32b84d137ddd92dc38", + "shasum": "" + }, + "require": { + "psy/psysh": "~0.9.3", + "symfony/var-dumper": "~2.7|~3.0|~4.0", + "yiisoft/yii2": "~2.0.0" + }, + "type": "yii2-extension", + "extra": { + "bootstrap": "yii\\shell\\Bootstrap", + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "yii\\shell\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Daniel Gomez Pan", + "email": "pana_1990@hotmail.com" + }, + { + "name": "Sascha Vincent Kurowski", + "email": "svkurowski@gmail.com" + } + ], + "description": "The interactive shell extension for Yii framework", + "keywords": [ + "shell", + "yii2" + ], + "time": "2019-01-07T21:30:35+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "xtetis/yii2-bootstrap4-glyphicons": 20, + "yiisoft/yii2-apidoc": 20, + "codeception/verify": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.3.0", + "ext-gd": "*", + "ext-intl": "*" + }, + "platform-dev": [] +} diff --git a/config/console.php b/config/console.php index 299656afc..4158f8109 100644 --- a/config/console.php +++ b/config/console.php @@ -2,6 +2,7 @@ $params = require __DIR__ . '/params.php'; $db = require __DIR__ . '/db.php'; +$log = require __DIR__ . '/log.php'; $config = [ 'id' => 'basic-console', @@ -13,28 +14,21 @@ '@npm' => '@vendor/npm-asset', '@tests' => '@app/tests', ], + 'language' => 'es-ES', 'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', ], - 'log' => [ - 'targets' => [ - [ - 'class' => 'yii\log\FileTarget', - 'levels' => ['error', 'warning'], - ], - ], - ], + 'log' => $log, 'db' => $db, ], 'params' => $params, - /* 'controllerMap' => [ 'fixture' => [ // Fixture generation command line. 'class' => 'yii\faker\FixtureController', + 'language' => 'es_ES', ], ], - */ ]; if (YII_ENV_DEV) { diff --git a/config/db.php b/config/db.php index bc75e616f..f016140aa 100644 --- a/config/db.php +++ b/config/db.php @@ -1,14 +1,37 @@ true, + //'schemaCacheDuration' => 60, + //'schemaCache' => 'cache', + 'on afterOpen' => function ($event) { + // $event->sender refers to the DB connection + $event->sender->createCommand("SET intervalstyle = 'iso_8601'")->execute(); + }, + ]; +} else { + // Configuración para entorno local: + $host = 'localhost'; + $port = '5432'; + $dbname = 'proyecto'; + $username = 'proyecto'; + $password = 'proyecto'; + $extra = []; +} + return [ 'class' => 'yii\db\Connection', - 'dsn' => 'mysql:host=localhost;dbname=yii2basic', - 'username' => 'root', - 'password' => '', + 'dsn' => "pgsql:host=$host;port=$port;dbname=$dbname", + 'username' => $username, + 'password' => $password, 'charset' => 'utf8', - - // Schema cache options (for production environment) - //'enableSchemaCache' => true, - //'schemaCacheDuration' => 60, - //'schemaCache' => 'cache', -]; +] + $extra; diff --git a/config/log.php b/config/log.php new file mode 100644 index 000000000..45781b485 --- /dev/null +++ b/config/log.php @@ -0,0 +1,26 @@ + 1, + 'traceLevel' => YII_DEBUG ? 3 : 0, +]; + +if (YII_ENV_PROD) { + $out['targets'] = [ + [ + 'class' => 'app\components\HerokuTarget', + 'levels' => ['error', 'warning'], + 'exportInterval' => 1, + 'logVars' => [], + ], + ]; +} else { + $out['targets'] = [ + [ + 'class' => 'yii\log\FileTarget', + 'levels' => ['error', 'warning'], + ], + ]; +} + +return $out; diff --git a/config/test.php b/config/test.php index f95bc031e..3bdb12969 100644 --- a/config/test.php +++ b/config/test.php @@ -11,8 +11,9 @@ 'aliases' => [ '@bower' => '@vendor/bower-asset', '@npm' => '@vendor/npm-asset', + '@tests' => '@app/tests', ], - 'language' => 'en-US', + 'language' => 'es-ES', 'components' => [ 'db' => $db, 'mailer' => [ diff --git a/config/test_db.php b/config/test_db.php index 5d213e135..ef53e6f5e 100644 --- a/config/test_db.php +++ b/config/test_db.php @@ -1,6 +1,6 @@ 'basic', @@ -11,6 +12,7 @@ '@bower' => '@vendor/bower-asset', '@npm' => '@vendor/npm-asset', ], + 'language' => 'es-ES', 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation @@ -32,17 +34,23 @@ // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, - ], - 'log' => [ - 'traceLevel' => YII_DEBUG ? 3 : 0, - 'targets' => [ - [ - 'class' => 'yii\log\FileTarget', - 'levels' => ['error', 'warning'], - ], + /* + // comment the following array to send mail using php's mail function: + 'transport' => [ + 'class' => 'Swift_SmtpTransport', + 'host' => 'smtp.gmail.com', + 'username' => $params['smtpUsername'], + 'password' => getenv('SMTP_PASS'), + 'port' => '587', + 'encryption' => 'tls', ], + */ ], + 'log' => $log, 'db' => $db, + 'formatter' => [ + 'timeZone' => 'Europe/Madrid', + ], /* 'urlManager' => [ 'enablePrettyUrl' => true, @@ -52,6 +60,11 @@ ], */ ], + 'container' => [ + 'definitions' => [ + 'yii\grid\ActionColumn' => ['header' => 'Acciones'], + ], + ], 'params' => $params, ]; @@ -69,6 +82,14 @@ 'class' => 'yii\gii\Module', // uncomment the following to add your IP if you are not connecting from localhost. //'allowedIPs' => ['127.0.0.1', '::1'], + 'generators' => [ + 'crud' => [ // generator name + 'class' => 'yii\gii\generators\crud\Generator', // generator class + 'templates' => [ // setting for out templates + 'default' => '@app/templates/crud/default', // template name => path to template + ], + ], + ], ]; } diff --git a/db/create.sh b/db/create.sh new file mode 100755 index 000000000..e5b8000b9 --- /dev/null +++ b/db/create.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +if [ "$1" = "travis" ]; then + psql -U postgres -c "CREATE DATABASE proyecto_test;" + psql -U postgres -c "CREATE USER proyecto PASSWORD 'proyecto' SUPERUSER;" +else + sudo -u postgres dropdb --if-exists proyecto + sudo -u postgres dropdb --if-exists proyecto_test + sudo -u postgres dropuser --if-exists proyecto + sudo -u postgres psql -c "CREATE USER proyecto PASSWORD 'proyecto' SUPERUSER;" + sudo -u postgres createdb -O proyecto proyecto + sudo -u postgres psql -d proyecto -c "CREATE EXTENSION pgcrypto;" 2>/dev/null + sudo -u postgres createdb -O proyecto proyecto_test + sudo -u postgres psql -d proyecto_test -c "CREATE EXTENSION pgcrypto;" 2>/dev/null + LINE="localhost:5432:*:proyecto:proyecto" + FILE=~/.pgpass + if [ ! -f $FILE ]; then + touch $FILE + chmod 600 $FILE + fi + if ! grep -qsF "$LINE" $FILE; then + echo "$LINE" >> $FILE + fi +fi diff --git a/db/load.sh b/db/load.sh new file mode 100755 index 000000000..da08f35a8 --- /dev/null +++ b/db/load.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +BASE_DIR=$(dirname "$(readlink -f "$0")") +if [ "$1" != "test" ]; then + psql -h localhost -U proyecto -d proyecto < $BASE_DIR/proyecto.sql +fi +psql -h localhost -U proyecto -d proyecto_test < $BASE_DIR/proyecto.sql diff --git a/db/proyecto.sql b/db/proyecto.sql new file mode 100644 index 000000000..0931d81d5 --- /dev/null +++ b/db/proyecto.sql @@ -0,0 +1,4 @@ +------------------------------ +-- Archivo de base de datos -- +------------------------------ + diff --git a/db/psql.sh b/db/psql.sh new file mode 100755 index 000000000..321cac23f --- /dev/null +++ b/db/psql.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +[ "$1" = "test" ] && BD="_test" +psql -h localhost -U proyecto -d proyecto$BD diff --git a/github/ISSUE_TEMPLATE.md b/github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..d5f63f558 --- /dev/null +++ b/github/ISSUE_TEMPLATE.md @@ -0,0 +1,27 @@ +--- +name: Nueva incidencia +about: Nueva incidencia genérica, no basada en requisitos del proyecto +title: '' +labels: '' +assignees: '' +--- + +### Importante + +**Si vas a crear un requisito (funcional, técnico o de almacenamiento de +información), no lo hagas aquí**. Hazlo en el archivo `requisitos.xls` del +directorio `guia` y luego ejecuta el comando `make` dentro del mismo +directorio. Esto garantizará que se actualizan los archivos necesarios y se +crean las incidencias correctamente. + +De lo contrario, si lo que quieres crear es una incidencia que no representa a +ningún requisito, describe aquí el propósito de la incidencia y limpia todo +este texto sobrante. Deja únicamente el texto que hayas escrito para describir +la incidencia. + +### No olvides: +- Asignarte a ti mismo como responsable de la incidencia en el apartado + **Asignees**, pulsando en *assign yourself*. +- Asignar las etiquetas correspondientes en **Labels**. +- Incorporar la incidencia al proyecto en **Projects**. +- Planificar en qué entrega estará solucionada la incidencia en **Milestone**. diff --git a/guia/Makefile b/guia/Makefile new file mode 100644 index 000000000..aa2f844e1 --- /dev/null +++ b/guia/Makefile @@ -0,0 +1,4 @@ +.PHONY: all + +all: + @php scripts/requisitos.php -i || true diff --git a/guia/README-api.md b/guia/README-api.md new file mode 100644 index 000000000..3582daf07 --- /dev/null +++ b/guia/README-api.md @@ -0,0 +1,5 @@ +API del Proyecto Integrado +========================== + +Este es el documento que explica el API del proyecto... + diff --git a/guia/README.md b/guia/README.md new file mode 100644 index 000000000..4c1b7984b --- /dev/null +++ b/guia/README.md @@ -0,0 +1,67 @@ +Proyecto integrado +================== + +Este es el documento principal, que incluye la portada y el índice de contenidos. + +Descripción general +------------------- + +* [Descripción general](descripcion.md) + + * [Funcionalidad principal de la aplicación](descripcion.md#funcionalidad-principal-de-la-aplicacion) + * [Objetivos generales](descripcion.md#objetivos-generales) + * [URL del repositorio](descripcion.md#url-del-repositorio) + * [URL de la documentación](descripcion.md#url-de-la-documentacion) + +Instrucciones de instalación y despliegue +----------------------------------------- + +* [Instrucciones de instalación y despliegue](instalacion.md) + + * [En local](instalacion.md#en-local) + * [En la nube](instalacion.md#en-la-nube) + +Catálogo de requisitos +---------------------- + +* [Catálogo de requisitos](requisitos.md) + + * [Cuadro resumen](requisitos.md#cuadro-resumen) + +Manual de usuario +----------------- + +* [Manual de usuario](manual.md) + +Decisiones adoptadas +-------------------- + +* [Decisiones adoptadas](decisiones.md) + +Dificultades encontradas +------------------------ + +* [Dificultades encontradas](dificultades.md) + +Diagramas +--------- + +* [Diagramas](diagramas.md) + + * [Diagramas de clases](diagramas.md#diagramas-de-clases) + * [Diagramas de estructura lógica de datos](diagramas.md#diagramas-de-estructura-logica-de-datos) + +Glosario de términos +-------------------- + +* [Glosario de términos](glosario.md) + +Conclusiones +------------ + +* [Conclusiones](conclusiones.md) + +Anexos +------ + +* [Anexos](anexos.md) diff --git a/guia/anexos.md b/guia/anexos.md new file mode 100644 index 000000000..525592837 --- /dev/null +++ b/guia/anexos.md @@ -0,0 +1,8 @@ +# Anexos + +Documentos específicos vinculados a determinados requisitos funcionales o +técnicos ("prueba del seis" y similares). + +Poner cada uno en un apartado separado, indicando en el título de cada apartado +el código y la descripción corta del requisito asociado (por ejemplo, +**(RF24) Prueba del seis**). diff --git a/guia/conclusiones.md b/guia/conclusiones.md new file mode 100644 index 000000000..04dde1702 --- /dev/null +++ b/guia/conclusiones.md @@ -0,0 +1,3 @@ +# Conclusiones + +Explicar. diff --git a/guia/decisiones.md b/guia/decisiones.md new file mode 100644 index 000000000..c8fd2c8d7 --- /dev/null +++ b/guia/decisiones.md @@ -0,0 +1,3 @@ +# Decisiones adoptadas + +Explicar, indicando en cada caso su justificación. diff --git a/guia/descripcion.md b/guia/descripcion.md new file mode 100644 index 000000000..50b728849 --- /dev/null +++ b/guia/descripcion.md @@ -0,0 +1,24 @@ +# Descripción general del proyecto + +Explicar. + +## Funcionalidad principal de la aplicación + +Explicar. + +## Objetivos generales + +A diferencia de los casos de uso, los objetivos no tienen principio ni fin. + +Por ejemplo: + +* Objetivo: "gestionar los alquileres y las devoluciones de las películas". +* Casos de uso: "alquilar una película", "devolver una película". + +## URL del repositorio + +[https://github.com/ricpelo/proyecto](https://github.com/ricpelo/proyecto) + +## URL de la documentación + +[https://ricpelo.github.io/proyecto](https://ricpelo.github.io/proyecto) diff --git a/guia/diagramas.md b/guia/diagramas.md new file mode 100644 index 000000000..83e41f359 --- /dev/null +++ b/guia/diagramas.md @@ -0,0 +1,9 @@ +# Diagramas + +## Diagramas de clases + +Incluir. + +## Diagramas de estructura lógica de datos + +Incluir. diff --git a/guia/dificultades.md b/guia/dificultades.md new file mode 100644 index 000000000..c0b68701f --- /dev/null +++ b/guia/dificultades.md @@ -0,0 +1,5 @@ +# Dificultades encontradas + +Explicar, indicando también las soluciones adoptadas en cada caso. + +Incluir aquí el elemento de innovación que se indicó en la propuesta. diff --git a/guia/glosario.md b/guia/glosario.md new file mode 100644 index 000000000..e9e9a066e --- /dev/null +++ b/guia/glosario.md @@ -0,0 +1,3 @@ +# Glosario de términos + +Indicar y definir uno por uno. diff --git a/guia/images/.gitkeep b/guia/images/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/guia/instalacion.md b/guia/instalacion.md new file mode 100644 index 000000000..bf6053394 --- /dev/null +++ b/guia/instalacion.md @@ -0,0 +1,9 @@ +# Instrucciones de instalación y despliegue + +## En local + +Explicar. + +## En la nube + +Explicar. diff --git a/guia/manual.md b/guia/manual.md new file mode 100644 index 000000000..431d6a63f --- /dev/null +++ b/guia/manual.md @@ -0,0 +1,3 @@ +# Manual de usuario + +Explicar, incluyendo capturas de pantalla. diff --git a/guia/requisitos.md b/guia/requisitos.md new file mode 100644 index 000000000..2e3bcf2ba --- /dev/null +++ b/guia/requisitos.md @@ -0,0 +1,388 @@ + +# Catálogo de requisitos + +| **R1** | **Requisitos como incidencias** | +| --------------: | :------------------- | +| **Descripción** | Requisitos perfectamente definidos y convertidos en incidencias (issues) de GitHub. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R2** | **Código fuente** | +| --------------: | :------------------- | +| **Descripción** | Código fuente publicado en GitHub. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R3** | **Estilo del código** | +| --------------: | :------------------- | +| **Descripción** | Estilo del código según las normas internas de Yii2 para el código y para las plantillas de las vistas. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R4** | **Tres lanzamientos** | +| --------------: | :------------------- | +| **Descripción** | Tres lanzamientos (releases) etiquetados en el repositorio como v1, v2 y v3. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R5** | **README.md** | +| --------------: | :------------------- | +| **Descripción** | README.md en el directorio raíz con la descripción principal del proyecto. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R6** | **Documentación** | +| --------------: | :------------------- | +| **Descripción** | Documentación generada con yii2-apidoc y publicada en GitHub Pages a partir del contenido del directorio /docs: - Contenido: - Guía general. - API. - Formato: GitHub flavored Markdown (fuente) y HTML (resultado). - Usar make docs para crear la documentación. - Opcional: conversión a PDF. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R7** | **Incidencias en GitHub** | +| --------------: | :------------------- | +| **Descripción** | Administración y resolución de todas las incidencias notificadas en GitHub. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R8** | **Etiquetas e hitos** | +| --------------: | :------------------- | +| **Descripción** | Usar etiquetas e hitos: - Etiquetas: mínimo, importante, opcional (además de las ya existentes). - Hitos: v1, v2, v3 (con fechas de entrega aproximadas). | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R9** | **Rama master** | +| --------------: | :------------------- | +| **Descripción** | La rama master debe reflejar en todo momento el estado más estable de la aplicación, de manera que: - La rama master no debe contener bugs conocidos. - El desarrollo deberá hacerse en otras ramas creadas a tal efecto (una distinta por cada funcionalidad) y se irán combinado con la master una vez que se haya implementado la funcionalidad correspondiente. - La release actual en Heroku corresponderá siempre con el último commit de la rama master (usar los deploys automáticos de Heroku conectando la aplicación de Heroku con la rama master de GitHub). | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R10** | **Gestión del proyecto** | +| --------------: | :------------------- | +| **Descripción** | Usar Waffle o similar para la gestión general del proyecto. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R11** | **Final de cada iteración** | +| --------------: | :------------------- | +| **Descripción** | Al final de cada iteración: - Se realiza el lanzamiento que toque (v1, v2 o v3), etiquetando el commit correspondiente con el hito adecuado. - Se actualiza y publica la documentación. - Al final del Proyecto, se tiene que cumplir lo siguiente: - Todas las incidencias cerradas con su debida justificación. - En el backlog sólo pueden quedar tarjetas con prioridad opcional. - El lanzamiento v3 desplegado en la nube. - La documentación correctamente actualizada y publicada. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R12** | **Validación de formularios** | +| --------------: | :------------------- | +| **Descripción** | Validación de los campos de los formularios. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R13** | **Gestión de ventanas** | +| --------------: | :------------------- | +| **Descripción** | Gestión de ventanas. Gestión de la apariencia de las ventanas. Creación de nuevas ventanas y comunicación entre ventanas. (Opcional) | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R14** | **Manejo de eventos** | +| --------------: | :------------------- | +| **Descripción** | Interactividad a través de mecanismos de manejo de eventos intuitivos y eficaces. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R15** | **DOM** | +| --------------: | :------------------- | +| **Descripción** | Uso y manipulación de las características del modelo de objetos del documento (DOM). | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R16** | **Almacenamiento en el lado del cliente** | +| --------------: | :------------------- | +| **Descripción** | Uso de mecanismos de almacenamiento en el lado del cliente. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R17** | **jQuery, jQuery UI** | +| --------------: | :------------------- | +| **Descripción** | Uso de la librería jQuery, jQuery UI. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R18** | **Plugin no trabajado en clase** | +| --------------: | :------------------- | +| **Descripción** | Incluir al menos un plugin no trabajado en clase. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R19** | **Utilización de AJAX** | +| --------------: | :------------------- | +| **Descripción** | Utilización de mecanismos de comunicación asíncrona: AJAX. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R20** | **ECMAScript2015 (ES6)** | +| --------------: | :------------------- | +| **Descripción** | Uso de las nuevas incorporaciones del estándar ECMAScript2015 (ES6) | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R21** | **PHP** | +| --------------: | :------------------- | +| **Descripción** | Usar PHP 7.1 ó superior. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R22** | **Yii2 Framework** | +| --------------: | :------------------- | +| **Descripción** | Usar Yii2 Framework versión 2.0.10 ó superior. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R23** | **PostgreSQL** | +| --------------: | :------------------- | +| **Descripción** | Usar PostgreSQL versión 9.6 ó superior. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R24** | **Heroku** | +| --------------: | :------------------- | +| **Descripción** | Despliegue de la aplicación en la plataforma Heroku. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R25** | **Codeception** | +| --------------: | :------------------- | +| **Descripción** | Pruebas funcionales con Codeception. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R26** | **Code Climate** | +| --------------: | :------------------- | +| **Descripción** | Estilo y mantenibilidad del código fuente validados por Code Climate. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R27** | **Aplicación escalable** | +| --------------: | :------------------- | +| **Descripción** | La aplicación ha de ser escalable. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R28** | **Tecnología AJAX** | +| --------------: | :------------------- | +| **Descripción** | La aplicación debe hacer en algún momento un uso apropiado de la tecnología AJAX. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R29** | **Etiquetas semánticas de HTML5** | +| --------------: | :------------------- | +| **Descripción** | Para estructurar el contenido se utilizarán las etiquetas semánticas de HTML5. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R30** | **Presentación mediante CSS** | +| --------------: | :------------------- | +| **Descripción** | Todo lo relacionado con la presentación se trabajará mediante CSS. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R31** | **Diseño flexible** | +| --------------: | :------------------- | +| **Descripción** | El diseño será flexible. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R32** | **Transiciones, transformaciones, animaciones y contenido multimedia** | +| --------------: | :------------------- | +| **Descripción** | Existirán transiciones, transformaciones, animaciones y contenido multimedia. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R33** | **Uso de microdatos** | +| --------------: | :------------------- | +| **Descripción** | Uso de microdatos. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R34** | **Validación HTML5, CSS3 y accesibilidad** | +| --------------: | :------------------- | +| **Descripción** | Se deberá comprobar que el código realizado supera: - El validador para HTML5, CSS3. - Nivel de accesibilidad AA. - Prueba del seis. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R35** | **Diseño para varias resoluciones** | +| --------------: | :------------------- | +| **Descripción** | Implementar el diseño para resoluciones grandes y pequeñas. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R36** | **Varios navegadores** | +| --------------: | :------------------- | +| **Descripción** | Comprobar que el diseño es correcto en los siguientes navegadores: - Internet Explorer. - Chrome. - Mozilla Firefox. - Opera. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R37** | **Despliegue en un Host** | +| --------------: | :------------------- | +| **Descripción** | Realizar el despliegue en un Host: - Utilizando algún servicio gratuito de hosting como los vistos en clase - Instalar / configurar o solicitar el software necesario para desplegar el proyecto. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +| **R38** | **Despliegue en un servidor local** | +| --------------: | :------------------- | +| **Descripción** | Realizar un despliegue en un servidor local usando y configurando tres máquinas virtuales para: - Crear un servicio de Nombres de dominio. - Gestionar y administrar el servidor Apache tanto en Windows como Linux: - Instalar el servidor y configurarlo. - Configurar directivas. - Usar directorios virtuales y redireccionamientos. - Usar diferentes módulos estáticos y dinámicos. - Usar autenticaciones. - Usar ficheros de configuración personalizada de directorios. - Usar HTTPS y certificados Digitales. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + + +## Cuadro resumen + +| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** | +| :------------ | :-----------: | :------: | :-------------: | :---------: | +| (**R1**) Requisitos como incidencias | Mínimo | Técnico | Fácil | v1 | +| (**R2**) Código fuente | Mínimo | Técnico | Fácil | v1 | +| (**R3**) Estilo del código | Mínimo | Técnico | Fácil | v1 | +| (**R4**) Tres lanzamientos | Mínimo | Técnico | Fácil | v1 | +| (**R5**) README.md | Mínimo | Técnico | Fácil | v1 | +| (**R6**) Documentación | Mínimo | Técnico | Fácil | v1 | +| (**R7**) Incidencias en GitHub | Mínimo | Técnico | Fácil | v1 | +| (**R8**) Etiquetas e hitos | Mínimo | Técnico | Fácil | v1 | +| (**R9**) Rama master | Mínimo | Técnico | Fácil | v1 | +| (**R10**) Gestión del proyecto | Mínimo | Técnico | Fácil | v1 | +| (**R11**) Final de cada iteración | Mínimo | Técnico | Fácil | v1 | +| (**R12**) Validación de formularios | Mínimo | Técnico | Fácil | v1 | +| (**R13**) Gestión de ventanas | Mínimo | Técnico | Fácil | v1 | +| (**R14**) Manejo de eventos | Mínimo | Técnico | Fácil | v1 | +| (**R15**) DOM | Mínimo | Técnico | Fácil | v1 | +| (**R16**) Almacenamiento en el lado del cliente | Mínimo | Técnico | Fácil | v1 | +| (**R17**) jQuery, jQuery UI | Mínimo | Técnico | Fácil | v1 | +| (**R18**) Plugin no trabajado en clase | Mínimo | Técnico | Fácil | v1 | +| (**R19**) Utilización de AJAX | Mínimo | Técnico | Fácil | v1 | +| (**R20**) ECMAScript2015 (ES6) | Mínimo | Técnico | Fácil | v1 | +| (**R21**) PHP | Mínimo | Técnico | Fácil | v1 | +| (**R22**) Yii2 Framework | Mínimo | Técnico | Fácil | v1 | +| (**R23**) PostgreSQL | Mínimo | Técnico | Fácil | v1 | +| (**R24**) Heroku | Mínimo | Técnico | Fácil | v1 | +| (**R25**) Codeception | Mínimo | Técnico | Fácil | v1 | +| (**R26**) Code Climate | Mínimo | Técnico | Fácil | v1 | +| (**R27**) Aplicación escalable | Mínimo | Técnico | Fácil | v1 | +| (**R28**) Tecnología AJAX | Mínimo | Técnico | Fácil | v1 | +| (**R29**) Etiquetas semánticas de HTML5 | Mínimo | Técnico | Fácil | v1 | +| (**R30**) Presentación mediante CSS | Mínimo | Técnico | Fácil | v1 | +| (**R31**) Diseño flexible | Mínimo | Técnico | Fácil | v1 | +| (**R32**) Transiciones, transformaciones, animaciones y contenido multimedia | Mínimo | Técnico | Fácil | v1 | +| (**R33**) Uso de microdatos | Mínimo | Técnico | Fácil | v1 | +| (**R34**) Validación HTML5, CSS3 y accesibilidad | Mínimo | Técnico | Fácil | v1 | +| (**R35**) Diseño para varias resoluciones | Mínimo | Técnico | Fácil | v1 | +| (**R36**) Varios navegadores | Mínimo | Técnico | Fácil | v1 | +| (**R37**) Despliegue en un Host | Mínimo | Técnico | Fácil | v1 | +| (**R38**) Despliegue en un servidor local | Mínimo | Técnico | Fácil | v1 | diff --git a/guia/requisitos.xls b/guia/requisitos.xls new file mode 100644 index 000000000..15e249886 Binary files /dev/null and b/guia/requisitos.xls differ diff --git a/guia/scripts/publish-docs.sh b/guia/scripts/publish-docs.sh new file mode 100755 index 000000000..187b7ddd0 --- /dev/null +++ b/guia/scripts/publish-docs.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +BASE_DIR=$(dirname "$(readlink -f "$0")") + +api() +{ + OBJ_FILE="vendor/yiisoft/yii2/base/Object.php" + mv -f $OBJ_FILE $OBJ_FILE.viejo + vendor/bin/apidoc api .,vendor/yiisoft/yii2 docs/api \ + --pageTitle="API del proyecto" --guide=.. --guidePrefix= \ + --exclude="docs,vendor,tests" --interactive=0 \ + --template="project" \ + --readmeUrl="file://$BASE_DIR/README-api.md" + mv -f $OBJ_FILE.viejo $OBJ_FILE +} + +guide() +{ + vendor/bin/apidoc guide guia docs \ + --pageTitle="Guía del proyecto" --guidePrefix= --apiDocs=./api \ + --interactive=0 --template="project" + mv docs/README.html docs/index.html + ln -sf index.html docs/README.html + rm docs/README-api.html +} + +ACTUAL=$PWD +cd $BASE_DIR/../.. + +if [ "$1" = "-a" ] +then + rm -rf docs/api + api +elif [ "$1" = "-g" ] +then + if [ -d docs ] + then + find docs -maxdepth 1 -not -path "docs" -not -name "api" -print0 | xargs -0 rm -rf + fi + guide +else + rm -rf docs/ + api + guide +fi + +touch docs/.nojekyll + +cd $ACTUAL diff --git a/guia/scripts/requisitos.php b/guia/scripts/requisitos.php new file mode 100755 index 000000000..6f187bce3 --- /dev/null +++ b/guia/scripts/requisitos.php @@ -0,0 +1,272 @@ +#!/usr/bin/env php +getSheet(0); +$highestRow = $objWorksheet->getHighestDataRow(); // e.g. 10 +$highestColumn = $objWorksheet->getHighestDataColumn(); // e.g 'F' +$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5 + +$prioridades = ['Mínimo', 'Importante', 'Opcional']; +$tipos = ['Funcional', 'Técnico', 'Información']; +$complejidades = ['Fácil', 'Media', 'Difícil']; +$entregas = ['v1', 'v2', 'v3']; + +echo "\033[1;28m# Comprobando archivo requisitos.xls...\033[0m\n"; + +for ($fallo = 0, $row = 2; $row <= $highestRow; $row++) { + echo "\r(" . ($row - 1) . '/' . ($highestRow - 1) . ') '; + $codigo = $objWorksheet->getCell("A$row")->getValue(); + $prioridad = $objWorksheet->getCell("D$row")->getValue(); + $tipo = $objWorksheet->getCell("E$row")->getValue(); + $complejidad = $objWorksheet->getCell("F$row")->getValue(); + $entrega = $objWorksheet->getCell("G$row")->getValue(); + $incidencia = $objWorksheet->getCell("H$row")->getValue(); + + if (!preg_match('/R[1-9]\d*/u', $codigo)) { + $fallo = fallo("El código '$codigo' es incorrecto (celda A$row).\n Debe empezar por R y seguir con un número que no empiece por 0."); + } + if (!in_array($prioridad, $prioridades)) { + $fallo = fallo("La prioridad '$prioridad' es incorrecta (celda D$row). Debe ser: " + . implode(', ', $prioridades)); + } + if (!in_array($tipo, $tipos)) { + $fallo = fallo("El tipo '$tipo' es incorrecto (celda E$row). Debe ser: " + . implode(', ', $tipos)); + } + if (!in_array($complejidad, $complejidades)) { + $fallo = fallo("La complejidad '$complejidad' es incorrecta (celda F$row). Debe ser: " + . implode(', ', $complejidades)); + } + if (!in_array($entrega, $entregas)) { + $fallo = fallo("La entrega '$entrega' es incorrecta (celda G$row). Debe ser: " + . implode(', ', $entregas)); + } + if ($incidencia != '' && !ctype_digit((string) $incidencia)) { + $fallo = fallo("La incidencia '$incidencia' es incorrecta (celda H$row). Debe ser un número entero."); + } +} + +if ($fallo == 0) { + echo "\r\033[1;28m# No se han encontrado errores en el archivo 'requisitos.xls'.\033[0m\n"; + if ($check) { + exit(0); + } +} else { + exit($fallo); +} + +pcntl_async_signals(true); +pcntl_signal(SIGINT, function () {}); +pcntl_signal(SIGTERM, function () {}); +pcntl_signal(SIGTSTP, function () {}); + +if ($issues) { + try { + $client = new \Github\Client(); + $client->authenticate(getenv('GITHUB_TOKEN'), null, \Github\Client::AUTH_HTTP_TOKEN); + $login = $client->currentUser()->show()['login']; + $repo = trim(`basename -s .git $(git remote get-url origin)`); + } catch (\Github\Exception\RuntimeException $e) { + fallo('No se ha podido encontrar el repositorio en GitHub.'); + exit(1); + } + + $projects = $client->api('repo')->projects()->configure()->all($login, $repo); + + switch (count($projects)) { + case 0: + echo '# Creando el nuevo proyecto en GitHub Projects...'; + $project = $client->api('repo')->projects()->configure()->create($login, $repo, ['name' => 'Proyecto']); + echo " #{$project['number']}\n"; + break; + case 1: + $project = $projects[0]; + echo "# Usando el proyecto #{$project['number']} ya existente...\n"; + break; + default: + fallo("No puede haber más de un proyecto en GitHub Projects para este repositorio.\n Visita https://github.com/$login/$repo/projects y elimínalos todos o deja sólo uno."); + exit(1); + } + + $columns = $client->api('repo')->projects()->columns()->configure()->all($project['id']); + + switch (count($columns)) { + case 0: + echo "# Creando columnas en el proyecto...\n"; + $column = $client->api('repo')->projects()->columns()->configure()->create($project['id'], ['name' => 'To Do']); + $client->api('repo')->projects()->columns()->configure()->create($project['id'], ['name' => 'In Progress']); + $client->api('repo')->projects()->columns()->configure()->create($project['id'], ['name' => 'Done']); + break; + default: + foreach ($columns as $col) { + if ($col['name'] === 'To Do') { + $column = $col; + break; + } + } + if (isset($column)) { + echo "# Usando columnas ya existentes en el proyecto...\n"; + } else { + fallo("El proyecto existente no es válido (no tiene una columna 'To Do').\n Elimínalo en https://github.com/$login/$repo/projects\n o crea otro con la plantilla 'Automated kanban'."); + exit(1); + } + break; + } + + $milestones = $client->api('issue')->milestones()->all($login, $repo); + $entregas = [1 => 'v1', 2 => 'v2', 3 => 'v3']; + + if (array_diff_assoc($entregas, array_column($milestones, 'title', 'number')) !== []) { + foreach ($milestones as $m) { + echo "# Eliminando el hito {$m['title']}...\n"; + $client->api('issue')->milestones()->remove($login, $repo, $m['number']); + } + foreach ($entregas as $e) { + echo "# Creando el hito $e...\n"; + $client->api('issue')->milestones()->create($login, $repo, ['title' => $e]); + } + } + + $labels = array_column($client->api('issue')->labels()->all($login, $repo), 'color', 'name'); + $etiquetas = [ + 'mínimo' => 'e99695', + 'importante' => '9370db', + 'opcional' => 'fef2c0', + 'fácil' => 'f9ca98', + 'media' => '93d8d7', + 'difícil' => 'b60205', + 'funcional' => 'd4c5f9', + 'técnico' => '006b75', + 'información' => '0052cc', + ]; + + foreach ($etiquetas as $name => $color) { + if (isset($labels[$name])) { + if ($labels[$name] !== $color) { + echo "# Actualizando el color de la etiqueta $name...\n"; + $client->api('issue')->labels()->update($login, $repo, $name, $name, $color); + } + } else { + echo "# Creando la etiqueta $name...\n"; + $client->api('issue')->labels()->create($login, $repo, ['name' => $name, 'color' => $color]); + } + } +} + +$requisitos = "\n# Catálogo de requisitos\n\n"; +$resumen = "\n## Cuadro resumen\n\n" + . '| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** |' + . ($issues ? ' **Incidencia** |' : '') . "\n" + . '| :------------ | :-----------: | :------: | :-------------: | :---------: |' + . ($issues ? ' :------------: |' : '') . "\n"; + +echo "\033[1;28m# Leyendo archivo requisitos.xls...\033[0m\n"; + +for ($row = 2, $i = 1; $row <= $highestRow; $row++) { + echo '(' . ($row - 1) . '/' . ($highestRow - 1) . ') '; + $codigo = $objWorksheet->getCell("A$row")->getValue(); + $corta = $objWorksheet->getCell("B$row")->getValue(); + $cortaMd = $corta; + $corta = preg_replace('/`/u', '\`', $corta); + $larga = $objWorksheet->getCell("C$row")->getValue(); + $largaMd = preg_replace('/\n/u', ' ', $larga); + $larga = preg_replace('/`/u', '\`', $larga); + $prioridad = $objWorksheet->getCell("D$row")->getValue(); + $tipo = $objWorksheet->getCell("E$row")->getValue(); + $complejidad = $objWorksheet->getCell("F$row")->getValue(); + $entrega = $objWorksheet->getCell("G$row")->getValue(); + $incidencia = $objWorksheet->getCell("H$row")->getValue(); + + if ($issues) { + if ($incidencia === null) { + if ($i++ % 10 === 0) { + echo '# Deteniendo la ejecución por 5 segundos para no exceder el límite de tasa...'; + sleep(5); + echo "\n"; + } + echo "Generando incidencia para $codigo en GitHub..."; + $issue = $client->api('issue')->create($login, $repo, [ + 'title' => "($codigo) $corta", + 'body' => $larga, + 'assignee' => $login, + 'milestone' => mb_substr($entrega, 1, 1), + 'labels' => [ + mb_strtolower($prioridad), + mb_strtolower($tipo), + mb_strtolower($complejidad) + ], + 'projects' => "$login/$repo/{$project['number']}", + ]); + $incidencia = $issue['number']; + $link = "https://github.com/$repo/issues/$incidencia"; + $objWorksheet->setCellValue("H$row", $incidencia); + $objWorksheet->getCell("H$row")->getHyperlink()->setUrl($link); + $client->api('repo')->projects()->columns()->cards()->configure()->create($column['id'], ['content_type' => 'Issue', 'content_id' => $issue['id']]); + echo " #$incidencia\n"; + } else { + echo "El requisito $codigo ya tiene asociada la incidencia #$incidencia.\n"; + } + $link = "https://github.com/$login/$repo/issues/$incidencia"; + } + + $incidencia = $issues ? "| **Incidencia** | [$incidencia]($link) |" : ''; + $requisitos .= "| **$codigo** | **$cortaMd** |\n" + . "| --------------: | :------------------- |\n" + . "| **Descripción** | $largaMd |\n" + . "| **Prioridad** | $prioridad |\n" + . "| **Tipo** | $tipo |\n" + . "| **Complejidad** | $complejidad |\n" + . "| **Entrega** | $entrega |\n" + . $incidencia . "\n\n"; + + $resumen .= "| (**$codigo**) $cortaMd | $prioridad | $tipo | $complejidad | $entrega | $incidencia\n"; +} + +if (!$issues) { + echo "\n"; +} + +echo "\033[1;28m# Generando archivo requisitos.md...\033[0m\n"; +file_put_contents(BASE_DIR . '/requisitos.md', $requisitos . $resumen, LOCK_EX); + +if ($issues) { + echo "\033[1;28m# Actualizando archivo requisitos.xls...\033[0m\n"; + $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($objPHPExcel); + $writer->save(BASE_DIR . '/requisitos.xls'); + echo "\033[1;31m# No olvides ir a https://github.com/$login/$repo/projects/{$project['number']}\n"; + echo " para configurar la automatización de las columnas del proyecto en GitHub.\033[0m\n"; +} diff --git a/migrations/m190225_103236_create_usuarios_table.php b/migrations/m190225_103236_create_usuarios_table.php new file mode 100644 index 000000000..11aadf418 --- /dev/null +++ b/migrations/m190225_103236_create_usuarios_table.php @@ -0,0 +1,32 @@ +createTable('{{%usuarios}}', [ + 'id' => $this->primaryKey(), + 'nombre' => $this->string()->notNull(), + 'password' => $this->string(60)->notNull(), + 'auth_key' => $this->string(), + 'telefono' => $this->string(), + 'poblacion' => $this->string(), + ]); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropTable('{{%usuarios}}'); + } +} diff --git a/models/Usuarios.php b/models/Usuarios.php new file mode 100644 index 000000000..184cab680 --- /dev/null +++ b/models/Usuarios.php @@ -0,0 +1,53 @@ + 255], + [['password'], 'string', 'max' => 60], + ]; + } + + /** + * {@inheritdoc} + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'nombre' => 'Nombre', + 'password' => 'Password', + 'auth_key' => 'Auth Key', + 'telefono' => 'Teléfono', + 'poblacion' => 'Población', + ]; + } +} diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 000000000..34d552e8e --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,17 @@ + + + Configuración para proyectos. + + . + + requirements.php + vendor/* + views/* + tests/* + templates/* + docs/* + guia/* + web/assets/* + + + diff --git a/phpmd.xml b/phpmd.xml new file mode 100644 index 000000000..28336ccc0 --- /dev/null +++ b/phpmd.xml @@ -0,0 +1,54 @@ + + + Custom PHPMD settings for naming, cleancode and controversial rulesets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/proyecto.conf b/proyecto.conf new file mode 100644 index 000000000..7a5f5a606 --- /dev/null +++ b/proyecto.conf @@ -0,0 +1,45 @@ + + # The ServerName directive sets the request scheme, hostname and port that + # the server uses to identify itself. This is used when creating + # redirection URLs. In the context of virtual hosts, the ServerName + # specifies what hostname must appear in the request's Host: header to + # match this virtual host. For the default virtual host (this file) this + # value is not decisive as it is used as a last resort host regardless. + # However, you must set it for any further virtual host explicitly. + ServerName proyecto.local + + ServerAdmin webmaster@localhost + DocumentRoot /var/www/web/proyecto/web + + + Options +FollowSymLinks + IndexIgnore */* + + RewriteEngine on + + # if a directory or a file exists, use it directly + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + + # otherwise forward it to index.php + RewriteRule . index.php + + + # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, + # error, crit, alert, emerg. + # It is also possible to configure the loglevel for particular + # modules, e.g. + #LogLevel info ssl:warn + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + # For most configuration files from conf-available/, which are + # enabled or disabled at a global level, it is possible to + # include a line for only one particular virtual host. For example the + # following line enables the CGI configuration for this host only + # after it has been globally disabled with "a2disconf". + #Include conf-available/serve-cgi-bin.conf + + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/setup.sh b/setup.sh new file mode 100755 index 000000000..7a37675ec --- /dev/null +++ b/setup.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +DIR=$(basename $(realpath .)) + +sed -i s/proyecto/$DIR/g db/* config/* proyecto.conf codeception.yml +mv proyecto.conf $DIR.conf +mv db/proyecto.sql db/$DIR.sql +mv github .github +rm -f $0 diff --git a/templates/crud/default/controller.php b/templates/crud/default/controller.php new file mode 100644 index 000000000..b7049e72a --- /dev/null +++ b/templates/crud/default/controller.php @@ -0,0 +1,179 @@ +controllerClass); +$modelClass = StringHelper::basename($generator->modelClass); +$searchModelClass = StringHelper::basename($generator->searchModelClass); +if ($modelClass === $searchModelClass) { + $searchModelAlias = $searchModelClass . 'Search'; +} + +/* @var $class ActiveRecordInterface */ +$class = $generator->modelClass; +$pks = $class::primaryKey(); +$urlParams = $generator->generateUrlParams(); +$actionParams = $generator->generateActionParams(); +$actionParamComments = $generator->generateActionParamComments(); + +echo " + +namespace controllerClass, '\\')) ?>; + +use Yii; +use modelClass, '\\') ?>; +searchModelClass)): ?> +use searchModelClass, '\\') . (isset($searchModelAlias) ? " as $searchModelAlias" : "") ?>; + +use yii\data\ActiveDataProvider; + +use baseControllerClass, '\\') ?>; +use yii\web\NotFoundHttpException; +use yii\filters\VerbFilter; + +/** + * implements the CRUD actions for model. + */ +class extends baseControllerClass) . "\n" ?> +{ + /** + * {@inheritdoc} + */ + public function behaviors() + { + return [ + 'verbs' => [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'delete' => ['POST'], + ], + ], + ]; + } + + /** + * Lists all models. + * @return mixed + */ + public function actionIndex() + { +searchModelClass)): ?> + $searchModel = new (); + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); + + return $this->render('index', [ + 'searchModel' => $searchModel, + 'dataProvider' => $dataProvider, + ]); + + $dataProvider = new ActiveDataProvider([ + 'query' => ::find(), + ]); + + return $this->render('index', [ + 'dataProvider' => $dataProvider, + ]); + + } + + /** + * Displays a single model. + * + * @return mixed + * @throws NotFoundHttpException if the model cannot be found + */ + public function actionView() + { + return $this->render('view', [ + 'model' => $this->findModel(), + ]); + } + + /** + * Creates a new model. + * If creation is successful, the browser will be redirected to the 'view' page. + * @return mixed + */ + public function actionCreate() + { + $model = new (); + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', ]); + } + + return $this->render('create', [ + 'model' => $model, + ]); + } + + /** + * Updates an existing model. + * If update is successful, the browser will be redirected to the 'view' page. + * + * @return mixed + * @throws NotFoundHttpException if the model cannot be found + */ + public function actionUpdate() + { + $model = $this->findModel(); + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', ]); + } + + return $this->render('update', [ + 'model' => $model, + ]); + } + + /** + * Deletes an existing model. + * If deletion is successful, the browser will be redirected to the 'index' page. + * + * @return mixed + * @throws NotFoundHttpException if the model cannot be found + */ + public function actionDelete() + { + $this->findModel()->delete(); + + return $this->redirect(['index']); + } + + /** + * Finds the model based on its primary key value. + * If the model is not found, a 404 HTTP exception will be thrown. + * + * @return the loaded model + * @throws NotFoundHttpException if the model cannot be found + */ + protected function findModel() + { + \$$pk"; + } + $condition = '[' . implode(', ', $condition) . ']'; +} +?> + if (($model = ::findOne()) !== null) { + return $model; + } + + throw new NotFoundHttpException(generateString('The requested page does not exist.') ?>); + } +} diff --git a/templates/crud/default/search.php b/templates/crud/default/search.php new file mode 100644 index 000000000..0ca91d454 --- /dev/null +++ b/templates/crud/default/search.php @@ -0,0 +1,86 @@ +modelClass); +$searchModelClass = StringHelper::basename($generator->searchModelClass); +if ($modelClass === $searchModelClass) { + $modelAlias = $modelClass . 'Model'; +} +$rules = $generator->generateSearchRules(); +$labels = $generator->generateSearchLabels(); +$searchAttributes = $generator->getSearchAttributes(); +$searchConditions = $generator->generateSearchConditions(); + +echo " + +namespace searchModelClass, '\\')) ?>; + +use yii\base\Model; +use yii\data\ActiveDataProvider; +use modelClass, '\\') . (isset($modelAlias) ? " as $modelAlias" : "") ?>; + +/** + * represents the model behind the search form of `modelClass ?>`. + */ +class extends + +{ + /** + * {@inheritdoc} + */ + public function rules() + { + return [ + , + ]; + } + + /** + * {@inheritdoc} + */ + public function scenarios() + { + // bypass scenarios() implementation in the parent class + return Model::scenarios(); + } + + /** + * Creates data provider instance with search query applied + * + * @param array $params + * + * @return ActiveDataProvider + */ + public function search($params) + { + $query = ::find(); + + // add conditions that should always apply here + + $dataProvider = new ActiveDataProvider([ + 'query' => $query, + ]); + + $this->load($params); + + if (!$this->validate()) { + // uncomment the following line if you do not want to return any records when validation fails + // $query->where('0=1'); + return $dataProvider; + } + + // grid filtering conditions + + + return $dataProvider; + } +} diff --git a/templates/crud/default/views/_form.php b/templates/crud/default/views/_form.php new file mode 100644 index 000000000..37c8fbac8 --- /dev/null +++ b/templates/crud/default/views/_form.php @@ -0,0 +1,42 @@ +modelClass(); +$safeAttributes = $model->safeAttributes(); +if (empty($safeAttributes)) { + $safeAttributes = $model->attributes(); +} + +echo " + +use yii\bootstrap4\Html; +use yii\bootstrap4\ActiveForm; + +/* @var $this yii\web\View */ +/* @var $model modelClass, '\\') ?> */ +/* @var $form yii\bootstrap4\ActiveForm */ +?> + +
+ + $form = ActiveForm::begin(); ?> + +getColumnNames() as $attribute) { + if (in_array($attribute, $safeAttributes)) { + echo " generateActiveField($attribute) . " ?>\n\n"; + } +} ?> +
+ Html::submitButton(generateString('Save') ?>, ['class' => 'btn btn-success']) ?> +
+ + ActiveForm::end(); ?> + +
diff --git a/templates/crud/default/views/_search.php b/templates/crud/default/views/_search.php new file mode 100644 index 000000000..489c3b47f --- /dev/null +++ b/templates/crud/default/views/_search.php @@ -0,0 +1,49 @@ + + +use yii\bootstrap4\Html; +use yii\bootstrap4\ActiveForm; + +/* @var $this yii\web\View */ +/* @var $model searchModelClass, '\\') ?> */ +/* @var $form yii\bootstrap4\ActiveForm */ +?> + + diff --git a/templates/crud/default/views/create.php b/templates/crud/default/views/create.php new file mode 100644 index 000000000..f5a4a165d --- /dev/null +++ b/templates/crud/default/views/create.php @@ -0,0 +1,29 @@ + + +use yii\bootstrap4\Html; + +/* @var $this yii\web\View */ +/* @var $model modelClass, '\\') ?> */ + +$this->title = generateString('Create ' . Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>; +$this->params['breadcrumbs'][] = ['label' => generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>, 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

Html::encode($this->title) ?>

+ + $this->render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/templates/crud/default/views/index.php b/templates/crud/default/views/index.php new file mode 100644 index 000000000..c6c0ee487 --- /dev/null +++ b/templates/crud/default/views/index.php @@ -0,0 +1,82 @@ +generateUrlParams(); +$nameAttribute = $generator->getNameAttribute(); + +echo " + +use yii\bootstrap4\Html; +use indexWidgetType === 'grid' ? "yii\\grid\\GridView" : "yii\\widgets\\ListView" ?>; +enablePjax ? 'use yii\widgets\Pjax;' : '' ?> + +/* @var $this yii\web\View */ +searchModelClass) ? "/* @var \$searchModel " . ltrim($generator->searchModelClass, '\\') . " */\n" : '' ?> +/* @var $dataProvider yii\data\ActiveDataProvider */ + +$this->title = generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

Html::encode($this->title) ?>

+ +

+ Html::a(generateString('Create ' . Inflector::camel2words(StringHelper::basename($generator->modelClass))) ?>, ['create'], ['class' => 'btn btn-success']) ?> +

+ +enablePjax ? " \n" : '' ?> +searchModelClass)): ?> +indexWidgetType === 'grid' ? "// " : "") ?>echo $this->render('_search', ['model' => $searchModel]); ?> + + +indexWidgetType === 'grid'): ?> + GridView::widget([ + 'dataProvider' => $dataProvider, + searchModelClass) ? "'filterModel' => \$searchModel,\n 'columns' => [\n" : "'columns' => [\n"; ?> + ['class' => 'yii\grid\SerialColumn'], + +getTableSchema()) === false) { + foreach ($generator->getColumnNames() as $name) { + if (++$count < 6) { + echo " '" . $name . "',\n"; + } else { + echo " //'" . $name . "',\n"; + } + } +} else { + foreach ($tableSchema->columns as $column) { + $format = $generator->generateColumnFormat($column); + if (++$count < 6) { + echo " '" . $column->name . ($format === 'text' ? "" : ":" . $format) . "',\n"; + } else { + echo " //'" . $column->name . ($format === 'text' ? "" : ":" . $format) . "',\n"; + } + } +} +?> + + ['class' => 'yii\grid\ActionColumn'], + ], + ]); ?> + + ListView::widget([ + 'dataProvider' => $dataProvider, + 'itemOptions' => ['class' => 'item'], + 'itemView' => function ($model, $key, $index, $widget) { + return Html::a(Html::encode($model->), ['view', ]); + }, + ]) ?> + + +enablePjax ? " \n" : '' ?> + +
diff --git a/templates/crud/default/views/update.php b/templates/crud/default/views/update.php new file mode 100644 index 000000000..c8870e06e --- /dev/null +++ b/templates/crud/default/views/update.php @@ -0,0 +1,40 @@ +generateUrlParams(); +$modelClassName = Inflector::camel2words(StringHelper::basename($generator->modelClass)); +$nameAttributeTemplate = '$model->' . $generator->getNameAttribute(); +$titleTemplate = $generator->generateString('Update ' . $modelClassName . ': {name}', ['name' => '{nameAttribute}']); +if ($generator->enableI18N) { + $title = strtr($titleTemplate, ['\'{nameAttribute}\'' => $nameAttributeTemplate]); +} else { + $title = strtr($titleTemplate, ['{nameAttribute}\'' => '\' . ' . $nameAttributeTemplate]); +} + +echo " + +use yii\bootstrap4\Html; + +/* @var $this yii\web\View */ +/* @var $model modelClass, '\\') ?> */ + +$this->title = ; +$this->params['breadcrumbs'][] = ['label' => generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>, 'url' => ['index']]; +$this->params['breadcrumbs'][] = ['label' => $model->getNameAttribute() ?>, 'url' => ['view', ]]; +$this->params['breadcrumbs'][] = generateString('Update') ?>; +?> +
+ +

Html::encode($this->title) ?>

+ + $this->render('_form', [ + 'model' => $model, + ]) ?> + +
diff --git a/templates/crud/default/views/view.php b/templates/crud/default/views/view.php new file mode 100644 index 000000000..c0d3e7bb0 --- /dev/null +++ b/templates/crud/default/views/view.php @@ -0,0 +1,58 @@ +generateUrlParams(); + +echo " + +use yii\bootstrap4\Html; +use yii\widgets\DetailView; + +/* @var $this yii\web\View */ +/* @var $model modelClass, '\\') ?> */ + +$this->title = $model->getNameAttribute() ?>; +$this->params['breadcrumbs'][] = ['label' => generateString(Inflector::pluralize(Inflector::camel2words(StringHelper::basename($generator->modelClass)))) ?>, 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +\yii\web\YiiAsset::register($this); +?> +
+ +

Html::encode($this->title) ?>

+ +

+ Html::a(generateString('Update') ?>, ['update', ], ['class' => 'btn btn-primary']) ?> + Html::a(generateString('Delete') ?>, ['delete', ], [ + 'class' => 'btn btn-danger', + 'data' => [ + 'confirm' => generateString('Are you sure you want to delete this item?') ?>, + 'method' => 'post', + ], + ]) ?> +

+ + DetailView::widget([ + 'model' => $model, + 'attributes' => [ +getTableSchema()) === false) { + foreach ($generator->getColumnNames() as $name) { + echo " '" . $name . "',\n"; + } +} else { + foreach ($generator->getTableSchema()->columns as $column) { + $format = $generator->generateColumnFormat($column); + echo " '" . $column->name . ($format === 'text' ? "" : ":" . $format) . "',\n"; + } +} +?> + ], + ]) ?> + +
diff --git a/tests/acceptance.suite.yml.example b/tests/acceptance.suite.yml.example index 7bb4986fd..92a1908b7 100644 --- a/tests/acceptance.suite.yml.example +++ b/tests/acceptance.suite.yml.example @@ -2,8 +2,14 @@ class_name: AcceptanceTester modules: enabled: - WebDriver: - url: http://127.0.0.1:8080/ - browser: firefox + url: http://localhost:8088/ + browser: chrome + port: 9515 # Quitar esta línea si se usa Selenium + window_size: false + capabilities: + chromeOptions: + args: ["--headless", "--disable-gpu", "--disable-extensions"] + binary: "/usr/bin/google-chrome" - Yii2: part: orm entryScript: index-test.php diff --git a/tests/acceptance/HomeCest.php b/tests/acceptance/HomeCest.php index e65df16ae..77899e3b9 100644 --- a/tests/acceptance/HomeCest.php +++ b/tests/acceptance/HomeCest.php @@ -7,7 +7,7 @@ class HomeCest public function ensureThatHomePageWorks(AcceptanceTester $I) { $I->amOnPage(Url::toRoute('/site/index')); - $I->see('My Company'); + $I->see('My Application'); $I->seeLink('About'); $I->click('About'); diff --git a/tests/bin/yii b/tests/bin/yii index 4923537fb..fd52b2b8a 100755 --- a/tests/bin/yii +++ b/tests/bin/yii @@ -8,10 +8,15 @@ * @license http://www.yiiframework.com/license/ */ -defined('YII_DEBUG') or define('YII_DEBUG', true); -defined('YII_ENV') or define('YII_ENV', 'test'); - require __DIR__ . '/../../vendor/autoload.php'; + +if (file_exists($file = __DIR__ . '/../../.env')) { + (new \Symfony\Component\Dotenv\Dotenv())->load($file); +} + +define('YII_ENV', getenv('YII_ENV') ?: 'test'); +define('YII_DEBUG', getenv('YII_DEBUG') ?: YII_ENV == 'test' || YII_ENV == 'dev'); + require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php'; $config = yii\helpers\ArrayHelper::merge( @@ -23,7 +28,6 @@ $config = yii\helpers\ArrayHelper::merge( ] ); - $application = new yii\console\Application($config); $exitCode = $application->run(); exit($exitCode); diff --git a/tests/download-chromedriver.sh b/tests/download-chromedriver.sh new file mode 100755 index 000000000..c723f1136 --- /dev/null +++ b/tests/download-chromedriver.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +BASE_DIR=$(dirname "$(readlink -f "$0")") +CHROME="chromedriver" +SN="S" +if [ -f "$BASE_DIR/$CHROME" ] +then + if [ "$1" = "-q" ] + then + SN="N" + else + echo -n "El archivo $CHROME ya existe. ¿Desea descargar la última versión? (s/N): " + read SN + [ "$SN" = "s" ] && SN="S" + fi +fi +if [ "$SN" = "S" ] + then + echo "Descargando la última versión de ChromeDriver..." + ZIP=chromedriver_linux64.zip + VERSION=$(curl -s https://chromedriver.storage.googleapis.com/LATEST_RELEASE) + curl -s -o $BASE_DIR/$ZIP https://chromedriver.storage.googleapis.com/$VERSION/$ZIP + unzip -o $BASE_DIR/$ZIP -d $BASE_DIR + rm $BASE_DIR/$ZIP +fi diff --git a/tests/functional.suite.yml b/tests/functional.suite.yml index 374c6df45..b5de7e143 100644 --- a/tests/functional.suite.yml +++ b/tests/functional.suite.yml @@ -9,5 +9,6 @@ class_name: FunctionalTester modules: enabled: + - Asserts - Filesystem - Yii2 diff --git a/tests/functional/ContactFormCest.php b/tests/functional/ContactFormCest.php index ad8167865..8f76017c0 100644 --- a/tests/functional/ContactFormCest.php +++ b/tests/functional/ContactFormCest.php @@ -17,11 +17,11 @@ public function submitEmptyForm(\FunctionalTester $I) $I->submitForm('#contact-form', []); $I->expectTo('see validations errors'); $I->see('Contact', 'h1'); - $I->see('Name cannot be blank'); - $I->see('Email cannot be blank'); - $I->see('Subject cannot be blank'); - $I->see('Body cannot be blank'); - $I->see('The verification code is incorrect'); + $I->see('Name no puede estar vacío'); + $I->see('Email no puede estar vacío'); + $I->see('Subject no puede estar vacío'); + $I->see('Body no puede estar vacío'); + $I->see('El código de verificación es incorrecto'); } public function submitFormWithIncorrectEmail(\FunctionalTester $I) @@ -34,10 +34,10 @@ public function submitFormWithIncorrectEmail(\FunctionalTester $I) 'ContactForm[verifyCode]' => 'testme', ]); $I->expectTo('see that email address is wrong'); - $I->dontSee('Name cannot be blank', '.help-inline'); - $I->see('Email is not a valid email address.'); - $I->dontSee('Subject cannot be blank', '.help-inline'); - $I->dontSee('Body cannot be blank', '.help-inline'); + $I->dontSee('Name no puede estar vacío', '.help-inline'); + $I->see('Email no es una dirección de correo válida.'); + $I->dontSee('Subject no puede esstar vacío', '.help-inline'); + $I->dontSee('Body no puede estar vacío', '.help-inline'); $I->dontSee('The verification code is incorrect', '.help-inline'); } diff --git a/tests/functional/LoginFormCest.php b/tests/functional/LoginFormCest.php index 7a83a27d6..cbabe1aab 100644 --- a/tests/functional/LoginFormCest.php +++ b/tests/functional/LoginFormCest.php @@ -33,8 +33,8 @@ public function loginWithEmptyCredentials(\FunctionalTester $I) { $I->submitForm('#login-form', []); $I->expectTo('see validations errors'); - $I->see('Username cannot be blank.'); - $I->see('Password cannot be blank.'); + $I->see('Username no puede estar vacío.'); + $I->see('Password no puede estar vacío.'); } public function loginWithWrongCredentials(\FunctionalTester $I) @@ -56,4 +56,4 @@ public function loginSuccessfully(\FunctionalTester $I) $I->see('Logout (admin)'); $I->dontSeeElement('form#login-form'); } -} \ No newline at end of file +} diff --git a/tests/functional/UsuariosCest.php b/tests/functional/UsuariosCest.php new file mode 100644 index 000000000..9cf20217d --- /dev/null +++ b/tests/functional/UsuariosCest.php @@ -0,0 +1,25 @@ + UsuariosFixture::class, + ], + ]; + } + + public function hayUsuarios(FunctionalTester $I) + { + $I->assertNotEquals(0, Usuarios::find()->count()); + } +} + diff --git a/tests/run-acceptance.sh b/tests/run-acceptance.sh new file mode 100755 index 000000000..2f05f0ce3 --- /dev/null +++ b/tests/run-acceptance.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +BASE_DIR=$(dirname "$(readlink -f "$0")") +PORT=8088 + +if [ -f $BASE_DIR/acceptance.suite.yml ] +then + if fuser -n tcp $PORT > /dev/null 2>&1 + then + echo "Matando los procesos en los puertos $PORT y 9515..." + fuser -k -n tcp $PORT + fuser -k -n tcp 9515 + fi + if [ "$1" != "-d" ] + then + echo "Ejecutando chromedriver --url-base=/wd/hub ..." + $BASE_DIR/chromedriver --url-base=/wd/hub > /dev/null 2>&1 & + echo "Ejecutando tests/bin/yii serve ..." + if [ "$1" = "-v" ] + then + $BASE_DIR/bin/yii serve --port=$PORT & + else + $BASE_DIR/bin/yii serve --port=$PORT > /dev/null 2>&1 & + fi + fi +fi diff --git a/tests/setup-acceptance.sh b/tests/setup-acceptance.sh new file mode 100755 index 000000000..a0b14f461 --- /dev/null +++ b/tests/setup-acceptance.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +BASE_DIR=$(dirname "$(readlink -f "$0")") +ACTUAL=$PWD +cd $BASE_DIR/.. +$BASE_DIR/download-chromedriver.sh -q +ACCEPT=tests/acceptance.suite.yml +SN="S" +if [ -f $ACCEPT ] +then + if [ "$1" = "-q" ] + then + SN="N" + else + echo -n "El archivo $ACCEPT ya existe. ¿Desea sobreescribirlo? (s/N): " + read SN + [ "$SN" = "s" ] && SN="S" + fi +fi +if [ "$SN" = "S" ] +then + echo "Copiando $ACCEPT.example sobre $ACCEPT..." + cp -f $ACCEPT.example $ACCEPT +fi +if ! grep -qs "codeception/codeception" composer.json +then + echo "Pasando de codeception/base a codeception/codeception..." + sed -i s%codeception/base%codeception/codeception%g composer.json + echo "Ejecutando composer update..." + composer update +else + echo "Ya se requiere codeception/codeception en composer.json." +fi +cd $ACTUAL diff --git a/tests/unit/fixtures/UsuariosFixture.php b/tests/unit/fixtures/UsuariosFixture.php new file mode 100644 index 000000000..52d2ad43a --- /dev/null +++ b/tests/unit/fixtures/UsuariosFixture.php @@ -0,0 +1,10 @@ + 'vaca.roberto', + 'password' => '$2y$13$AbFTOYb9VlhAT9B5HsTIh.EyojYnHPlXkJBB/ifYg6F/sHa/9SvKS', + 'auth_key' => 'SuZOf8aEastmBX_AQyWNsvAeFqgwoTDY', + 'telefono' => '980-018583', + 'poblacion' => 'A Alfaro', + ], + [ + 'nombre' => 'alberto19', + 'password' => '$2y$13$H/Xzfudn7XZT2jGQN.bXdOXuIme96o7tc89Hdky7u11d1AUtHZ4bi', + 'auth_key' => '5UXD-aFyEJbJi8eeRhMf8hV0VaMnGZ4r', + 'telefono' => '+34 693 834368', + 'poblacion' => 'San Domínguez', + ], + [ + 'nombre' => 'mespinosa', + 'password' => '$2y$13$YppbMuFIlG6joh2IcNIAY.nX.9Dt7efZLtcCs8dG5ruNK8KGLJ0Ne', + 'auth_key' => '-TCsEeW4ivD6nSX5h3dydJbi75q42a0V', + 'telefono' => '+34 652-929710', + 'poblacion' => 'Villa Barrios de Lemos', + ], + [ + 'nombre' => 'mara.caballero', + 'password' => '$2y$13$alqQs15drCLRRGIpv572iOC1i4gAF3Hi5BgrMEaHgqBpsMMu9hyeS', + 'auth_key' => 'qNSFfbSc25NJa0G3gQC6y_OBfSOCFojN', + 'telefono' => '965-49-1015', + 'poblacion' => 'San Cárdenas', + ], + [ + 'nombre' => 'vila.miriam', + 'password' => '$2y$13$H7SJdO6VFNmlmNQWJZzebeZq.xUgTf41S/2/PqfUrL3V.2VlWyawq', + 'auth_key' => '7xKI0iU_8_ThBKNlF6vwz13o2M-320_y', + 'telefono' => '954-813387', + 'poblacion' => 'Urías del Vallès', + ], + [ + 'nombre' => 'rordonez', + 'password' => '$2y$13$AVfOlfZXHQTdcLqG42QrOeaCjybEQQ6s4JPiFq8yXr9vZDKvAhu8u', + 'auth_key' => 'hOy8vfmrUMcpYpzcozf4ITEdxCTbCdHG', + 'telefono' => '682850032', + 'poblacion' => 'Villa Batista del Pozo', + ], + [ + 'nombre' => 'zbeltran', + 'password' => '$2y$13$A12aWYGMjPj9vO8WfrCV3ul7w6CeMj37OklpnWvaGnsWSJSLSr126', + 'auth_key' => 'zYW6uQKRuxUNuD-WUf1wNXVUZFdF-tM6', + 'telefono' => '669-583319', + 'poblacion' => 'O Jaimes de Ulla', + ], + [ + 'nombre' => 'cristina.rodarte', + 'password' => '$2y$13$mN.JV29TF3iibmUK3fDglO409qTY3i0RYHrf2tBxN2rqXNMGa60DC', + 'auth_key' => 'UT0JHlazUiRAU5iR_RuRiOBy17tsoxmH', + 'telefono' => '900 95 6431', + 'poblacion' => 'Os Guevara', + ], + [ + 'nombre' => 'wgalindo', + 'password' => '$2y$13$.bFTow12e8tqpIZRfG/qseimzrrGvI2uOggeiNM.mMnxSVKKEMJNO', + 'auth_key' => 'vivNA8VNLN7N30a8NUJh6nZxmy7E9TWm', + 'telefono' => '919 23 5328', + 'poblacion' => 'El Castellanos', + ], + [ + 'nombre' => 'godinez.sofia', + 'password' => '$2y$13$YqN8iRvkEPIbrYB0a4pJ3OyYQrNhhajnBYvSis1862lP4luSXQW6C', + 'auth_key' => '5vWzlzdWZXoJ8-va7V761wIQO4QWxdlj', + 'telefono' => '666-069726', + 'poblacion' => 'Los Palacios Medio', + ], +]; diff --git a/tests/unit/models/UsuariosTest.php b/tests/unit/models/UsuariosTest.php new file mode 100644 index 000000000..0a52ab938 --- /dev/null +++ b/tests/unit/models/UsuariosTest.php @@ -0,0 +1,23 @@ + UsuariosFixture::class, + ], + ]; + } + + public function testHayUsuarios() + { + expect(Usuarios::find()->count())->notEquals(0); + } +} diff --git a/tests/unit/templates/fixtures/usuarios.php b/tests/unit/templates/fixtures/usuarios.php new file mode 100644 index 000000000..2574c978b --- /dev/null +++ b/tests/unit/templates/fixtures/usuarios.php @@ -0,0 +1,16 @@ + $faker->unique()->userName, + 'password' => Yii::$app->security->generatePasswordHash('password_' . $index), + 'auth_key' => Yii::$app->security->generateRandomString(), + 'telefono' => $faker->phoneNumber, + 'poblacion' => $faker->city, +]; diff --git a/views/layouts/main.php b/views/layouts/main.php index 87dfdcbc9..c41f3b8ab 100644 --- a/views/layouts/main.php +++ b/views/layouts/main.php @@ -5,9 +5,9 @@ use app\widgets\Alert; use yii\helpers\Html; -use yii\bootstrap\Nav; -use yii\bootstrap\NavBar; -use yii\widgets\Breadcrumbs; +use yii\bootstrap4\Nav; +use yii\bootstrap4\NavBar; +use yii\bootstrap4\Breadcrumbs; use app\assets\AppAsset; AppAsset::register($this); @@ -32,11 +32,14 @@ 'brandLabel' => Yii::$app->name, 'brandUrl' => Yii::$app->homeUrl, 'options' => [ - 'class' => 'navbar-inverse navbar-fixed-top', + 'class' => 'navbar-dark bg-dark navbar-expand-md fixed-top', + ], + 'collapseOptions' => [ + 'class' => 'justify-content-end', ], ]); echo Nav::widget([ - 'options' => ['class' => 'navbar-nav navbar-right'], + 'options' => ['class' => 'navbar-nav'], 'items' => [ ['label' => 'Home', 'url' => ['/site/index']], ['label' => 'About', 'url' => ['/site/about']], @@ -44,11 +47,11 @@ Yii::$app->user->isGuest ? ( ['label' => 'Login', 'url' => ['/site/login']] ) : ( - '
  • ' + '
  • ' @@ -69,9 +72,9 @@ diff --git a/views/site/contact.php b/views/site/contact.php index f4c1e74a2..e2f4da05f 100644 --- a/views/site/contact.php +++ b/views/site/contact.php @@ -5,7 +5,7 @@ /* @var $model app\models\ContactForm */ use yii\helpers\Html; -use yii\bootstrap\ActiveForm; +use yii\bootstrap4\ActiveForm; use yii\captcha\Captcha; $this->title = 'Contact'; @@ -39,9 +39,15 @@

    -
    +
    - 'contact-form']); ?> + 'contact-form', + 'layout' => 'horizontal', + 'fieldConfig' => [ + 'horizontalCssClasses' => ['label' => 'col-sm-2'], + ], + ]); ?> field($model, 'name')->textInput(['autofocus' => true]) ?> @@ -52,7 +58,8 @@ field($model, 'body')->textarea(['rows' => 6]) ?> field($model, 'verifyCode')->widget(Captcha::className(), [ - 'template' => '
    {image}
    {input}
    ', + 'imageOptions' => ['class' => 'col-sm-3', 'style' => 'padding: 0'], + 'options' => ['class' => 'form-control col-sm-7', 'style' => 'display: inline'], ]) ?>
    diff --git a/views/site/index.php b/views/site/index.php index f78061088..295dfa7f1 100644 --- a/views/site/index.php +++ b/views/site/index.php @@ -17,7 +17,7 @@
    -
    +

    Heading

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et @@ -25,9 +25,9 @@ ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

    -

    Yii Documentation »

    +

    Yii Documentation »

    -
    +

    Heading

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et @@ -35,9 +35,9 @@ ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

    -

    Yii Forum »

    +

    Yii Forum »

    -
    +

    Heading

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et @@ -45,7 +45,7 @@ ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

    -

    Yii Extensions »

    +

    Yii Extensions »

    diff --git a/views/site/login.php b/views/site/login.php index 0944d37e4..bb9233a2f 100644 --- a/views/site/login.php +++ b/views/site/login.php @@ -5,7 +5,7 @@ /* @var $model app\models\LoginForm */ use yii\helpers\Html; -use yii\bootstrap\ActiveForm; +use yii\bootstrap4\ActiveForm; $this->title = 'Login'; $this->params['breadcrumbs'][] = $this->title; @@ -19,8 +19,7 @@ 'id' => 'login-form', 'layout' => 'horizontal', 'fieldConfig' => [ - 'template' => "{label}\n
    {input}
    \n
    {error}
    ", - 'labelOptions' => ['class' => 'col-lg-1 control-label'], + 'horizontalCssClasses' => ['wrapper' => 'col-sm-5'], ], ]); ?> @@ -28,19 +27,17 @@ field($model, 'password')->passwordInput() ?> - field($model, 'rememberMe')->checkbox([ - 'template' => "
    {input} {label}
    \n
    {error}
    ", - ]) ?> + field($model, 'rememberMe')->checkbox() ?>
    -
    +
    'btn btn-primary', 'name' => 'login-button']) ?>
    -
    +
    You may login with admin/admin or demo/demo.
    To modify the username/password, please check out the code app\models\User::$users.
    diff --git a/web/css/site.css b/web/css/site.css index 2bfebd275..d817adbfb 100644 --- a/web/css/site.css +++ b/web/css/site.css @@ -92,24 +92,10 @@ a.desc:after { /* align the logout "link" (button in form) of the navbar */ .nav li > form > button.logout { - padding: 15px; border: none; } -@media(max-width:767px) { - .nav li > form > button.logout { - display:block; - text-align: left; - width: 100%; - padding: 10px 15px; - } -} - .nav > li > form > button.logout:focus, .nav > li > form > button.logout:hover { - text-decoration: none; -} - -.nav > li > form > button.logout:focus { - outline: none; + background-color: transparent; } diff --git a/web/index-test.php b/web/index-test.php index 1ec192f22..e22fc7d3d 100644 --- a/web/index-test.php +++ b/web/index-test.php @@ -5,10 +5,17 @@ die('You are not allowed to access this file.'); } -defined('YII_DEBUG') or define('YII_DEBUG', true); -defined('YII_ENV') or define('YII_ENV', 'test'); - require __DIR__ . '/../vendor/autoload.php'; + +if (file_exists($file = __DIR__ . '/../.env.test')) { + (new \Symfony\Component\Dotenv\Dotenv())->load($file); +} elseif (file_exists($file = __DIR__ . '/../.env')) { + (new \Symfony\Component\Dotenv\Dotenv())->load($file); +} + +define('YII_ENV', getenv('YII_ENV') ?: 'test'); +define('YII_DEBUG', getenv('YII_DEBUG') ?: YII_ENV == 'test' || YII_ENV == 'dev'); + require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/../config/test.php'; diff --git a/web/index.php b/web/index.php index 02d5e1da9..bd608c25a 100644 --- a/web/index.php +++ b/web/index.php @@ -1,10 +1,15 @@ load($file); +} + +define('YII_ENV', $getenv ?: 'dev'); +define('YII_DEBUG', getenv('YII_DEBUG') ?: YII_ENV == 'dev'); + require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/../config/web.php'; diff --git a/widgets/Alert.php b/widgets/Alert.php index ae6c1d85c..8590a7fe8 100644 --- a/widgets/Alert.php +++ b/widgets/Alert.php @@ -22,7 +22,7 @@ * @author Kartik Visweswaran * @author Alexander Makarov */ -class Alert extends \yii\bootstrap\Widget +class Alert extends \yii\bootstrap4\Widget { /** * @var array the alert types configuration for the flash messages. diff --git a/yii b/yii index 2a2e8ede7..0652a6e58 100755 --- a/yii +++ b/yii @@ -8,10 +8,16 @@ * @license http://www.yiiframework.com/license/ */ -defined('YII_DEBUG') or define('YII_DEBUG', true); -defined('YII_ENV') or define('YII_ENV', 'dev'); - require __DIR__ . '/vendor/autoload.php'; + +if (($getenv = getenv('YII_ENV')) !== 'prod' + && file_exists($file = __DIR__ . '/.env')) { + (new \Symfony\Component\Dotenv\Dotenv())->load($file); +} + +define('YII_ENV', $getenv ?: 'dev'); +define('YII_DEBUG', getenv('YII_DEBUG') ?: YII_ENV == 'dev'); + require __DIR__ . '/vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/config/console.php';