From a6412bc4346bd15db5f294b241b203b89f4dd800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 29 Dec 2017 12:29:29 +0100 Subject: [PATCH 01/54] Cambios propios --- .codeclimate.yml | 31 ++++++ .env.example | 1 + .gitignore | 9 +- .php_cs.dist | 139 ++++++++++++++++++++++++ .travis.yml | 66 +++++------ Makefile | 49 +++++++++ Procfile | 1 + components/HerokuTarget.php | 23 ++++ composer.json | 24 +++- config/console.php | 13 +-- config/db.php | 41 +++++-- config/log.php | 26 +++++ config/test_db.php | 2 +- config/web.php | 21 ++-- db/create.sh | 25 +++++ db/load.sh | 8 ++ db/proyecto.sql | 4 + db/psql.sh | 3 + guia/Makefile | 12 ++ guia/README-api.md | 5 + guia/README.md | 67 ++++++++++++ guia/anexos.md | 8 ++ guia/check-ghi.sh | 35 ++++++ guia/check-label.sh | 11 ++ guia/conclusiones.md | 3 + guia/decisiones.md | 3 + guia/descripcion.md | 24 ++++ guia/diagramas.md | 9 ++ guia/dificultades.md | 5 + guia/glosario.md | 3 + guia/instalacion.md | 9 ++ guia/manual.md | 3 + guia/publish-docs.sh | 45 ++++++++ guia/requisitos.md | 70 ++++++++++++ guia/requisitos.php | 109 +++++++++++++++++++ guia/requisitos.xlsx | Bin 0 -> 6366 bytes phpcs.xml.dist | 16 +++ phpmd.xml | 54 +++++++++ proyecto.conf | 45 ++++++++ setup.sh | 8 ++ tests/acceptance.suite.yml.example | 10 +- tests/download-chromedriver.sh | 25 +++++ tests/run-acceptance.sh | 25 +++++ tests/setup-acceptance.sh | 34 ++++++ tests/unit/fixtures/UserFixture.php | 10 ++ tests/unit/fixtures/data/users.php | 74 +++++++++++++ tests/unit/templates/fixtures/users.php | 16 +++ web/index.php | 5 +- yii | 5 +- 49 files changed, 1162 insertions(+), 72 deletions(-) create mode 100644 .codeclimate.yml create mode 100644 .env.example create mode 100644 .php_cs.dist create mode 100644 Makefile create mode 100644 Procfile create mode 100644 components/HerokuTarget.php create mode 100644 config/log.php create mode 100755 db/create.sh create mode 100755 db/load.sh create mode 100644 db/proyecto.sql create mode 100755 db/psql.sh create mode 100644 guia/Makefile create mode 100644 guia/README-api.md create mode 100644 guia/README.md create mode 100644 guia/anexos.md create mode 100755 guia/check-ghi.sh create mode 100755 guia/check-label.sh create mode 100644 guia/conclusiones.md create mode 100644 guia/decisiones.md create mode 100644 guia/descripcion.md create mode 100644 guia/diagramas.md create mode 100644 guia/dificultades.md create mode 100644 guia/glosario.md create mode 100644 guia/instalacion.md create mode 100644 guia/manual.md create mode 100755 guia/publish-docs.sh create mode 100644 guia/requisitos.md create mode 100755 guia/requisitos.php create mode 100644 guia/requisitos.xlsx create mode 100644 phpcs.xml.dist create mode 100644 phpmd.xml create mode 100644 proyecto.conf create mode 100755 setup.sh create mode 100755 tests/download-chromedriver.sh create mode 100755 tests/run-acceptance.sh create mode 100755 tests/setup-acceptance.sh create mode 100644 tests/unit/fixtures/UserFixture.php create mode 100644 tests/unit/fixtures/data/users.php create mode 100644 tests/unit/templates/fixtures/users.php 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/.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..8867707ef --- /dev/null +++ b/.php_cs.dist @@ -0,0 +1,139 @@ +exclude(['views', 'tests']) + ->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..c70d93353 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,24 @@ -language: php +# Travis CI configuration file. + +dist: trusty -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.1 + +services: + - postgresql + +addons: + postgresql: "9.6" + chrome: stable + +before_install: phpenv config-rm xdebug.ini services: - mysql @@ -24,23 +27,24 @@ before_install: - mysql -e 'CREATE DATABASE IF NOT EXISTS yii2_basic_tests;' 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 + - 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..07eb145a3 --- /dev/null +++ b/Makefile @@ -0,0 +1,49 @@ +.PHONY: all test tests cs codecept pre_codecept post_codecept run_codecept \ + fastcs fast phpcs docs api guia guide install psql + +all: test + +test tests: codecept phpcs + +codecept: pre_codecept run_codecept post_codecept + +pre_codecept: + db/load.sh test + tests/run-acceptance.sh + +post_codecept: + tests/run-acceptance.sh -d + +run_codecept: + vendor/bin/codecept run + +fastcs: fast phpcs + +fast: + vendor/bin/codecept run unit + vendor/bin/codecept run functional + +phpcs cs: + vendor/bin/phpcs + +docs: + guia/publish-docs.sh + +api: + guia/publish-docs.sh -a + +guide guia: + guia/publish-docs.sh -g + +.ONESHELL: +serve: + @# + [ -f .env ] && export $$(cat .env) + ./yii serve + +install: + composer install + composer run-script post-create-project-cmd + +psql: + db/psql.sh 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/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..06ac6e891 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "yiisoft/yii2-app-basic", + "name": "ricpelo/yii2-app-basic", "description": "Yii 2 Basic Project Template", "keywords": ["yii2", "framework", "basic", "project template"], "homepage": "http://www.yiiframework.com/", @@ -12,24 +12,33 @@ "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { - "php": ">=5.4.0", + "php": "~7.1.0", + "ext-gd": "*", + "ext-intl": "*", "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", - "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0" + "yiisoft/yii2-swiftmailer": "~2.1.0" }, "require-dev": { "yiisoft/yii2-debug": "~2.1.0", "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", + "yiisoft/yii2-shell": "dev-master", + "yiisoft/yii2-apidoc": "dev-master", + "codeception/codeception": "4.0.x-dev | ^4.0", "codeception/verify": "~0.5.0 || ~1.1.0", "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", + "squizlabs/php_codesniffer": "^2.0", + "yiisoft/yii2-coding-standards": "^2.0", + "friendsofphp/php-cs-fixer": "^2.8", + "phpoffice/phpexcel": "^1.8" }, "config": { "process-timeout": 1800, @@ -43,6 +52,7 @@ ], "post-create-project-cmd": [ "yii\\composer\\Installer::postCreateProject", + "[ -f setup.sh ] && ./setup.sh || true", "yii\\composer\\Installer::postInstall" ] }, @@ -66,6 +76,10 @@ { "type": "composer", "url": "https://asset-packagist.org/" + }, + { + "type": "vcs", + "url": "https://github.com/ricpelo/yii2-apidoc" } ] } diff --git a/config/console.php b/config/console.php index 299656afc..ed1d19ee0 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', @@ -17,24 +18,16 @@ '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..52293f4de --- /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', 'info'], + 'exportInterval' => 1, + 'logVars' => [], + ], + ]; +} else { + $out['targets'] = [ + [ + 'class' => 'yii\log\FileTarget', + 'levels' => ['error', 'warning'], + ], + ]; +} + +return $out; 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,16 +34,19 @@ // '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, /* 'urlManager' => [ diff --git a/db/create.sh b/db/create.sh new file mode 100755 index 000000000..674ffb144 --- /dev/null +++ b/db/create.sh @@ -0,0 +1,25 @@ +#!/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 + [ "$1" != "test" ] && sudo -u postgres dropdb --if-exists proyecto + [ "$1" != "test" ] && sudo -u postgres dropdb --if-exists proyecto_test + [ "$1" != "test" ] && sudo -u postgres dropuser --if-exists proyecto + sudo -u postgres psql -c "CREATE USER proyecto PASSWORD 'proyecto' SUPERUSER;" + [ "$1" != "test" ] && sudo -u postgres createdb -O proyecto proyecto + sudo -u postgres createdb -O proyecto proyecto_test + 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..5faf53494 --- /dev/null +++ b/db/load.sh @@ -0,0 +1,8 @@ +#!/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..7b1df3733 --- /dev/null +++ b/db/psql.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +psql -h localhost -U proyecto -d proyecto diff --git a/guia/Makefile b/guia/Makefile new file mode 100644 index 000000000..68f39050f --- /dev/null +++ b/guia/Makefile @@ -0,0 +1,12 @@ +.PHONY: all check setup req + +all: check req + +setup: + ./check-label.sh + +check: + ./check-ghi.sh + +req: + php requisitos.php -i 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/check-ghi.sh b/guia/check-ghi.sh new file mode 100755 index 000000000..e2b87280f --- /dev/null +++ b/guia/check-ghi.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +if [ ! -x /usr/local/bin/ghi ] +then + echo "Error: falta el programa ghi." + exit 1 +fi + +if ! ghi milestone > /dev/null 2>&1 +then + echo "No hay repositorio asociado en GitHub." + echo "Crea primero un repositorio y vincúlalo con éste." + exit 1 +fi + +GHI=$(ghi milestone | grep -v ^\# | cut -c3-) +OK="1" + +for p in "1: v1" "2: v2" "3: v3" +do + if ! echo $GHI | grep -qs "$p" + then + echo "El hito (milestone) $p falta o está mal creado." + OK="0" + fi +done + +if [ "$OK" = "0" ] +then + REPO=$(ghi milestone -w) + echo "Crea en $REPO los hitos v1, v2 y v3 (en ese orden), para que sus" + echo "números internos coincidan con 1, 2 y 3, respectivamente." + echo "Si ya estaban creados, elimínalos primero antes de crearlos." + exit 1 +fi diff --git a/guia/check-label.sh b/guia/check-label.sh new file mode 100755 index 000000000..45620f8a1 --- /dev/null +++ b/guia/check-label.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +ghi label mínimo -c e99695 +ghi label importante -c mediumpurple +ghi label opcional -c fef2c0 +ghi label fácil -c f9ca98 +ghi label media -c 93d8d7 +ghi label difícil -c b60205 +ghi label funcional -c d4c5f9 +ghi label técnico -c 006b75 +ghi label información -c 0052cc 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/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/publish-docs.sh b/guia/publish-docs.sh new file mode 100755 index 000000000..2337ebb2f --- /dev/null +++ b/guia/publish-docs.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +BASE_DIR=$(dirname $(readlink -f "$0")) + +api() +{ + vendor/bin/apidoc api .,vendor/yiisoft/yii2 docs/api \ + --pageTitle="API del proyecto" --guide=.. --guidePrefix= \ + --exclude="docs,vendor,tests,yii2-apidoc" --interactive=0 \ + --template="project" \ + --readmeUrl="file://$BASE_DIR/README-api.md" +} + +guide() +{ + vendor/bin/apidoc guide guia docs \ + --pageTitle="Guía del proyecto" --guidePrefix= --apiDocs=./api \ + --interactive=0 --template="project" + ln -sf README.html docs/index.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/requisitos.md b/guia/requisitos.md new file mode 100644 index 000000000..35e4ac076 --- /dev/null +++ b/guia/requisitos.md @@ -0,0 +1,70 @@ + +# Catálogo de requisitos + +**(Usar el generado durante la propuesta.)** + +| **R01** | **sdfsdfsdfsdfs** | +| --------------: | :------------------- | +| **Descripción** | skdjfksjf skjf hskjfh kjsdh fkjs hkjh fdjksh fkjsdh fkjs dfkjs dfkj sjkd fsjk fkjs fkjs fkjs fjks fjks hfkjs fjks hfjks hfjks hfjks hfjk sfjks fjks hfjks hjkf hsjkfs jk | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + + +[]() + +| **R02** | **kdldjflgdfg** | +| --------------: | :------------------- | +| **Descripción** | sdlksdljkfsldjfsd | +| **Prioridad** | Importante | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v2 | + + +[]() + +| **R03** | **sdfsfd** | +| --------------: | :------------------- | +| **Descripción** | lkcvlkjxcjklcxljkwejlksdfvc | +| **Prioridad** | Importante | +| **Tipo** | Información | +| **Complejidad** | Fácil | +| **Entrega** | v3 | + + +[]() + +| **R04** | **sfsfsfd** | +| --------------: | :------------------- | +| **Descripción** | jk34jlk4n,lkjlksdflksdf | +| **Prioridad** | Opcional | +| **Tipo** | Funcional | +| **Complejidad** | Media | +| **Entrega** | v3 | + + +[]() + +| **R05** | **xcvxcv** | +| --------------: | :------------------- | +| **Descripción** | sdkfjklsdfjldksf - sdlkfjlksdjfldksjflksjfdss - slkdjflksjflksjflksjkljfksldjfldks sldkjflskdjfdlskjflksdjflkdsjflkjslkfjslkjfdlskjflsjklfdjslkjlskjdflks klsdjfkljsdlkfjskldf sdklfjklsdjfklsdjflksdjfklsdjkl lñklllllllllllllllllllllllqweqweqweqew | +| **Prioridad** | Opcional | +| **Tipo** | Información | +| **Complejidad** | Difícil | +| **Entrega** | v3 | + + +[]() + + +## Cuadro resumen + +| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** | +| :------------ | :-----------: | :------: | :-------------: | :---------: | +| (**R01**) sdfsdfsdfsdfs | Mínimo | Técnico | Fácil | v1 | +| (**R02**) kdldjflgdfg | Importante | Técnico | Fácil | v2 | +| (**R03**) sdfsfd | Importante | Información | Fácil | v3 | +| (**R04**) sfsfsfd | Opcional | Funcional | Media | v3 | +| (**R05**) xcvxcv | Opcional | Información | Difícil | v3 | diff --git a/guia/requisitos.php b/guia/requisitos.php new file mode 100755 index 000000000..fde5db851 --- /dev/null +++ b/guia/requisitos.php @@ -0,0 +1,109 @@ +#!/usr/bin/env php +getSheet(0); +$highestRow = $objWorksheet->getHighestDataRow(); // e.g. 10 +$highestColumn = $objWorksheet->getHighestDataColumn(); // e.g 'F' +$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5 +$requisitos = "\n# Catálogo de requisitos\n\n"; +$resumen = "\n## Cuadro resumen\n\n" + . '| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** |' + . ($issues ? " **Incidencia** |" : '') . "\n" + . '| :------------ | :-----------: | :------: | :-------------: | :---------: |' + . ($issues ? " :------------: |" : '') . "\n"; + +$salida = `ghi`; +$matches = []; + +if ($issues) { + if (preg_match('%# ([^ ]+/[^ ]+)%', $salida, $matches) === 1) { + $repo = $matches[1]; + } else { + echo "Error: no se puede identificar el repositorio de GitHub asociado.\n"; + exit(1); + } +} + +for ($row = 2; $row <= $highestRow; $row++) { + $codigo = $objWorksheet->getCell("A$row")->getValue(); + $corta = $objWorksheet->getCell("B$row")->getValue(); + $larga = $objWorksheet->getCell("C$row")->getValue(); + $largaMd = preg_replace('/\n/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) { + $mensaje = "($codigo) $corta\n$larga"; + $prioridadGhi = mb_strtolower($prioridad); + $tipoGhi = mb_strtolower($tipo); + $complejidadGhi = mb_strtolower($complejidad); + $entregaGhi = mb_substr($entrega, 1, 1); + echo "Generando incidencia para $codigo en GitHub..."; + $salida = `ghi open -m "$mensaje" --claim -L $prioridadGhi -L $tipoGhi -L $complejidadGhi -M $entregaGhi`; + $matches = []; + if (preg_match('/^#([0-9]+):/', $salida, $matches) === 1) { + $incidencia = $matches[1]; + $objWorksheet->setCellValue("H$row", $incidencia); + $objWorksheet->getCell("H$row")->getHyperlink()->setUrl($link); + echo "#$incidencia\n"; + } else { + echo "\nError: no se ha podido crear la incidencia en GitHub.\n"; + $link = ''; + } + } else { + echo "El requisito $codigo ya tiene asociada la incidencia #$incidencia.\n"; + } + + $link = "https://github.com/$repo/issues/$incidencia"; + } + + $requisitos .= "| **$codigo** | **$corta** |\n" + . "| --------------: | :------------------- |\n" + . "| **Descripción** | $largaMd |\n" + . "| **Prioridad** | $prioridad |\n" + . "| **Tipo** | $tipo |\n" + . "| **Complejidad** | $complejidad |\n" + . "| **Entrega** | $entrega |\n" + . ($issues ? "| **Incidencia** | [$incidencia]($link) |" : '') . "\n\n"; + + $resumen .= "| (**$codigo**) $corta | $prioridad | $tipo | $complejidad | $entrega |" + . ($issues ? " [$incidencia]($link) |" : '') . "\n"; +} + +echo "Generando archivo requisitos.md...\n"; +file_put_contents('requisitos.md', $requisitos . $resumen, LOCK_EX); + +if ($issues) { + echo "Actualizando archivo requisitos.xlsx...\n"; + $writer = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); + $writer->save('requisitos.xlsx'); +} diff --git a/guia/requisitos.xlsx b/guia/requisitos.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..51d206fe9baa7d3a2a7bc1a7ed458465b7538960 GIT binary patch literal 6366 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 nTpa$4aJ{ttvkH1H1O7j)tgC^22@Dz + + Configuración para proyectos. + + . + + requirements.php + vendor/* + views/* + tests/* + 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..5bea29511 --- /dev/null +++ b/setup.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +DIR=$(basename $(realpath .)) + +sed -i s/proyecto/$DIR/g db/* config/* proyecto.conf +mv db/proyecto.sql db/$DIR.sql +mv proyecto.conf $DIR.conf +rm -f $0 diff --git a/tests/acceptance.suite.yml.example b/tests/acceptance.suite.yml.example index 7bb4986fd..8b7d7d67a 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:8080/ + 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/download-chromedriver.sh b/tests/download-chromedriver.sh new file mode 100755 index 000000000..aa2fefe2c --- /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/run-acceptance.sh b/tests/run-acceptance.sh new file mode 100755 index 000000000..b852f2ca4 --- /dev/null +++ b/tests/run-acceptance.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +BASE_DIR=$(dirname $(readlink -f "$0")) + +if [ -f $BASE_DIR/acceptance.suite.yml ] +then + if fuser -n tcp 8080 > /dev/null 2>&1 + then + echo "Matando los procesos en los puertos 8080 y 9515..." + fuser -k -n tcp 8080 + 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 & + else + $BASE_DIR/bin/yii serve > /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..1999ca386 --- /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/UserFixture.php b/tests/unit/fixtures/UserFixture.php new file mode 100644 index 000000000..704c64016 --- /dev/null +++ b/tests/unit/fixtures/UserFixture.php @@ -0,0 +1,10 @@ + 'vaca.roberto', + 'password' => '$2y$13$AbFTOYb9VlhAT9B5HsTIh.EyojYnHPlXkJBB/ifYg6F/sHa/9SvKS', + 'auth_key' => 'SuZOf8aEastmBX_AQyWNsvAeFqgwoTDY', + 'phone' => '980-018583', + 'city' => 'A Alfaro', + ], + [ + 'username' => 'alberto19', + 'password' => '$2y$13$H/Xzfudn7XZT2jGQN.bXdOXuIme96o7tc89Hdky7u11d1AUtHZ4bi', + 'auth_key' => '5UXD-aFyEJbJi8eeRhMf8hV0VaMnGZ4r', + 'phone' => '+34 693 834368', + 'city' => 'San Domínguez', + ], + [ + 'username' => 'mespinosa', + 'password' => '$2y$13$YppbMuFIlG6joh2IcNIAY.nX.9Dt7efZLtcCs8dG5ruNK8KGLJ0Ne', + 'auth_key' => '-TCsEeW4ivD6nSX5h3dydJbi75q42a0V', + 'phone' => '+34 652-929710', + 'city' => 'Villa Barrios de Lemos', + ], + [ + 'username' => 'mara.caballero', + 'password' => '$2y$13$alqQs15drCLRRGIpv572iOC1i4gAF3Hi5BgrMEaHgqBpsMMu9hyeS', + 'auth_key' => 'qNSFfbSc25NJa0G3gQC6y_OBfSOCFojN', + 'phone' => '965-49-1015', + 'city' => 'San Cárdenas', + ], + [ + 'username' => 'vila.miriam', + 'password' => '$2y$13$H7SJdO6VFNmlmNQWJZzebeZq.xUgTf41S/2/PqfUrL3V.2VlWyawq', + 'auth_key' => '7xKI0iU_8_ThBKNlF6vwz13o2M-320_y', + 'phone' => '954-813387', + 'city' => 'Urías del Vallès', + ], + [ + 'username' => 'rordonez', + 'password' => '$2y$13$AVfOlfZXHQTdcLqG42QrOeaCjybEQQ6s4JPiFq8yXr9vZDKvAhu8u', + 'auth_key' => 'hOy8vfmrUMcpYpzcozf4ITEdxCTbCdHG', + 'phone' => '682850032', + 'city' => 'Villa Batista del Pozo', + ], + [ + 'username' => 'zbeltran', + 'password' => '$2y$13$A12aWYGMjPj9vO8WfrCV3ul7w6CeMj37OklpnWvaGnsWSJSLSr126', + 'auth_key' => 'zYW6uQKRuxUNuD-WUf1wNXVUZFdF-tM6', + 'phone' => '669-583319', + 'city' => 'O Jaimes de Ulla', + ], + [ + 'username' => 'cristina.rodarte', + 'password' => '$2y$13$mN.JV29TF3iibmUK3fDglO409qTY3i0RYHrf2tBxN2rqXNMGa60DC', + 'auth_key' => 'UT0JHlazUiRAU5iR_RuRiOBy17tsoxmH', + 'phone' => '900 95 6431', + 'city' => 'Os Guevara', + ], + [ + 'username' => 'wgalindo', + 'password' => '$2y$13$.bFTow12e8tqpIZRfG/qseimzrrGvI2uOggeiNM.mMnxSVKKEMJNO', + 'auth_key' => 'vivNA8VNLN7N30a8NUJh6nZxmy7E9TWm', + 'phone' => '919 23 5328', + 'city' => 'El Castellanos', + ], + [ + 'username' => 'godinez.sofia', + 'password' => '$2y$13$YqN8iRvkEPIbrYB0a4pJ3OyYQrNhhajnBYvSis1862lP4luSXQW6C', + 'auth_key' => '5vWzlzdWZXoJ8-va7V761wIQO4QWxdlj', + 'phone' => '666-069726', + 'city' => 'Los Palacios Medio', + ], +]; diff --git a/tests/unit/templates/fixtures/users.php b/tests/unit/templates/fixtures/users.php new file mode 100644 index 000000000..e9e5fafb3 --- /dev/null +++ b/tests/unit/templates/fixtures/users.php @@ -0,0 +1,16 @@ + $faker->unique()->userName, + 'password' => Yii::$app->getSecurity()->generatePasswordHash('password_' . $index), + 'auth_key' => Yii::$app->getSecurity()->generateRandomString(), + 'phone' => $faker->phoneNumber, + 'city' => $faker->city, +]; diff --git a/web/index.php b/web/index.php index 02d5e1da9..03b1829cf 100644 --- a/web/index.php +++ b/web/index.php @@ -1,8 +1,7 @@ Date: Thu, 25 Jan 2018 17:49:11 +0100 Subject: [PATCH 02/54] Establece timeZone por defecto en el formateador --- config/web.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/web.php b/config/web.php index 2aa19f4b2..1225ea013 100644 --- a/config/web.php +++ b/config/web.php @@ -48,6 +48,9 @@ ], 'log' => $log, 'db' => $db, + 'formatter' => [ + 'timeZone' => 'Europe/Madrid', + ], /* 'urlManager' => [ 'enablePrettyUrl' => true, From 4e3c6a5c52b6e502af3d41ee4e7fa3cfd92a2154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 30 Jan 2018 23:03:44 +0100 Subject: [PATCH 03/54] Cambia phpoffice/phpexcel por phpoffice/phpspreadsheet --- composer.json | 2 +- guia/requisitos.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 06ac6e891..4d834aef4 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "squizlabs/php_codesniffer": "^2.0", "yiisoft/yii2-coding-standards": "^2.0", "friendsofphp/php-cs-fixer": "^2.8", - "phpoffice/phpexcel": "^1.8" + "phpoffice/phpspreadsheet": "^1.1" }, "config": { "process-timeout": 1800, diff --git a/guia/requisitos.php b/guia/requisitos.php index fde5db851..cefe7538d 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -24,12 +24,12 @@ } echo "Leyendo archivo requisitos.xslx...\n"; -PHPExcel_Settings::setLocale('es'); -$objPHPExcel = PHPExcel_IOFactory::load("requisitos.xlsx"); +\PhpOffice\PhpSpreadsheet\Settings::setLocale('es'); +$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load("requisitos.xlsx"); $objWorksheet = $objPHPExcel->getSheet(0); $highestRow = $objWorksheet->getHighestDataRow(); // e.g. 10 $highestColumn = $objWorksheet->getHighestDataColumn(); // e.g 'F' -$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5 +$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5 $requisitos = "\n# Catálogo de requisitos\n\n"; $resumen = "\n## Cuadro resumen\n\n" . '| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** |' @@ -104,6 +104,6 @@ if ($issues) { echo "Actualizando archivo requisitos.xlsx...\n"; - $writer = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); + $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($objPHPExcel, 'Xlsx'); $writer->save('requisitos.xlsx'); } From 5932180b7b177d3d5d3c971cdc5573b259ea0844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 12 Feb 2018 12:59:10 +0100 Subject: [PATCH 04/54] =?UTF-8?q?Establece=20idioma=20y=20traducci=C3=B3n?= =?UTF-8?q?=20de=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/console.php | 1 + config/test.php | 2 +- tests/functional/ContactFormCest.php | 18 +++++++++--------- tests/functional/LoginFormCest.php | 6 +++--- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/config/console.php b/config/console.php index ed1d19ee0..4158f8109 100644 --- a/config/console.php +++ b/config/console.php @@ -14,6 +14,7 @@ '@npm' => '@vendor/npm-asset', '@tests' => '@app/tests', ], + 'language' => 'es-ES', 'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', diff --git a/config/test.php b/config/test.php index f95bc031e..a9c7bb195 100644 --- a/config/test.php +++ b/config/test.php @@ -12,7 +12,7 @@ '@bower' => '@vendor/bower-asset', '@npm' => '@vendor/npm-asset', ], - 'language' => 'en-US', + 'language' => 'es-ES', 'components' => [ 'db' => $db, 'mailer' => [ 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 +} From 387adab0c2c7fd878a515f06e401333d271cb86c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 12 Feb 2018 13:11:57 +0100 Subject: [PATCH 05/54] =?UTF-8?q?Los=20tests=20de=20aceptaci=C3=B3n=20usan?= =?UTF-8?q?=20el=20puerto=208088=20y=20no=20el=208080?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/acceptance.suite.yml.example | 2 +- tests/run-acceptance.sh | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/acceptance.suite.yml.example b/tests/acceptance.suite.yml.example index 8b7d7d67a..92a1908b7 100644 --- a/tests/acceptance.suite.yml.example +++ b/tests/acceptance.suite.yml.example @@ -2,7 +2,7 @@ class_name: AcceptanceTester modules: enabled: - WebDriver: - url: http://localhost:8080/ + url: http://localhost:8088/ browser: chrome port: 9515 # Quitar esta línea si se usa Selenium window_size: false diff --git a/tests/run-acceptance.sh b/tests/run-acceptance.sh index b852f2ca4..3478dda9b 100755 --- a/tests/run-acceptance.sh +++ b/tests/run-acceptance.sh @@ -1,13 +1,14 @@ #!/bin/sh BASE_DIR=$(dirname $(readlink -f "$0")) +PORT=8088 if [ -f $BASE_DIR/acceptance.suite.yml ] then - if fuser -n tcp 8080 > /dev/null 2>&1 + if fuser -n tcp $PORT > /dev/null 2>&1 then - echo "Matando los procesos en los puertos 8080 y 9515..." - fuser -k -n tcp 8080 + echo "Matando los procesos en los puertos $PORT y 9515..." + fuser -k -n tcp $PORT fuser -k -n tcp 9515 fi if [ "$1" != "-d" ] @@ -17,9 +18,9 @@ then echo "Ejecutando tests/bin/yii serve ..." if [ "$1" = "-v" ] then - $BASE_DIR/bin/yii serve & + $BASE_DIR/bin/yii serve --port=$PORT & else - $BASE_DIR/bin/yii serve > /dev/null 2>&1 & + $BASE_DIR/bin/yii serve --port=$PORT > /dev/null 2>&1 & fi fi fi From 26f7a83dc3a682d0bef7d42888a0b92d085b2e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 13 Feb 2018 11:04:07 +0100 Subject: [PATCH 06/54] Simplifica 'make serve' --- Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 07eb145a3..eba525224 100644 --- a/Makefile +++ b/Makefile @@ -35,11 +35,8 @@ api: guide guia: guia/publish-docs.sh -g -.ONESHELL: serve: - @# - [ -f .env ] && export $$(cat .env) - ./yii serve + @[ -f .env ] && export $$(cat .env) ; ./yii serve install: composer install From df6beea9cda745d4b5dea8933a88742bd8a5e52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 13 Feb 2018 14:24:17 +0100 Subject: [PATCH 07/54] Conserva el archivo .travis.yml --- .gitattributes | 1 - 1 file changed, 1 deletion(-) 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 From e09ecec3ee03cf4f52bddedd689108ad7f7883ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 13 Feb 2018 14:42:56 +0100 Subject: [PATCH 08/54] Usa symfony/dotenv --- composer.json | 3 ++- web/index-test.php | 7 ++++++- web/index.php | 10 ++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 4d834aef4..88399f8eb 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,8 @@ "squizlabs/php_codesniffer": "^2.0", "yiisoft/yii2-coding-standards": "^2.0", "friendsofphp/php-cs-fixer": "^2.8", - "phpoffice/phpspreadsheet": "^1.1" + "phpoffice/phpspreadsheet": "^1.1", + "symfony/dotenv": "^4.0" }, "config": { "process-timeout": 1800, diff --git a/web/index-test.php b/web/index-test.php index 1ec192f22..7c4e93383 100644 --- a/web/index-test.php +++ b/web/index-test.php @@ -5,10 +5,15 @@ die('You are not allowed to access this file.'); } +require __DIR__ . '/../vendor/autoload.php'; + +if (file_exists($file = __DIR__ . '/../.env.test')) { + (new \Symfony\Component\Dotenv\Dotenv())->load($file); +} + defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'test'); -require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/../config/test.php'; diff --git a/web/index.php b/web/index.php index 03b1829cf..bd608c25a 100644 --- a/web/index.php +++ b/web/index.php @@ -1,9 +1,15 @@ load($file); +} + +define('YII_ENV', $getenv ?: 'dev'); define('YII_DEBUG', getenv('YII_DEBUG') ?: YII_ENV == 'dev'); -require __DIR__ . '/../vendor/autoload.php'; require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/../config/web.php'; From a5461b9bdf081130a8b3a2a6f6e6b81e6264ced4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 19 Feb 2018 13:22:20 +0100 Subject: [PATCH 09/54] =?UTF-8?q?Sube=20versi=C3=B3n=20a=20PHP=207.2=20y?= =?UTF-8?q?=20Yii=202.0.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 2 +- composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c70d93353..074c5e7b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ sudo: false language: php php: - - 7.1 + - 7.2 services: - postgresql diff --git a/composer.json b/composer.json index 88399f8eb..4078f79ee 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ }, "minimum-stability": "stable", "require": { - "php": "~7.1.0", + "php": "~7.2.0", "ext-gd": "*", "ext-intl": "*", "yiisoft/yii2": "~2.0.14", From 3b01f1ddfdb51ccad821177d683c8c9bf71b03b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 20 Feb 2018 13:38:24 +0100 Subject: [PATCH 10/54] Rellena la BD de pruebas en cada test --- .travis.yml | 1 - Makefile | 1 - codeception.yml | 9 +++++++++ setup.sh | 3 ++- tests/_data/proyecto.sql | 1 + 5 files changed, 12 insertions(+), 3 deletions(-) create mode 120000 tests/_data/proyecto.sql diff --git a/.travis.yml b/.travis.yml index 074c5e7b0..2037b65d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,7 +31,6 @@ install: before_script: - db/create.sh travis - - db/load.sh test - tests/download-chromedriver.sh - tests/run-acceptance.sh - sleep 3 diff --git a/Makefile b/Makefile index eba525224..87f0b3bb0 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,6 @@ test tests: codecept phpcs codecept: pre_codecept run_codecept post_codecept pre_codecept: - db/load.sh test tests/run-acceptance.sh post_codecept: diff --git a/codeception.yml b/codeception.yml index d5aecb308..4e2b3b9fb 100644 --- a/codeception.yml +++ b/codeception.yml @@ -12,6 +12,15 @@ modules: config: Yii2: configFile: 'config/test.php' + enabled: + - Db: + dsn: 'pgsql:host=localhost;dbname=proyecto_test' + user: 'proyecto' + password: 'proyecto' + dump: 'tests/_data/proyecto.sql' + populate: true # run populator before all tests + cleanup: true # run populator before each test + populator: 'psql -U $user -h $host -d $dbname < $dump' # To enable code coverage: #coverage: diff --git a/setup.sh b/setup.sh index 5bea29511..b0745d3a2 100755 --- a/setup.sh +++ b/setup.sh @@ -2,7 +2,8 @@ DIR=$(basename $(realpath .)) -sed -i s/proyecto/$DIR/g db/* config/* proyecto.conf +sed -i s/proyecto/$DIR/g db/* config/* proyecto.conf codeception.yml mv db/proyecto.sql db/$DIR.sql +mv tests/_data/proyecto.sql tests/_data/$DIR.sql mv proyecto.conf $DIR.conf rm -f $0 diff --git a/tests/_data/proyecto.sql b/tests/_data/proyecto.sql new file mode 120000 index 000000000..962d98b8c --- /dev/null +++ b/tests/_data/proyecto.sql @@ -0,0 +1 @@ +../../db/proyecto.sql \ No newline at end of file From 36e4059dfe189ee8014fd4a270ebd1152fc29e65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 26 Feb 2018 12:52:53 +0100 Subject: [PATCH 11/54] =?UTF-8?q?Corrige=20fallos=20en=20generaci=C3=B3n?= =?UTF-8?q?=20de=20incidencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guia/Makefile | 5 +---- guia/check-ghi.sh | 10 ++++++++++ guia/requisitos.md | 12 ------------ guia/requisitos.php | 30 +++++++++++++++++++++++++++--- guia/requisitos.xlsx | Bin 6366 -> 6371 bytes 5 files changed, 38 insertions(+), 19 deletions(-) diff --git a/guia/Makefile b/guia/Makefile index 68f39050f..6de9b406f 100644 --- a/guia/Makefile +++ b/guia/Makefile @@ -1,10 +1,7 @@ -.PHONY: all check setup req +.PHONY: all check req all: check req -setup: - ./check-label.sh - check: ./check-ghi.sh diff --git a/guia/check-ghi.sh b/guia/check-ghi.sh index e2b87280f..8710cfe49 100755 --- a/guia/check-ghi.sh +++ b/guia/check-ghi.sh @@ -33,3 +33,13 @@ then echo "Si ya estaban creados, elimínalos primero antes de crearlos." exit 1 fi + +ghi label mínimo -c e99695 +ghi label importante -c mediumpurple +ghi label opcional -c fef2c0 +ghi label fácil -c f9ca98 +ghi label media -c 93d8d7 +ghi label difícil -c b60205 +ghi label funcional -c d4c5f9 +ghi label técnico -c 006b75 +ghi label información -c 0052cc diff --git a/guia/requisitos.md b/guia/requisitos.md index 35e4ac076..fa7498345 100644 --- a/guia/requisitos.md +++ b/guia/requisitos.md @@ -1,8 +1,6 @@ # Catálogo de requisitos -**(Usar el generado durante la propuesta.)** - | **R01** | **sdfsdfsdfsdfs** | | --------------: | :------------------- | | **Descripción** | skdjfksjf skjf hskjfh kjsdh fkjs hkjh fdjksh fkjsdh fkjs dfkjs dfkj sjkd fsjk fkjs fkjs fkjs fjks fjks hfkjs fjks hfjks hfjks hfjks hfjk sfjks fjks hfjks hjkf hsjkfs jk | @@ -12,8 +10,6 @@ | **Entrega** | v1 | -[]() - | **R02** | **kdldjflgdfg** | | --------------: | :------------------- | | **Descripción** | sdlksdljkfsldjfsd | @@ -23,8 +19,6 @@ | **Entrega** | v2 | -[]() - | **R03** | **sdfsfd** | | --------------: | :------------------- | | **Descripción** | lkcvlkjxcjklcxljkwejlksdfvc | @@ -34,8 +28,6 @@ | **Entrega** | v3 | -[]() - | **R04** | **sfsfsfd** | | --------------: | :------------------- | | **Descripción** | jk34jlk4n,lkjlksdflksdf | @@ -45,8 +37,6 @@ | **Entrega** | v3 | -[]() - | **R05** | **xcvxcv** | | --------------: | :------------------- | | **Descripción** | sdkfjklsdfjldksf - sdlkfjlksdjfldksjflksjfdss - slkdjflksjflksjflksjkljfksldjfldks sldkjflskdjfdlskjflksdjflkdsjflkjslkfjslkjfdlskjflsjklfdjslkjlskjdflks klsdjfkljsdlkfjskldf sdklfjklsdjfklsdjflksdjfklsdjkl lñklllllllllllllllllllllllqweqweqweqew | @@ -56,8 +46,6 @@ | **Entrega** | v3 | -[]() - ## Cuadro resumen diff --git a/guia/requisitos.php b/guia/requisitos.php index cefe7538d..99ed4894b 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -23,7 +23,7 @@ } } -echo "Leyendo archivo requisitos.xslx...\n"; +echo "Leyendo archivo requisitos.xlsx...\n"; \PhpOffice\PhpSpreadsheet\Settings::setLocale('es'); $objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load("requisitos.xlsx"); $objWorksheet = $objPHPExcel->getSheet(0); @@ -50,6 +50,12 @@ } for ($row = 2; $row <= $highestRow; $row++) { + if (($row - 1) % 10 === 0) { + echo "Deteniendo la ejecución por 10 segundos para evitar exceso de tasa..."; + sleep(10); + echo "\n"; + } + echo '(' . ($row - 1) . '/' . ($highestRow - 1) . ') '; $codigo = $objWorksheet->getCell("A$row")->getValue(); $corta = $objWorksheet->getCell("B$row")->getValue(); $larga = $objWorksheet->getCell("C$row")->getValue(); @@ -67,14 +73,32 @@ $tipoGhi = mb_strtolower($tipo); $complejidadGhi = mb_strtolower($complejidad); $entregaGhi = mb_substr($entrega, 1, 1); + $comando = "ghi open -m \"$mensaje\" --claim"; + if (!empty($prioridadGhi) + && in_array($prioridadGhi, ['mínimo', 'importante', 'opcional'])) { + $comando .= " -L $prioridadGhi"; + } + if (!empty($tipoGhi) + && in_array($tipoGhi, ['funcional', 'técnico', 'información'])) { + $comando .= " -L $tipoGhi"; + } + if (!empty($complejidadGhi) + && in_array($complejidadGhi, ['fácil', 'media', 'difícil'])) { + $comando .= " -L $complejidadGhi"; + } + if (!empty($entregaGhi) + && in_array($entregaGhi, ['1', '2', '3'])) { + $comando .= " -M $entregaGhi"; + } echo "Generando incidencia para $codigo en GitHub..."; - $salida = `ghi open -m "$mensaje" --claim -L $prioridadGhi -L $tipoGhi -L $complejidadGhi -M $entregaGhi`; + $salida = `$comando`; $matches = []; if (preg_match('/^#([0-9]+):/', $salida, $matches) === 1) { $incidencia = $matches[1]; + $link = "https://github.com/$repo/issues/$incidencia"; $objWorksheet->setCellValue("H$row", $incidencia); $objWorksheet->getCell("H$row")->getHyperlink()->setUrl($link); - echo "#$incidencia\n"; + echo " #$incidencia\n"; } else { echo "\nError: no se ha podido crear la incidencia en GitHub.\n"; $link = ''; diff --git a/guia/requisitos.xlsx b/guia/requisitos.xlsx index 51d206fe9baa7d3a2a7bc1a7ed458465b7538960..ea6ac306faba04e2c4c33262eaa955a692c63eb0 100644 GIT binary patch delta 2992 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 Date: Mon, 26 Feb 2018 15:56:38 +0100 Subject: [PATCH 12/54] =?UTF-8?q?Baja=20la=20versi=C3=B3n=20de=20PHP=20req?= =?UTF-8?q?uerida=20a=207.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 4078f79ee..88399f8eb 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ }, "minimum-stability": "stable", "require": { - "php": "~7.2.0", + "php": "~7.1.0", "ext-gd": "*", "ext-intl": "*", "yiisoft/yii2": "~2.0.14", From 0dc31a8c0334edeef0098be225fc422f8ed72625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 26 Feb 2018 16:34:32 +0100 Subject: [PATCH 13/54] Elimina check-label.sh, innecesario ya --- guia/check-label.sh | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100755 guia/check-label.sh diff --git a/guia/check-label.sh b/guia/check-label.sh deleted file mode 100755 index 45620f8a1..000000000 --- a/guia/check-label.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -ghi label mínimo -c e99695 -ghi label importante -c mediumpurple -ghi label opcional -c fef2c0 -ghi label fácil -c f9ca98 -ghi label media -c 93d8d7 -ghi label difícil -c b60205 -ghi label funcional -c d4c5f9 -ghi label técnico -c 006b75 -ghi label información -c 0052cc From 13c3954c9b872fe4edca5725f91b3422d5cec407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 26 Feb 2018 16:38:39 +0100 Subject: [PATCH 14/54] =?UTF-8?q?Despliega=20las=20im=C3=A1genes=20conteni?= =?UTF-8?q?das=20en=20guia/img?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guia/img/.gitkeep | 0 guia/publish-docs.sh | 1 + 2 files changed, 1 insertion(+) create mode 100644 guia/img/.gitkeep diff --git a/guia/img/.gitkeep b/guia/img/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/guia/publish-docs.sh b/guia/publish-docs.sh index 2337ebb2f..8a41281d4 100755 --- a/guia/publish-docs.sh +++ b/guia/publish-docs.sh @@ -18,6 +18,7 @@ guide() --interactive=0 --template="project" ln -sf README.html docs/index.html rm docs/README-api.html + cp -r guia/img docs } ACTUAL=$PWD From 56bd6ce3cc7993837816d74b250717c83222b708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 26 Feb 2018 17:43:13 +0100 Subject: [PATCH 15/54] El directorio yii2-apidoc no existe ya --- guia/publish-docs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guia/publish-docs.sh b/guia/publish-docs.sh index 8a41281d4..7dd0e5cb1 100755 --- a/guia/publish-docs.sh +++ b/guia/publish-docs.sh @@ -6,7 +6,7 @@ api() { vendor/bin/apidoc api .,vendor/yiisoft/yii2 docs/api \ --pageTitle="API del proyecto" --guide=.. --guidePrefix= \ - --exclude="docs,vendor,tests,yii2-apidoc" --interactive=0 \ + --exclude="docs,vendor,tests" --interactive=0 \ --template="project" \ --readmeUrl="file://$BASE_DIR/README-api.md" } From 58e06d83873915eaf02c5c510802f1de81c9d748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 27 Feb 2018 11:12:23 +0100 Subject: [PATCH 16/54] La carpeta guia/images se copia sola --- guia/{img => images}/.gitkeep | 0 guia/publish-docs.sh | 1 - 2 files changed, 1 deletion(-) rename guia/{img => images}/.gitkeep (100%) diff --git a/guia/img/.gitkeep b/guia/images/.gitkeep similarity index 100% rename from guia/img/.gitkeep rename to guia/images/.gitkeep diff --git a/guia/publish-docs.sh b/guia/publish-docs.sh index 7dd0e5cb1..fd65413a1 100755 --- a/guia/publish-docs.sh +++ b/guia/publish-docs.sh @@ -18,7 +18,6 @@ guide() --interactive=0 --template="project" ln -sf README.html docs/index.html rm docs/README-api.html - cp -r guia/img docs } ACTUAL=$PWD From d688c15228374157c74e81f825834ef43f831834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 28 Feb 2018 21:00:00 +0100 Subject: [PATCH 17/54] =?UTF-8?q?Corrige=20enlace=20simb=C3=B3lico=20a=20d?= =?UTF-8?q?b/proyecto.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.sh b/setup.sh index b0745d3a2..bf59d2387 100755 --- a/setup.sh +++ b/setup.sh @@ -3,7 +3,8 @@ 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 tests/_data/proyecto.sql tests/_data/$DIR.sql -mv proyecto.conf $DIR.conf +ln -sf ../../db/$DIR.sql tests/_data/$DIR.sql rm -f $0 From abb5dde09c001a29694916d9ce50e2729917a858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 1 Mar 2018 11:27:07 +0100 Subject: [PATCH 18/54] Corrige problema con symlink en index.html --- guia/publish-docs.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guia/publish-docs.sh b/guia/publish-docs.sh index fd65413a1..a0f083e54 100755 --- a/guia/publish-docs.sh +++ b/guia/publish-docs.sh @@ -16,7 +16,8 @@ guide() vendor/bin/apidoc guide guia docs \ --pageTitle="Guía del proyecto" --guidePrefix= --apiDocs=./api \ --interactive=0 --template="project" - ln -sf README.html docs/index.html + mv docs/README.html docs/index.html + ln -sf index.html docs/README.html rm docs/README-api.html } From a8b759ac114ea81854c5ceef29a1df5054bc6b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 19 Apr 2018 16:50:10 +0200 Subject: [PATCH 19/54] Cambia dependencia yii2-apidoc a dev-project --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 88399f8eb..ff70a3108 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", "yiisoft/yii2-shell": "dev-master", - "yiisoft/yii2-apidoc": "dev-master", + "yiisoft/yii2-apidoc": "dev-project", "codeception/codeception": "4.0.x-dev | ^4.0", "codeception/verify": "~0.5.0 || ~1.1.0", From 6baa0c68a977eeb9754b08cea4b20c834aab9eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 9 Nov 2018 13:22:22 +0100 Subject: [PATCH 20/54] Cambia a Xenial, PHP 7.1 y PostgreSQL 10 en Travis --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2037b65d0..4b79a54d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ # Travis CI configuration file. -dist: trusty +dist: xenial # faster builds on new travis setup not using sudo @@ -9,13 +9,13 @@ sudo: false language: php php: - - 7.2 + - 7.1 services: - postgresql addons: - postgresql: "9.6" + postgresql: 10 chrome: stable before_install: phpenv config-rm xdebug.ini From 66c583fdb1991fec44c839a33d5cf63359537811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 23 Nov 2018 18:17:49 +0100 Subject: [PATCH 21/54] =?UTF-8?q?A=C3=B1ade=20comando=20'make=20doc'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 87f0b3bb0..bfa6add14 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ fast: phpcs cs: vendor/bin/phpcs -docs: +doc docs: guia/publish-docs.sh api: From 1516e949ab496d337eb37c99dbe1bd6816d9a4a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 13 Dec 2018 11:27:00 +0100 Subject: [PATCH 22/54] Suprime mensajes de error de BD durante tests --- codeception.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codeception.yml b/codeception.yml index 4e2b3b9fb..d377b153a 100644 --- a/codeception.yml +++ b/codeception.yml @@ -20,7 +20,7 @@ modules: dump: 'tests/_data/proyecto.sql' populate: true # run populator before all tests cleanup: true # run populator before each test - populator: 'psql -U $user -h $host -d $dbname < $dump' + populator: 'psql -U $user -h $host -d $dbname < $dump 2>/dev/null' # To enable code coverage: #coverage: From 0c4efe3a437f2ac62fc7e370a80974b566cf7ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 13 Dec 2018 11:40:06 +0100 Subject: [PATCH 23/54] Quita MySQL de Travis-CI --- .travis.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4b79a54d9..5c970afd2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,12 +20,6 @@ addons: before_install: phpenv config-rm xdebug.ini -services: - - mysql - -before_install: - - mysql -e 'CREATE DATABASE IF NOT EXISTS yii2_basic_tests;' - install: - composer install --no-interaction From 00ef631b37bdeee7c97f555ff0abc0ae98a41d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 13 Dec 2018 12:07:30 +0100 Subject: [PATCH 24/54] Corrige db/create.sh y db/load.sh --- db/create.sh | 19 +++++++++---------- db/load.sh | 3 +-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/db/create.sh b/db/create.sh index 674ffb144..e5b8000b9 100755 --- a/db/create.sh +++ b/db/create.sh @@ -1,25 +1,24 @@ #!/bin/sh -if [ "$1" = "travis" ] -then +if [ "$1" = "travis" ]; then psql -U postgres -c "CREATE DATABASE proyecto_test;" psql -U postgres -c "CREATE USER proyecto PASSWORD 'proyecto' SUPERUSER;" else - [ "$1" != "test" ] && sudo -u postgres dropdb --if-exists proyecto - [ "$1" != "test" ] && sudo -u postgres dropdb --if-exists proyecto_test - [ "$1" != "test" ] && sudo -u postgres dropuser --if-exists proyecto + 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;" - [ "$1" != "test" ] && sudo -u postgres createdb -O proyecto proyecto + 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 + if [ ! -f $FILE ]; then touch $FILE chmod 600 $FILE fi - if ! grep -qsF "$LINE" $FILE - then + if ! grep -qsF "$LINE" $FILE; then echo "$LINE" >> $FILE fi fi diff --git a/db/load.sh b/db/load.sh index 5faf53494..fac6c2202 100755 --- a/db/load.sh +++ b/db/load.sh @@ -1,8 +1,7 @@ #!/bin/sh BASE_DIR=$(dirname $(readlink -f "$0")) -if [ "$1" != "test" ] -then +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 From bba7ef87318c6411570637bbadedaeed0427cc39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 13 Dec 2018 12:12:03 +0100 Subject: [PATCH 25/54] Retoques en scripts de guia/ --- guia/check-ghi.sh | 2 +- guia/requisitos.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/guia/check-ghi.sh b/guia/check-ghi.sh index 8710cfe49..106b9f1cd 100755 --- a/guia/check-ghi.sh +++ b/guia/check-ghi.sh @@ -20,7 +20,7 @@ for p in "1: v1" "2: v2" "3: v3" do if ! echo $GHI | grep -qs "$p" then - echo "El hito (milestone) $p falta o está mal creado." + echo "El hito (milestone) '$p' falta o está mal creado." OK="0" fi done diff --git a/guia/requisitos.php b/guia/requisitos.php index 99ed4894b..f23a7448e 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -10,11 +10,12 @@ $issues = isset($argv[1]) && $argv[1] === '-i'; if ($issues) { - echo "Se ha indicado la opción '-i'. Se actualizarán las incidencias en\n"; + echo "\nSe ha indicado la opción '-i'. Se actualizarán las incidencias en\n"; echo "GitHub y se registrarán los enlaces correspondientes en los archivos\n"; echo "'requisitos.md' y 'requisitos.xlsx' (en cambio, si el archivo\n"; echo "'requisitos.xlsx' contiene ya las incidencias creadas, no se\n"; echo "volverán a crear ni se modificarán en GitHub).\n\n"; + echo "*** ESTE PROCESO ES IRREVERSIBLE Y NO SE PUEDE INTERRUMPIR ***\n\n"; echo "¿Deseas continuar? (s/N): "; $sn = ''; fscanf(STDIN, "%s", $sn); From 8f967165591fe1a7782fc56659d29263367048aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 14 Dec 2018 19:30:05 +0100 Subject: [PATCH 26/54] =?UTF-8?q?Incorpora=20los=20requisitos=20m=C3=ADnim?= =?UTF-8?q?os=20en=20requisitos.xlsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guia/requisitos.xlsx | Bin 6371 -> 9691 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/guia/requisitos.xlsx b/guia/requisitos.xlsx index ea6ac306faba04e2c4c33262eaa955a692c63eb0..60dd8d460cefb62fc021fd8c1bcecce129671d52 100644 GIT binary patch delta 8359 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 Date: Mon, 17 Dec 2018 14:33:36 +0100 Subject: [PATCH 27/54] =?UTF-8?q?Mejoras=20en=20generaci=C3=B3n=20de=20inc?= =?UTF-8?q?idencias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- guia/requisitos.md | 352 +++++++++++++++++++++++++++++++++++++++---- guia/requisitos.php | 33 ++-- guia/requisitos.xls | Bin 0 -> 16896 bytes guia/requisitos.xlsx | Bin 9691 -> 0 bytes 4 files changed, 340 insertions(+), 45 deletions(-) create mode 100644 guia/requisitos.xls delete mode 100644 guia/requisitos.xlsx diff --git a/guia/requisitos.md b/guia/requisitos.md index fa7498345..e2c4d1636 100644 --- a/guia/requisitos.md +++ b/guia/requisitos.md @@ -1,58 +1,350 @@ # Catálogo de requisitos -| **R01** | **sdfsdfsdfsdfs** | +| **R01** | **Requisitos como incidencias** | | --------------: | :------------------- | -| **Descripción** | skdjfksjf skjf hskjfh kjsdh fkjs hkjh fdjksh fkjsdh fkjs dfkjs dfkj sjkd fsjk fkjs fkjs fkjs fjks fjks hfkjs fjks hfjks hfjks hfjks hfjk sfjks fjks hfjks hjkf hsjkfs jk | +| **Descripción** | Requisitos perfectamente definidos y convertidos en incidencias (issues) de GitHub. | | **Prioridad** | Mínimo | | **Tipo** | Técnico | | **Complejidad** | Fácil | | **Entrega** | v1 | +| **R02** | **Código fuente** | +| --------------: | :------------------- | +| **Descripción** | Código fuente publicado en GitHub. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | +| **Complejidad** | Fácil | +| **Entrega** | v1 | + +| **R03** | **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 | + +| **R04** | **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 | + +| **R05** | **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 | + +| **R06** | **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 | + +| **R07** | **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 | + +| **R08** | **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 | + +| **R09** | **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 | -| **R02** | **kdldjflgdfg** | +| **R22** | **Yii2 Framework** | | --------------: | :------------------- | -| **Descripción** | sdlksdljkfsldjfsd | -| **Prioridad** | Importante | +| **Descripción** | Usar Yii2 Framework versión 2.0.10 ó superior. | +| **Prioridad** | Mínimo | | **Tipo** | Técnico | | **Complejidad** | Fácil | -| **Entrega** | v2 | +| **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 | -| **R03** | **sdfsfd** | +| **R25** | **Codeception** | | --------------: | :------------------- | -| **Descripción** | lkcvlkjxcjklcxljkwejlksdfvc | -| **Prioridad** | Importante | -| **Tipo** | Información | +| **Descripción** | Pruebas funcionales con Codeception. | +| **Prioridad** | Mínimo | +| **Tipo** | Técnico | | **Complejidad** | Fácil | -| **Entrega** | v3 | +| **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 | -| **R04** | **sfsfsfd** | +| **R27** | **Aplicación escalable** | | --------------: | :------------------- | -| **Descripción** | jk34jlk4n,lkjlksdflksdf | -| **Prioridad** | Opcional | -| **Tipo** | Funcional | -| **Complejidad** | Media | -| **Entrega** | v3 | +| **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 | -| **R05** | **xcvxcv** | +| **R29** | **Etiquetas semánticas de HTML5** | | --------------: | :------------------- | -| **Descripción** | sdkfjklsdfjldksf - sdlkfjlksdjfldksjflksjfdss - slkdjflksjflksjflksjkljfksldjfldks sldkjflskdjfdlskjflksdjflkdsjflkjslkfjslkjfdlskjflsjklfdjslkjlskjdflks klsdjfkljsdlkfjskldf sdklfjklsdjfklsdjflksdjfklsdjkl lñklllllllllllllllllllllllqweqweqweqew | -| **Prioridad** | Opcional | -| **Tipo** | Información | -| **Complejidad** | Difícil | -| **Entrega** | v3 | +| **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** | -| :------------ | :-----------: | :------: | :-------------: | :---------: | -| (**R01**) sdfsdfsdfsdfs | Mínimo | Técnico | Fácil | v1 | -| (**R02**) kdldjflgdfg | Importante | Técnico | Fácil | v2 | -| (**R03**) sdfsfd | Importante | Información | Fácil | v3 | -| (**R04**) sfsfsfd | Opcional | Funcional | Media | v3 | -| (**R05**) xcvxcv | Opcional | Información | Difícil | v3 | +| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** | **Incidencia** | +| :------------ | :-----------: | :------: | :-------------: | :---------: | :------------: | +| (**R01**) Requisitos como incidencias | Mínimo | Técnico | Fácil | v1 | +| (**R02**) Código fuente | Mínimo | Técnico | Fácil | v1 | +| (**R03**) Estilo del código | Mínimo | Técnico | Fácil | v1 | +| (**R04**) Tres lanzamientos | Mínimo | Técnico | Fácil | v1 | +| (**R05**) README.md | Mínimo | Técnico | Fácil | v1 | +| (**R06**) Documentación | Mínimo | Técnico | Fácil | v1 | +| (**R07**) Incidencias en GitHub | Mínimo | Técnico | Fácil | v1 | +| (**R08**) Etiquetas e hitos | Mínimo | Técnico | Fácil | v1 | +| (**R09**) 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.php b/guia/requisitos.php index f23a7448e..9567b34e1 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -10,13 +10,13 @@ $issues = isset($argv[1]) && $argv[1] === '-i'; if ($issues) { - echo "\nSe ha indicado la opción '-i'. Se actualizarán las incidencias en\n"; - echo "GitHub y se registrarán los enlaces correspondientes en los archivos\n"; - echo "'requisitos.md' y 'requisitos.xlsx' (en cambio, si el archivo\n"; - echo "'requisitos.xlsx' contiene ya las incidencias creadas, no se\n"; + echo "\nSe ha indicado la opción '\033[1;28m-i\033[0m'. Se actualizarán las incidencias\n"; + echo "en GitHub y se anotarán los enlaces correspondientes en los\n"; + echo "archivos '\033[1;28mrequisitos.md\033[0m' y '\033[1;28mrequisitos.xls\033[0m' (en cambio, si este\n"; + echo "último contiene ya anotadas las incidencias creadas, no se\n"; echo "volverán a crear ni se modificarán en GitHub).\n\n"; - echo "*** ESTE PROCESO ES IRREVERSIBLE Y NO SE PUEDE INTERRUMPIR ***\n\n"; - echo "¿Deseas continuar? (s/N): "; + echo "\033[1;31m*** ESTE PROCESO ES IRREVERSIBLE Y NO SE PUEDE INTERRUMPIR ***\033[0m\n\n"; + echo "\033[1;28m¿Deseas continuar? (s/N): \033[0m"; $sn = ''; fscanf(STDIN, "%s", $sn); if ($sn !== 's' && $sn !== 'S') { @@ -24,9 +24,9 @@ } } -echo "Leyendo archivo requisitos.xlsx...\n"; +echo "Leyendo archivo requisitos.xls...\n"; \PhpOffice\PhpSpreadsheet\Settings::setLocale('es'); -$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load("requisitos.xlsx"); +$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load("requisitos.xls"); $objWorksheet = $objPHPExcel->getSheet(0); $highestRow = $objWorksheet->getHighestDataRow(); // e.g. 10 $highestColumn = $objWorksheet->getHighestDataColumn(); // e.g 'F' @@ -51,7 +51,7 @@ } for ($row = 2; $row <= $highestRow; $row++) { - if (($row - 1) % 10 === 0) { + if ($issues && ($row - 1) % 10 === 0) { echo "Deteniendo la ejecución por 10 segundos para evitar exceso de tasa..."; sleep(10); echo "\n"; @@ -59,8 +59,11 @@ 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(); @@ -111,7 +114,7 @@ $link = "https://github.com/$repo/issues/$incidencia"; } - $requisitos .= "| **$codigo** | **$corta** |\n" + $requisitos .= "| **$codigo** | **$cortaMd** |\n" . "| --------------: | :------------------- |\n" . "| **Descripción** | $largaMd |\n" . "| **Prioridad** | $prioridad |\n" @@ -120,15 +123,15 @@ . "| **Entrega** | $entrega |\n" . ($issues ? "| **Incidencia** | [$incidencia]($link) |" : '') . "\n\n"; - $resumen .= "| (**$codigo**) $corta | $prioridad | $tipo | $complejidad | $entrega |" + $resumen .= "| (**$codigo**) $cortaMd | $prioridad | $tipo | $complejidad | $entrega |" . ($issues ? " [$incidencia]($link) |" : '') . "\n"; } -echo "Generando archivo requisitos.md...\n"; +echo "\nGenerando archivo requisitos.md...\n"; file_put_contents('requisitos.md', $requisitos . $resumen, LOCK_EX); if ($issues) { - echo "Actualizando archivo requisitos.xlsx...\n"; - $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($objPHPExcel, 'Xlsx'); - $writer->save('requisitos.xlsx'); + echo "Actualizando archivo requisitos.xls...\n"; + $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($objPHPExcel); + $writer->save('requisitos.xls'); } diff --git a/guia/requisitos.xls b/guia/requisitos.xls new file mode 100644 index 0000000000000000000000000000000000000000..c14c333f6e371cb23e4623525ea4e9aa8c591e65 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/guia/requisitos.xlsx b/guia/requisitos.xlsx deleted file mode 100644 index 60dd8d460cefb62fc021fd8c1bcecce129671d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9691 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 Wvzp=~)Q2H3;g>Hwp32Za{Q7?s!FpZ* From 207218d549cb6bc3041ada143458ec349106a21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 24 Jan 2019 17:59:57 +0100 Subject: [PATCH 28/54] Compatibilidad con PHP >=7.2 --- composer.json | 2 +- guia/publish-docs.sh | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index ff70a3108..4ffd887c8 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ }, "minimum-stability": "stable", "require": { - "php": "~7.1.0", + "php": "~7.1.0|~7.2.0|~7.3.0", "ext-gd": "*", "ext-intl": "*", "yiisoft/yii2": "~2.0.14", diff --git a/guia/publish-docs.sh b/guia/publish-docs.sh index a0f083e54..b34c02190 100755 --- a/guia/publish-docs.sh +++ b/guia/publish-docs.sh @@ -4,11 +4,14 @@ 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() From 127182783175608e5a4e48602c0ec2d376a47ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 24 Jan 2019 18:42:12 +0100 Subject: [PATCH 29/54] Makefile con mensajes de ayuda --- Makefile | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index bfa6add14..d2cda91fe 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,15 @@ -.PHONY: all test tests cs codecept pre_codecept post_codecept run_codecept \ +.PHONY: help test tests cs codecept pre_codecept post_codecept run_codecept \ fastcs fast phpcs docs api guia guide install psql -all: test +help: ## Muestra este mensaje de ayuda + @echo "Uso: make [comando]\n\nComandos:\n" + @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//' +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: pre_codecept run_codecept post_codecept pre_codecept: @@ -16,30 +21,38 @@ post_codecept: run_codecept: vendor/bin/codecept run -fastcs: fast phpcs +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 vendor/bin/codecept run functional -phpcs cs: +cs: ## Pasa CodeSniffer +phpcs: ## Ídem +cs phpcs: vendor/bin/phpcs +doc: ## Genera toda la documentación (guía + API) +docs: ## Ídem doc docs: guia/publish-docs.sh -api: +api: ## Genera el API del proyecto guia/publish-docs.sh -a -guide guia: +guia: ## Genera la guía del proyecto +guide: ## Ídem +guia guide: guia/publish-docs.sh -g -serve: +serve: ## Arranca el servidor web integrado @[ -f .env ] && export $$(cat .env) ; ./yii serve -install: +install: ## Ejecuta la post-instalación composer install composer run-script post-create-project-cmd -psql: +psql: ## Arranca una consola SQL db/psql.sh From 9a21635a41404e33931d000cfbb4ec5641ab5e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 24 Jan 2019 18:56:10 +0100 Subject: [PATCH 30/54] Cambia Makefile para mensajes con color --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index d2cda91fe..583944318 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,8 @@ fastcs fast phpcs docs api guia guide install psql help: ## Muestra este mensaje de ayuda - @echo "Uso: make [comando]\n\nComandos:\n" - @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//' + @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 From 3159494d741c42fd260e93565b56307641015d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 8 Feb 2019 19:30:08 +0100 Subject: [PATCH 31/54] =?UTF-8?q?Lee=20.env=20tambi=C3=A9n=20en=20yii,=20t?= =?UTF-8?q?ests/bin/yii=20e=20index-test.php?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- tests/bin/yii | 12 ++++++++---- web/index-test.php | 6 ++++-- yii | 11 ++++++++--- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 583944318..74b7d176b 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ guia guide: guia/publish-docs.sh -g serve: ## Arranca el servidor web integrado - @[ -f .env ] && export $$(cat .env) ; ./yii serve + ./yii serve install: ## Ejecuta la post-instalación composer install 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/web/index-test.php b/web/index-test.php index 7c4e93383..e22fc7d3d 100644 --- a/web/index-test.php +++ b/web/index-test.php @@ -9,10 +9,12 @@ 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); } -defined('YII_DEBUG') or define('YII_DEBUG', true); -defined('YII_ENV') or define('YII_ENV', 'test'); +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'; diff --git a/yii b/yii index 4085a50ef..0652a6e58 100755 --- a/yii +++ b/yii @@ -8,11 +8,16 @@ * @license http://www.yiiframework.com/license/ */ -define('YII_ENV', getenv('YII_ENV') ?: 'dev'); -define('YII_DEBUG', getenv('YII_DEBUG') ?: 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/autoload.php'; require __DIR__ . '/vendor/yiisoft/yii2/Yii.php'; $config = require __DIR__ . '/config/console.php'; From 9205069a75070b1a71687725c1d07aeeae7a9a00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 18 Feb 2019 19:10:09 +0100 Subject: [PATCH 32/54] =?UTF-8?q?Cambia=20logs=20de=20Heroku=20en=20aplica?= =?UTF-8?q?ci=C3=B3n=20de=20consola?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/log.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/log.php b/config/log.php index 52293f4de..45781b485 100644 --- a/config/log.php +++ b/config/log.php @@ -9,7 +9,7 @@ $out['targets'] = [ [ 'class' => 'app\components\HerokuTarget', - 'levels' => ['error', 'warning', 'info'], + 'levels' => ['error', 'warning'], 'exportInterval' => 1, 'logVars' => [], ], From a67e76ffa81162708013062b97a9f38e3f98dd61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Sun, 24 Feb 2019 12:09:00 +0100 Subject: [PATCH 33/54] Corrige pruebas, no usar Db de Codeception --- Makefile | 5 ++++- codeception.yml | 4 ---- config/test.php | 1 + db/psql.sh | 3 ++- setup.sh | 2 -- tests/_data/proyecto.sql | 1 - 6 files changed, 7 insertions(+), 9 deletions(-) delete mode 120000 tests/_data/proyecto.sql diff --git a/Makefile b/Makefile index 74b7d176b..780fca88f 100644 --- a/Makefile +++ b/Makefile @@ -54,5 +54,8 @@ install: ## Ejecuta la post-instalación composer install composer run-script post-create-project-cmd -psql: ## Arranca una consola SQL +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 diff --git a/codeception.yml b/codeception.yml index d377b153a..cb1a3f0aa 100644 --- a/codeception.yml +++ b/codeception.yml @@ -17,10 +17,6 @@ modules: dsn: 'pgsql:host=localhost;dbname=proyecto_test' user: 'proyecto' password: 'proyecto' - dump: 'tests/_data/proyecto.sql' - populate: true # run populator before all tests - cleanup: true # run populator before each test - populator: 'psql -U $user -h $host -d $dbname < $dump 2>/dev/null' # To enable code coverage: #coverage: diff --git a/config/test.php b/config/test.php index a9c7bb195..3bdb12969 100644 --- a/config/test.php +++ b/config/test.php @@ -11,6 +11,7 @@ 'aliases' => [ '@bower' => '@vendor/bower-asset', '@npm' => '@vendor/npm-asset', + '@tests' => '@app/tests', ], 'language' => 'es-ES', 'components' => [ diff --git a/db/psql.sh b/db/psql.sh index 7b1df3733..321cac23f 100755 --- a/db/psql.sh +++ b/db/psql.sh @@ -1,3 +1,4 @@ #!/bin/sh -psql -h localhost -U proyecto -d proyecto +[ "$1" = "test" ] && BD="_test" +psql -h localhost -U proyecto -d proyecto$BD diff --git a/setup.sh b/setup.sh index bf59d2387..622ab983d 100755 --- a/setup.sh +++ b/setup.sh @@ -5,6 +5,4 @@ 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 tests/_data/proyecto.sql tests/_data/$DIR.sql -ln -sf ../../db/$DIR.sql tests/_data/$DIR.sql rm -f $0 diff --git a/tests/_data/proyecto.sql b/tests/_data/proyecto.sql deleted file mode 120000 index 962d98b8c..000000000 --- a/tests/_data/proyecto.sql +++ /dev/null @@ -1 +0,0 @@ -../../db/proyecto.sql \ No newline at end of file From bcd83a7c39bfa1547bf3a541d39765dc4026790d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 25 Feb 2019 11:20:04 +0100 Subject: [PATCH 34/54] =?UTF-8?q?Pruebas=20b=C3=A1sicas=20con=20usuarios?= =?UTF-8?q?=20y=20fixtures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../m190225_103236_create_usuarios_table.php | 32 ++++++++++ tests/functional.suite.yml | 1 + tests/functional/UsuariosCest.php | 25 ++++++++ tests/unit/fixtures/UserFixture.php | 10 ---- tests/unit/fixtures/UsuariosFixture.php | 10 ++++ .../fixtures/data/{users.php => usuarios.php} | 60 +++++++++---------- tests/unit/models/UsuariosTest.php | 23 +++++++ tests/unit/templates/fixtures/users.php | 16 ----- tests/unit/templates/fixtures/usuarios.php | 16 +++++ 9 files changed, 137 insertions(+), 56 deletions(-) create mode 100644 migrations/m190225_103236_create_usuarios_table.php create mode 100644 tests/functional/UsuariosCest.php delete mode 100644 tests/unit/fixtures/UserFixture.php create mode 100644 tests/unit/fixtures/UsuariosFixture.php rename tests/unit/fixtures/data/{users.php => usuarios.php} (58%) create mode 100644 tests/unit/models/UsuariosTest.php delete mode 100644 tests/unit/templates/fixtures/users.php create mode 100644 tests/unit/templates/fixtures/usuarios.php 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/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/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/unit/fixtures/UserFixture.php b/tests/unit/fixtures/UserFixture.php deleted file mode 100644 index 704c64016..000000000 --- a/tests/unit/fixtures/UserFixture.php +++ /dev/null @@ -1,10 +0,0 @@ - 'vaca.roberto', + 'nombre' => 'vaca.roberto', 'password' => '$2y$13$AbFTOYb9VlhAT9B5HsTIh.EyojYnHPlXkJBB/ifYg6F/sHa/9SvKS', 'auth_key' => 'SuZOf8aEastmBX_AQyWNsvAeFqgwoTDY', - 'phone' => '980-018583', - 'city' => 'A Alfaro', + 'telefono' => '980-018583', + 'poblacion' => 'A Alfaro', ], [ - 'username' => 'alberto19', + 'nombre' => 'alberto19', 'password' => '$2y$13$H/Xzfudn7XZT2jGQN.bXdOXuIme96o7tc89Hdky7u11d1AUtHZ4bi', 'auth_key' => '5UXD-aFyEJbJi8eeRhMf8hV0VaMnGZ4r', - 'phone' => '+34 693 834368', - 'city' => 'San Domínguez', + 'telefono' => '+34 693 834368', + 'poblacion' => 'San Domínguez', ], [ - 'username' => 'mespinosa', + 'nombre' => 'mespinosa', 'password' => '$2y$13$YppbMuFIlG6joh2IcNIAY.nX.9Dt7efZLtcCs8dG5ruNK8KGLJ0Ne', 'auth_key' => '-TCsEeW4ivD6nSX5h3dydJbi75q42a0V', - 'phone' => '+34 652-929710', - 'city' => 'Villa Barrios de Lemos', + 'telefono' => '+34 652-929710', + 'poblacion' => 'Villa Barrios de Lemos', ], [ - 'username' => 'mara.caballero', + 'nombre' => 'mara.caballero', 'password' => '$2y$13$alqQs15drCLRRGIpv572iOC1i4gAF3Hi5BgrMEaHgqBpsMMu9hyeS', 'auth_key' => 'qNSFfbSc25NJa0G3gQC6y_OBfSOCFojN', - 'phone' => '965-49-1015', - 'city' => 'San Cárdenas', + 'telefono' => '965-49-1015', + 'poblacion' => 'San Cárdenas', ], [ - 'username' => 'vila.miriam', + 'nombre' => 'vila.miriam', 'password' => '$2y$13$H7SJdO6VFNmlmNQWJZzebeZq.xUgTf41S/2/PqfUrL3V.2VlWyawq', 'auth_key' => '7xKI0iU_8_ThBKNlF6vwz13o2M-320_y', - 'phone' => '954-813387', - 'city' => 'Urías del Vallès', + 'telefono' => '954-813387', + 'poblacion' => 'Urías del Vallès', ], [ - 'username' => 'rordonez', + 'nombre' => 'rordonez', 'password' => '$2y$13$AVfOlfZXHQTdcLqG42QrOeaCjybEQQ6s4JPiFq8yXr9vZDKvAhu8u', 'auth_key' => 'hOy8vfmrUMcpYpzcozf4ITEdxCTbCdHG', - 'phone' => '682850032', - 'city' => 'Villa Batista del Pozo', + 'telefono' => '682850032', + 'poblacion' => 'Villa Batista del Pozo', ], [ - 'username' => 'zbeltran', + 'nombre' => 'zbeltran', 'password' => '$2y$13$A12aWYGMjPj9vO8WfrCV3ul7w6CeMj37OklpnWvaGnsWSJSLSr126', 'auth_key' => 'zYW6uQKRuxUNuD-WUf1wNXVUZFdF-tM6', - 'phone' => '669-583319', - 'city' => 'O Jaimes de Ulla', + 'telefono' => '669-583319', + 'poblacion' => 'O Jaimes de Ulla', ], [ - 'username' => 'cristina.rodarte', + 'nombre' => 'cristina.rodarte', 'password' => '$2y$13$mN.JV29TF3iibmUK3fDglO409qTY3i0RYHrf2tBxN2rqXNMGa60DC', 'auth_key' => 'UT0JHlazUiRAU5iR_RuRiOBy17tsoxmH', - 'phone' => '900 95 6431', - 'city' => 'Os Guevara', + 'telefono' => '900 95 6431', + 'poblacion' => 'Os Guevara', ], [ - 'username' => 'wgalindo', + 'nombre' => 'wgalindo', 'password' => '$2y$13$.bFTow12e8tqpIZRfG/qseimzrrGvI2uOggeiNM.mMnxSVKKEMJNO', 'auth_key' => 'vivNA8VNLN7N30a8NUJh6nZxmy7E9TWm', - 'phone' => '919 23 5328', - 'city' => 'El Castellanos', + 'telefono' => '919 23 5328', + 'poblacion' => 'El Castellanos', ], [ - 'username' => 'godinez.sofia', + 'nombre' => 'godinez.sofia', 'password' => '$2y$13$YqN8iRvkEPIbrYB0a4pJ3OyYQrNhhajnBYvSis1862lP4luSXQW6C', 'auth_key' => '5vWzlzdWZXoJ8-va7V761wIQO4QWxdlj', - 'phone' => '666-069726', - 'city' => 'Los Palacios Medio', + '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/users.php b/tests/unit/templates/fixtures/users.php deleted file mode 100644 index e9e5fafb3..000000000 --- a/tests/unit/templates/fixtures/users.php +++ /dev/null @@ -1,16 +0,0 @@ - $faker->unique()->userName, - 'password' => Yii::$app->getSecurity()->generatePasswordHash('password_' . $index), - 'auth_key' => Yii::$app->getSecurity()->generateRandomString(), - 'phone' => $faker->phoneNumber, - 'city' => $faker->city, -]; 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, +]; From 7b1a636c7ce2e7dad87ab46248122d46f12aea75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 1 Mar 2019 11:08:34 +0100 Subject: [PATCH 35/54] Corrige Makefile --- Makefile | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 780fca88f..01750008f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ -.PHONY: help test tests cs codecept pre_codecept post_codecept run_codecept \ - fastcs fast phpcs docs api guia guide install psql +.PHONY: help test tests codecept pre_codecept post_codecept run_codecept \ + fastcs fast disable_acceptance enable_acceptance 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" @@ -19,15 +20,19 @@ post_codecept: tests/run-acceptance.sh -d run_codecept: - vendor/bin/codecept run + vendor/bin/codecept run || true 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 - vendor/bin/codecept run functional +fast: disable_acceptance run_codecept enable_acceptance + +disable_acceptance: + @if [ -f tests/acceptance.suite.yml ]; then mv -f tests/acceptance.suite.yml tests/acceptance.suite.yml.disabled; fi + +enable_acceptance: + @if [ -f tests/acceptance.suite.yml.disabled ]; then mv -f tests/acceptance.suite.yml.disabled tests/acceptance.suite.yml; fi cs: ## Pasa CodeSniffer phpcs: ## Ídem @@ -39,10 +44,10 @@ docs: ## Ídem doc docs: guia/publish-docs.sh -api: ## Genera el API del proyecto +api: ## Genera sólo el API del proyecto guia/publish-docs.sh -a -guia: ## Genera la guía del proyecto +guia: ## Genera sólo la guía del proyecto guide: ## Ídem guia guide: guia/publish-docs.sh -g From b394b42c451ebf32323fb4be40ae46a943ef50a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 1 Mar 2019 15:24:19 +0100 Subject: [PATCH 36/54] =?UTF-8?q?Simplifica=20a=C3=BAn=20m=C3=A1s=20el=20M?= =?UTF-8?q?akefile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 01750008f..22f7ea2cf 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ -.PHONY: help test tests codecept pre_codecept post_codecept run_codecept \ - fastcs fast disable_acceptance enable_acceptance cs phpcs doc docs \ +.PHONY: help test tests codecept fastcs fast cs phpcs doc docs \ api guia guide install psql help: ## Muestra este mensaje de ayuda @@ -11,28 +10,17 @@ tests: ## Ídem test tests: codecept phpcs codecept: ## Ejecuta los tests unitarios, funcionales y de aceptación -codecept: pre_codecept run_codecept post_codecept - -pre_codecept: +codecept: tests/run-acceptance.sh - -post_codecept: - tests/run-acceptance.sh -d - -run_codecept: 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: disable_acceptance run_codecept enable_acceptance - -disable_acceptance: - @if [ -f tests/acceptance.suite.yml ]; then mv -f tests/acceptance.suite.yml tests/acceptance.suite.yml.disabled; fi - -enable_acceptance: - @if [ -f tests/acceptance.suite.yml.disabled ]; then mv -f tests/acceptance.suite.yml.disabled tests/acceptance.suite.yml; fi +fast: + vendor/bin/codecept run unit,functional cs: ## Pasa CodeSniffer phpcs: ## Ídem From bf004214e02fd148b15887eb503cb7c3e3f758ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 5 Mar 2019 12:48:38 +0100 Subject: [PATCH 37/54] Corrige fallo de espacios en rutas en db/load.sh --- db/load.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/load.sh b/db/load.sh index fac6c2202..da08f35a8 100755 --- a/db/load.sh +++ b/db/load.sh @@ -1,6 +1,6 @@ #!/bin/sh -BASE_DIR=$(dirname $(readlink -f "$0")) +BASE_DIR=$(dirname "$(readlink -f "$0")") if [ "$1" != "test" ]; then psql -h localhost -U proyecto -d proyecto < $BASE_DIR/proyecto.sql fi From fe3a2f8bb7631135e05467d3c74acd8bbbc988b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 13 Mar 2019 21:18:28 +0100 Subject: [PATCH 38/54] =?UTF-8?q?Corrige=20creaci=C3=B3n=20de=20BD=20para?= =?UTF-8?q?=20Travis-CI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5c970afd2..e36e6d1b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,8 @@ install: 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 From dd683f7cad4b07cd948572d93881c4fa1827875b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 13 Mar 2019 21:24:41 +0100 Subject: [PATCH 39/54] Evita errores en Code Climate --- guia/requisitos.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guia/requisitos.php b/guia/requisitos.php index 9567b34e1..aa22f0784 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -18,7 +18,7 @@ echo "\033[1;31m*** ESTE PROCESO ES IRREVERSIBLE Y NO SE PUEDE INTERRUMPIR ***\033[0m\n\n"; echo "\033[1;28m¿Deseas continuar? (s/N): \033[0m"; $sn = ''; - fscanf(STDIN, "%s", $sn); + fscanf(STDIN, '%s', $sn); if ($sn !== 's' && $sn !== 'S') { exit(1); } @@ -26,7 +26,7 @@ echo "Leyendo archivo requisitos.xls...\n"; \PhpOffice\PhpSpreadsheet\Settings::setLocale('es'); -$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load("requisitos.xls"); +$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load('requisitos.xls'); $objWorksheet = $objPHPExcel->getSheet(0); $highestRow = $objWorksheet->getHighestDataRow(); // e.g. 10 $highestColumn = $objWorksheet->getHighestDataColumn(); // e.g 'F' @@ -34,9 +34,9 @@ $requisitos = "\n# Catálogo de requisitos\n\n"; $resumen = "\n## Cuadro resumen\n\n" . '| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** |' - . ($issues ? " **Incidencia** |" : '') . "\n" + . ($issues ? ' **Incidencia** |' : '') . "\n" . '| :------------ | :-----------: | :------: | :-------------: | :---------: |' - . ($issues ? " :------------: |" : '') . "\n"; + . ($issues ? ' :------------: |' : '') . "\n"; $salida = `ghi`; $matches = []; @@ -52,7 +52,7 @@ for ($row = 2; $row <= $highestRow; $row++) { if ($issues && ($row - 1) % 10 === 0) { - echo "Deteniendo la ejecución por 10 segundos para evitar exceso de tasa..."; + echo 'Deteniendo la ejecución por 10 segundos para evitar exceso de tasa...'; sleep(10); echo "\n"; } From 0eb51a24d85b4ee9682634d22fbb23bb463f6c71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 13 Mar 2019 23:20:09 +0100 Subject: [PATCH 40/54] =?UTF-8?q?Mejora=20los=20tests=20con=20migraci?= =?UTF-8?q?=C3=B3n=20y=20carga=20previa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 22f7ea2cf..c974a067b 100644 --- a/Makefile +++ b/Makefile @@ -11,9 +11,11 @@ test tests: codecept phpcs codecept: ## Ejecuta los tests unitarios, funcionales y de aceptación codecept: - tests/run-acceptance.sh + @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 + @tests/run-acceptance.sh -d fastcs: ## Ejecuta los tests unitarios y funcionales y pasa CodeSniffer fastcs: fast cs From bbc1d36c54b50abc4a63e876347da9610a7a9a9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 14 Mar 2019 10:04:26 +0100 Subject: [PATCH 41/54] =?UTF-8?q?Incluye=20un=20modelo=20Usuarios=20b?= =?UTF-8?q?=C3=A1sico=20para=20pasar=20los=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- models/Usuarios.php | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 models/Usuarios.php 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', + ]; + } +} From 7b7721b9305eceeec1fd5c02414e4557d64265ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 15 Mar 2019 19:59:27 +0100 Subject: [PATCH 42/54] Actualiza 'requisitos.php' --- guia/Makefile | 4 +-- guia/requisitos.md | 78 +++++++++++++++++++++++++++++----------- guia/requisitos.php | 85 ++++++++++++++++++++++++++++++++------------ guia/requisitos.xls | Bin 16896 -> 16896 bytes 4 files changed, 123 insertions(+), 44 deletions(-) diff --git a/guia/Makefile b/guia/Makefile index 6de9b406f..65b5f4b82 100644 --- a/guia/Makefile +++ b/guia/Makefile @@ -3,7 +3,7 @@ all: check req check: - ./check-ghi.sh + @./check-ghi.sh req: - php requisitos.php -i + @php requisitos.php -i diff --git a/guia/requisitos.md b/guia/requisitos.md index e2c4d1636..2e3bcf2ba 100644 --- a/guia/requisitos.md +++ b/guia/requisitos.md @@ -1,7 +1,7 @@ # Catálogo de requisitos -| **R01** | **Requisitos como incidencias** | +| **R1** | **Requisitos como incidencias** | | --------------: | :------------------- | | **Descripción** | Requisitos perfectamente definidos y convertidos en incidencias (issues) de GitHub. | | **Prioridad** | Mínimo | @@ -9,7 +9,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R02** | **Código fuente** | + +| **R2** | **Código fuente** | | --------------: | :------------------- | | **Descripción** | Código fuente publicado en GitHub. | | **Prioridad** | Mínimo | @@ -17,7 +18,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R03** | **Estilo del código** | + +| **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 | @@ -25,7 +27,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R04** | **Tres lanzamientos** | + +| **R4** | **Tres lanzamientos** | | --------------: | :------------------- | | **Descripción** | Tres lanzamientos (releases) etiquetados en el repositorio como v1, v2 y v3. | | **Prioridad** | Mínimo | @@ -33,7 +36,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R05** | **README.md** | + +| **R5** | **README.md** | | --------------: | :------------------- | | **Descripción** | README.md en el directorio raíz con la descripción principal del proyecto. | | **Prioridad** | Mínimo | @@ -41,7 +45,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R06** | **Documentación** | + +| **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 | @@ -49,7 +54,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R07** | **Incidencias en GitHub** | + +| **R7** | **Incidencias en GitHub** | | --------------: | :------------------- | | **Descripción** | Administración y resolución de todas las incidencias notificadas en GitHub. | | **Prioridad** | Mínimo | @@ -57,7 +63,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R08** | **Etiquetas e hitos** | + +| **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 | @@ -65,7 +72,8 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | -| **R09** | **Rama master** | + +| **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 | @@ -73,6 +81,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R10** | **Gestión del proyecto** | | --------------: | :------------------- | | **Descripción** | Usar Waffle o similar para la gestión general del proyecto. | @@ -81,6 +90,7 @@ | **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. | @@ -89,6 +99,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R12** | **Validación de formularios** | | --------------: | :------------------- | | **Descripción** | Validación de los campos de los formularios. | @@ -97,6 +108,7 @@ | **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) | @@ -105,6 +117,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R14** | **Manejo de eventos** | | --------------: | :------------------- | | **Descripción** | Interactividad a través de mecanismos de manejo de eventos intuitivos y eficaces. | @@ -113,6 +126,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R15** | **DOM** | | --------------: | :------------------- | | **Descripción** | Uso y manipulación de las características del modelo de objetos del documento (DOM). | @@ -121,6 +135,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R16** | **Almacenamiento en el lado del cliente** | | --------------: | :------------------- | | **Descripción** | Uso de mecanismos de almacenamiento en el lado del cliente. | @@ -129,6 +144,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R17** | **jQuery, jQuery UI** | | --------------: | :------------------- | | **Descripción** | Uso de la librería jQuery, jQuery UI. | @@ -137,6 +153,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R18** | **Plugin no trabajado en clase** | | --------------: | :------------------- | | **Descripción** | Incluir al menos un plugin no trabajado en clase. | @@ -145,6 +162,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R19** | **Utilización de AJAX** | | --------------: | :------------------- | | **Descripción** | Utilización de mecanismos de comunicación asíncrona: AJAX. | @@ -153,6 +171,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R20** | **ECMAScript2015 (ES6)** | | --------------: | :------------------- | | **Descripción** | Uso de las nuevas incorporaciones del estándar ECMAScript2015 (ES6) | @@ -161,6 +180,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R21** | **PHP** | | --------------: | :------------------- | | **Descripción** | Usar PHP 7.1 ó superior. | @@ -169,6 +189,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R22** | **Yii2 Framework** | | --------------: | :------------------- | | **Descripción** | Usar Yii2 Framework versión 2.0.10 ó superior. | @@ -177,6 +198,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R23** | **PostgreSQL** | | --------------: | :------------------- | | **Descripción** | Usar PostgreSQL versión 9.6 ó superior. | @@ -185,6 +207,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R24** | **Heroku** | | --------------: | :------------------- | | **Descripción** | Despliegue de la aplicación en la plataforma Heroku. | @@ -193,6 +216,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R25** | **Codeception** | | --------------: | :------------------- | | **Descripción** | Pruebas funcionales con Codeception. | @@ -201,6 +225,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R26** | **Code Climate** | | --------------: | :------------------- | | **Descripción** | Estilo y mantenibilidad del código fuente validados por Code Climate. | @@ -209,6 +234,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R27** | **Aplicación escalable** | | --------------: | :------------------- | | **Descripción** | La aplicación ha de ser escalable. | @@ -217,6 +243,7 @@ | **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. | @@ -225,6 +252,7 @@ | **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. | @@ -233,6 +261,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R30** | **Presentación mediante CSS** | | --------------: | :------------------- | | **Descripción** | Todo lo relacionado con la presentación se trabajará mediante CSS. | @@ -241,6 +270,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R31** | **Diseño flexible** | | --------------: | :------------------- | | **Descripción** | El diseño será flexible. | @@ -249,6 +279,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R32** | **Transiciones, transformaciones, animaciones y contenido multimedia** | | --------------: | :------------------- | | **Descripción** | Existirán transiciones, transformaciones, animaciones y contenido multimedia. | @@ -257,6 +288,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R33** | **Uso de microdatos** | | --------------: | :------------------- | | **Descripción** | Uso de microdatos. | @@ -265,6 +297,7 @@ | **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. | @@ -273,6 +306,7 @@ | **Complejidad** | Fácil | | **Entrega** | v1 | + | **R35** | **Diseño para varias resoluciones** | | --------------: | :------------------- | | **Descripción** | Implementar el diseño para resoluciones grandes y pequeñas. | @@ -281,6 +315,7 @@ | **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. | @@ -289,6 +324,7 @@ | **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. | @@ -297,6 +333,7 @@ | **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. | @@ -306,19 +343,20 @@ | **Entrega** | v1 | + ## Cuadro resumen -| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** | **Incidencia** | -| :------------ | :-----------: | :------: | :-------------: | :---------: | :------------: | -| (**R01**) Requisitos como incidencias | Mínimo | Técnico | Fácil | v1 | -| (**R02**) Código fuente | Mínimo | Técnico | Fácil | v1 | -| (**R03**) Estilo del código | Mínimo | Técnico | Fácil | v1 | -| (**R04**) Tres lanzamientos | Mínimo | Técnico | Fácil | v1 | -| (**R05**) README.md | Mínimo | Técnico | Fácil | v1 | -| (**R06**) Documentación | Mínimo | Técnico | Fácil | v1 | -| (**R07**) Incidencias en GitHub | Mínimo | Técnico | Fácil | v1 | -| (**R08**) Etiquetas e hitos | Mínimo | Técnico | Fácil | v1 | -| (**R09**) Rama master | Mínimo | Técnico | Fácil | v1 | +| **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 | diff --git a/guia/requisitos.php b/guia/requisitos.php index aa22f0784..220bda2e6 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -8,6 +8,7 @@ } $issues = isset($argv[1]) && $argv[1] === '-i'; +$check = isset($argv[1]) && $argv[1] === '-c'; if ($issues) { echo "\nSe ha indicado la opción '\033[1;28m-i\033[0m'. Se actualizarán las incidencias\n"; @@ -24,13 +25,63 @@ } } -echo "Leyendo archivo requisitos.xls...\n"; \PhpOffice\PhpSpreadsheet\Settings::setLocale('es'); $objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load('requisitos.xls'); $objWorksheet = $objPHPExcel->getSheet(0); $highestRow = $objWorksheet->getHighestDataRow(); // e.g. 10 $highestColumn = $objWorksheet->getHighestDataColumn(); // e.g 'F' $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5 + +$fallo = 0; + +echo "\033[1;28m# Comprobando archivo requisitos.xls...\033[0m\n"; + +for ($row = 2; $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 (!preg_match('/R[1-9]\d*/u', $codigo)) { + echo "\033[1;31m* Error: 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.\033[0m\n"; + $fallo = 1; + } + if (!in_array($prioridad, ['Mínimo', 'Importante', 'Opcional'])) { + echo "\033[1;31m* Error: La prioridad '$prioridad' es incorrecta (celda D$row).\033[0m\n"; + $fallo = 1; + } + if (!in_array($tipo, ['Funcional', 'Técnico', 'Información'])) { + echo "\033[1;31m* Error: El tipo '$tipo' es incorrecto (celda E$row).\033[0m\n"; + $fallo = 1; + } + if (!in_array($complejidad, ['Fácil', 'Media', 'Difícil'])) { + echo "\033[1;31m* Error: La complejidad '$complejidad' es incorrecta (celda F$row).\033[0m\n"; + $fallo = 1; + } + if (!in_array($entrega, ['v1', 'v2', 'v3'])) { + echo "\033[1;31m* Error: La entrega '$entrega' es incorrecta (celda G$row).\033[0m\n"; + $fallo = 1; + } +} + +if ($fallo == 0) { + echo "\n\033[1;28m# No se han encontrado errores.\033[0m\n"; + if ($check) { + exit(0); + } +} else { + exit($fallo); +} + $requisitos = "\n# Catálogo de requisitos\n\n"; $resumen = "\n## Cuadro resumen\n\n" . '| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** |' @@ -45,14 +96,16 @@ if (preg_match('%# ([^ ]+/[^ ]+)%', $salida, $matches) === 1) { $repo = $matches[1]; } else { - echo "Error: no se puede identificar el repositorio de GitHub asociado.\n"; + echo "\033[1;31m* Error: no se puede identificar el repositorio de GitHub asociado.\033[0m\n"; exit(1); } } +echo "\033[1;28m# Leyendo archivo requisitos.xls...\033[0m\n"; + for ($row = 2; $row <= $highestRow; $row++) { if ($issues && ($row - 1) % 10 === 0) { - echo 'Deteniendo la ejecución por 10 segundos para evitar exceso de tasa...'; + echo '# Deteniendo la ejecución por 10 segundos para evitar exceso de tasa...'; sleep(10); echo "\n"; } @@ -78,22 +131,10 @@ $complejidadGhi = mb_strtolower($complejidad); $entregaGhi = mb_substr($entrega, 1, 1); $comando = "ghi open -m \"$mensaje\" --claim"; - if (!empty($prioridadGhi) - && in_array($prioridadGhi, ['mínimo', 'importante', 'opcional'])) { - $comando .= " -L $prioridadGhi"; - } - if (!empty($tipoGhi) - && in_array($tipoGhi, ['funcional', 'técnico', 'información'])) { - $comando .= " -L $tipoGhi"; - } - if (!empty($complejidadGhi) - && in_array($complejidadGhi, ['fácil', 'media', 'difícil'])) { - $comando .= " -L $complejidadGhi"; - } - if (!empty($entregaGhi) - && in_array($entregaGhi, ['1', '2', '3'])) { - $comando .= " -M $entregaGhi"; - } + $comando .= " -L $prioridadGhi"; + $comando .= " -L $tipoGhi"; + $comando .= " -L $complejidadGhi"; + $comando .= " -M $entregaGhi"; echo "Generando incidencia para $codigo en GitHub..."; $salida = `$comando`; $matches = []; @@ -104,7 +145,7 @@ $objWorksheet->getCell("H$row")->getHyperlink()->setUrl($link); echo " #$incidencia\n"; } else { - echo "\nError: no se ha podido crear la incidencia en GitHub.\n"; + echo "\n\033[1;31m* Error: no se ha podido crear la incidencia en GitHub.\033[0m\n"; $link = ''; } } else { @@ -127,11 +168,11 @@ . ($issues ? " [$incidencia]($link) |" : '') . "\n"; } -echo "\nGenerando archivo requisitos.md...\n"; +echo "\n\033[1;28m# Generando archivo requisitos.md...\033[0m\n"; file_put_contents('requisitos.md', $requisitos . $resumen, LOCK_EX); if ($issues) { - echo "Actualizando archivo requisitos.xls...\n"; + echo "\033[1;28m# Actualizando archivo requisitos.xls...\033[0m\n"; $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($objPHPExcel); $writer->save('requisitos.xls'); } diff --git a/guia/requisitos.xls b/guia/requisitos.xls index c14c333f6e371cb23e4623525ea4e9aa8c591e65..15e249886c62276291571bb748851b90ba3cffe7 100644 GIT binary patch delta 314 zcmZo@VQgq&+%SoY(RT7=t_G&RqLW3r3t5;L7=k8ub5DgZRC&xGj0B!~2;&J)3WVXy z8wF-;Uc+n22oZY4mkwcs@o$32@d{`O)u(WYG60QbsAb?`UiNobt8CV%2xDk9d26hyA4h9Cs6fOy{dIlywpe-Q42*f}c1`Z|x28PYslx7Mu zGE5FIlYz>Eq(NYFm026(WCIq?O%@i+JeEKa2Ow_9jd7mrVy(dOP`+q+#O*7LlNDJ+ RHaA#TFf&fr{L_w|830cQG^GFl delta 342 zcmZo@VQgq&+%SoY(QWc%t_CJHvB{#`g{;gB3_%8yySS%9S;{ZVE7#M09co-OgFik`Z&SwI$uA3nE z%nU3HX}XV;j#?;49rSk{frDsK*+?jxzMbQag&7wGmiyOsRKy4$s>cw hF4hVh4XncJZ%w|!I9ZWJWOIXc1vBH!%|GqfnE?}jG`#=- From ce1ade1861aeed8f2b2be08cf74e6190ba2f980f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 20 Mar 2019 15:34:29 +0100 Subject: [PATCH 43/54] Ya no depende de 'ghi' y crea proyecto en GitHub Projects --- composer.json | 4 +- guia/Makefile | 11 +-- guia/check-ghi.sh | 45 ----------- guia/requisitos.php | 182 +++++++++++++++++++++++++++++--------------- 4 files changed, 126 insertions(+), 116 deletions(-) delete mode 100755 guia/check-ghi.sh diff --git a/composer.json b/composer.json index 4ffd887c8..177b0f5a9 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,9 @@ "yiisoft/yii2-coding-standards": "^2.0", "friendsofphp/php-cs-fixer": "^2.8", "phpoffice/phpspreadsheet": "^1.1", - "symfony/dotenv": "^4.0" + "symfony/dotenv": "^4.0", + "knplabs/github-api": "^2.11", + "php-http/guzzle6-adapter": "^1.1" }, "config": { "process-timeout": 1800, diff --git a/guia/Makefile b/guia/Makefile index 65b5f4b82..017a4f0f5 100644 --- a/guia/Makefile +++ b/guia/Makefile @@ -1,9 +1,4 @@ -.PHONY: all check req +.PHONY: all -all: check req - -check: - @./check-ghi.sh - -req: - @php requisitos.php -i +all: + php requisitos.php -i diff --git a/guia/check-ghi.sh b/guia/check-ghi.sh deleted file mode 100755 index 106b9f1cd..000000000 --- a/guia/check-ghi.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -if [ ! -x /usr/local/bin/ghi ] -then - echo "Error: falta el programa ghi." - exit 1 -fi - -if ! ghi milestone > /dev/null 2>&1 -then - echo "No hay repositorio asociado en GitHub." - echo "Crea primero un repositorio y vincúlalo con éste." - exit 1 -fi - -GHI=$(ghi milestone | grep -v ^\# | cut -c3-) -OK="1" - -for p in "1: v1" "2: v2" "3: v3" -do - if ! echo $GHI | grep -qs "$p" - then - echo "El hito (milestone) '$p' falta o está mal creado." - OK="0" - fi -done - -if [ "$OK" = "0" ] -then - REPO=$(ghi milestone -w) - echo "Crea en $REPO los hitos v1, v2 y v3 (en ese orden), para que sus" - echo "números internos coincidan con 1, 2 y 3, respectivamente." - echo "Si ya estaban creados, elimínalos primero antes de crearlos." - exit 1 -fi - -ghi label mínimo -c e99695 -ghi label importante -c mediumpurple -ghi label opcional -c fef2c0 -ghi label fácil -c f9ca98 -ghi label media -c 93d8d7 -ghi label difícil -c b60205 -ghi label funcional -c d4c5f9 -ghi label técnico -c 006b75 -ghi label información -c 0052cc diff --git a/guia/requisitos.php b/guia/requisitos.php index 220bda2e6..e3d1ffb37 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -1,6 +1,12 @@ #!/usr/bin/env php getHighestDataColumn(); // e.g 'F' $highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // e.g. 5 -$fallo = 0; - echo "\033[1;28m# Comprobando archivo requisitos.xls...\033[0m\n"; -for ($row = 2; $row <= $highestRow; $row++) { +for ($fallo = 0, $row = 2; $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(); @@ -52,29 +50,27 @@ $incidencia = $objWorksheet->getCell("H$row")->getValue(); if (!preg_match('/R[1-9]\d*/u', $codigo)) { - echo "\033[1;31m* Error: 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.\033[0m\n"; - $fallo = 1; + $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, ['Mínimo', 'Importante', 'Opcional'])) { - echo "\033[1;31m* Error: La prioridad '$prioridad' es incorrecta (celda D$row).\033[0m\n"; - $fallo = 1; + $fallo = fallo("Error: La prioridad '$prioridad' es incorrecta (celda D$row)."); } if (!in_array($tipo, ['Funcional', 'Técnico', 'Información'])) { - echo "\033[1;31m* Error: El tipo '$tipo' es incorrecto (celda E$row).\033[0m\n"; - $fallo = 1; + $fallo = fallo("El tipo '$tipo' es incorrecto (celda E$row)."); } if (!in_array($complejidad, ['Fácil', 'Media', 'Difícil'])) { - echo "\033[1;31m* Error: La complejidad '$complejidad' es incorrecta (celda F$row).\033[0m\n"; - $fallo = 1; + $fallo = fallo("La complejidad '$complejidad' es incorrecta (celda F$row)."); } if (!in_array($entrega, ['v1', 'v2', 'v3'])) { - echo "\033[1;31m* Error: La entrega '$entrega' es incorrecta (celda G$row).\033[0m\n"; - $fallo = 1; + $fallo = fallo("La entrega '$entrega' es incorrecta (celda G$row)."); + } + if ($incidencia != '' && !ctype_digit((string) $incidencia)) { + $fallo = fallo("La incidencia '$incidencia' es incorrecta (celda H$row)."); } } if ($fallo == 0) { - echo "\n\033[1;28m# No se han encontrado errores.\033[0m\n"; + echo "\n\033[1;28m# No se han encontrado errores en el archivo 'requisitos.xls'.\033[0m\n"; if ($check) { exit(0); } @@ -82,6 +78,78 @@ exit($fallo); } +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); + } + + $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]); + } + } + + $etiquetas = [ + 'mínimo' => 'e99695', + 'importante' => '9370db', + 'opcional' => 'fef2c0', + 'fácil' => 'f9ca98', + 'media' => '93d8d7', + 'difícil' => 'b60205', + 'funcional' => 'd4c5f9', + 'técnico' => '006b75', + 'información' => '0052cc', + ]; + + $labels = array_column($client->api('issue')->labels()->all($login, $repo), 'name'); + + foreach ($etiquetas as $name => $color) { + if (in_array($name, $labels)) { + 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]); + } + } + + $projects = $client->api('repo')->projects()->configure()->all($login, $repo); + + if (count($projects) == 0) { + echo "# Creando el nuevo proyecto en GitHub Projects..."; + $project = $client->api('repo')->projects()->configure()->create($login, $repo, ['name' => 'Proyecto']); + echo " #{$project['number']}\n"; + } else { + $project = $projects[0]; + echo "# Usando el proyecto #{$project['number']} ya existente...\n"; + } + + $columns = $client->api('repo')->projects()->columns()->configure()->all($project['id']); + if (count($columns) == 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']); + } else { + $column = $columns[0]; + echo "# Usando columnas ya existentes en el proyecto...\n"; + } +} + $requisitos = "\n# Catálogo de requisitos\n\n"; $resumen = "\n## Cuadro resumen\n\n" . '| **Requisito** | **Prioridad** | **Tipo** | **Complejidad** | **Entrega** |' @@ -89,24 +157,12 @@ . '| :------------ | :-----------: | :------: | :-------------: | :---------: |' . ($issues ? ' :------------: |' : '') . "\n"; -$salida = `ghi`; -$matches = []; - -if ($issues) { - if (preg_match('%# ([^ ]+/[^ ]+)%', $salida, $matches) === 1) { - $repo = $matches[1]; - } else { - echo "\033[1;31m* Error: no se puede identificar el repositorio de GitHub asociado.\033[0m\n"; - exit(1); - } -} - echo "\033[1;28m# Leyendo archivo requisitos.xls...\033[0m\n"; for ($row = 2; $row <= $highestRow; $row++) { if ($issues && ($row - 1) % 10 === 0) { - echo '# Deteniendo la ejecución por 10 segundos para evitar exceso de tasa...'; - sleep(10); + echo '# Deteniendo la ejecución por 5 segundos para no exceder el límite de tasa...'; + sleep(5); echo "\n"; } echo '(' . ($row - 1) . '/' . ($highestRow - 1) . ') '; @@ -125,36 +181,33 @@ if ($issues) { if ($incidencia === null) { - $mensaje = "($codigo) $corta\n$larga"; - $prioridadGhi = mb_strtolower($prioridad); - $tipoGhi = mb_strtolower($tipo); - $complejidadGhi = mb_strtolower($complejidad); - $entregaGhi = mb_substr($entrega, 1, 1); - $comando = "ghi open -m \"$mensaje\" --claim"; - $comando .= " -L $prioridadGhi"; - $comando .= " -L $tipoGhi"; - $comando .= " -L $complejidadGhi"; - $comando .= " -M $entregaGhi"; echo "Generando incidencia para $codigo en GitHub..."; - $salida = `$comando`; - $matches = []; - if (preg_match('/^#([0-9]+):/', $salida, $matches) === 1) { - $incidencia = $matches[1]; - $link = "https://github.com/$repo/issues/$incidencia"; - $objWorksheet->setCellValue("H$row", $incidencia); - $objWorksheet->getCell("H$row")->getHyperlink()->setUrl($link); - echo " #$incidencia\n"; - } else { - echo "\n\033[1;31m* Error: no se ha podido crear la incidencia en GitHub.\033[0m\n"; - $link = ''; - } + $issue = $client->api('issue')->create($login, $repo, [ + 'title' => $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"; + $issue = $client->api('issue')->show($login, $repo, $incidencia); } - - $link = "https://github.com/$repo/issues/$incidencia"; + $link = "https://github.com/$login/$repo/issues/$incidencia"; } + $incidencia = $issues ? "| **Incidencia** | [$incidencia]($link) |" : ''; $requisitos .= "| **$codigo** | **$cortaMd** |\n" . "| --------------: | :------------------- |\n" . "| **Descripción** | $largaMd |\n" @@ -162,17 +215,22 @@ . "| **Tipo** | $tipo |\n" . "| **Complejidad** | $complejidad |\n" . "| **Entrega** | $entrega |\n" - . ($issues ? "| **Incidencia** | [$incidencia]($link) |" : '') . "\n\n"; + . $incidencia . "\n\n"; + + $resumen .= "| (**$codigo**) $cortaMd | $prioridad | $tipo | $complejidad | $entrega | $incidencia\n"; +} - $resumen .= "| (**$codigo**) $cortaMd | $prioridad | $tipo | $complejidad | $entrega |" - . ($issues ? " [$incidencia]($link) |" : '') . "\n"; +if (!$issues) { + echo "\n"; } -echo "\n\033[1;28m# Generando archivo requisitos.md...\033[0m\n"; +echo "\033[1;28m# Generando archivo requisitos.md...\033[0m\n"; file_put_contents('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('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"; } From 64de291348578f8c67bf3cbc0068a19b1f1abfa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 21 Mar 2019 14:53:35 +0100 Subject: [PATCH 44/54] =?UTF-8?q?A=C3=B1ade=20.github?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- github/ISSUE_TEMPLATE.md | 27 +++++++++++++++++++++++++++ setup.sh | 1 + 2 files changed, 28 insertions(+) create mode 100644 github/ISSUE_TEMPLATE.md 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/setup.sh b/setup.sh index 622ab983d..7a37675ec 100755 --- a/setup.sh +++ b/setup.sh @@ -5,4 +5,5 @@ 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 From 7d83737b64c1835340dd32be92f117036052c441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Thu, 21 Mar 2019 17:17:28 +0100 Subject: [PATCH 45/54] Mejora guia/requisitos.php --- guia/Makefile | 2 +- guia/requisitos.php | 118 +++++++++++++++++++++++++++----------------- 2 files changed, 75 insertions(+), 45 deletions(-) diff --git a/guia/Makefile b/guia/Makefile index 017a4f0f5..98b59c8fa 100644 --- a/guia/Makefile +++ b/guia/Makefile @@ -1,4 +1,4 @@ .PHONY: all all: - php requisitos.php -i + @php requisitos.php -i || true diff --git a/guia/requisitos.php b/guia/requisitos.php index e3d1ffb37..9b19265ca 100755 --- a/guia/requisitos.php +++ b/guia/requisitos.php @@ -38,10 +38,15 @@ function fallo($mensaje) $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 '(' . ($row - 1) . '/' . ($highestRow - 1) . ') '; + echo "\r(" . ($row - 1) . '/' . ($highestRow - 1) . ') '; $codigo = $objWorksheet->getCell("A$row")->getValue(); $prioridad = $objWorksheet->getCell("D$row")->getValue(); $tipo = $objWorksheet->getCell("E$row")->getValue(); @@ -52,25 +57,29 @@ function fallo($mensaje) 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, ['Mínimo', 'Importante', 'Opcional'])) { - $fallo = fallo("Error: La prioridad '$prioridad' es incorrecta (celda D$row)."); + if (!in_array($prioridad, $prioridades)) { + $fallo = fallo("La prioridad '$prioridad' es incorrecta (celda D$row). Debe ser: " + . implode(', ', $prioridades)); } - if (!in_array($tipo, ['Funcional', 'Técnico', 'Información'])) { - $fallo = fallo("El tipo '$tipo' es incorrecto (celda E$row)."); + if (!in_array($tipo, $tipos)) { + $fallo = fallo("El tipo '$tipo' es incorrecto (celda E$row). Debe ser: " + . implode(', ', $tipos)); } - if (!in_array($complejidad, ['Fácil', 'Media', 'Difícil'])) { - $fallo = fallo("La complejidad '$complejidad' es incorrecta (celda F$row)."); + if (!in_array($complejidad, $complejidades)) { + $fallo = fallo("La complejidad '$complejidad' es incorrecta (celda F$row). Debe ser: " + . implode(', ', $complejidades)); } - if (!in_array($entrega, ['v1', 'v2', 'v3'])) { - $fallo = fallo("La entrega '$entrega' es incorrecta (celda G$row)."); + 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)."); + $fallo = fallo("La incidencia '$incidencia' es incorrecta (celda H$row). Debe ser un número entero."); } } if ($fallo == 0) { - echo "\n\033[1;28m# No se han encontrado errores en el archivo 'requisitos.xls'.\033[0m\n"; + echo "\r\033[1;28m# No se han encontrado errores en el archivo 'requisitos.xls'.\033[0m\n"; if ($check) { exit(0); } @@ -85,10 +94,52 @@ function fallo($mensaje) $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."); + 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']; @@ -103,6 +154,7 @@ function fallo($mensaje) } } + $labels = array_column($client->api('issue')->labels()->all($login, $repo), 'color', 'name'); $etiquetas = [ 'mínimo' => 'e99695', 'importante' => '9370db', @@ -115,39 +167,17 @@ function fallo($mensaje) 'información' => '0052cc', ]; - $labels = array_column($client->api('issue')->labels()->all($login, $repo), 'name'); - foreach ($etiquetas as $name => $color) { - if (in_array($name, $labels)) { - echo "# Actualizando el color de la etiqueta $name...\n"; - $client->api('issue')->labels()->update($login, $repo, $name, $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]); } } - - $projects = $client->api('repo')->projects()->configure()->all($login, $repo); - - if (count($projects) == 0) { - echo "# Creando el nuevo proyecto en GitHub Projects..."; - $project = $client->api('repo')->projects()->configure()->create($login, $repo, ['name' => 'Proyecto']); - echo " #{$project['number']}\n"; - } else { - $project = $projects[0]; - echo "# Usando el proyecto #{$project['number']} ya existente...\n"; - } - - $columns = $client->api('repo')->projects()->columns()->configure()->all($project['id']); - if (count($columns) == 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']); - } else { - $column = $columns[0]; - echo "# Usando columnas ya existentes en el proyecto...\n"; - } } $requisitos = "\n# Catálogo de requisitos\n\n"; @@ -160,11 +190,6 @@ function fallo($mensaje) echo "\033[1;28m# Leyendo archivo requisitos.xls...\033[0m\n"; for ($row = 2; $row <= $highestRow; $row++) { - if ($issues && ($row - 1) % 10 === 0) { - echo '# Deteniendo la ejecución por 5 segundos para no exceder el límite de tasa...'; - sleep(5); - echo "\n"; - } echo '(' . ($row - 1) . '/' . ($highestRow - 1) . ') '; $codigo = $objWorksheet->getCell("A$row")->getValue(); $corta = $objWorksheet->getCell("B$row")->getValue(); @@ -181,6 +206,11 @@ function fallo($mensaje) if ($issues) { if ($incidencia === null) { + if (($row - 1) % 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' => $corta, From 52c865698be674795d4e0f24577acc77d2477cc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 22 Mar 2019 14:54:39 +0100 Subject: [PATCH 46/54] =?UTF-8?q?Reestructuraci=C3=B3n=20de=20scripts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 9 ++++++--- guia/Makefile | 2 +- guia/{ => scripts}/publish-docs.sh | 4 ++-- guia/{ => scripts}/requisitos.php | 16 +++++++++------- tests/download-chromedriver.sh | 2 +- tests/run-acceptance.sh | 2 +- tests/setup-acceptance.sh | 2 +- 7 files changed, 21 insertions(+), 16 deletions(-) rename guia/{ => scripts}/publish-docs.sh (94%) rename guia/{ => scripts}/requisitos.php (96%) diff --git a/Makefile b/Makefile index c974a067b..9b5d07d63 100644 --- a/Makefile +++ b/Makefile @@ -32,15 +32,15 @@ cs phpcs: doc: ## Genera toda la documentación (guía + API) docs: ## Ídem doc docs: - guia/publish-docs.sh + guia/scripts/publish-docs.sh api: ## Genera sólo el API del proyecto - guia/publish-docs.sh -a + guia/scripts/publish-docs.sh -a guia: ## Genera sólo la guía del proyecto guide: ## Ídem guia guide: - guia/publish-docs.sh -g + guia/scripts/publish-docs.sh -g serve: ## Arranca el servidor web integrado ./yii serve @@ -54,3 +54,6 @@ psql: ## Arranca una consola SQL en la BD principal 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/guia/Makefile b/guia/Makefile index 98b59c8fa..aa2f844e1 100644 --- a/guia/Makefile +++ b/guia/Makefile @@ -1,4 +1,4 @@ .PHONY: all all: - @php requisitos.php -i || true + @php scripts/requisitos.php -i || true diff --git a/guia/publish-docs.sh b/guia/scripts/publish-docs.sh similarity index 94% rename from guia/publish-docs.sh rename to guia/scripts/publish-docs.sh index b34c02190..187b7ddd0 100755 --- a/guia/publish-docs.sh +++ b/guia/scripts/publish-docs.sh @@ -1,6 +1,6 @@ #!/bin/sh -BASE_DIR=$(dirname $(readlink -f "$0")) +BASE_DIR=$(dirname "$(readlink -f "$0")") api() { @@ -25,7 +25,7 @@ guide() } ACTUAL=$PWD -cd $BASE_DIR/.. +cd $BASE_DIR/../.. if [ "$1" = "-a" ] then diff --git a/guia/requisitos.php b/guia/scripts/requisitos.php similarity index 96% rename from guia/requisitos.php rename to guia/scripts/requisitos.php index 9b19265ca..7199a7db6 100755 --- a/guia/requisitos.php +++ b/guia/scripts/requisitos.php @@ -7,10 +7,12 @@ function fallo($mensaje) return 1; } -if (file_exists('vendor')) { - require 'vendor/autoload.php'; -} elseif (file_exists('../vendor')) { - require '../vendor/autoload.php'; +define('BASE_DIR', dirname(__DIR__)); + +if (file_exists(BASE_DIR . '/vendor')) { + require BASE_DIR . '/vendor/autoload.php'; +} elseif (file_exists(BASE_DIR . '/../vendor')) { + require BASE_DIR . '/../vendor/autoload.php'; } $issues = isset($argv[1]) && $argv[1] === '-i'; @@ -32,7 +34,7 @@ function fallo($mensaje) } \PhpOffice\PhpSpreadsheet\Settings::setLocale('es'); -$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load('requisitos.xls'); +$objPHPExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load(BASE_DIR . '/requisitos.xls'); $objWorksheet = $objPHPExcel->getSheet(0); $highestRow = $objWorksheet->getHighestDataRow(); // e.g. 10 $highestColumn = $objWorksheet->getHighestDataColumn(); // e.g 'F' @@ -255,12 +257,12 @@ function fallo($mensaje) } echo "\033[1;28m# Generando archivo requisitos.md...\033[0m\n"; -file_put_contents('requisitos.md', $requisitos . $resumen, LOCK_EX); +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('requisitos.xls'); + $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/tests/download-chromedriver.sh b/tests/download-chromedriver.sh index aa2fefe2c..c723f1136 100755 --- a/tests/download-chromedriver.sh +++ b/tests/download-chromedriver.sh @@ -1,6 +1,6 @@ #!/bin/sh -BASE_DIR=$(dirname $(readlink -f "$0")) +BASE_DIR=$(dirname "$(readlink -f "$0")") CHROME="chromedriver" SN="S" if [ -f "$BASE_DIR/$CHROME" ] diff --git a/tests/run-acceptance.sh b/tests/run-acceptance.sh index 3478dda9b..2f05f0ce3 100755 --- a/tests/run-acceptance.sh +++ b/tests/run-acceptance.sh @@ -1,6 +1,6 @@ #!/bin/sh -BASE_DIR=$(dirname $(readlink -f "$0")) +BASE_DIR=$(dirname "$(readlink -f "$0")") PORT=8088 if [ -f $BASE_DIR/acceptance.suite.yml ] diff --git a/tests/setup-acceptance.sh b/tests/setup-acceptance.sh index 1999ca386..a0b14f461 100755 --- a/tests/setup-acceptance.sh +++ b/tests/setup-acceptance.sh @@ -1,6 +1,6 @@ #!/bin/sh -BASE_DIR=$(dirname $(readlink -f "$0")) +BASE_DIR=$(dirname "$(readlink -f "$0")") ACTUAL=$PWD cd $BASE_DIR/.. $BASE_DIR/download-chromedriver.sh -q From beee7bcc919fd2673d5686c14803c07e967e9e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 22 Mar 2019 17:13:58 +0100 Subject: [PATCH 47/54] Corrige fallos y mejora rendimiento de requisitos.php --- guia/scripts/requisitos.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/guia/scripts/requisitos.php b/guia/scripts/requisitos.php index 7199a7db6..6f187bce3 100755 --- a/guia/scripts/requisitos.php +++ b/guia/scripts/requisitos.php @@ -89,6 +89,11 @@ function fallo($mensaje) 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(); @@ -191,7 +196,7 @@ function fallo($mensaje) echo "\033[1;28m# Leyendo archivo requisitos.xls...\033[0m\n"; -for ($row = 2; $row <= $highestRow; $row++) { +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(); @@ -208,14 +213,14 @@ function fallo($mensaje) if ($issues) { if ($incidencia === null) { - if (($row - 1) % 10 === 0) { + 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' => $corta, + 'title' => "($codigo) $corta", 'body' => $larga, 'assignee' => $login, 'milestone' => mb_substr($entrega, 1, 1), @@ -234,7 +239,6 @@ function fallo($mensaje) echo " #$incidencia\n"; } else { echo "El requisito $codigo ya tiene asociada la incidencia #$incidencia.\n"; - $issue = $client->api('issue')->show($login, $repo, $incidencia); } $link = "https://github.com/$login/$repo/issues/$incidencia"; } From 026d563a9899a0a42ca4dea337a48b36a4346d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Mon, 25 Mar 2019 10:13:31 +0100 Subject: [PATCH 48/54] Actualiza versiones estables en composer.json --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 177b0f5a9..626c156b6 100644 --- a/composer.json +++ b/composer.json @@ -14,10 +14,10 @@ }, "minimum-stability": "stable", "require": { - "php": "~7.1.0|~7.2.0|~7.3.0", + "php": "^7.1.0", "ext-gd": "*", "ext-intl": "*", - "yiisoft/yii2": "~2.0.14", + "yiisoft/yii2": "~2.0.17", "yiisoft/yii2-bootstrap": "~2.0.0", "yiisoft/yii2-swiftmailer": "~2.1.0" }, @@ -25,7 +25,7 @@ "yiisoft/yii2-debug": "~2.1.0", "yiisoft/yii2-gii": "~2.1.0", "yiisoft/yii2-faker": "~2.0.0", - "yiisoft/yii2-shell": "dev-master", + "yiisoft/yii2-shell": "~2.0.2", "yiisoft/yii2-apidoc": "dev-project", "codeception/codeception": "4.0.x-dev | ^4.0", From e1d28a037312287d101a7d83bf7d2da73c235bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 27 Mar 2019 13:25:38 +0100 Subject: [PATCH 49/54] Cambia a Boostrap 4 --- assets/AppAsset.php | 3 ++- composer.json | 2 +- views/layouts/main.php | 21 ++++++++++++--------- views/site/contact.php | 15 +++++++++++---- views/site/index.php | 12 ++++++------ views/site/login.php | 13 +++++-------- web/css/site.css | 16 +--------------- 7 files changed, 38 insertions(+), 44 deletions(-) diff --git a/assets/AppAsset.php b/assets/AppAsset.php index 47932b165..5a48915fe 100644 --- a/assets/AppAsset.php +++ b/assets/AppAsset.php @@ -26,6 +26,7 @@ class AppAsset extends AssetBundle ]; public $depends = [ 'yii\web\YiiAsset', - 'yii\bootstrap\BootstrapAsset', + 'yii\bootstrap4\BootstrapAsset', + 'yii\bootstrap4\BootstrapPluginAsset', ]; } diff --git a/composer.json b/composer.json index 626c156b6..8d9fe3e49 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ "ext-gd": "*", "ext-intl": "*", "yiisoft/yii2": "~2.0.17", - "yiisoft/yii2-bootstrap": "~2.0.0", + "yiisoft/yii2-bootstrap4": "^2.0.0", "yiisoft/yii2-swiftmailer": "~2.1.0" }, "require-dev": { 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 @@
    -

    © My Company

    +

    © My Company

    -

    +

    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; } From 36c8856d998bd4f0f6eac148c3cdf430937cf446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 6 Nov 2019 17:42:43 +0100 Subject: [PATCH 50/54] Pasa el widgets/Alert.php a Bootstrap 4 --- widgets/Alert.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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. From 90d9077232236b0c5b5be21f10c2dd1435406105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Tue, 17 Dec 2019 21:12:12 +0100 Subject: [PATCH 51/54] Hace que Gii genere un CRUD basado en Bootstrap4 --- config/web.php | 8 + templates/crud/default/controller.php | 179 +++++++++++++++++++++++ templates/crud/default/search.php | 86 +++++++++++ templates/crud/default/views/_form.php | 42 ++++++ templates/crud/default/views/_search.php | 49 +++++++ templates/crud/default/views/create.php | 29 ++++ templates/crud/default/views/index.php | 82 +++++++++++ templates/crud/default/views/update.php | 40 +++++ templates/crud/default/views/view.php | 58 ++++++++ 9 files changed, 573 insertions(+) create mode 100644 templates/crud/default/controller.php create mode 100644 templates/crud/default/search.php create mode 100644 templates/crud/default/views/_form.php create mode 100644 templates/crud/default/views/_search.php create mode 100644 templates/crud/default/views/create.php create mode 100644 templates/crud/default/views/index.php create mode 100644 templates/crud/default/views/update.php create mode 100644 templates/crud/default/views/view.php diff --git a/config/web.php b/config/web.php index 1225ea013..2043baec6 100644 --- a/config/web.php +++ b/config/web.php @@ -77,6 +77,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/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"; + } +} +?> + ], + ]) ?> + +
    From 1eca3fd65b62e071b0cb7b0c27a2ad27ff68910f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 18 Dec 2019 11:07:19 +0100 Subject: [PATCH 52/54] Mete Glyphicons como asset con Bootstrap4 --- assets/AppAsset.php | 1 + composer.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/AppAsset.php b/assets/AppAsset.php index 5a48915fe..13c23f0a8 100644 --- a/assets/AppAsset.php +++ b/assets/AppAsset.php @@ -28,5 +28,6 @@ class AppAsset extends AssetBundle 'yii\web\YiiAsset', 'yii\bootstrap4\BootstrapAsset', 'yii\bootstrap4\BootstrapPluginAsset', + 'xtetis\bootstrap4glyphicons\assets\GlyphiconAsset', ]; } diff --git a/composer.json b/composer.json index 8d9fe3e49..58c7fde24 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,8 @@ "ext-intl": "*", "yiisoft/yii2": "~2.0.17", "yiisoft/yii2-bootstrap4": "^2.0.0", - "yiisoft/yii2-swiftmailer": "~2.1.0" + "yiisoft/yii2-swiftmailer": "~2.1.0", + "xtetis/yii2-bootstrap4-glyphicons": "dev-master" }, "require-dev": { "yiisoft/yii2-debug": "~2.1.0", From 9e7ecb89bd9dc0e034f33436a0874a0dae1f88c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Wed, 18 Dec 2019 11:13:19 +0100 Subject: [PATCH 53/54] =?UTF-8?q?Pone=20'Acciones'=20como=20t=C3=ADtulo=20?= =?UTF-8?q?de=20ActionColumn=20por=20defecto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/web.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/web.php b/config/web.php index 2043baec6..2df40a4e6 100644 --- a/config/web.php +++ b/config/web.php @@ -60,6 +60,11 @@ ], */ ], + 'container' => [ + 'definitions' => [ + 'yii\grid\ActionColumn' => ['header' => 'Acciones'], + ], + ], 'params' => $params, ]; From 18bda572e0dda01e7084fc1bddbdf0f5cf4b0152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20P=C3=A9rez?= Date: Fri, 10 Jan 2020 21:33:19 +0100 Subject: [PATCH 54/54] Hace que funcionen bien todas las pruebas --- .php_cs.dist | 2 +- .travis.yml | 2 +- composer.json | 20 +- composer.lock | 6910 +++++++++++++++++++++++++++++++++ phpcs.xml.dist | 1 + tests/acceptance/HomeCest.php | 2 +- 6 files changed, 6929 insertions(+), 8 deletions(-) create mode 100644 composer.lock diff --git a/.php_cs.dist b/.php_cs.dist index 8867707ef..a3de02c63 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -1,7 +1,7 @@ exclude(['views', 'tests']) + ->exclude(['views', 'tests', 'templates']) ->in(__DIR__); return PhpCsFixer\Config::create() diff --git a/.travis.yml b/.travis.yml index e36e6d1b7..78f795c81 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ sudo: false language: php php: - - 7.1 + - 7.3 services: - postgresql diff --git a/composer.json b/composer.json index 58c7fde24..f01877a42 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,12 @@ { "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", @@ -14,7 +19,7 @@ }, "minimum-stability": "stable", "require": { - "php": "^7.1.0", + "php": "^7.3.0", "ext-gd": "*", "ext-intl": "*", "yiisoft/yii2": "~2.0.17", @@ -28,14 +33,15 @@ "yiisoft/yii2-faker": "~2.0.0", "yiisoft/yii2-shell": "~2.0.2", "yiisoft/yii2-apidoc": "dev-project", - - "codeception/codeception": "4.0.x-dev | ^4.0", - "codeception/verify": "~0.5.0 || ~1.1.0", + "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-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", @@ -84,6 +90,10 @@ { "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/phpcs.xml.dist b/phpcs.xml.dist index fb0a38692..34d552e8e 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -8,6 +8,7 @@ vendor/* views/* tests/* + templates/* docs/* guia/* web/assets/* 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');