Commit 2049c43ea0b760de0063b0b9bc7f64a25826d145

Authored by Alexey Boroda
0 parents

first commit

Showing 69 changed files with 5807 additions and 0 deletions   Show diff stats
.bowerrc 0 → 100644
  1 +++ a/.bowerrc
  1 +{
  2 + "directory" : "vendor/bower-asset"
  3 +}
... ...
.gitignore 0 → 100644
  1 +++ a/.gitignore
  1 +# phpstorm project files
  2 +.idea
  3 +
  4 +# netbeans project files
  5 +nbproject
  6 +
  7 +# zend studio for eclipse project files
  8 +.buildpath
  9 +.project
  10 +.settings
  11 +
  12 +# windows thumbnail cache
  13 +Thumbs.db
  14 +
  15 +# composer vendor dir
  16 +/vendor
  17 +
  18 +# composer itself is not needed
  19 +composer.phar
  20 +
  21 +# Mac DS_Store Files
  22 +.DS_Store
  23 +
  24 +# phpunit itself is not needed
  25 +phpunit.phar
  26 +# local phpunit config
  27 +/phpunit.xml
  28 +
  29 +tests/_output/*
  30 +tests/_support/_generated
  31 +
  32 +#vagrant folder
  33 +/.vagrant
0 34 \ No newline at end of file
... ...
LICENSE.md 0 → 100644
  1 +++ a/LICENSE.md
  1 +Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com)
  2 +All rights reserved.
  3 +
  4 +Redistribution and use in source and binary forms, with or without
  5 +modification, are permitted provided that the following conditions
  6 +are met:
  7 +
  8 + * Redistributions of source code must retain the above copyright
  9 + notice, this list of conditions and the following disclaimer.
  10 + * Redistributions in binary form must reproduce the above copyright
  11 + notice, this list of conditions and the following disclaimer in
  12 + the documentation and/or other materials provided with the
  13 + distribution.
  14 + * Neither the name of Yii Software LLC nor the names of its
  15 + contributors may be used to endorse or promote products derived
  16 + from this software without specific prior written permission.
  17 +
  18 +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19 +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20 +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  21 +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  22 +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  23 +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  24 +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25 +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  26 +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27 +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  28 +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  29 +POSSIBILITY OF SUCH DAMAGE.
... ...
README.md 0 → 100644
  1 +++ a/README.md
  1 +<p align="center">
  2 + <a href="https://github.com/yiisoft" target="_blank">
  3 + <img src="https://avatars0.githubusercontent.com/u/993323" height="100px">
  4 + </a>
  5 + <h1 align="center">Yii 2 Basic Project Template</h1>
  6 + <br>
  7 +</p>
  8 +
  9 +Yii 2 Basic Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for
  10 +rapidly creating small projects.
  11 +
  12 +The template contains the basic features including user login/logout and a contact page.
  13 +It includes all commonly used configurations that would allow you to focus on adding new
  14 +features to your application.
  15 +
  16 +[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
  17 +[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic)
  18 +[![Build Status](https://travis-ci.org/yiisoft/yii2-app-basic.svg?branch=master)](https://travis-ci.org/yiisoft/yii2-app-basic)
  19 +
  20 +DIRECTORY STRUCTURE
  21 +-------------------
  22 +
  23 + assets/ contains assets definition
  24 + commands/ contains console commands (controllers)
  25 + config/ contains application configurations
  26 + controllers/ contains Web controller classes
  27 + mail/ contains view files for e-mails
  28 + models/ contains model classes
  29 + runtime/ contains files generated during runtime
  30 + tests/ contains various tests for the basic application
  31 + vendor/ contains dependent 3rd-party packages
  32 + views/ contains view files for the Web application
  33 + web/ contains the entry script and Web resources
  34 +
  35 +
  36 +
  37 +REQUIREMENTS
  38 +------------
  39 +
  40 +The minimum requirement by this project template that your Web server supports PHP 5.4.0.
  41 +
  42 +
  43 +INSTALLATION
  44 +------------
  45 +
  46 +### Install via Composer
  47 +
  48 +If you do not have [Composer](http://getcomposer.org/), you may install it by following the instructions
  49 +at [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix).
  50 +
  51 +You can then install this project template using the following command:
  52 +
  53 +~~~
  54 +php composer.phar create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic
  55 +~~~
  56 +
  57 +Now you should be able to access the application through the following URL, assuming `basic` is the directory
  58 +directly under the Web root.
  59 +
  60 +~~~
  61 +http://localhost/basic/web/
  62 +~~~
  63 +
  64 +### Install from an Archive File
  65 +
  66 +Extract the archive file downloaded from [yiiframework.com](http://www.yiiframework.com/download/) to
  67 +a directory named `basic` that is directly under the Web root.
  68 +
  69 +Set cookie validation key in `config/web.php` file to some random secret string:
  70 +
  71 +```php
  72 +'request' => [
  73 + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
  74 + 'cookieValidationKey' => '<secret random string goes here>',
  75 +],
  76 +```
  77 +
  78 +You can then access the application through the following URL:
  79 +
  80 +~~~
  81 +http://localhost/basic/web/
  82 +~~~
  83 +
  84 +
  85 +### Install with Docker
  86 +
  87 +Update your vendor packages
  88 +
  89 + docker-compose run --rm php composer update --prefer-dist
  90 +
  91 +Run the installation triggers (creating cookie validation code)
  92 +
  93 + docker-compose run --rm php composer install
  94 +
  95 +Start the container
  96 +
  97 + docker-compose up -d
  98 +
  99 +You can then access the application through the following URL:
  100 +
  101 + http://127.0.0.1:8000
  102 +
  103 +**NOTES:**
  104 +- Minimum required Docker engine version `17.04` for development (see [Performance tuning for volume mounts](https://docs.docker.com/docker-for-mac/osxfs-caching/))
  105 +- The default configuration uses a host-volume in your home directory `.docker-composer` for composer caches
  106 +
  107 +
  108 +CONFIGURATION
  109 +-------------
  110 +
  111 +### Database
  112 +
  113 +Edit the file `config/db.php` with real data, for example:
  114 +
  115 +```php
  116 +return [
  117 + 'class' => 'yii\db\Connection',
  118 + 'dsn' => 'mysql:host=localhost;dbname=yii2basic',
  119 + 'username' => 'root',
  120 + 'password' => '1234',
  121 + 'charset' => 'utf8',
  122 +];
  123 +```
  124 +
  125 +**NOTES:**
  126 +- Yii won't create the database for you, this has to be done manually before you can access it.
  127 +- Check and edit the other files in the `config/` directory to customize your application as required.
  128 +- Refer to the README in the `tests` directory for information specific to basic application tests.
  129 +
  130 +
  131 +TESTING
  132 +-------
  133 +
  134 +Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](http://codeception.com/).
  135 +By default there are 3 test suites:
  136 +
  137 +- `unit`
  138 +- `functional`
  139 +- `acceptance`
  140 +
  141 +Tests can be executed by running
  142 +
  143 +```
  144 +vendor/bin/codecept run
  145 +```
  146 +
  147 +The command above will execute unit and functional tests. Unit tests are testing the system components, while functional
  148 +tests are for testing user interaction. Acceptance tests are disabled by default as they require additional setup since
  149 +they perform testing in real browser.
  150 +
  151 +
  152 +### Running acceptance tests
  153 +
  154 +To execute acceptance tests do the following:
  155 +
  156 +1. Rename `tests/acceptance.suite.yml.example` to `tests/acceptance.suite.yml` to enable suite configuration
  157 +
  158 +2. Replace `codeception/base` package in `composer.json` with `codeception/codeception` to install full featured
  159 + version of Codeception
  160 +
  161 +3. Update dependencies with Composer
  162 +
  163 + ```
  164 + composer update
  165 + ```
  166 +
  167 +4. Download [Selenium Server](http://www.seleniumhq.org/download/) and launch it:
  168 +
  169 + ```
  170 + java -jar ~/selenium-server-standalone-x.xx.x.jar
  171 + ```
  172 +
  173 + In case of using Selenium Server 3.0 with Firefox browser since v48 or Google Chrome since v53 you must download [GeckoDriver](https://github.com/mozilla/geckodriver/releases) or [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads) and launch Selenium with it:
  174 +
  175 + ```
  176 + # for Firefox
  177 + java -jar -Dwebdriver.gecko.driver=~/geckodriver ~/selenium-server-standalone-3.xx.x.jar
  178 +
  179 + # for Google Chrome
  180 + java -jar -Dwebdriver.chrome.driver=~/chromedriver ~/selenium-server-standalone-3.xx.x.jar
  181 + ```
  182 +
  183 + As an alternative way you can use already configured Docker container with older versions of Selenium and Firefox:
  184 +
  185 + ```
  186 + docker run --net=host selenium/standalone-firefox:2.53.0
  187 + ```
  188 +
  189 +5. (Optional) Create `yii2_basic_tests` database and update it by applying migrations if you have them.
  190 +
  191 + ```
  192 + tests/bin/yii migrate
  193 + ```
  194 +
  195 + The database configuration can be found at `config/test_db.php`.
  196 +
  197 +
  198 +6. Start web server:
  199 +
  200 + ```
  201 + tests/bin/yii serve
  202 + ```
  203 +
  204 +7. Now you can run all available tests
  205 +
  206 + ```
  207 + # run all available tests
  208 + vendor/bin/codecept run
  209 +
  210 + # run acceptance tests
  211 + vendor/bin/codecept run acceptance
  212 +
  213 + # run only unit and functional tests
  214 + vendor/bin/codecept run unit,functional
  215 + ```
  216 +
  217 +### Code coverage support
  218 +
  219 +By default, code coverage is disabled in `codeception.yml` configuration file, you should uncomment needed rows to be able
  220 +to collect code coverage. You can run your tests and collect coverage with the following command:
  221 +
  222 +```
  223 +#collect coverage for all tests
  224 +vendor/bin/codecept run -- --coverage-html --coverage-xml
  225 +
  226 +#collect coverage only for unit tests
  227 +vendor/bin/codecept run unit -- --coverage-html --coverage-xml
  228 +
  229 +#collect coverage for unit and functional tests
  230 +vendor/bin/codecept run functional,unit -- --coverage-html --coverage-xml
  231 +```
  232 +
  233 +You can see code coverage output under the `tests/_output` directory.
... ...
Vagrantfile 0 → 100644
  1 +++ a/Vagrantfile
  1 +require 'yaml'
  2 +require 'fileutils'
  3 +
  4 +required_plugins = %w( vagrant-hostmanager vagrant-vbguest )
  5 +required_plugins.each do |plugin|
  6 + exec "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin
  7 +end
  8 +
  9 +domains = {
  10 + app: 'yii2basic.dev'
  11 +}
  12 +
  13 +vagrantfile_dir_path = File.dirname(__FILE__)
  14 +
  15 +config = {
  16 + local: vagrantfile_dir_path + '/vagrant/config/vagrant-local.yml',
  17 + example: vagrantfile_dir_path + '/vagrant/config/vagrant-local.example.yml'
  18 +}
  19 +
  20 +# copy config from example if local config not exists
  21 +FileUtils.cp config[:example], config[:local] unless File.exist?(config[:local])
  22 +# read config
  23 +options = YAML.load_file config[:local]
  24 +
  25 +# check github token
  26 +if options['github_token'].nil? || options['github_token'].to_s.length != 40
  27 + puts "You must place REAL GitHub token into configuration:\n/yii2-app-basic/vagrant/config/vagrant-local.yml"
  28 + exit
  29 +end
  30 +
  31 +# vagrant configurate
  32 +Vagrant.configure(2) do |config|
  33 + # select the box
  34 + config.vm.box = 'bento/ubuntu-16.04'
  35 +
  36 + # should we ask about box updates?
  37 + config.vm.box_check_update = options['box_check_update']
  38 +
  39 + config.vm.provider 'virtualbox' do |vb|
  40 + # machine cpus count
  41 + vb.cpus = options['cpus']
  42 + # machine memory size
  43 + vb.memory = options['memory']
  44 + # machine name (for VirtualBox UI)
  45 + vb.name = options['machine_name']
  46 + end
  47 +
  48 + # machine name (for vagrant console)
  49 + config.vm.define options['machine_name']
  50 +
  51 + # machine name (for guest machine console)
  52 + config.vm.hostname = options['machine_name']
  53 +
  54 + # network settings
  55 + config.vm.network 'private_network', ip: options['ip']
  56 +
  57 + # sync: folder 'yii2-app-advanced' (host machine) -> folder '/app' (guest machine)
  58 + config.vm.synced_folder './', '/app', owner: 'vagrant', group: 'vagrant'
  59 +
  60 + # disable folder '/vagrant' (guest machine)
  61 + config.vm.synced_folder '.', '/vagrant', disabled: true
  62 +
  63 + # hosts settings (host machine)
  64 + config.vm.provision :hostmanager
  65 + config.hostmanager.enabled = true
  66 + config.hostmanager.manage_host = true
  67 + config.hostmanager.ignore_private_ip = false
  68 + config.hostmanager.include_offline = true
  69 + config.hostmanager.aliases = domains.values
  70 +
  71 + # quick fix for failed guest additions installations
  72 + # config.vbguest.auto_update = false
  73 +
  74 + # provisioners
  75 + config.vm.provision 'shell', path: './vagrant/provision/once-as-root.sh', args: [options['timezone']]
  76 + config.vm.provision 'shell', path: './vagrant/provision/once-as-vagrant.sh', args: [options['github_token']], privileged: false
  77 + config.vm.provision 'shell', path: './vagrant/provision/always-as-root.sh', run: 'always'
  78 +
  79 + # post-install message (vagrant console)
  80 + config.vm.post_up_message = "App URL: http://#{domains[:app]}"
  81 +end
... ...
assets/AppAsset.php 0 → 100644
  1 +++ a/assets/AppAsset.php
  1 +<?php
  2 +/**
  3 + * @link http://www.yiiframework.com/
  4 + * @copyright Copyright (c) 2008 Yii Software LLC
  5 + * @license http://www.yiiframework.com/license/
  6 + */
  7 +
  8 +namespace app\assets;
  9 +
  10 +use yii\web\AssetBundle;
  11 +
  12 +/**
  13 + * Main application asset bundle.
  14 + *
  15 + * @author Qiang Xue <qiang.xue@gmail.com>
  16 + * @since 2.0
  17 + */
  18 +class AppAsset extends AssetBundle
  19 +{
  20 + public $basePath = '@webroot';
  21 + public $baseUrl = '@web';
  22 + public $css = [
  23 + 'css/site.css',
  24 + ];
  25 + public $js = [
  26 + ];
  27 + public $depends = [
  28 + 'yii\web\YiiAsset',
  29 + 'yii\bootstrap\BootstrapAsset',
  30 + ];
  31 +}
... ...
codeception.yml 0 → 100644
  1 +++ a/codeception.yml
  1 +actor: Tester
  2 +paths:
  3 + tests: tests
  4 + log: tests/_output
  5 + data: tests/_data
  6 + helpers: tests/_support
  7 +settings:
  8 + bootstrap: _bootstrap.php
  9 + memory_limit: 1024M
  10 + colors: true
  11 +modules:
  12 + config:
  13 + Yii2:
  14 + configFile: 'config/test.php'
  15 + cleanup: false
  16 +
  17 +# To enable code coverage:
  18 +#coverage:
  19 +# #c3_url: http://localhost:8080/index-test.php/
  20 +# enabled: true
  21 +# #remote: true
  22 +# #remote_config: '../codeception.yml'
  23 +# whitelist:
  24 +# include:
  25 +# - models/*
  26 +# - controllers/*
  27 +# - commands/*
  28 +# - mail/*
  29 +# blacklist:
  30 +# include:
  31 +# - assets/*
  32 +# - config/*
  33 +# - runtime/*
  34 +# - vendor/*
  35 +# - views/*
  36 +# - web/*
  37 +# - tests/*
... ...
commands/HelloController.php 0 → 100644
  1 +++ a/commands/HelloController.php
  1 +<?php
  2 +/**
  3 + * @link http://www.yiiframework.com/
  4 + * @copyright Copyright (c) 2008 Yii Software LLC
  5 + * @license http://www.yiiframework.com/license/
  6 + */
  7 +
  8 +namespace app\commands;
  9 +
  10 +use yii\console\Controller;
  11 +use yii\console\ExitCode;
  12 +
  13 +/**
  14 + * This command echoes the first argument that you have entered.
  15 + *
  16 + * This command is provided as an example for you to learn how to create console commands.
  17 + *
  18 + * @author Qiang Xue <qiang.xue@gmail.com>
  19 + * @since 2.0
  20 + */
  21 +class HelloController extends Controller
  22 +{
  23 + /**
  24 + * This command echoes what you have entered as the message.
  25 + * @param string $message the message to be echoed.
  26 + * @return int Exit code
  27 + */
  28 + public function actionIndex($message = 'hello world')
  29 + {
  30 + echo $message . "\n";
  31 +
  32 + return ExitCode::OK;
  33 + }
  34 +}
... ...
composer.json 0 → 100644
  1 +++ a/composer.json
  1 +{
  2 + "name": "yiisoft/yii2-app-basic",
  3 + "description": "Yii 2 Basic Project Template",
  4 + "keywords": ["yii2", "framework", "basic", "project template"],
  5 + "homepage": "http://www.yiiframework.com/",
  6 + "type": "project",
  7 + "license": "BSD-3-Clause",
  8 + "support": {
  9 + "issues": "https://github.com/yiisoft/yii2/issues?state=open",
  10 + "forum": "http://www.yiiframework.com/forum/",
  11 + "wiki": "http://www.yiiframework.com/wiki/",
  12 + "irc": "irc://irc.freenode.net/yii",
  13 + "source": "https://github.com/yiisoft/yii2"
  14 + },
  15 + "minimum-stability": "dev",
  16 + "require": {
  17 + "php": ">=5.4.0",
  18 + "yiisoft/yii2": "~2.0.14",
  19 + "yiisoft/yii2-bootstrap": "~2.0.0",
  20 + "yiisoft/yii2-swiftmailer": "~2.0.0"
  21 + },
  22 + "require-dev": {
  23 + "yiisoft/yii2-debug": "~2.0.0",
  24 + "yiisoft/yii2-gii": "~2.0.0",
  25 + "yiisoft/yii2-faker": "~2.0.0",
  26 +
  27 + "codeception/base": "^2.2.3",
  28 + "codeception/verify": "~0.3.1",
  29 + "codeception/specify": "~0.4.3"
  30 + },
  31 + "config": {
  32 + "process-timeout": 1800,
  33 + "fxp-asset": {
  34 + "enabled": false
  35 + }
  36 + },
  37 + "scripts": {
  38 + "post-install-cmd": [
  39 + "yii\\composer\\Installer::postInstall"
  40 + ],
  41 + "post-create-project-cmd": [
  42 + "yii\\composer\\Installer::postCreateProject",
  43 + "yii\\composer\\Installer::postInstall"
  44 + ]
  45 + },
  46 + "extra": {
  47 + "yii\\composer\\Installer::postCreateProject": {
  48 + "setPermission": [
  49 + {
  50 + "runtime": "0777",
  51 + "web/assets": "0777",
  52 + "yii": "0755"
  53 + }
  54 + ]
  55 + },
  56 + "yii\\composer\\Installer::postInstall": {
  57 + "generateCookieValidationKey": [
  58 + "config/web.php"
  59 + ]
  60 + }
  61 + },
  62 + "repositories": [
  63 + {
  64 + "type": "composer",
  65 + "url": "https://asset-packagist.org"
  66 + }
  67 + ]
  68 +}
... ...
composer.lock 0 → 100644
  1 +++ a/composer.lock
  1 +{
  2 + "_readme": [
  3 + "This file locks the dependencies of your project to a known state",
  4 + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
  5 + "This file is @generated automatically"
  6 + ],
  7 + "content-hash": "bc7a8cdcef199b8ae2c984c1e3e94b51",
  8 + "packages": [
  9 + {
  10 + "name": "bower-asset/bootstrap",
  11 + "version": "v3.3.7",
  12 + "source": {
  13 + "type": "git",
  14 + "url": "https://github.com/twbs/bootstrap.git",
  15 + "reference": "0b9c4a4007c44201dce9a6cc1a38407005c26c86"
  16 + },
  17 + "dist": {
  18 + "type": "zip",
  19 + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/0b9c4a4007c44201dce9a6cc1a38407005c26c86",
  20 + "reference": "0b9c4a4007c44201dce9a6cc1a38407005c26c86",
  21 + "shasum": null
  22 + },
  23 + "require": {
  24 + "bower-asset/jquery": ">=1.9.1,<4.0"
  25 + },
  26 + "type": "bower-asset",
  27 + "license": [
  28 + "MIT"
  29 + ]
  30 + },
  31 + {
  32 + "name": "bower-asset/inputmask",
  33 + "version": "3.3.11",
  34 + "source": {
  35 + "type": "git",
  36 + "url": "https://github.com/RobinHerbots/Inputmask.git",
  37 + "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b"
  38 + },
  39 + "dist": {
  40 + "type": "zip",
  41 + "url": "https://api.github.com/repos/RobinHerbots/Inputmask/zipball/5e670ad62f50c738388d4dcec78d2888505ad77b",
  42 + "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b",
  43 + "shasum": null
  44 + },
  45 + "require": {
  46 + "bower-asset/jquery": ">=1.7"
  47 + },
  48 + "type": "bower-asset",
  49 + "license": [
  50 + "http://opensource.org/licenses/mit-license.php"
  51 + ]
  52 + },
  53 + {
  54 + "name": "bower-asset/jquery",
  55 + "version": "3.2.1",
  56 + "source": {
  57 + "type": "git",
  58 + "url": "https://github.com/jquery/jquery-dist.git",
  59 + "reference": "77d2a51d0520d2ee44173afdf4e40a9201f5964e"
  60 + },
  61 + "dist": {
  62 + "type": "zip",
  63 + "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/77d2a51d0520d2ee44173afdf4e40a9201f5964e",
  64 + "reference": "77d2a51d0520d2ee44173afdf4e40a9201f5964e",
  65 + "shasum": null
  66 + },
  67 + "type": "bower-asset",
  68 + "license": [
  69 + "MIT"
  70 + ]
  71 + },
  72 + {
  73 + "name": "bower-asset/punycode",
  74 + "version": "v1.3.2",
  75 + "source": {
  76 + "type": "git",
  77 + "url": "https://github.com/bestiejs/punycode.js.git",
  78 + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3"
  79 + },
  80 + "dist": {
  81 + "type": "zip",
  82 + "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3",
  83 + "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3",
  84 + "shasum": null
  85 + },
  86 + "type": "bower-asset"
  87 + },
  88 + {
  89 + "name": "bower-asset/yii2-pjax",
  90 + "version": "2.0.7.1",
  91 + "source": {
  92 + "type": "git",
  93 + "url": "git@github.com:yiisoft/jquery-pjax.git",
  94 + "reference": "aef7b953107264f00234902a3880eb50dafc48be"
  95 + },
  96 + "dist": {
  97 + "type": "zip",
  98 + "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/aef7b953107264f00234902a3880eb50dafc48be",
  99 + "reference": "aef7b953107264f00234902a3880eb50dafc48be",
  100 + "shasum": null
  101 + },
  102 + "require": {
  103 + "bower-asset/jquery": ">=1.8"
  104 + },
  105 + "type": "bower-asset",
  106 + "license": [
  107 + "MIT"
  108 + ]
  109 + },
  110 + {
  111 + "name": "cebe/markdown",
  112 + "version": "dev-master",
  113 + "source": {
  114 + "type": "git",
  115 + "url": "https://github.com/cebe/markdown.git",
  116 + "reference": "7b158880b9c128de39d1102dc26e68082d1c4aa9"
  117 + },
  118 + "dist": {
  119 + "type": "zip",
  120 + "url": "https://api.github.com/repos/cebe/markdown/zipball/7b158880b9c128de39d1102dc26e68082d1c4aa9",
  121 + "reference": "7b158880b9c128de39d1102dc26e68082d1c4aa9",
  122 + "shasum": ""
  123 + },
  124 + "require": {
  125 + "lib-pcre": "*",
  126 + "php": ">=5.4.0"
  127 + },
  128 + "require-dev": {
  129 + "cebe/indent": "*",
  130 + "facebook/xhprof": "*@dev",
  131 + "phpunit/phpunit": "4.1.*"
  132 + },
  133 + "bin": [
  134 + "bin/markdown"
  135 + ],
  136 + "type": "library",
  137 + "extra": {
  138 + "branch-alias": {
  139 + "dev-master": "1.2.x-dev"
  140 + }
  141 + },
  142 + "autoload": {
  143 + "psr-4": {
  144 + "cebe\\markdown\\": ""
  145 + }
  146 + },
  147 + "notification-url": "https://packagist.org/downloads/",
  148 + "license": [
  149 + "MIT"
  150 + ],
  151 + "authors": [
  152 + {
  153 + "name": "Carsten Brandt",
  154 + "email": "mail@cebe.cc",
  155 + "homepage": "http://cebe.cc/",
  156 + "role": "Creator"
  157 + }
  158 + ],
  159 + "description": "A super fast, highly extensible markdown parser for PHP",
  160 + "homepage": "https://github.com/cebe/markdown#readme",
  161 + "keywords": [
  162 + "extensible",
  163 + "fast",
  164 + "gfm",
  165 + "markdown",
  166 + "markdown-extra"
  167 + ],
  168 + "time": "2018-03-26T11:25:22+00:00"
  169 + },
  170 + {
  171 + "name": "ezyang/htmlpurifier",
  172 + "version": "v4.10.0",
  173 + "source": {
  174 + "type": "git",
  175 + "url": "https://github.com/ezyang/htmlpurifier.git",
  176 + "reference": "d85d39da4576a6934b72480be6978fb10c860021"
  177 + },
  178 + "dist": {
  179 + "type": "zip",
  180 + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/d85d39da4576a6934b72480be6978fb10c860021",
  181 + "reference": "d85d39da4576a6934b72480be6978fb10c860021",
  182 + "shasum": ""
  183 + },
  184 + "require": {
  185 + "php": ">=5.2"
  186 + },
  187 + "require-dev": {
  188 + "simpletest/simpletest": "^1.1"
  189 + },
  190 + "type": "library",
  191 + "autoload": {
  192 + "psr-0": {
  193 + "HTMLPurifier": "library/"
  194 + },
  195 + "files": [
  196 + "library/HTMLPurifier.composer.php"
  197 + ]
  198 + },
  199 + "notification-url": "https://packagist.org/downloads/",
  200 + "license": [
  201 + "LGPL"
  202 + ],
  203 + "authors": [
  204 + {
  205 + "name": "Edward Z. Yang",
  206 + "email": "admin@htmlpurifier.org",
  207 + "homepage": "http://ezyang.com"
  208 + }
  209 + ],
  210 + "description": "Standards compliant HTML filter written in PHP",
  211 + "homepage": "http://htmlpurifier.org/",
  212 + "keywords": [
  213 + "html"
  214 + ],
  215 + "time": "2018-02-23T01:58:20+00:00"
  216 + },
  217 + {
  218 + "name": "swiftmailer/swiftmailer",
  219 + "version": "5.x-dev",
  220 + "source": {
  221 + "type": "git",
  222 + "url": "https://github.com/swiftmailer/swiftmailer.git",
  223 + "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91"
  224 + },
  225 + "dist": {
  226 + "type": "zip",
  227 + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7ffc1ea296ed14bf8260b6ef11b80208dbadba91",
  228 + "reference": "7ffc1ea296ed14bf8260b6ef11b80208dbadba91",
  229 + "shasum": ""
  230 + },
  231 + "require": {
  232 + "php": ">=5.3.3"
  233 + },
  234 + "require-dev": {
  235 + "mockery/mockery": "~0.9.1",
  236 + "symfony/phpunit-bridge": "~3.2"
  237 + },
  238 + "type": "library",
  239 + "extra": {
  240 + "branch-alias": {
  241 + "dev-master": "5.4-dev"
  242 + }
  243 + },
  244 + "autoload": {
  245 + "files": [
  246 + "lib/swift_required.php"
  247 + ]
  248 + },
  249 + "notification-url": "https://packagist.org/downloads/",
  250 + "license": [
  251 + "MIT"
  252 + ],
  253 + "authors": [
  254 + {
  255 + "name": "Chris Corbyn"
  256 + },
  257 + {
  258 + "name": "Fabien Potencier",
  259 + "email": "fabien@symfony.com"
  260 + }
  261 + ],
  262 + "description": "Swiftmailer, free feature-rich PHP mailer",
  263 + "homepage": "https://swiftmailer.symfony.com",
  264 + "keywords": [
  265 + "email",
  266 + "mail",
  267 + "mailer"
  268 + ],
  269 + "time": "2018-01-23T07:37:21+00:00"
  270 + },
  271 + {
  272 + "name": "yiisoft/yii2",
  273 + "version": "dev-master",
  274 + "source": {
  275 + "type": "git",
  276 + "url": "https://github.com/yiisoft/yii2-framework.git",
  277 + "reference": "e0cdb388bc62d66ad4aa63ad11b83a47824f9e38"
  278 + },
  279 + "dist": {
  280 + "type": "zip",
  281 + "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/e0cdb388bc62d66ad4aa63ad11b83a47824f9e38",
  282 + "reference": "e0cdb388bc62d66ad4aa63ad11b83a47824f9e38",
  283 + "shasum": ""
  284 + },
  285 + "require": {
  286 + "bower-asset/inputmask": "~3.2.2 | ~3.3.5",
  287 + "bower-asset/jquery": "3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable",
  288 + "bower-asset/punycode": "1.3.*",
  289 + "bower-asset/yii2-pjax": "~2.0.1",
  290 + "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0",
  291 + "ext-ctype": "*",
  292 + "ext-mbstring": "*",
  293 + "ezyang/htmlpurifier": "~4.6",
  294 + "lib-pcre": "*",
  295 + "php": ">=5.4.0",
  296 + "yiisoft/yii2-composer": "~2.0.4"
  297 + },
  298 + "bin": [
  299 + "yii"
  300 + ],
  301 + "type": "library",
  302 + "extra": {
  303 + "branch-alias": {
  304 + "dev-master": "2.0.x-dev"
  305 + }
  306 + },
  307 + "autoload": {
  308 + "psr-4": {
  309 + "yii\\": ""
  310 + }
  311 + },
  312 + "notification-url": "https://packagist.org/downloads/",
  313 + "license": [
  314 + "BSD-3-Clause"
  315 + ],
  316 + "authors": [
  317 + {
  318 + "name": "Qiang Xue",
  319 + "email": "qiang.xue@gmail.com",
  320 + "homepage": "http://www.yiiframework.com/",
  321 + "role": "Founder and project lead"
  322 + },
  323 + {
  324 + "name": "Alexander Makarov",
  325 + "email": "sam@rmcreative.ru",
  326 + "homepage": "http://rmcreative.ru/",
  327 + "role": "Core framework development"
  328 + },
  329 + {
  330 + "name": "Maurizio Domba",
  331 + "homepage": "http://mdomba.info/",
  332 + "role": "Core framework development"
  333 + },
  334 + {
  335 + "name": "Carsten Brandt",
  336 + "email": "mail@cebe.cc",
  337 + "homepage": "http://cebe.cc/",
  338 + "role": "Core framework development"
  339 + },
  340 + {
  341 + "name": "Timur Ruziev",
  342 + "email": "resurtm@gmail.com",
  343 + "homepage": "http://resurtm.com/",
  344 + "role": "Core framework development"
  345 + },
  346 + {
  347 + "name": "Paul Klimov",
  348 + "email": "klimov.paul@gmail.com",
  349 + "role": "Core framework development"
  350 + },
  351 + {
  352 + "name": "Dmitry Naumenko",
  353 + "email": "d.naumenko.a@gmail.com",
  354 + "role": "Core framework development"
  355 + },
  356 + {
  357 + "name": "Boudewijn Vahrmeijer",
  358 + "email": "info@dynasource.eu",
  359 + "homepage": "http://dynasource.eu",
  360 + "role": "Core framework development"
  361 + }
  362 + ],
  363 + "description": "Yii PHP Framework Version 2",
  364 + "homepage": "http://www.yiiframework.com/",
  365 + "keywords": [
  366 + "framework",
  367 + "yii2"
  368 + ],
  369 + "time": "2018-05-24T11:29:05+00:00"
  370 + },
  371 + {
  372 + "name": "yiisoft/yii2-bootstrap",
  373 + "version": "dev-master",
  374 + "source": {
  375 + "type": "git",
  376 + "url": "https://github.com/yiisoft/yii2-bootstrap.git",
  377 + "reference": "3d40965ca284aa70081fbbd679cf2c3686160726"
  378 + },
  379 + "dist": {
  380 + "type": "zip",
  381 + "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/3d40965ca284aa70081fbbd679cf2c3686160726",
  382 + "reference": "3d40965ca284aa70081fbbd679cf2c3686160726",
  383 + "shasum": ""
  384 + },
  385 + "require": {
  386 + "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*",
  387 + "yiisoft/yii2": "~2.0.6"
  388 + },
  389 + "type": "yii2-extension",
  390 + "extra": {
  391 + "branch-alias": {
  392 + "dev-master": "2.0.x-dev"
  393 + }
  394 + },
  395 + "autoload": {
  396 + "psr-4": {
  397 + "yii\\bootstrap\\": "src"
  398 + }
  399 + },
  400 + "notification-url": "https://packagist.org/downloads/",
  401 + "license": [
  402 + "BSD-3-Clause"
  403 + ],
  404 + "authors": [
  405 + {
  406 + "name": "Paul Klimov",
  407 + "email": "klimov.paul@gmail.com"
  408 + },
  409 + {
  410 + "name": "Alexander Makarov",
  411 + "email": "sam@rmcreative.ru",
  412 + "homepage": "http://rmcreative.ru/"
  413 + },
  414 + {
  415 + "name": "Antonio Ramirez",
  416 + "email": "amigo.cobos@gmail.com"
  417 + },
  418 + {
  419 + "name": "Qiang Xue",
  420 + "email": "qiang.xue@gmail.com",
  421 + "homepage": "http://www.yiiframework.com/"
  422 + }
  423 + ],
  424 + "description": "The Twitter Bootstrap extension for the Yii framework",
  425 + "keywords": [
  426 + "bootstrap",
  427 + "yii2"
  428 + ],
  429 + "time": "2018-05-04T06:55:14+00:00"
  430 + },
  431 + {
  432 + "name": "yiisoft/yii2-composer",
  433 + "version": "dev-master",
  434 + "source": {
  435 + "type": "git",
  436 + "url": "https://github.com/yiisoft/yii2-composer.git",
  437 + "reference": "884efe0ba2c1619e345da3388dead094ccbea616"
  438 + },
  439 + "dist": {
  440 + "type": "zip",
  441 + "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/884efe0ba2c1619e345da3388dead094ccbea616",
  442 + "reference": "884efe0ba2c1619e345da3388dead094ccbea616",
  443 + "shasum": ""
  444 + },
  445 + "require": {
  446 + "composer-plugin-api": "^1.0"
  447 + },
  448 + "require-dev": {
  449 + "composer/composer": "^1.0"
  450 + },
  451 + "type": "composer-plugin",
  452 + "extra": {
  453 + "class": "yii\\composer\\Plugin",
  454 + "branch-alias": {
  455 + "dev-master": "2.0.x-dev"
  456 + }
  457 + },
  458 + "autoload": {
  459 + "psr-4": {
  460 + "yii\\composer\\": ""
  461 + }
  462 + },
  463 + "notification-url": "https://packagist.org/downloads/",
  464 + "license": [
  465 + "BSD-3-Clause"
  466 + ],
  467 + "authors": [
  468 + {
  469 + "name": "Qiang Xue",
  470 + "email": "qiang.xue@gmail.com"
  471 + },
  472 + {
  473 + "name": "Carsten Brandt",
  474 + "email": "mail@cebe.cc"
  475 + }
  476 + ],
  477 + "description": "The composer plugin for Yii extension installer",
  478 + "keywords": [
  479 + "composer",
  480 + "extension installer",
  481 + "yii2"
  482 + ],
  483 + "time": "2018-05-04T21:18:11+00:00"
  484 + },
  485 + {
  486 + "name": "yiisoft/yii2-swiftmailer",
  487 + "version": "2.0.7",
  488 + "source": {
  489 + "type": "git",
  490 + "url": "https://github.com/yiisoft/yii2-swiftmailer.git",
  491 + "reference": "8a03a62cbcb82e7697d3002eb43a8d2637f566ec"
  492 + },
  493 + "dist": {
  494 + "type": "zip",
  495 + "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/8a03a62cbcb82e7697d3002eb43a8d2637f566ec",
  496 + "reference": "8a03a62cbcb82e7697d3002eb43a8d2637f566ec",
  497 + "shasum": ""
  498 + },
  499 + "require": {
  500 + "swiftmailer/swiftmailer": "~5.0",
  501 + "yiisoft/yii2": "~2.0.4"
  502 + },
  503 + "type": "yii2-extension",
  504 + "extra": {
  505 + "branch-alias": {
  506 + "dev-master": "2.0.x-dev"
  507 + }
  508 + },
  509 + "autoload": {
  510 + "psr-4": {
  511 + "yii\\swiftmailer\\": ""
  512 + }
  513 + },
  514 + "notification-url": "https://packagist.org/downloads/",
  515 + "license": [
  516 + "BSD-3-Clause"
  517 + ],
  518 + "authors": [
  519 + {
  520 + "name": "Paul Klimov",
  521 + "email": "klimov.paul@gmail.com"
  522 + }
  523 + ],
  524 + "description": "The SwiftMailer integration for the Yii framework",
  525 + "keywords": [
  526 + "email",
  527 + "mail",
  528 + "mailer",
  529 + "swift",
  530 + "swiftmailer",
  531 + "yii2"
  532 + ],
  533 + "time": "2017-05-01T08:29:00+00:00"
  534 + }
  535 + ],
  536 + "packages-dev": [
  537 + {
  538 + "name": "behat/gherkin",
  539 + "version": "v4.5.1",
  540 + "source": {
  541 + "type": "git",
  542 + "url": "https://github.com/Behat/Gherkin.git",
  543 + "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a"
  544 + },
  545 + "dist": {
  546 + "type": "zip",
  547 + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a",
  548 + "reference": "74ac03d52c5e23ad8abd5c5cce4ab0e8dc1b530a",
  549 + "shasum": ""
  550 + },
  551 + "require": {
  552 + "php": ">=5.3.1"
  553 + },
  554 + "require-dev": {
  555 + "phpunit/phpunit": "~4.5|~5",
  556 + "symfony/phpunit-bridge": "~2.7|~3",
  557 + "symfony/yaml": "~2.3|~3"
  558 + },
  559 + "suggest": {
  560 + "symfony/yaml": "If you want to parse features, represented in YAML files"
  561 + },
  562 + "type": "library",
  563 + "extra": {
  564 + "branch-alias": {
  565 + "dev-master": "4.4-dev"
  566 + }
  567 + },
  568 + "autoload": {
  569 + "psr-0": {
  570 + "Behat\\Gherkin": "src/"
  571 + }
  572 + },
  573 + "notification-url": "https://packagist.org/downloads/",
  574 + "license": [
  575 + "MIT"
  576 + ],
  577 + "authors": [
  578 + {
  579 + "name": "Konstantin Kudryashov",
  580 + "email": "ever.zet@gmail.com",
  581 + "homepage": "http://everzet.com"
  582 + }
  583 + ],
  584 + "description": "Gherkin DSL parser for PHP 5.3",
  585 + "homepage": "http://behat.org/",
  586 + "keywords": [
  587 + "BDD",
  588 + "Behat",
  589 + "Cucumber",
  590 + "DSL",
  591 + "gherkin",
  592 + "parser"
  593 + ],
  594 + "time": "2017-08-30T11:04:43+00:00"
  595 + },
  596 + {
  597 + "name": "bower-asset/typeahead.js",
  598 + "version": "v0.11.1",
  599 + "source": {
  600 + "type": "git",
  601 + "url": "git@github.com:twitter/typeahead.js.git",
  602 + "reference": "588440f66559714280628a4f9799f0c4eb880a4a"
  603 + },
  604 + "dist": {
  605 + "type": "zip",
  606 + "url": "https://api.github.com/repos/twitter/typeahead.js/zipball/588440f66559714280628a4f9799f0c4eb880a4a",
  607 + "reference": "588440f66559714280628a4f9799f0c4eb880a4a",
  608 + "shasum": null
  609 + },
  610 + "require": {
  611 + "bower-asset/jquery": ">=1.7"
  612 + },
  613 + "type": "bower-asset"
  614 + },
  615 + {
  616 + "name": "codeception/base",
  617 + "version": "2.4.x-dev",
  618 + "source": {
  619 + "type": "git",
  620 + "url": "https://github.com/Codeception/base.git",
  621 + "reference": "fb07b713f2a97cdf0c5c81c93fa26a0785eb44a6"
  622 + },
  623 + "dist": {
  624 + "type": "zip",
  625 + "url": "https://api.github.com/repos/Codeception/base/zipball/fb07b713f2a97cdf0c5c81c93fa26a0785eb44a6",
  626 + "reference": "fb07b713f2a97cdf0c5c81c93fa26a0785eb44a6",
  627 + "shasum": ""
  628 + },
  629 + "require": {
  630 + "behat/gherkin": "^4.4.0",
  631 + "codeception/phpunit-wrapper": "^6.0.9|^7.0.6",
  632 + "codeception/stub": "^1.0",
  633 + "ext-json": "*",
  634 + "ext-mbstring": "*",
  635 + "guzzlehttp/psr7": "~1.0",
  636 + "php": ">=5.4.0 <8.0",
  637 + "symfony/browser-kit": ">=2.7 <5.0",
  638 + "symfony/console": ">=2.7 <5.0",
  639 + "symfony/css-selector": ">=2.7 <5.0",
  640 + "symfony/dom-crawler": ">=2.7 <5.0",
  641 + "symfony/event-dispatcher": ">=2.7 <5.0",
  642 + "symfony/finder": ">=2.7 <5.0",
  643 + "symfony/yaml": ">=2.7 <5.0"
  644 + },
  645 + "require-dev": {
  646 + "codeception/specify": "~0.3",
  647 + "facebook/graph-sdk": "~5.3",
  648 + "flow/jsonpath": "~0.2",
  649 + "monolog/monolog": "~1.8",
  650 + "pda/pheanstalk": "~3.0",
  651 + "php-amqplib/php-amqplib": "~2.4",
  652 + "predis/predis": "^1.0",
  653 + "squizlabs/php_codesniffer": "~2.0",
  654 + "symfony/process": ">=2.7 <5.0",
  655 + "vlucas/phpdotenv": "^2.4.0"
  656 + },
  657 + "suggest": {
  658 + "aws/aws-sdk-php": "For using AWS Auth in REST module and Queue module",
  659 + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests",
  660 + "codeception/specify": "BDD-style code blocks",
  661 + "codeception/verify": "BDD-style assertions",
  662 + "flow/jsonpath": "For using JSONPath in REST module",
  663 + "league/factory-muffin": "For DataFactory module",
  664 + "league/factory-muffin-faker": "For Faker support in DataFactory module",
  665 + "phpseclib/phpseclib": "for SFTP option in FTP Module",
  666 + "stecman/symfony-console-completion": "For BASH autocompletion",
  667 + "symfony/phpunit-bridge": "For phpunit-bridge support"
  668 + },
  669 + "bin": [
  670 + "codecept"
  671 + ],
  672 + "type": "library",
  673 + "extra": {
  674 + "branch-alias": []
  675 + },
  676 + "autoload": {
  677 + "psr-4": {
  678 + "Codeception\\": "src\\Codeception",
  679 + "Codeception\\Extension\\": "ext"
  680 + }
  681 + },
  682 + "notification-url": "https://packagist.org/downloads/",
  683 + "license": [
  684 + "MIT"
  685 + ],
  686 + "authors": [
  687 + {
  688 + "name": "Michael Bodnarchuk",
  689 + "email": "davert@mail.ua",
  690 + "homepage": "http://codegyre.com"
  691 + }
  692 + ],
  693 + "description": "BDD-style testing framework",
  694 + "homepage": "http://codeception.com/",
  695 + "keywords": [
  696 + "BDD",
  697 + "TDD",
  698 + "acceptance testing",
  699 + "functional testing",
  700 + "unit testing"
  701 + ],
  702 + "time": "2018-03-31T22:36:34+00:00"
  703 + },
  704 + {
  705 + "name": "codeception/phpunit-wrapper",
  706 + "version": "7.1.3",
  707 + "source": {
  708 + "type": "git",
  709 + "url": "https://github.com/Codeception/phpunit-wrapper.git",
  710 + "reference": "6a6244340e942a8d88cd9579d23c80b0ba10d46d"
  711 + },
  712 + "dist": {
  713 + "type": "zip",
  714 + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/6a6244340e942a8d88cd9579d23c80b0ba10d46d",
  715 + "reference": "6a6244340e942a8d88cd9579d23c80b0ba10d46d",
  716 + "shasum": ""
  717 + },
  718 + "require": {
  719 + "phpunit/php-code-coverage": "^6.0",
  720 + "phpunit/phpunit": "^7.1",
  721 + "sebastian/comparator": "^3.0",
  722 + "sebastian/diff": "^3.0"
  723 + },
  724 + "require-dev": {
  725 + "codeception/specify": "*",
  726 + "vlucas/phpdotenv": "^2.4"
  727 + },
  728 + "type": "library",
  729 + "autoload": {
  730 + "psr-4": {
  731 + "Codeception\\PHPUnit\\": "src\\"
  732 + }
  733 + },
  734 + "notification-url": "https://packagist.org/downloads/",
  735 + "license": [
  736 + "MIT"
  737 + ],
  738 + "authors": [
  739 + {
  740 + "name": "Davert",
  741 + "email": "davert.php@resend.cc"
  742 + }
  743 + ],
  744 + "description": "PHPUnit classes used by Codeception",
  745 + "time": "2018-05-22T09:20:59+00:00"
  746 + },
  747 + {
  748 + "name": "codeception/specify",
  749 + "version": "0.4.6",
  750 + "source": {
  751 + "type": "git",
  752 + "url": "https://github.com/Codeception/Specify.git",
  753 + "reference": "21b586f503ca444aa519dd9cafb32f113a05f286"
  754 + },
  755 + "dist": {
  756 + "type": "zip",
  757 + "url": "https://api.github.com/repos/Codeception/Specify/zipball/21b586f503ca444aa519dd9cafb32f113a05f286",
  758 + "reference": "21b586f503ca444aa519dd9cafb32f113a05f286",
  759 + "shasum": ""
  760 + },
  761 + "require": {
  762 + "myclabs/deep-copy": "~1.1",
  763 + "php": ">=5.4.0"
  764 + },
  765 + "require-dev": {
  766 + "phpunit/phpunit": "~4.0"
  767 + },
  768 + "type": "library",
  769 + "autoload": {
  770 + "psr-0": {
  771 + "Codeception\\": "src/"
  772 + }
  773 + },
  774 + "notification-url": "https://packagist.org/downloads/",
  775 + "license": [
  776 + "MIT"
  777 + ],
  778 + "authors": [
  779 + {
  780 + "name": "Michael Bodnarchuk",
  781 + "email": "davert.php@mailican.com"
  782 + }
  783 + ],
  784 + "description": "BDD code blocks for PHPUnit and Codeception",
  785 + "time": "2016-10-21T09:42:00+00:00"
  786 + },
  787 + {
  788 + "name": "codeception/stub",
  789 + "version": "1.0.4",
  790 + "source": {
  791 + "type": "git",
  792 + "url": "https://github.com/Codeception/Stub.git",
  793 + "reference": "681b62348837a5ef07d10d8a226f5bc358cc8805"
  794 + },
  795 + "dist": {
  796 + "type": "zip",
  797 + "url": "https://api.github.com/repos/Codeception/Stub/zipball/681b62348837a5ef07d10d8a226f5bc358cc8805",
  798 + "reference": "681b62348837a5ef07d10d8a226f5bc358cc8805",
  799 + "shasum": ""
  800 + },
  801 + "require": {
  802 + "phpunit/phpunit-mock-objects": ">2.3 <7.0"
  803 + },
  804 + "require-dev": {
  805 + "phpunit/phpunit": ">=4.8 <8.0"
  806 + },
  807 + "type": "library",
  808 + "autoload": {
  809 + "psr-4": {
  810 + "Codeception\\": "src/"
  811 + }
  812 + },
  813 + "notification-url": "https://packagist.org/downloads/",
  814 + "license": [
  815 + "MIT"
  816 + ],
  817 + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder",
  818 + "time": "2018-05-17T09:31:08+00:00"
  819 + },
  820 + {
  821 + "name": "codeception/verify",
  822 + "version": "0.3.3",
  823 + "source": {
  824 + "type": "git",
  825 + "url": "https://github.com/Codeception/Verify.git",
  826 + "reference": "5d649dda453cd814dadc4bb053060cd2c6bb4b4c"
  827 + },
  828 + "dist": {
  829 + "type": "zip",
  830 + "url": "https://api.github.com/repos/Codeception/Verify/zipball/5d649dda453cd814dadc4bb053060cd2c6bb4b4c",
  831 + "reference": "5d649dda453cd814dadc4bb053060cd2c6bb4b4c",
  832 + "shasum": ""
  833 + },
  834 + "require-dev": {
  835 + "phpunit/phpunit": "~4.0"
  836 + },
  837 + "type": "library",
  838 + "autoload": {
  839 + "files": [
  840 + "src/Codeception/function.php"
  841 + ]
  842 + },
  843 + "notification-url": "https://packagist.org/downloads/",
  844 + "license": [
  845 + "MIT"
  846 + ],
  847 + "authors": [
  848 + {
  849 + "name": "Michael Bodnarchuk",
  850 + "email": "davert.php@mailican.com"
  851 + }
  852 + ],
  853 + "description": "BDD assertion library for PHPUnit",
  854 + "time": "2017-01-09T10:58:51+00:00"
  855 + },
  856 + {
  857 + "name": "doctrine/instantiator",
  858 + "version": "dev-master",
  859 + "source": {
  860 + "type": "git",
  861 + "url": "https://github.com/doctrine/instantiator.git",
  862 + "reference": "870a62d7b0d63d4e0ffa8f2ce3ab7c8a53d1846d"
  863 + },
  864 + "dist": {
  865 + "type": "zip",
  866 + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/870a62d7b0d63d4e0ffa8f2ce3ab7c8a53d1846d",
  867 + "reference": "870a62d7b0d63d4e0ffa8f2ce3ab7c8a53d1846d",
  868 + "shasum": ""
  869 + },
  870 + "require": {
  871 + "php": "^7.1"
  872 + },
  873 + "require-dev": {
  874 + "doctrine/coding-standard": "^4.0",
  875 + "ext-pdo": "*",
  876 + "ext-phar": "*",
  877 + "phpbench/phpbench": "^0.13",
  878 + "phpstan/phpstan-shim": "^0.9.2",
  879 + "phpunit/phpunit": "^7.0"
  880 + },
  881 + "type": "library",
  882 + "extra": {
  883 + "branch-alias": {
  884 + "dev-master": "1.2.x-dev"
  885 + }
  886 + },
  887 + "autoload": {
  888 + "psr-4": {
  889 + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
  890 + }
  891 + },
  892 + "notification-url": "https://packagist.org/downloads/",
  893 + "license": [
  894 + "MIT"
  895 + ],
  896 + "authors": [
  897 + {
  898 + "name": "Marco Pivetta",
  899 + "email": "ocramius@gmail.com",
  900 + "homepage": "http://ocramius.github.com/"
  901 + }
  902 + ],
  903 + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
  904 + "homepage": "https://github.com/doctrine/instantiator",
  905 + "keywords": [
  906 + "constructor",
  907 + "instantiate"
  908 + ],
  909 + "time": "2018-03-05T09:41:42+00:00"
  910 + },
  911 + {
  912 + "name": "fzaninotto/faker",
  913 + "version": "dev-master",
  914 + "source": {
  915 + "type": "git",
  916 + "url": "https://github.com/fzaninotto/Faker.git",
  917 + "reference": "65fbcca41437baff58a5c0e8f08fae617531dd0d"
  918 + },
  919 + "dist": {
  920 + "type": "zip",
  921 + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/65fbcca41437baff58a5c0e8f08fae617531dd0d",
  922 + "reference": "65fbcca41437baff58a5c0e8f08fae617531dd0d",
  923 + "shasum": ""
  924 + },
  925 + "require": {
  926 + "php": "^5.3.3 || ^7.0"
  927 + },
  928 + "require-dev": {
  929 + "ext-intl": "*",
  930 + "phpunit/phpunit": "^4.8.35 || ^5.7",
  931 + "squizlabs/php_codesniffer": "^1.5"
  932 + },
  933 + "type": "library",
  934 + "extra": {
  935 + "branch-alias": {
  936 + "dev-master": "1.8-dev"
  937 + }
  938 + },
  939 + "autoload": {
  940 + "psr-4": {
  941 + "Faker\\": "src/Faker/"
  942 + }
  943 + },
  944 + "notification-url": "https://packagist.org/downloads/",
  945 + "license": [
  946 + "MIT"
  947 + ],
  948 + "authors": [
  949 + {
  950 + "name": "François Zaninotto"
  951 + }
  952 + ],
  953 + "description": "Faker is a PHP library that generates fake data for you.",
  954 + "keywords": [
  955 + "data",
  956 + "faker",
  957 + "fixtures"
  958 + ],
  959 + "time": "2018-03-15T16:58:08+00:00"
  960 + },
  961 + {
  962 + "name": "guzzlehttp/psr7",
  963 + "version": "dev-master",
  964 + "source": {
  965 + "type": "git",
  966 + "url": "https://github.com/guzzle/psr7.git",
  967 + "reference": "239912a01c502f2d8f3c642eb2fcd4e58cf82a72"
  968 + },
  969 + "dist": {
  970 + "type": "zip",
  971 + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239912a01c502f2d8f3c642eb2fcd4e58cf82a72",
  972 + "reference": "239912a01c502f2d8f3c642eb2fcd4e58cf82a72",
  973 + "shasum": ""
  974 + },
  975 + "require": {
  976 + "php": ">=5.4.0",
  977 + "psr/http-message": "~1.0",
  978 + "ralouphie/getallheaders": "^2.0.5"
  979 + },
  980 + "provide": {
  981 + "psr/http-message-implementation": "1.0"
  982 + },
  983 + "require-dev": {
  984 + "phpunit/phpunit": "~4.0"
  985 + },
  986 + "type": "library",
  987 + "extra": {
  988 + "branch-alias": {
  989 + "dev-master": "1.4-dev"
  990 + }
  991 + },
  992 + "autoload": {
  993 + "psr-4": {
  994 + "GuzzleHttp\\Psr7\\": "src/"
  995 + },
  996 + "files": [
  997 + "src/functions_include.php"
  998 + ]
  999 + },
  1000 + "notification-url": "https://packagist.org/downloads/",
  1001 + "license": [
  1002 + "MIT"
  1003 + ],
  1004 + "authors": [
  1005 + {
  1006 + "name": "Michael Dowling",
  1007 + "email": "mtdowling@gmail.com",
  1008 + "homepage": "https://github.com/mtdowling"
  1009 + },
  1010 + {
  1011 + "name": "Tobias Schultze",
  1012 + "homepage": "https://github.com/Tobion"
  1013 + }
  1014 + ],
  1015 + "description": "PSR-7 message implementation that also provides common utility methods",
  1016 + "keywords": [
  1017 + "http",
  1018 + "message",
  1019 + "request",
  1020 + "response",
  1021 + "stream",
  1022 + "uri",
  1023 + "url"
  1024 + ],
  1025 + "time": "2018-04-24T00:35:57+00:00"
  1026 + },
  1027 + {
  1028 + "name": "myclabs/deep-copy",
  1029 + "version": "1.x-dev",
  1030 + "source": {
  1031 + "type": "git",
  1032 + "url": "https://github.com/myclabs/DeepCopy.git",
  1033 + "reference": "9f807201f6e6a8b7ab3582d815511d1807c9c202"
  1034 + },
  1035 + "dist": {
  1036 + "type": "zip",
  1037 + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/9f807201f6e6a8b7ab3582d815511d1807c9c202",
  1038 + "reference": "9f807201f6e6a8b7ab3582d815511d1807c9c202",
  1039 + "shasum": ""
  1040 + },
  1041 + "require": {
  1042 + "php": "^7.1"
  1043 + },
  1044 + "require-dev": {
  1045 + "doctrine/collections": "^1.0",
  1046 + "doctrine/common": "^2.6",
  1047 + "phpunit/phpunit": "^6.4"
  1048 + },
  1049 + "type": "library",
  1050 + "extra": {
  1051 + "branch-alias": {
  1052 + "dev-1.x": "1.x-dev"
  1053 + }
  1054 + },
  1055 + "autoload": {
  1056 + "psr-4": {
  1057 + "DeepCopy\\": "src/DeepCopy/"
  1058 + },
  1059 + "files": [
  1060 + "src/DeepCopy/deep_copy.php"
  1061 + ]
  1062 + },
  1063 + "notification-url": "https://packagist.org/downloads/",
  1064 + "license": [
  1065 + "MIT"
  1066 + ],
  1067 + "description": "Create deep copies (clones) of your objects",
  1068 + "keywords": [
  1069 + "clone",
  1070 + "copy",
  1071 + "duplicate",
  1072 + "object",
  1073 + "object graph"
  1074 + ],
  1075 + "time": "2017-12-18T00:20:24+00:00"
  1076 + },
  1077 + {
  1078 + "name": "phar-io/manifest",
  1079 + "version": "dev-master",
  1080 + "source": {
  1081 + "type": "git",
  1082 + "url": "https://github.com/phar-io/manifest.git",
  1083 + "reference": "014feadb268809af7c8e2f7ccd396b8494901f58"
  1084 + },
  1085 + "dist": {
  1086 + "type": "zip",
  1087 + "url": "https://api.github.com/repos/phar-io/manifest/zipball/014feadb268809af7c8e2f7ccd396b8494901f58",
  1088 + "reference": "014feadb268809af7c8e2f7ccd396b8494901f58",
  1089 + "shasum": ""
  1090 + },
  1091 + "require": {
  1092 + "ext-dom": "*",
  1093 + "ext-phar": "*",
  1094 + "phar-io/version": "^1.0.1",
  1095 + "php": "^5.6 || ^7.0"
  1096 + },
  1097 + "type": "library",
  1098 + "extra": {
  1099 + "branch-alias": {
  1100 + "dev-master": "1.0.x-dev"
  1101 + }
  1102 + },
  1103 + "autoload": {
  1104 + "classmap": [
  1105 + "src/"
  1106 + ]
  1107 + },
  1108 + "notification-url": "https://packagist.org/downloads/",
  1109 + "license": [
  1110 + "BSD-3-Clause"
  1111 + ],
  1112 + "authors": [
  1113 + {
  1114 + "name": "Arne Blankerts",
  1115 + "email": "arne@blankerts.de",
  1116 + "role": "Developer"
  1117 + },
  1118 + {
  1119 + "name": "Sebastian Heuer",
  1120 + "email": "sebastian@phpeople.de",
  1121 + "role": "Developer"
  1122 + },
  1123 + {
  1124 + "name": "Sebastian Bergmann",
  1125 + "email": "sebastian@phpunit.de",
  1126 + "role": "Developer"
  1127 + }
  1128 + ],
  1129 + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
  1130 + "time": "2017-04-07T07:07:10+00:00"
  1131 + },
  1132 + {
  1133 + "name": "phar-io/version",
  1134 + "version": "1.0.1",
  1135 + "source": {
  1136 + "type": "git",
  1137 + "url": "https://github.com/phar-io/version.git",
  1138 + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
  1139 + },
  1140 + "dist": {
  1141 + "type": "zip",
  1142 + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
  1143 + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
  1144 + "shasum": ""
  1145 + },
  1146 + "require": {
  1147 + "php": "^5.6 || ^7.0"
  1148 + },
  1149 + "type": "library",
  1150 + "autoload": {
  1151 + "classmap": [
  1152 + "src/"
  1153 + ]
  1154 + },
  1155 + "notification-url": "https://packagist.org/downloads/",
  1156 + "license": [
  1157 + "BSD-3-Clause"
  1158 + ],
  1159 + "authors": [
  1160 + {
  1161 + "name": "Arne Blankerts",
  1162 + "email": "arne@blankerts.de",
  1163 + "role": "Developer"
  1164 + },
  1165 + {
  1166 + "name": "Sebastian Heuer",
  1167 + "email": "sebastian@phpeople.de",
  1168 + "role": "Developer"
  1169 + },
  1170 + {
  1171 + "name": "Sebastian Bergmann",
  1172 + "email": "sebastian@phpunit.de",
  1173 + "role": "Developer"
  1174 + }
  1175 + ],
  1176 + "description": "Library for handling version information and constraints",
  1177 + "time": "2017-03-05T17:38:23+00:00"
  1178 + },
  1179 + {
  1180 + "name": "phpdocumentor/reflection-common",
  1181 + "version": "1.0.1",
  1182 + "source": {
  1183 + "type": "git",
  1184 + "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
  1185 + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
  1186 + },
  1187 + "dist": {
  1188 + "type": "zip",
  1189 + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
  1190 + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
  1191 + "shasum": ""
  1192 + },
  1193 + "require": {
  1194 + "php": ">=5.5"
  1195 + },
  1196 + "require-dev": {
  1197 + "phpunit/phpunit": "^4.6"
  1198 + },
  1199 + "type": "library",
  1200 + "extra": {
  1201 + "branch-alias": {
  1202 + "dev-master": "1.0.x-dev"
  1203 + }
  1204 + },
  1205 + "autoload": {
  1206 + "psr-4": {
  1207 + "phpDocumentor\\Reflection\\": [
  1208 + "src"
  1209 + ]
  1210 + }
  1211 + },
  1212 + "notification-url": "https://packagist.org/downloads/",
  1213 + "license": [
  1214 + "MIT"
  1215 + ],
  1216 + "authors": [
  1217 + {
  1218 + "name": "Jaap van Otterdijk",
  1219 + "email": "opensource@ijaap.nl"
  1220 + }
  1221 + ],
  1222 + "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
  1223 + "homepage": "http://www.phpdoc.org",
  1224 + "keywords": [
  1225 + "FQSEN",
  1226 + "phpDocumentor",
  1227 + "phpdoc",
  1228 + "reflection",
  1229 + "static analysis"
  1230 + ],
  1231 + "time": "2017-09-11T18:02:19+00:00"
  1232 + },
  1233 + {
  1234 + "name": "phpdocumentor/reflection-docblock",
  1235 + "version": "4.3.0",
  1236 + "source": {
  1237 + "type": "git",
  1238 + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
  1239 + "reference": "94fd0001232e47129dd3504189fa1c7225010d08"
  1240 + },
  1241 + "dist": {
  1242 + "type": "zip",
  1243 + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08",
  1244 + "reference": "94fd0001232e47129dd3504189fa1c7225010d08",
  1245 + "shasum": ""
  1246 + },
  1247 + "require": {
  1248 + "php": "^7.0",
  1249 + "phpdocumentor/reflection-common": "^1.0.0",
  1250 + "phpdocumentor/type-resolver": "^0.4.0",
  1251 + "webmozart/assert": "^1.0"
  1252 + },
  1253 + "require-dev": {
  1254 + "doctrine/instantiator": "~1.0.5",
  1255 + "mockery/mockery": "^1.0",
  1256 + "phpunit/phpunit": "^6.4"
  1257 + },
  1258 + "type": "library",
  1259 + "extra": {
  1260 + "branch-alias": {
  1261 + "dev-master": "4.x-dev"
  1262 + }
  1263 + },
  1264 + "autoload": {
  1265 + "psr-4": {
  1266 + "phpDocumentor\\Reflection\\": [
  1267 + "src/"
  1268 + ]
  1269 + }
  1270 + },
  1271 + "notification-url": "https://packagist.org/downloads/",
  1272 + "license": [
  1273 + "MIT"
  1274 + ],
  1275 + "authors": [
  1276 + {
  1277 + "name": "Mike van Riel",
  1278 + "email": "me@mikevanriel.com"
  1279 + }
  1280 + ],
  1281 + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
  1282 + "time": "2017-11-30T07:14:17+00:00"
  1283 + },
  1284 + {
  1285 + "name": "phpdocumentor/type-resolver",
  1286 + "version": "0.4.0",
  1287 + "source": {
  1288 + "type": "git",
  1289 + "url": "https://github.com/phpDocumentor/TypeResolver.git",
  1290 + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
  1291 + },
  1292 + "dist": {
  1293 + "type": "zip",
  1294 + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
  1295 + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
  1296 + "shasum": ""
  1297 + },
  1298 + "require": {
  1299 + "php": "^5.5 || ^7.0",
  1300 + "phpdocumentor/reflection-common": "^1.0"
  1301 + },
  1302 + "require-dev": {
  1303 + "mockery/mockery": "^0.9.4",
  1304 + "phpunit/phpunit": "^5.2||^4.8.24"
  1305 + },
  1306 + "type": "library",
  1307 + "extra": {
  1308 + "branch-alias": {
  1309 + "dev-master": "1.0.x-dev"
  1310 + }
  1311 + },
  1312 + "autoload": {
  1313 + "psr-4": {
  1314 + "phpDocumentor\\Reflection\\": [
  1315 + "src/"
  1316 + ]
  1317 + }
  1318 + },
  1319 + "notification-url": "https://packagist.org/downloads/",
  1320 + "license": [
  1321 + "MIT"
  1322 + ],
  1323 + "authors": [
  1324 + {
  1325 + "name": "Mike van Riel",
  1326 + "email": "me@mikevanriel.com"
  1327 + }
  1328 + ],
  1329 + "time": "2017-07-14T14:27:02+00:00"
  1330 + },
  1331 + {
  1332 + "name": "phpspec/php-diff",
  1333 + "version": "dev-master",
  1334 + "source": {
  1335 + "type": "git",
  1336 + "url": "https://github.com/phpspec/php-diff.git",
  1337 + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a"
  1338 + },
  1339 + "dist": {
  1340 + "type": "zip",
  1341 + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a",
  1342 + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a",
  1343 + "shasum": ""
  1344 + },
  1345 + "type": "library",
  1346 + "extra": {
  1347 + "branch-alias": {
  1348 + "dev-master": "1.0.x-dev"
  1349 + }
  1350 + },
  1351 + "autoload": {
  1352 + "psr-0": {
  1353 + "Diff": "lib/"
  1354 + }
  1355 + },
  1356 + "notification-url": "https://packagist.org/downloads/",
  1357 + "license": [
  1358 + "BSD-3-Clause"
  1359 + ],
  1360 + "authors": [
  1361 + {
  1362 + "name": "Chris Boulton",
  1363 + "homepage": "http://github.com/chrisboulton"
  1364 + }
  1365 + ],
  1366 + "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).",
  1367 + "time": "2016-04-07T12:29:16+00:00"
  1368 + },
  1369 + {
  1370 + "name": "phpspec/prophecy",
  1371 + "version": "dev-master",
  1372 + "source": {
  1373 + "type": "git",
  1374 + "url": "https://github.com/phpspec/prophecy.git",
  1375 + "reference": "6471ce6aa91ec03e9fdf3ca188e277104d8a7d1c"
  1376 + },
  1377 + "dist": {
  1378 + "type": "zip",
  1379 + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6471ce6aa91ec03e9fdf3ca188e277104d8a7d1c",
  1380 + "reference": "6471ce6aa91ec03e9fdf3ca188e277104d8a7d1c",
  1381 + "shasum": ""
  1382 + },
  1383 + "require": {
  1384 + "doctrine/instantiator": "^1.0.2",
  1385 + "php": "^5.3|^7.0",
  1386 + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
  1387 + "sebastian/comparator": "^1.1|^2.0|^3.0",
  1388 + "sebastian/recursion-context": "^1.0|^2.0|^3.0"
  1389 + },
  1390 + "require-dev": {
  1391 + "phpspec/phpspec": "^2.5|^3.2",
  1392 + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
  1393 + },
  1394 + "type": "library",
  1395 + "extra": {
  1396 + "branch-alias": {
  1397 + "dev-master": "1.7.x-dev"
  1398 + }
  1399 + },
  1400 + "autoload": {
  1401 + "psr-0": {
  1402 + "Prophecy\\": "src/"
  1403 + }
  1404 + },
  1405 + "notification-url": "https://packagist.org/downloads/",
  1406 + "license": [
  1407 + "MIT"
  1408 + ],
  1409 + "authors": [
  1410 + {
  1411 + "name": "Konstantin Kudryashov",
  1412 + "email": "ever.zet@gmail.com",
  1413 + "homepage": "http://everzet.com"
  1414 + },
  1415 + {
  1416 + "name": "Marcello Duarte",
  1417 + "email": "marcello.duarte@gmail.com"
  1418 + }
  1419 + ],
  1420 + "description": "Highly opinionated mocking framework for PHP 5.3+",
  1421 + "homepage": "https://github.com/phpspec/prophecy",
  1422 + "keywords": [
  1423 + "Double",
  1424 + "Dummy",
  1425 + "fake",
  1426 + "mock",
  1427 + "spy",
  1428 + "stub"
  1429 + ],
  1430 + "time": "2018-05-09T14:00:54+00:00"
  1431 + },
  1432 + {
  1433 + "name": "phpunit/php-code-coverage",
  1434 + "version": "dev-master",
  1435 + "source": {
  1436 + "type": "git",
  1437 + "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
  1438 + "reference": "837e7924a40fffda434ac6c896f6f6dacd6ba4e1"
  1439 + },
  1440 + "dist": {
  1441 + "type": "zip",
  1442 + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/837e7924a40fffda434ac6c896f6f6dacd6ba4e1",
  1443 + "reference": "837e7924a40fffda434ac6c896f6f6dacd6ba4e1",
  1444 + "shasum": ""
  1445 + },
  1446 + "require": {
  1447 + "ext-dom": "*",
  1448 + "ext-xmlwriter": "*",
  1449 + "php": "^7.1",
  1450 + "phpunit/php-file-iterator": "^1.4.2",
  1451 + "phpunit/php-text-template": "^1.2.1",
  1452 + "phpunit/php-token-stream": "^3.0",
  1453 + "sebastian/code-unit-reverse-lookup": "^1.0.1",
  1454 + "sebastian/environment": "^3.1",
  1455 + "sebastian/version": "^2.0.1",
  1456 + "theseer/tokenizer": "^1.1"
  1457 + },
  1458 + "require-dev": {
  1459 + "phpunit/phpunit": "^7.0"
  1460 + },
  1461 + "suggest": {
  1462 + "ext-xdebug": "^2.6.0"
  1463 + },
  1464 + "type": "library",
  1465 + "extra": {
  1466 + "branch-alias": {
  1467 + "dev-master": "6.0-dev"
  1468 + }
  1469 + },
  1470 + "autoload": {
  1471 + "classmap": [
  1472 + "src/"
  1473 + ]
  1474 + },
  1475 + "notification-url": "https://packagist.org/downloads/",
  1476 + "license": [
  1477 + "BSD-3-Clause"
  1478 + ],
  1479 + "authors": [
  1480 + {
  1481 + "name": "Sebastian Bergmann",
  1482 + "email": "sebastian@phpunit.de",
  1483 + "role": "lead"
  1484 + }
  1485 + ],
  1486 + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
  1487 + "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
  1488 + "keywords": [
  1489 + "coverage",
  1490 + "testing",
  1491 + "xunit"
  1492 + ],
  1493 + "time": "2018-05-22T03:55:48+00:00"
  1494 + },
  1495 + {
  1496 + "name": "phpunit/php-file-iterator",
  1497 + "version": "1.4.x-dev",
  1498 + "source": {
  1499 + "type": "git",
  1500 + "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
  1501 + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
  1502 + },
  1503 + "dist": {
  1504 + "type": "zip",
  1505 + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
  1506 + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
  1507 + "shasum": ""
  1508 + },
  1509 + "require": {
  1510 + "php": ">=5.3.3"
  1511 + },
  1512 + "type": "library",
  1513 + "extra": {
  1514 + "branch-alias": {
  1515 + "dev-master": "1.4.x-dev"
  1516 + }
  1517 + },
  1518 + "autoload": {
  1519 + "classmap": [
  1520 + "src/"
  1521 + ]
  1522 + },
  1523 + "notification-url": "https://packagist.org/downloads/",
  1524 + "license": [
  1525 + "BSD-3-Clause"
  1526 + ],
  1527 + "authors": [
  1528 + {
  1529 + "name": "Sebastian Bergmann",
  1530 + "email": "sb@sebastian-bergmann.de",
  1531 + "role": "lead"
  1532 + }
  1533 + ],
  1534 + "description": "FilterIterator implementation that filters files based on a list of suffixes.",
  1535 + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
  1536 + "keywords": [
  1537 + "filesystem",
  1538 + "iterator"
  1539 + ],
  1540 + "time": "2017-11-27T13:52:08+00:00"
  1541 + },
  1542 + {
  1543 + "name": "phpunit/php-text-template",
  1544 + "version": "1.2.1",
  1545 + "source": {
  1546 + "type": "git",
  1547 + "url": "https://github.com/sebastianbergmann/php-text-template.git",
  1548 + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
  1549 + },
  1550 + "dist": {
  1551 + "type": "zip",
  1552 + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
  1553 + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
  1554 + "shasum": ""
  1555 + },
  1556 + "require": {
  1557 + "php": ">=5.3.3"
  1558 + },
  1559 + "type": "library",
  1560 + "autoload": {
  1561 + "classmap": [
  1562 + "src/"
  1563 + ]
  1564 + },
  1565 + "notification-url": "https://packagist.org/downloads/",
  1566 + "license": [
  1567 + "BSD-3-Clause"
  1568 + ],
  1569 + "authors": [
  1570 + {
  1571 + "name": "Sebastian Bergmann",
  1572 + "email": "sebastian@phpunit.de",
  1573 + "role": "lead"
  1574 + }
  1575 + ],
  1576 + "description": "Simple template engine.",
  1577 + "homepage": "https://github.com/sebastianbergmann/php-text-template/",
  1578 + "keywords": [
  1579 + "template"
  1580 + ],
  1581 + "time": "2015-06-21T13:50:34+00:00"
  1582 + },
  1583 + {
  1584 + "name": "phpunit/php-timer",
  1585 + "version": "dev-master",
  1586 + "source": {
  1587 + "type": "git",
  1588 + "url": "https://github.com/sebastianbergmann/php-timer.git",
  1589 + "reference": "0753e54e87486014ef2b77d4bf50ce4f7cf9ce21"
  1590 + },
  1591 + "dist": {
  1592 + "type": "zip",
  1593 + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/0753e54e87486014ef2b77d4bf50ce4f7cf9ce21",
  1594 + "reference": "0753e54e87486014ef2b77d4bf50ce4f7cf9ce21",
  1595 + "shasum": ""
  1596 + },
  1597 + "require": {
  1598 + "php": "^7.1"
  1599 + },
  1600 + "require-dev": {
  1601 + "phpunit/phpunit": "^7.0"
  1602 + },
  1603 + "type": "library",
  1604 + "extra": {
  1605 + "branch-alias": {
  1606 + "dev-master": "2.0-dev"
  1607 + }
  1608 + },
  1609 + "autoload": {
  1610 + "classmap": [
  1611 + "src/"
  1612 + ]
  1613 + },
  1614 + "notification-url": "https://packagist.org/downloads/",
  1615 + "license": [
  1616 + "BSD-3-Clause"
  1617 + ],
  1618 + "authors": [
  1619 + {
  1620 + "name": "Sebastian Bergmann",
  1621 + "email": "sebastian@phpunit.de",
  1622 + "role": "lead"
  1623 + }
  1624 + ],
  1625 + "description": "Utility class for timing",
  1626 + "homepage": "https://github.com/sebastianbergmann/php-timer/",
  1627 + "keywords": [
  1628 + "timer"
  1629 + ],
  1630 + "time": "2018-05-15T05:50:31+00:00"
  1631 + },
  1632 + {
  1633 + "name": "phpunit/php-token-stream",
  1634 + "version": "dev-master",
  1635 + "source": {
  1636 + "type": "git",
  1637 + "url": "https://github.com/sebastianbergmann/php-token-stream.git",
  1638 + "reference": "ddd3bcc3d1061d1afcdf1e1f3b8e8573e9b7ecc4"
  1639 + },
  1640 + "dist": {
  1641 + "type": "zip",
  1642 + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ddd3bcc3d1061d1afcdf1e1f3b8e8573e9b7ecc4",
  1643 + "reference": "ddd3bcc3d1061d1afcdf1e1f3b8e8573e9b7ecc4",
  1644 + "shasum": ""
  1645 + },
  1646 + "require": {
  1647 + "ext-tokenizer": "*",
  1648 + "php": "^7.1"
  1649 + },
  1650 + "require-dev": {
  1651 + "phpunit/phpunit": "^7.0"
  1652 + },
  1653 + "type": "library",
  1654 + "extra": {
  1655 + "branch-alias": {
  1656 + "dev-master": "3.0-dev"
  1657 + }
  1658 + },
  1659 + "autoload": {
  1660 + "classmap": [
  1661 + "src/"
  1662 + ]
  1663 + },
  1664 + "notification-url": "https://packagist.org/downloads/",
  1665 + "license": [
  1666 + "BSD-3-Clause"
  1667 + ],
  1668 + "authors": [
  1669 + {
  1670 + "name": "Sebastian Bergmann",
  1671 + "email": "sebastian@phpunit.de"
  1672 + }
  1673 + ],
  1674 + "description": "Wrapper around PHP's tokenizer extension.",
  1675 + "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
  1676 + "keywords": [
  1677 + "tokenizer"
  1678 + ],
  1679 + "time": "2018-05-15T05:50:16+00:00"
  1680 + },
  1681 + {
  1682 + "name": "phpunit/phpunit",
  1683 + "version": "7.1.x-dev",
  1684 + "source": {
  1685 + "type": "git",
  1686 + "url": "https://github.com/sebastianbergmann/phpunit.git",
  1687 + "reference": "67289aa7130ca6a0c5c205166b51774dee63a043"
  1688 + },
  1689 + "dist": {
  1690 + "type": "zip",
  1691 + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/67289aa7130ca6a0c5c205166b51774dee63a043",
  1692 + "reference": "67289aa7130ca6a0c5c205166b51774dee63a043",
  1693 + "shasum": ""
  1694 + },
  1695 + "require": {
  1696 + "ext-dom": "*",
  1697 + "ext-json": "*",
  1698 + "ext-libxml": "*",
  1699 + "ext-mbstring": "*",
  1700 + "ext-xml": "*",
  1701 + "myclabs/deep-copy": "^1.6.1",
  1702 + "phar-io/manifest": "^1.0.1",
  1703 + "phar-io/version": "^1.0",
  1704 + "php": "^7.1",
  1705 + "phpspec/prophecy": "^1.7",
  1706 + "phpunit/php-code-coverage": "^6.0.1",
  1707 + "phpunit/php-file-iterator": "^1.4.3",
  1708 + "phpunit/php-text-template": "^1.2.1",
  1709 + "phpunit/php-timer": "^2.0",
  1710 + "phpunit/phpunit-mock-objects": "^6.1.1",
  1711 + "sebastian/comparator": "^3.0",
  1712 + "sebastian/diff": "^3.0",
  1713 + "sebastian/environment": "^3.1",
  1714 + "sebastian/exporter": "^3.1",
  1715 + "sebastian/global-state": "^2.0",
  1716 + "sebastian/object-enumerator": "^3.0.3",
  1717 + "sebastian/resource-operations": "^1.0",
  1718 + "sebastian/version": "^2.0.1"
  1719 + },
  1720 + "require-dev": {
  1721 + "ext-pdo": "*"
  1722 + },
  1723 + "suggest": {
  1724 + "ext-xdebug": "*",
  1725 + "phpunit/php-invoker": "^2.0"
  1726 + },
  1727 + "bin": [
  1728 + "phpunit"
  1729 + ],
  1730 + "type": "library",
  1731 + "extra": {
  1732 + "branch-alias": {
  1733 + "dev-master": "7.1-dev"
  1734 + }
  1735 + },
  1736 + "autoload": {
  1737 + "classmap": [
  1738 + "src/"
  1739 + ]
  1740 + },
  1741 + "notification-url": "https://packagist.org/downloads/",
  1742 + "license": [
  1743 + "BSD-3-Clause"
  1744 + ],
  1745 + "authors": [
  1746 + {
  1747 + "name": "Sebastian Bergmann",
  1748 + "email": "sebastian@phpunit.de",
  1749 + "role": "lead"
  1750 + }
  1751 + ],
  1752 + "description": "The PHP Unit Testing framework.",
  1753 + "homepage": "https://phpunit.de/",
  1754 + "keywords": [
  1755 + "phpunit",
  1756 + "testing",
  1757 + "xunit"
  1758 + ],
  1759 + "time": "2018-05-25T12:16:21+00:00"
  1760 + },
  1761 + {
  1762 + "name": "phpunit/phpunit-mock-objects",
  1763 + "version": "dev-master",
  1764 + "source": {
  1765 + "type": "git",
  1766 + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
  1767 + "reference": "a75f06cca35652683c2b993247cb9ab2f8c57fb9"
  1768 + },
  1769 + "dist": {
  1770 + "type": "zip",
  1771 + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a75f06cca35652683c2b993247cb9ab2f8c57fb9",
  1772 + "reference": "a75f06cca35652683c2b993247cb9ab2f8c57fb9",
  1773 + "shasum": ""
  1774 + },
  1775 + "require": {
  1776 + "doctrine/instantiator": "^1.0.5",
  1777 + "php": "^7.1",
  1778 + "phpunit/php-text-template": "^1.2.1",
  1779 + "sebastian/exporter": "^3.1"
  1780 + },
  1781 + "require-dev": {
  1782 + "phpunit/phpunit": "^7.0"
  1783 + },
  1784 + "suggest": {
  1785 + "ext-soap": "*"
  1786 + },
  1787 + "type": "library",
  1788 + "extra": {
  1789 + "branch-alias": {
  1790 + "dev-master": "6.1-dev"
  1791 + }
  1792 + },
  1793 + "autoload": {
  1794 + "classmap": [
  1795 + "src/"
  1796 + ]
  1797 + },
  1798 + "notification-url": "https://packagist.org/downloads/",
  1799 + "license": [
  1800 + "BSD-3-Clause"
  1801 + ],
  1802 + "authors": [
  1803 + {
  1804 + "name": "Sebastian Bergmann",
  1805 + "email": "sebastian@phpunit.de",
  1806 + "role": "lead"
  1807 + }
  1808 + ],
  1809 + "description": "Mock Object library for PHPUnit",
  1810 + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
  1811 + "keywords": [
  1812 + "mock",
  1813 + "xunit"
  1814 + ],
  1815 + "time": "2018-04-24T05:40:33+00:00"
  1816 + },
  1817 + {
  1818 + "name": "psr/http-message",
  1819 + "version": "dev-master",
  1820 + "source": {
  1821 + "type": "git",
  1822 + "url": "https://github.com/php-fig/http-message.git",
  1823 + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
  1824 + },
  1825 + "dist": {
  1826 + "type": "zip",
  1827 + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
  1828 + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
  1829 + "shasum": ""
  1830 + },
  1831 + "require": {
  1832 + "php": ">=5.3.0"
  1833 + },
  1834 + "type": "library",
  1835 + "extra": {
  1836 + "branch-alias": {
  1837 + "dev-master": "1.0.x-dev"
  1838 + }
  1839 + },
  1840 + "autoload": {
  1841 + "psr-4": {
  1842 + "Psr\\Http\\Message\\": "src/"
  1843 + }
  1844 + },
  1845 + "notification-url": "https://packagist.org/downloads/",
  1846 + "license": [
  1847 + "MIT"
  1848 + ],
  1849 + "authors": [
  1850 + {
  1851 + "name": "PHP-FIG",
  1852 + "homepage": "http://www.php-fig.org/"
  1853 + }
  1854 + ],
  1855 + "description": "Common interface for HTTP messages",
  1856 + "homepage": "https://github.com/php-fig/http-message",
  1857 + "keywords": [
  1858 + "http",
  1859 + "http-message",
  1860 + "psr",
  1861 + "psr-7",
  1862 + "request",
  1863 + "response"
  1864 + ],
  1865 + "time": "2016-08-06T14:39:51+00:00"
  1866 + },
  1867 + {
  1868 + "name": "ralouphie/getallheaders",
  1869 + "version": "2.0.5",
  1870 + "source": {
  1871 + "type": "git",
  1872 + "url": "https://github.com/ralouphie/getallheaders.git",
  1873 + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa"
  1874 + },
  1875 + "dist": {
  1876 + "type": "zip",
  1877 + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
  1878 + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
  1879 + "shasum": ""
  1880 + },
  1881 + "require": {
  1882 + "php": ">=5.3"
  1883 + },
  1884 + "require-dev": {
  1885 + "phpunit/phpunit": "~3.7.0",
  1886 + "satooshi/php-coveralls": ">=1.0"
  1887 + },
  1888 + "type": "library",
  1889 + "autoload": {
  1890 + "files": [
  1891 + "src/getallheaders.php"
  1892 + ]
  1893 + },
  1894 + "notification-url": "https://packagist.org/downloads/",
  1895 + "license": [
  1896 + "MIT"
  1897 + ],
  1898 + "authors": [
  1899 + {
  1900 + "name": "Ralph Khattar",
  1901 + "email": "ralph.khattar@gmail.com"
  1902 + }
  1903 + ],
  1904 + "description": "A polyfill for getallheaders.",
  1905 + "time": "2016-02-11T07:05:27+00:00"
  1906 + },
  1907 + {
  1908 + "name": "sebastian/code-unit-reverse-lookup",
  1909 + "version": "dev-master",
  1910 + "source": {
  1911 + "type": "git",
  1912 + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
  1913 + "reference": "22f5f5ff892d51035dd1fb4cd6b224a640ffb206"
  1914 + },
  1915 + "dist": {
  1916 + "type": "zip",
  1917 + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/22f5f5ff892d51035dd1fb4cd6b224a640ffb206",
  1918 + "reference": "22f5f5ff892d51035dd1fb4cd6b224a640ffb206",
  1919 + "shasum": ""
  1920 + },
  1921 + "require": {
  1922 + "php": "^5.6 || ^7.0"
  1923 + },
  1924 + "require-dev": {
  1925 + "phpunit/phpunit": "^5.7 || ^6.0"
  1926 + },
  1927 + "type": "library",
  1928 + "extra": {
  1929 + "branch-alias": {
  1930 + "dev-master": "1.0.x-dev"
  1931 + }
  1932 + },
  1933 + "autoload": {
  1934 + "classmap": [
  1935 + "src/"
  1936 + ]
  1937 + },
  1938 + "notification-url": "https://packagist.org/downloads/",
  1939 + "license": [
  1940 + "BSD-3-Clause"
  1941 + ],
  1942 + "authors": [
  1943 + {
  1944 + "name": "Sebastian Bergmann",
  1945 + "email": "sebastian@phpunit.de"
  1946 + }
  1947 + ],
  1948 + "description": "Looks up which function or method a line of code belongs to",
  1949 + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
  1950 + "time": "2018-05-15T05:52:48+00:00"
  1951 + },
  1952 + {
  1953 + "name": "sebastian/comparator",
  1954 + "version": "dev-master",
  1955 + "source": {
  1956 + "type": "git",
  1957 + "url": "https://github.com/sebastianbergmann/comparator.git",
  1958 + "reference": "71d4a9394b5a0d4e98a35493c81dbd2cba657a7b"
  1959 + },
  1960 + "dist": {
  1961 + "type": "zip",
  1962 + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/71d4a9394b5a0d4e98a35493c81dbd2cba657a7b",
  1963 + "reference": "71d4a9394b5a0d4e98a35493c81dbd2cba657a7b",
  1964 + "shasum": ""
  1965 + },
  1966 + "require": {
  1967 + "php": "^7.1",
  1968 + "sebastian/diff": "^3.0",
  1969 + "sebastian/exporter": "^3.1"
  1970 + },
  1971 + "require-dev": {
  1972 + "phpunit/phpunit": "^7.1"
  1973 + },
  1974 + "type": "library",
  1975 + "extra": {
  1976 + "branch-alias": {
  1977 + "dev-master": "3.0-dev"
  1978 + }
  1979 + },
  1980 + "autoload": {
  1981 + "classmap": [
  1982 + "src/"
  1983 + ]
  1984 + },
  1985 + "notification-url": "https://packagist.org/downloads/",
  1986 + "license": [
  1987 + "BSD-3-Clause"
  1988 + ],
  1989 + "authors": [
  1990 + {
  1991 + "name": "Jeff Welch",
  1992 + "email": "whatthejeff@gmail.com"
  1993 + },
  1994 + {
  1995 + "name": "Volker Dusch",
  1996 + "email": "github@wallbash.com"
  1997 + },
  1998 + {
  1999 + "name": "Bernhard Schussek",
  2000 + "email": "bschussek@2bepublished.at"
  2001 + },
  2002 + {
  2003 + "name": "Sebastian Bergmann",
  2004 + "email": "sebastian@phpunit.de"
  2005 + }
  2006 + ],
  2007 + "description": "Provides the functionality to compare PHP values for equality",
  2008 + "homepage": "https://github.com/sebastianbergmann/comparator",
  2009 + "keywords": [
  2010 + "comparator",
  2011 + "compare",
  2012 + "equality"
  2013 + ],
  2014 + "time": "2018-05-23T07:33:54+00:00"
  2015 + },
  2016 + {
  2017 + "name": "sebastian/diff",
  2018 + "version": "dev-master",
  2019 + "source": {
  2020 + "type": "git",
  2021 + "url": "https://github.com/sebastianbergmann/diff.git",
  2022 + "reference": "eea784213d383dcdf56c9002074bb61f647b0e97"
  2023 + },
  2024 + "dist": {
  2025 + "type": "zip",
  2026 + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/eea784213d383dcdf56c9002074bb61f647b0e97",
  2027 + "reference": "eea784213d383dcdf56c9002074bb61f647b0e97",
  2028 + "shasum": ""
  2029 + },
  2030 + "require": {
  2031 + "php": "^7.1"
  2032 + },
  2033 + "require-dev": {
  2034 + "phpunit/phpunit": "^7.0",
  2035 + "symfony/process": "^2 || ^3.3 || ^4"
  2036 + },
  2037 + "type": "library",
  2038 + "extra": {
  2039 + "branch-alias": {
  2040 + "dev-master": "3.0-dev"
  2041 + }
  2042 + },
  2043 + "autoload": {
  2044 + "classmap": [
  2045 + "src/"
  2046 + ]
  2047 + },
  2048 + "notification-url": "https://packagist.org/downloads/",
  2049 + "license": [
  2050 + "BSD-3-Clause"
  2051 + ],
  2052 + "authors": [
  2053 + {
  2054 + "name": "Kore Nordmann",
  2055 + "email": "mail@kore-nordmann.de"
  2056 + },
  2057 + {
  2058 + "name": "Sebastian Bergmann",
  2059 + "email": "sebastian@phpunit.de"
  2060 + }
  2061 + ],
  2062 + "description": "Diff implementation",
  2063 + "homepage": "https://github.com/sebastianbergmann/diff",
  2064 + "keywords": [
  2065 + "diff",
  2066 + "udiff",
  2067 + "unidiff",
  2068 + "unified diff"
  2069 + ],
  2070 + "time": "2018-05-15T05:49:24+00:00"
  2071 + },
  2072 + {
  2073 + "name": "sebastian/environment",
  2074 + "version": "dev-master",
  2075 + "source": {
  2076 + "type": "git",
  2077 + "url": "https://github.com/sebastianbergmann/environment.git",
  2078 + "reference": "32c5cba90f7db47b1c10a777b36eccfd44ef8bd7"
  2079 + },
  2080 + "dist": {
  2081 + "type": "zip",
  2082 + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/32c5cba90f7db47b1c10a777b36eccfd44ef8bd7",
  2083 + "reference": "32c5cba90f7db47b1c10a777b36eccfd44ef8bd7",
  2084 + "shasum": ""
  2085 + },
  2086 + "require": {
  2087 + "php": "^7.0"
  2088 + },
  2089 + "require-dev": {
  2090 + "phpunit/phpunit": "^6.1"
  2091 + },
  2092 + "type": "library",
  2093 + "extra": {
  2094 + "branch-alias": {
  2095 + "dev-master": "3.1.x-dev"
  2096 + }
  2097 + },
  2098 + "autoload": {
  2099 + "classmap": [
  2100 + "src/"
  2101 + ]
  2102 + },
  2103 + "notification-url": "https://packagist.org/downloads/",
  2104 + "license": [
  2105 + "BSD-3-Clause"
  2106 + ],
  2107 + "authors": [
  2108 + {
  2109 + "name": "Sebastian Bergmann",
  2110 + "email": "sebastian@phpunit.de"
  2111 + }
  2112 + ],
  2113 + "description": "Provides functionality to handle HHVM/PHP environments",
  2114 + "homepage": "http://www.github.com/sebastianbergmann/environment",
  2115 + "keywords": [
  2116 + "Xdebug",
  2117 + "environment",
  2118 + "hhvm"
  2119 + ],
  2120 + "time": "2018-05-15T05:48:40+00:00"
  2121 + },
  2122 + {
  2123 + "name": "sebastian/exporter",
  2124 + "version": "dev-master",
  2125 + "source": {
  2126 + "type": "git",
  2127 + "url": "https://github.com/sebastianbergmann/exporter.git",
  2128 + "reference": "20962714658cf74b1d293a98a30ec108e2e81ca9"
  2129 + },
  2130 + "dist": {
  2131 + "type": "zip",
  2132 + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/20962714658cf74b1d293a98a30ec108e2e81ca9",
  2133 + "reference": "20962714658cf74b1d293a98a30ec108e2e81ca9",
  2134 + "shasum": ""
  2135 + },
  2136 + "require": {
  2137 + "php": "^7.0",
  2138 + "sebastian/recursion-context": "^3.0"
  2139 + },
  2140 + "require-dev": {
  2141 + "ext-mbstring": "*",
  2142 + "phpunit/phpunit": "^6.0"
  2143 + },
  2144 + "type": "library",
  2145 + "extra": {
  2146 + "branch-alias": {
  2147 + "dev-master": "3.1.x-dev"
  2148 + }
  2149 + },
  2150 + "autoload": {
  2151 + "classmap": [
  2152 + "src/"
  2153 + ]
  2154 + },
  2155 + "notification-url": "https://packagist.org/downloads/",
  2156 + "license": [
  2157 + "BSD-3-Clause"
  2158 + ],
  2159 + "authors": [
  2160 + {
  2161 + "name": "Jeff Welch",
  2162 + "email": "whatthejeff@gmail.com"
  2163 + },
  2164 + {
  2165 + "name": "Volker Dusch",
  2166 + "email": "github@wallbash.com"
  2167 + },
  2168 + {
  2169 + "name": "Bernhard Schussek",
  2170 + "email": "bschussek@2bepublished.at"
  2171 + },
  2172 + {
  2173 + "name": "Sebastian Bergmann",
  2174 + "email": "sebastian@phpunit.de"
  2175 + },
  2176 + {
  2177 + "name": "Adam Harvey",
  2178 + "email": "aharvey@php.net"
  2179 + }
  2180 + ],
  2181 + "description": "Provides the functionality to export PHP variables for visualization",
  2182 + "homepage": "http://www.github.com/sebastianbergmann/exporter",
  2183 + "keywords": [
  2184 + "export",
  2185 + "exporter"
  2186 + ],
  2187 + "time": "2018-05-15T05:51:07+00:00"
  2188 + },
  2189 + {
  2190 + "name": "sebastian/global-state",
  2191 + "version": "dev-master",
  2192 + "source": {
  2193 + "type": "git",
  2194 + "url": "https://github.com/sebastianbergmann/global-state.git",
  2195 + "reference": "30367ea06c5cc3bf684457ac793fb2b863d783c6"
  2196 + },
  2197 + "dist": {
  2198 + "type": "zip",
  2199 + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/30367ea06c5cc3bf684457ac793fb2b863d783c6",
  2200 + "reference": "30367ea06c5cc3bf684457ac793fb2b863d783c6",
  2201 + "shasum": ""
  2202 + },
  2203 + "require": {
  2204 + "php": "^7.0"
  2205 + },
  2206 + "require-dev": {
  2207 + "phpunit/phpunit": "^6.0"
  2208 + },
  2209 + "suggest": {
  2210 + "ext-uopz": "*"
  2211 + },
  2212 + "type": "library",
  2213 + "extra": {
  2214 + "branch-alias": {
  2215 + "dev-master": "2.0-dev"
  2216 + }
  2217 + },
  2218 + "autoload": {
  2219 + "classmap": [
  2220 + "src/"
  2221 + ]
  2222 + },
  2223 + "notification-url": "https://packagist.org/downloads/",
  2224 + "license": [
  2225 + "BSD-3-Clause"
  2226 + ],
  2227 + "authors": [
  2228 + {
  2229 + "name": "Sebastian Bergmann",
  2230 + "email": "sebastian@phpunit.de"
  2231 + }
  2232 + ],
  2233 + "description": "Snapshotting of global state",
  2234 + "homepage": "http://www.github.com/sebastianbergmann/global-state",
  2235 + "keywords": [
  2236 + "global state"
  2237 + ],
  2238 + "time": "2018-05-15T05:52:33+00:00"
  2239 + },
  2240 + {
  2241 + "name": "sebastian/object-enumerator",
  2242 + "version": "dev-master",
  2243 + "source": {
  2244 + "type": "git",
  2245 + "url": "https://github.com/sebastianbergmann/object-enumerator.git",
  2246 + "reference": "06d95dc84f06fc6cc246b8bf48facebcf0fe8069"
  2247 + },
  2248 + "dist": {
  2249 + "type": "zip",
  2250 + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/06d95dc84f06fc6cc246b8bf48facebcf0fe8069",
  2251 + "reference": "06d95dc84f06fc6cc246b8bf48facebcf0fe8069",
  2252 + "shasum": ""
  2253 + },
  2254 + "require": {
  2255 + "php": "^7.0",
  2256 + "sebastian/object-reflector": "^1.1.1",
  2257 + "sebastian/recursion-context": "^3.0"
  2258 + },
  2259 + "require-dev": {
  2260 + "phpunit/phpunit": "^6.0"
  2261 + },
  2262 + "type": "library",
  2263 + "extra": {
  2264 + "branch-alias": {
  2265 + "dev-master": "3.0.x-dev"
  2266 + }
  2267 + },
  2268 + "autoload": {
  2269 + "classmap": [
  2270 + "src/"
  2271 + ]
  2272 + },
  2273 + "notification-url": "https://packagist.org/downloads/",
  2274 + "license": [
  2275 + "BSD-3-Clause"
  2276 + ],
  2277 + "authors": [
  2278 + {
  2279 + "name": "Sebastian Bergmann",
  2280 + "email": "sebastian@phpunit.de"
  2281 + }
  2282 + ],
  2283 + "description": "Traverses array structures and object graphs to enumerate all referenced objects",
  2284 + "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
  2285 + "time": "2018-05-15T05:52:18+00:00"
  2286 + },
  2287 + {
  2288 + "name": "sebastian/object-reflector",
  2289 + "version": "dev-master",
  2290 + "source": {
  2291 + "type": "git",
  2292 + "url": "https://github.com/sebastianbergmann/object-reflector.git",
  2293 + "reference": "7707193304715e3caddf28fc73c02c12ed6f350c"
  2294 + },
  2295 + "dist": {
  2296 + "type": "zip",
  2297 + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/7707193304715e3caddf28fc73c02c12ed6f350c",
  2298 + "reference": "7707193304715e3caddf28fc73c02c12ed6f350c",
  2299 + "shasum": ""
  2300 + },
  2301 + "require": {
  2302 + "php": "^7.0"
  2303 + },
  2304 + "require-dev": {
  2305 + "phpunit/phpunit": "^6.0"
  2306 + },
  2307 + "type": "library",
  2308 + "extra": {
  2309 + "branch-alias": {
  2310 + "dev-master": "1.1-dev"
  2311 + }
  2312 + },
  2313 + "autoload": {
  2314 + "classmap": [
  2315 + "src/"
  2316 + ]
  2317 + },
  2318 + "notification-url": "https://packagist.org/downloads/",
  2319 + "license": [
  2320 + "BSD-3-Clause"
  2321 + ],
  2322 + "authors": [
  2323 + {
  2324 + "name": "Sebastian Bergmann",
  2325 + "email": "sebastian@phpunit.de"
  2326 + }
  2327 + ],
  2328 + "description": "Allows reflection of object attributes, including inherited and non-public ones",
  2329 + "homepage": "https://github.com/sebastianbergmann/object-reflector/",
  2330 + "time": "2018-05-15T05:50:44+00:00"
  2331 + },
  2332 + {
  2333 + "name": "sebastian/recursion-context",
  2334 + "version": "dev-master",
  2335 + "source": {
  2336 + "type": "git",
  2337 + "url": "https://github.com/sebastianbergmann/recursion-context.git",
  2338 + "reference": "dbe1869c13935c6080c834fc61424834b9ad5907"
  2339 + },
  2340 + "dist": {
  2341 + "type": "zip",
  2342 + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/dbe1869c13935c6080c834fc61424834b9ad5907",
  2343 + "reference": "dbe1869c13935c6080c834fc61424834b9ad5907",
  2344 + "shasum": ""
  2345 + },
  2346 + "require": {
  2347 + "php": "^7.0"
  2348 + },
  2349 + "require-dev": {
  2350 + "phpunit/phpunit": "^6.0"
  2351 + },
  2352 + "type": "library",
  2353 + "extra": {
  2354 + "branch-alias": {
  2355 + "dev-master": "3.0.x-dev"
  2356 + }
  2357 + },
  2358 + "autoload": {
  2359 + "classmap": [
  2360 + "src/"
  2361 + ]
  2362 + },
  2363 + "notification-url": "https://packagist.org/downloads/",
  2364 + "license": [
  2365 + "BSD-3-Clause"
  2366 + ],
  2367 + "authors": [
  2368 + {
  2369 + "name": "Jeff Welch",
  2370 + "email": "whatthejeff@gmail.com"
  2371 + },
  2372 + {
  2373 + "name": "Sebastian Bergmann",
  2374 + "email": "sebastian@phpunit.de"
  2375 + },
  2376 + {
  2377 + "name": "Adam Harvey",
  2378 + "email": "aharvey@php.net"
  2379 + }
  2380 + ],
  2381 + "description": "Provides functionality to recursively process PHP variables",
  2382 + "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
  2383 + "time": "2018-05-15T05:52:05+00:00"
  2384 + },
  2385 + {
  2386 + "name": "sebastian/resource-operations",
  2387 + "version": "dev-master",
  2388 + "source": {
  2389 + "type": "git",
  2390 + "url": "https://github.com/sebastianbergmann/resource-operations.git",
  2391 + "reference": "0f9911fea026d9737c9b357ddda0916ea3beaf1d"
  2392 + },
  2393 + "dist": {
  2394 + "type": "zip",
  2395 + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f9911fea026d9737c9b357ddda0916ea3beaf1d",
  2396 + "reference": "0f9911fea026d9737c9b357ddda0916ea3beaf1d",
  2397 + "shasum": ""
  2398 + },
  2399 + "require": {
  2400 + "php": ">=5.6.0"
  2401 + },
  2402 + "type": "library",
  2403 + "extra": {
  2404 + "branch-alias": {
  2405 + "dev-master": "1.0.x-dev"
  2406 + }
  2407 + },
  2408 + "autoload": {
  2409 + "classmap": [
  2410 + "src/"
  2411 + ]
  2412 + },
  2413 + "notification-url": "https://packagist.org/downloads/",
  2414 + "license": [
  2415 + "BSD-3-Clause"
  2416 + ],
  2417 + "authors": [
  2418 + {
  2419 + "name": "Sebastian Bergmann",
  2420 + "email": "sebastian@phpunit.de"
  2421 + }
  2422 + ],
  2423 + "description": "Provides a list of PHP built-in functions that operate on resources",
  2424 + "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
  2425 + "time": "2018-05-15T05:53:02+00:00"
  2426 + },
  2427 + {
  2428 + "name": "sebastian/version",
  2429 + "version": "2.0.1",
  2430 + "source": {
  2431 + "type": "git",
  2432 + "url": "https://github.com/sebastianbergmann/version.git",
  2433 + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
  2434 + },
  2435 + "dist": {
  2436 + "type": "zip",
  2437 + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
  2438 + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
  2439 + "shasum": ""
  2440 + },
  2441 + "require": {
  2442 + "php": ">=5.6"
  2443 + },
  2444 + "type": "library",
  2445 + "extra": {
  2446 + "branch-alias": {
  2447 + "dev-master": "2.0.x-dev"
  2448 + }
  2449 + },
  2450 + "autoload": {
  2451 + "classmap": [
  2452 + "src/"
  2453 + ]
  2454 + },
  2455 + "notification-url": "https://packagist.org/downloads/",
  2456 + "license": [
  2457 + "BSD-3-Clause"
  2458 + ],
  2459 + "authors": [
  2460 + {
  2461 + "name": "Sebastian Bergmann",
  2462 + "email": "sebastian@phpunit.de",
  2463 + "role": "lead"
  2464 + }
  2465 + ],
  2466 + "description": "Library that helps with managing the version number of Git-hosted PHP projects",
  2467 + "homepage": "https://github.com/sebastianbergmann/version",
  2468 + "time": "2016-10-03T07:35:21+00:00"
  2469 + },
  2470 + {
  2471 + "name": "symfony/browser-kit",
  2472 + "version": "dev-master",
  2473 + "source": {
  2474 + "type": "git",
  2475 + "url": "https://github.com/symfony/browser-kit.git",
  2476 + "reference": "e419ab2b17167dfd1ad319ea4bbb3097b9458112"
  2477 + },
  2478 + "dist": {
  2479 + "type": "zip",
  2480 + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e419ab2b17167dfd1ad319ea4bbb3097b9458112",
  2481 + "reference": "e419ab2b17167dfd1ad319ea4bbb3097b9458112",
  2482 + "shasum": ""
  2483 + },
  2484 + "require": {
  2485 + "php": "^7.1.3",
  2486 + "symfony/dom-crawler": "~3.4|~4.0"
  2487 + },
  2488 + "require-dev": {
  2489 + "symfony/css-selector": "~3.4|~4.0",
  2490 + "symfony/process": "~3.4|~4.0"
  2491 + },
  2492 + "suggest": {
  2493 + "symfony/process": ""
  2494 + },
  2495 + "type": "library",
  2496 + "extra": {
  2497 + "branch-alias": {
  2498 + "dev-master": "4.2-dev"
  2499 + }
  2500 + },
  2501 + "autoload": {
  2502 + "psr-4": {
  2503 + "Symfony\\Component\\BrowserKit\\": ""
  2504 + },
  2505 + "exclude-from-classmap": [
  2506 + "/Tests/"
  2507 + ]
  2508 + },
  2509 + "notification-url": "https://packagist.org/downloads/",
  2510 + "license": [
  2511 + "MIT"
  2512 + ],
  2513 + "authors": [
  2514 + {
  2515 + "name": "Fabien Potencier",
  2516 + "email": "fabien@symfony.com"
  2517 + },
  2518 + {
  2519 + "name": "Symfony Community",
  2520 + "homepage": "https://symfony.com/contributors"
  2521 + }
  2522 + ],
  2523 + "description": "Symfony BrowserKit Component",
  2524 + "homepage": "https://symfony.com",
  2525 + "time": "2018-05-18T01:41:27+00:00"
  2526 + },
  2527 + {
  2528 + "name": "symfony/console",
  2529 + "version": "dev-master",
  2530 + "source": {
  2531 + "type": "git",
  2532 + "url": "https://github.com/symfony/console.git",
  2533 + "reference": "04173e19f71445fa9eada6db05f242b57c5b849b"
  2534 + },
  2535 + "dist": {
  2536 + "type": "zip",
  2537 + "url": "https://api.github.com/repos/symfony/console/zipball/04173e19f71445fa9eada6db05f242b57c5b849b",
  2538 + "reference": "04173e19f71445fa9eada6db05f242b57c5b849b",
  2539 + "shasum": ""
  2540 + },
  2541 + "require": {
  2542 + "php": "^7.1.3",
  2543 + "symfony/polyfill-mbstring": "~1.0"
  2544 + },
  2545 + "conflict": {
  2546 + "symfony/dependency-injection": "<3.4",
  2547 + "symfony/process": "<3.3"
  2548 + },
  2549 + "require-dev": {
  2550 + "psr/log": "~1.0",
  2551 + "symfony/config": "~3.4|~4.0",
  2552 + "symfony/dependency-injection": "~3.4|~4.0",
  2553 + "symfony/event-dispatcher": "~3.4|~4.0",
  2554 + "symfony/lock": "~3.4|~4.0",
  2555 + "symfony/process": "~3.4|~4.0"
  2556 + },
  2557 + "suggest": {
  2558 + "psr/log-implementation": "For using the console logger",
  2559 + "symfony/event-dispatcher": "",
  2560 + "symfony/lock": "",
  2561 + "symfony/process": ""
  2562 + },
  2563 + "type": "library",
  2564 + "extra": {
  2565 + "branch-alias": {
  2566 + "dev-master": "4.2-dev"
  2567 + }
  2568 + },
  2569 + "autoload": {
  2570 + "psr-4": {
  2571 + "Symfony\\Component\\Console\\": ""
  2572 + },
  2573 + "exclude-from-classmap": [
  2574 + "/Tests/"
  2575 + ]
  2576 + },
  2577 + "notification-url": "https://packagist.org/downloads/",
  2578 + "license": [
  2579 + "MIT"
  2580 + ],
  2581 + "authors": [
  2582 + {
  2583 + "name": "Fabien Potencier",
  2584 + "email": "fabien@symfony.com"
  2585 + },
  2586 + {
  2587 + "name": "Symfony Community",
  2588 + "homepage": "https://symfony.com/contributors"
  2589 + }
  2590 + ],
  2591 + "description": "Symfony Console Component",
  2592 + "homepage": "https://symfony.com",
  2593 + "time": "2018-05-16T14:42:13+00:00"
  2594 + },
  2595 + {
  2596 + "name": "symfony/css-selector",
  2597 + "version": "dev-master",
  2598 + "source": {
  2599 + "type": "git",
  2600 + "url": "https://github.com/symfony/css-selector.git",
  2601 + "reference": "7c36bc0c859a0bc3a7407522bf6b4c005a431f3e"
  2602 + },
  2603 + "dist": {
  2604 + "type": "zip",
  2605 + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7c36bc0c859a0bc3a7407522bf6b4c005a431f3e",
  2606 + "reference": "7c36bc0c859a0bc3a7407522bf6b4c005a431f3e",
  2607 + "shasum": ""
  2608 + },
  2609 + "require": {
  2610 + "php": "^7.1.3"
  2611 + },
  2612 + "type": "library",
  2613 + "extra": {
  2614 + "branch-alias": {
  2615 + "dev-master": "4.2-dev"
  2616 + }
  2617 + },
  2618 + "autoload": {
  2619 + "psr-4": {
  2620 + "Symfony\\Component\\CssSelector\\": ""
  2621 + },
  2622 + "exclude-from-classmap": [
  2623 + "/Tests/"
  2624 + ]
  2625 + },
  2626 + "notification-url": "https://packagist.org/downloads/",
  2627 + "license": [
  2628 + "MIT"
  2629 + ],
  2630 + "authors": [
  2631 + {
  2632 + "name": "Jean-François Simon",
  2633 + "email": "jeanfrancois.simon@sensiolabs.com"
  2634 + },
  2635 + {
  2636 + "name": "Fabien Potencier",
  2637 + "email": "fabien@symfony.com"
  2638 + },
  2639 + {
  2640 + "name": "Symfony Community",
  2641 + "homepage": "https://symfony.com/contributors"
  2642 + }
  2643 + ],
  2644 + "description": "Symfony CssSelector Component",
  2645 + "homepage": "https://symfony.com",
  2646 + "time": "2018-05-16T14:42:13+00:00"
  2647 + },
  2648 + {
  2649 + "name": "symfony/dom-crawler",
  2650 + "version": "dev-master",
  2651 + "source": {
  2652 + "type": "git",
  2653 + "url": "https://github.com/symfony/dom-crawler.git",
  2654 + "reference": "f9cae86c8f7ed57554c9b68fd6776ac641055b93"
  2655 + },
  2656 + "dist": {
  2657 + "type": "zip",
  2658 + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/f9cae86c8f7ed57554c9b68fd6776ac641055b93",
  2659 + "reference": "f9cae86c8f7ed57554c9b68fd6776ac641055b93",
  2660 + "shasum": ""
  2661 + },
  2662 + "require": {
  2663 + "php": "^7.1.3",
  2664 + "symfony/polyfill-ctype": "~1.8",
  2665 + "symfony/polyfill-mbstring": "~1.0"
  2666 + },
  2667 + "require-dev": {
  2668 + "symfony/css-selector": "~3.4|~4.0"
  2669 + },
  2670 + "suggest": {
  2671 + "symfony/css-selector": ""
  2672 + },
  2673 + "type": "library",
  2674 + "extra": {
  2675 + "branch-alias": {
  2676 + "dev-master": "4.2-dev"
  2677 + }
  2678 + },
  2679 + "autoload": {
  2680 + "psr-4": {
  2681 + "Symfony\\Component\\DomCrawler\\": ""
  2682 + },
  2683 + "exclude-from-classmap": [
  2684 + "/Tests/"
  2685 + ]
  2686 + },
  2687 + "notification-url": "https://packagist.org/downloads/",
  2688 + "license": [
  2689 + "MIT"
  2690 + ],
  2691 + "authors": [
  2692 + {
  2693 + "name": "Fabien Potencier",
  2694 + "email": "fabien@symfony.com"
  2695 + },
  2696 + {
  2697 + "name": "Symfony Community",
  2698 + "homepage": "https://symfony.com/contributors"
  2699 + }
  2700 + ],
  2701 + "description": "Symfony DomCrawler Component",
  2702 + "homepage": "https://symfony.com",
  2703 + "time": "2018-05-07T14:51:25+00:00"
  2704 + },
  2705 + {
  2706 + "name": "symfony/event-dispatcher",
  2707 + "version": "dev-master",
  2708 + "source": {
  2709 + "type": "git",
  2710 + "url": "https://github.com/symfony/event-dispatcher.git",
  2711 + "reference": "7edfcd9670ce9dd7450333f281d61f487f403aff"
  2712 + },
  2713 + "dist": {
  2714 + "type": "zip",
  2715 + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7edfcd9670ce9dd7450333f281d61f487f403aff",
  2716 + "reference": "7edfcd9670ce9dd7450333f281d61f487f403aff",
  2717 + "shasum": ""
  2718 + },
  2719 + "require": {
  2720 + "php": "^7.1.3"
  2721 + },
  2722 + "conflict": {
  2723 + "symfony/dependency-injection": "<3.4"
  2724 + },
  2725 + "require-dev": {
  2726 + "psr/log": "~1.0",
  2727 + "symfony/config": "~3.4|~4.0",
  2728 + "symfony/dependency-injection": "~3.4|~4.0",
  2729 + "symfony/expression-language": "~3.4|~4.0",
  2730 + "symfony/stopwatch": "~3.4|~4.0"
  2731 + },
  2732 + "suggest": {
  2733 + "symfony/dependency-injection": "",
  2734 + "symfony/http-kernel": ""
  2735 + },
  2736 + "type": "library",
  2737 + "extra": {
  2738 + "branch-alias": {
  2739 + "dev-master": "4.2-dev"
  2740 + }
  2741 + },
  2742 + "autoload": {
  2743 + "psr-4": {
  2744 + "Symfony\\Component\\EventDispatcher\\": ""
  2745 + },
  2746 + "exclude-from-classmap": [
  2747 + "/Tests/"
  2748 + ]
  2749 + },
  2750 + "notification-url": "https://packagist.org/downloads/",
  2751 + "license": [
  2752 + "MIT"
  2753 + ],
  2754 + "authors": [
  2755 + {
  2756 + "name": "Fabien Potencier",
  2757 + "email": "fabien@symfony.com"
  2758 + },
  2759 + {
  2760 + "name": "Symfony Community",
  2761 + "homepage": "https://symfony.com/contributors"
  2762 + }
  2763 + ],
  2764 + "description": "Symfony EventDispatcher Component",
  2765 + "homepage": "https://symfony.com",
  2766 + "time": "2018-05-07T14:51:25+00:00"
  2767 + },
  2768 + {
  2769 + "name": "symfony/finder",
  2770 + "version": "dev-master",
  2771 + "source": {
  2772 + "type": "git",
  2773 + "url": "https://github.com/symfony/finder.git",
  2774 + "reference": "c1f37edd31fc56312f5912e4322b2a16f5e12ef3"
  2775 + },
  2776 + "dist": {
  2777 + "type": "zip",
  2778 + "url": "https://api.github.com/repos/symfony/finder/zipball/c1f37edd31fc56312f5912e4322b2a16f5e12ef3",
  2779 + "reference": "c1f37edd31fc56312f5912e4322b2a16f5e12ef3",
  2780 + "shasum": ""
  2781 + },
  2782 + "require": {
  2783 + "php": "^7.1.3"
  2784 + },
  2785 + "type": "library",
  2786 + "extra": {
  2787 + "branch-alias": {
  2788 + "dev-master": "4.2-dev"
  2789 + }
  2790 + },
  2791 + "autoload": {
  2792 + "psr-4": {
  2793 + "Symfony\\Component\\Finder\\": ""
  2794 + },
  2795 + "exclude-from-classmap": [
  2796 + "/Tests/"
  2797 + ]
  2798 + },
  2799 + "notification-url": "https://packagist.org/downloads/",
  2800 + "license": [
  2801 + "MIT"
  2802 + ],
  2803 + "authors": [
  2804 + {
  2805 + "name": "Fabien Potencier",
  2806 + "email": "fabien@symfony.com"
  2807 + },
  2808 + {
  2809 + "name": "Symfony Community",
  2810 + "homepage": "https://symfony.com/contributors"
  2811 + }
  2812 + ],
  2813 + "description": "Symfony Finder Component",
  2814 + "homepage": "https://symfony.com",
  2815 + "time": "2018-05-16T14:42:13+00:00"
  2816 + },
  2817 + {
  2818 + "name": "symfony/polyfill-ctype",
  2819 + "version": "dev-master",
  2820 + "source": {
  2821 + "type": "git",
  2822 + "url": "https://github.com/symfony/polyfill-ctype.git",
  2823 + "reference": "9d31bef82d2e9b033f335d60b96611757f98c605"
  2824 + },
  2825 + "dist": {
  2826 + "type": "zip",
  2827 + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/9d31bef82d2e9b033f335d60b96611757f98c605",
  2828 + "reference": "9d31bef82d2e9b033f335d60b96611757f98c605",
  2829 + "shasum": ""
  2830 + },
  2831 + "require": {
  2832 + "php": ">=5.3.3"
  2833 + },
  2834 + "suggest": {
  2835 + "ext-ctype": "For best performance"
  2836 + },
  2837 + "type": "library",
  2838 + "extra": {
  2839 + "branch-alias": {
  2840 + "dev-master": "1.8-dev"
  2841 + }
  2842 + },
  2843 + "autoload": {
  2844 + "psr-4": {
  2845 + "Symfony\\Polyfill\\Ctype\\": ""
  2846 + },
  2847 + "files": [
  2848 + "bootstrap.php"
  2849 + ]
  2850 + },
  2851 + "notification-url": "https://packagist.org/downloads/",
  2852 + "license": [
  2853 + "MIT"
  2854 + ],
  2855 + "authors": [
  2856 + {
  2857 + "name": "Symfony Community",
  2858 + "homepage": "https://symfony.com/contributors"
  2859 + },
  2860 + {
  2861 + "name": "Gert de Pagter",
  2862 + "email": "BackEndTea@gmail.com"
  2863 + }
  2864 + ],
  2865 + "description": "Symfony polyfill for ctype functions",
  2866 + "homepage": "https://symfony.com",
  2867 + "keywords": [
  2868 + "compatibility",
  2869 + "ctype",
  2870 + "polyfill",
  2871 + "portable"
  2872 + ],
  2873 + "time": "2018-05-17T18:32:56+00:00"
  2874 + },
  2875 + {
  2876 + "name": "symfony/polyfill-mbstring",
  2877 + "version": "dev-master",
  2878 + "source": {
  2879 + "type": "git",
  2880 + "url": "https://github.com/symfony/polyfill-mbstring.git",
  2881 + "reference": "3296adf6a6454a050679cde90f95350ad604b171"
  2882 + },
  2883 + "dist": {
  2884 + "type": "zip",
  2885 + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171",
  2886 + "reference": "3296adf6a6454a050679cde90f95350ad604b171",
  2887 + "shasum": ""
  2888 + },
  2889 + "require": {
  2890 + "php": ">=5.3.3"
  2891 + },
  2892 + "suggest": {
  2893 + "ext-mbstring": "For best performance"
  2894 + },
  2895 + "type": "library",
  2896 + "extra": {
  2897 + "branch-alias": {
  2898 + "dev-master": "1.8-dev"
  2899 + }
  2900 + },
  2901 + "autoload": {
  2902 + "psr-4": {
  2903 + "Symfony\\Polyfill\\Mbstring\\": ""
  2904 + },
  2905 + "files": [
  2906 + "bootstrap.php"
  2907 + ]
  2908 + },
  2909 + "notification-url": "https://packagist.org/downloads/",
  2910 + "license": [
  2911 + "MIT"
  2912 + ],
  2913 + "authors": [
  2914 + {
  2915 + "name": "Nicolas Grekas",
  2916 + "email": "p@tchwork.com"
  2917 + },
  2918 + {
  2919 + "name": "Symfony Community",
  2920 + "homepage": "https://symfony.com/contributors"
  2921 + }
  2922 + ],
  2923 + "description": "Symfony polyfill for the Mbstring extension",
  2924 + "homepage": "https://symfony.com",
  2925 + "keywords": [
  2926 + "compatibility",
  2927 + "mbstring",
  2928 + "polyfill",
  2929 + "portable",
  2930 + "shim"
  2931 + ],
  2932 + "time": "2018-04-26T10:06:28+00:00"
  2933 + },
  2934 + {
  2935 + "name": "symfony/yaml",
  2936 + "version": "dev-master",
  2937 + "source": {
  2938 + "type": "git",
  2939 + "url": "https://github.com/symfony/yaml.git",
  2940 + "reference": "55f138b02455b1053070e9a17be7915882c459bd"
  2941 + },
  2942 + "dist": {
  2943 + "type": "zip",
  2944 + "url": "https://api.github.com/repos/symfony/yaml/zipball/55f138b02455b1053070e9a17be7915882c459bd",
  2945 + "reference": "55f138b02455b1053070e9a17be7915882c459bd",
  2946 + "shasum": ""
  2947 + },
  2948 + "require": {
  2949 + "php": "^7.1.3",
  2950 + "symfony/polyfill-ctype": "~1.8"
  2951 + },
  2952 + "conflict": {
  2953 + "symfony/console": "<3.4"
  2954 + },
  2955 + "require-dev": {
  2956 + "symfony/console": "~3.4|~4.0"
  2957 + },
  2958 + "suggest": {
  2959 + "symfony/console": "For validating YAML files using the lint command"
  2960 + },
  2961 + "type": "library",
  2962 + "extra": {
  2963 + "branch-alias": {
  2964 + "dev-master": "4.2-dev"
  2965 + }
  2966 + },
  2967 + "autoload": {
  2968 + "psr-4": {
  2969 + "Symfony\\Component\\Yaml\\": ""
  2970 + },
  2971 + "exclude-from-classmap": [
  2972 + "/Tests/"
  2973 + ]
  2974 + },
  2975 + "notification-url": "https://packagist.org/downloads/",
  2976 + "license": [
  2977 + "MIT"
  2978 + ],
  2979 + "authors": [
  2980 + {
  2981 + "name": "Fabien Potencier",
  2982 + "email": "fabien@symfony.com"
  2983 + },
  2984 + {
  2985 + "name": "Symfony Community",
  2986 + "homepage": "https://symfony.com/contributors"
  2987 + }
  2988 + ],
  2989 + "description": "Symfony Yaml Component",
  2990 + "homepage": "https://symfony.com",
  2991 + "time": "2018-05-07T14:51:25+00:00"
  2992 + },
  2993 + {
  2994 + "name": "theseer/tokenizer",
  2995 + "version": "1.1.0",
  2996 + "source": {
  2997 + "type": "git",
  2998 + "url": "https://github.com/theseer/tokenizer.git",
  2999 + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
  3000 + },
  3001 + "dist": {
  3002 + "type": "zip",
  3003 + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b",
  3004 + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
  3005 + "shasum": ""
  3006 + },
  3007 + "require": {
  3008 + "ext-dom": "*",
  3009 + "ext-tokenizer": "*",
  3010 + "ext-xmlwriter": "*",
  3011 + "php": "^7.0"
  3012 + },
  3013 + "type": "library",
  3014 + "autoload": {
  3015 + "classmap": [
  3016 + "src/"
  3017 + ]
  3018 + },
  3019 + "notification-url": "https://packagist.org/downloads/",
  3020 + "license": [
  3021 + "BSD-3-Clause"
  3022 + ],
  3023 + "authors": [
  3024 + {
  3025 + "name": "Arne Blankerts",
  3026 + "email": "arne@blankerts.de",
  3027 + "role": "Developer"
  3028 + }
  3029 + ],
  3030 + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
  3031 + "time": "2017-04-07T12:08:54+00:00"
  3032 + },
  3033 + {
  3034 + "name": "webmozart/assert",
  3035 + "version": "dev-master",
  3036 + "source": {
  3037 + "type": "git",
  3038 + "url": "https://github.com/webmozart/assert.git",
  3039 + "reference": "23bf61bc8a7cc229d7ce8689b1bf818a9e192cac"
  3040 + },
  3041 + "dist": {
  3042 + "type": "zip",
  3043 + "url": "https://api.github.com/repos/webmozart/assert/zipball/23bf61bc8a7cc229d7ce8689b1bf818a9e192cac",
  3044 + "reference": "23bf61bc8a7cc229d7ce8689b1bf818a9e192cac",
  3045 + "shasum": ""
  3046 + },
  3047 + "require": {
  3048 + "php": "^5.3.3 || ^7.0"
  3049 + },
  3050 + "require-dev": {
  3051 + "phpunit/phpunit": "^4.6",
  3052 + "sebastian/version": "^1.0.1"
  3053 + },
  3054 + "type": "library",
  3055 + "extra": {
  3056 + "branch-alias": {
  3057 + "dev-master": "1.3-dev"
  3058 + }
  3059 + },
  3060 + "autoload": {
  3061 + "psr-4": {
  3062 + "Webmozart\\Assert\\": "src/"
  3063 + }
  3064 + },
  3065 + "notification-url": "https://packagist.org/downloads/",
  3066 + "license": [
  3067 + "MIT"
  3068 + ],
  3069 + "authors": [
  3070 + {
  3071 + "name": "Bernhard Schussek",
  3072 + "email": "bschussek@gmail.com"
  3073 + }
  3074 + ],
  3075 + "description": "Assertions to validate method input/output with nice error messages.",
  3076 + "keywords": [
  3077 + "assert",
  3078 + "check",
  3079 + "validate"
  3080 + ],
  3081 + "time": "2018-04-19T15:46:26+00:00"
  3082 + },
  3083 + {
  3084 + "name": "yiisoft/yii2-debug",
  3085 + "version": "dev-master",
  3086 + "source": {
  3087 + "type": "git",
  3088 + "url": "https://github.com/yiisoft/yii2-debug.git",
  3089 + "reference": "9634019f7f9590943427d0bafe6a40da3143ac43"
  3090 + },
  3091 + "dist": {
  3092 + "type": "zip",
  3093 + "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/9634019f7f9590943427d0bafe6a40da3143ac43",
  3094 + "reference": "9634019f7f9590943427d0bafe6a40da3143ac43",
  3095 + "shasum": ""
  3096 + },
  3097 + "require": {
  3098 + "yiisoft/yii2": "~2.0.13",
  3099 + "yiisoft/yii2-bootstrap": "~2.0.0"
  3100 + },
  3101 + "type": "yii2-extension",
  3102 + "extra": {
  3103 + "branch-alias": {
  3104 + "dev-master": "2.0.x-dev"
  3105 + }
  3106 + },
  3107 + "autoload": {
  3108 + "psr-4": {
  3109 + "yii\\debug\\": "src"
  3110 + }
  3111 + },
  3112 + "notification-url": "https://packagist.org/downloads/",
  3113 + "license": [
  3114 + "BSD-3-Clause"
  3115 + ],
  3116 + "authors": [
  3117 + {
  3118 + "name": "Qiang Xue",
  3119 + "email": "qiang.xue@gmail.com"
  3120 + }
  3121 + ],
  3122 + "description": "The debugger extension for the Yii framework",
  3123 + "keywords": [
  3124 + "debug",
  3125 + "debugger",
  3126 + "yii2"
  3127 + ],
  3128 + "time": "2018-05-12T18:29:46+00:00"
  3129 + },
  3130 + {
  3131 + "name": "yiisoft/yii2-faker",
  3132 + "version": "dev-master",
  3133 + "source": {
  3134 + "type": "git",
  3135 + "url": "https://github.com/yiisoft/yii2-faker.git",
  3136 + "reference": "4d04c58da24f8b0f0745d4f7608398d4428edfe7"
  3137 + },
  3138 + "dist": {
  3139 + "type": "zip",
  3140 + "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/4d04c58da24f8b0f0745d4f7608398d4428edfe7",
  3141 + "reference": "4d04c58da24f8b0f0745d4f7608398d4428edfe7",
  3142 + "shasum": ""
  3143 + },
  3144 + "require": {
  3145 + "fzaninotto/faker": "~1.4",
  3146 + "yiisoft/yii2": "~2.0.0"
  3147 + },
  3148 + "type": "yii2-extension",
  3149 + "extra": {
  3150 + "branch-alias": {
  3151 + "dev-master": "2.0.x-dev"
  3152 + }
  3153 + },
  3154 + "autoload": {
  3155 + "psr-4": {
  3156 + "yii\\faker\\": "src"
  3157 + }
  3158 + },
  3159 + "notification-url": "https://packagist.org/downloads/",
  3160 + "license": [
  3161 + "BSD-3-Clause"
  3162 + ],
  3163 + "authors": [
  3164 + {
  3165 + "name": "Mark Jebri",
  3166 + "email": "mark.github@yandex.ru"
  3167 + }
  3168 + ],
  3169 + "description": "Fixture generator. The Faker integration for the Yii framework.",
  3170 + "keywords": [
  3171 + "Fixture",
  3172 + "faker",
  3173 + "yii2"
  3174 + ],
  3175 + "time": "2018-05-04T06:55:41+00:00"
  3176 + },
  3177 + {
  3178 + "name": "yiisoft/yii2-gii",
  3179 + "version": "dev-master",
  3180 + "source": {
  3181 + "type": "git",
  3182 + "url": "https://github.com/yiisoft/yii2-gii.git",
  3183 + "reference": "c54431694e605dab8fa2bb0e84dc34b8dec2377f"
  3184 + },
  3185 + "dist": {
  3186 + "type": "zip",
  3187 + "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/c54431694e605dab8fa2bb0e84dc34b8dec2377f",
  3188 + "reference": "c54431694e605dab8fa2bb0e84dc34b8dec2377f",
  3189 + "shasum": ""
  3190 + },
  3191 + "require": {
  3192 + "bower-asset/typeahead.js": "0.10.* | ~0.11.0",
  3193 + "phpspec/php-diff": ">=1.0.2",
  3194 + "yiisoft/yii2": "~2.0.14",
  3195 + "yiisoft/yii2-bootstrap": "~2.0.0"
  3196 + },
  3197 + "type": "yii2-extension",
  3198 + "extra": {
  3199 + "branch-alias": {
  3200 + "dev-master": "2.0.x-dev"
  3201 + }
  3202 + },
  3203 + "autoload": {
  3204 + "psr-4": {
  3205 + "yii\\gii\\": "src"
  3206 + }
  3207 + },
  3208 + "notification-url": "https://packagist.org/downloads/",
  3209 + "license": [
  3210 + "BSD-3-Clause"
  3211 + ],
  3212 + "authors": [
  3213 + {
  3214 + "name": "Qiang Xue",
  3215 + "email": "qiang.xue@gmail.com"
  3216 + }
  3217 + ],
  3218 + "description": "The Gii extension for the Yii framework",
  3219 + "keywords": [
  3220 + "code generator",
  3221 + "gii",
  3222 + "yii2"
  3223 + ],
  3224 + "time": "2018-05-22T11:51:18+00:00"
  3225 + }
  3226 + ],
  3227 + "aliases": [],
  3228 + "minimum-stability": "dev",
  3229 + "stability-flags": [],
  3230 + "prefer-stable": false,
  3231 + "prefer-lowest": false,
  3232 + "platform": {
  3233 + "php": ">=5.4.0"
  3234 + },
  3235 + "platform-dev": []
  3236 +}
... ...
config/console.php 0 → 100644
  1 +++ a/config/console.php
  1 +<?php
  2 +
  3 +$params = require __DIR__ . '/params.php';
  4 +$db = require __DIR__ . '/db.php';
  5 +
  6 +$config = [
  7 + 'id' => 'basic-console',
  8 + 'basePath' => dirname(__DIR__),
  9 + 'bootstrap' => ['log'],
  10 + 'controllerNamespace' => 'app\commands',
  11 + 'aliases' => [
  12 + '@bower' => '@vendor/bower-asset',
  13 + '@npm' => '@vendor/npm-asset',
  14 + '@tests' => '@app/tests',
  15 + ],
  16 + 'components' => [
  17 + 'cache' => [
  18 + 'class' => 'yii\caching\FileCache',
  19 + ],
  20 + 'log' => [
  21 + 'targets' => [
  22 + [
  23 + 'class' => 'yii\log\FileTarget',
  24 + 'levels' => ['error', 'warning'],
  25 + ],
  26 + ],
  27 + ],
  28 + 'db' => $db,
  29 + ],
  30 + 'params' => $params,
  31 + /*
  32 + 'controllerMap' => [
  33 + 'fixture' => [ // Fixture generation command line.
  34 + 'class' => 'yii\faker\FixtureController',
  35 + ],
  36 + ],
  37 + */
  38 +];
  39 +
  40 +if (YII_ENV_DEV) {
  41 + // configuration adjustments for 'dev' environment
  42 + $config['bootstrap'][] = 'gii';
  43 + $config['modules']['gii'] = [
  44 + 'class' => 'yii\gii\Module',
  45 + ];
  46 +}
  47 +
  48 +return $config;
... ...
config/db.php 0 → 100644
  1 +++ a/config/db.php
  1 +<?php
  2 +
  3 +return [
  4 + 'class' => 'yii\db\Connection',
  5 + 'dsn' => 'mysql:host=localhost;dbname=yii2basic',
  6 + 'username' => 'root',
  7 + 'password' => '',
  8 + 'charset' => 'utf8',
  9 +
  10 + // Schema cache options (for production environment)
  11 + //'enableSchemaCache' => true,
  12 + //'schemaCacheDuration' => 60,
  13 + //'schemaCache' => 'cache',
  14 +];
... ...
config/params.php 0 → 100644
  1 +++ a/config/params.php
  1 +<?php
  2 +
  3 +return [
  4 + 'adminEmail' => 'admin@example.com',
  5 +];
... ...
config/test.php 0 → 100644
  1 +++ a/config/test.php
  1 +<?php
  2 +$params = require __DIR__ . '/params.php';
  3 +$db = require __DIR__ . '/test_db.php';
  4 +
  5 +/**
  6 + * Application configuration shared by all test types
  7 + */
  8 +return [
  9 + 'id' => 'basic-tests',
  10 + 'basePath' => dirname(__DIR__),
  11 + 'aliases' => [
  12 + '@bower' => '@vendor/bower-asset',
  13 + '@npm' => '@vendor/npm-asset',
  14 + ],
  15 + 'language' => 'en-US',
  16 + 'components' => [
  17 + 'db' => $db,
  18 + 'mailer' => [
  19 + 'useFileTransport' => true,
  20 + ],
  21 + 'assetManager' => [
  22 + 'basePath' => __DIR__ . '/../web/assets',
  23 + ],
  24 + 'urlManager' => [
  25 + 'showScriptName' => true,
  26 + ],
  27 + 'user' => [
  28 + 'identityClass' => 'app\models\User',
  29 + ],
  30 + 'request' => [
  31 + 'cookieValidationKey' => 'test',
  32 + 'enableCsrfValidation' => false,
  33 + // but if you absolutely need it set cookie domain to localhost
  34 + /*
  35 + 'csrfCookie' => [
  36 + 'domain' => 'localhost',
  37 + ],
  38 + */
  39 + ],
  40 + ],
  41 + 'params' => $params,
  42 +];
... ...
config/test_db.php 0 → 100644
  1 +++ a/config/test_db.php
  1 +<?php
  2 +$db = require __DIR__ . '/db.php';
  3 +// test database! Important not to run tests on production or development databases
  4 +$db['dsn'] = 'mysql:host=localhost;dbname=yii2_basic_tests';
  5 +
  6 +return $db;
... ...
config/web.php 0 → 100644
  1 +++ a/config/web.php
  1 +<?php
  2 +
  3 + $params = require __DIR__ . '/params.php';
  4 + $db = require __DIR__ . '/db.php';
  5 +
  6 + $config = [
  7 + 'id' => 'basic',
  8 + 'homeUrl' => '/',
  9 + 'basePath' => dirname(__DIR__),
  10 + 'bootstrap' => [ 'log' ],
  11 + 'aliases' => [
  12 + '@bower' => '@vendor/bower-asset',
  13 + '@npm' => '@vendor/npm-asset',
  14 + ],
  15 + 'components' => [
  16 + 'request' => [
  17 + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
  18 + 'cookieValidationKey' => 'Ss-uV-PyprNBSMTEEInjXR9ogP31Z8Gv',
  19 + 'baseUrl' => '/',
  20 + ],
  21 + 'cache' => [
  22 + 'class' => 'yii\caching\FileCache',
  23 + ],
  24 + 'user' => [
  25 + 'identityClass' => 'app\models\User',
  26 + 'enableAutoLogin' => true,
  27 + ],
  28 + 'errorHandler' => [
  29 + 'errorAction' => 'site/error',
  30 + ],
  31 + 'mailer' => [
  32 + 'class' => 'yii\swiftmailer\Mailer',
  33 + // send all mails to a file by default. You have to set
  34 + // 'useFileTransport' to false and configure a transport
  35 + // for the mailer to send real emails.
  36 + 'useFileTransport' => true,
  37 + ],
  38 + 'log' => [
  39 + 'traceLevel' => YII_DEBUG ? 3 : 0,
  40 + 'targets' => [
  41 + [
  42 + 'class' => 'yii\log\FileTarget',
  43 + 'levels' => [
  44 + 'error',
  45 + 'warning',
  46 + ],
  47 + ],
  48 + ],
  49 + ],
  50 + 'db' => $db,
  51 + /*
  52 + 'urlManager' => [
  53 + 'enablePrettyUrl' => true,
  54 + 'showScriptName' => false,
  55 + 'rules' => [
  56 + ],
  57 + ],
  58 + */
  59 + ],
  60 + 'params' => $params,
  61 + ];
  62 +
  63 + if (YII_ENV_DEV) {
  64 + // configuration adjustments for 'dev' environment
  65 + $config[ 'bootstrap' ][] = 'debug';
  66 + $config[ 'modules' ][ 'debug' ] = [
  67 + 'class' => 'yii\debug\Module',
  68 + // uncomment the following to add your IP if you are not connecting from localhost.
  69 + //'allowedIPs' => ['127.0.0.1', '::1'],
  70 + ];
  71 +
  72 + $config[ 'bootstrap' ][] = 'gii';
  73 + $config[ 'modules' ][ 'gii' ] = [
  74 + 'class' => 'yii\gii\Module',
  75 + // uncomment the following to add your IP if you are not connecting from localhost.
  76 + //'allowedIPs' => ['127.0.0.1', '::1'],
  77 + ];
  78 + }
  79 +
  80 + return $config;
... ...
controllers/SiteController.php 0 → 100644
  1 +++ a/controllers/SiteController.php
  1 +<?php
  2 +
  3 +namespace app\controllers;
  4 +
  5 +use Yii;
  6 +use yii\filters\AccessControl;
  7 +use yii\web\Controller;
  8 +use yii\web\Response;
  9 +use yii\filters\VerbFilter;
  10 +use app\models\LoginForm;
  11 +use app\models\ContactForm;
  12 +
  13 +class SiteController extends Controller
  14 +{
  15 + /**
  16 + * {@inheritdoc}
  17 + */
  18 + public function behaviors()
  19 + {
  20 + return [
  21 + 'access' => [
  22 + 'class' => AccessControl::className(),
  23 + 'only' => ['logout'],
  24 + 'rules' => [
  25 + [
  26 + 'actions' => ['logout'],
  27 + 'allow' => true,
  28 + 'roles' => ['@'],
  29 + ],
  30 + ],
  31 + ],
  32 + 'verbs' => [
  33 + 'class' => VerbFilter::className(),
  34 + 'actions' => [
  35 + 'logout' => ['post'],
  36 + ],
  37 + ],
  38 + ];
  39 + }
  40 +
  41 + /**
  42 + * {@inheritdoc}
  43 + */
  44 + public function actions()
  45 + {
  46 + return [
  47 + 'error' => [
  48 + 'class' => 'yii\web\ErrorAction',
  49 + ],
  50 + 'captcha' => [
  51 + 'class' => 'yii\captcha\CaptchaAction',
  52 + 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
  53 + ],
  54 + ];
  55 + }
  56 +
  57 + /**
  58 + * Displays homepage.
  59 + *
  60 + * @return string
  61 + */
  62 + public function actionIndex()
  63 + {
  64 + return $this->render('index');
  65 + }
  66 +
  67 + /**
  68 + * Login action.
  69 + *
  70 + * @return Response|string
  71 + */
  72 + public function actionLogin()
  73 + {
  74 + if (!Yii::$app->user->isGuest) {
  75 + return $this->goHome();
  76 + }
  77 +
  78 + $model = new LoginForm();
  79 + if ($model->load(Yii::$app->request->post()) && $model->login()) {
  80 + return $this->goBack();
  81 + }
  82 +
  83 + $model->password = '';
  84 + return $this->render('login', [
  85 + 'model' => $model,
  86 + ]);
  87 + }
  88 +
  89 + /**
  90 + * Logout action.
  91 + *
  92 + * @return Response
  93 + */
  94 + public function actionLogout()
  95 + {
  96 + Yii::$app->user->logout();
  97 +
  98 + return $this->goHome();
  99 + }
  100 +
  101 + /**
  102 + * Displays contact page.
  103 + *
  104 + * @return Response|string
  105 + */
  106 + public function actionContact()
  107 + {
  108 + $model = new ContactForm();
  109 + if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
  110 + Yii::$app->session->setFlash('contactFormSubmitted');
  111 +
  112 + return $this->refresh();
  113 + }
  114 + return $this->render('contact', [
  115 + 'model' => $model,
  116 + ]);
  117 + }
  118 +
  119 + /**
  120 + * Displays about page.
  121 + *
  122 + * @return string
  123 + */
  124 + public function actionAbout()
  125 + {
  126 + return $this->render('about');
  127 + }
  128 +}
... ...
docker-compose.yml 0 → 100644
  1 +++ a/docker-compose.yml
  1 +version: '2'
  2 +services:
  3 + php:
  4 + image: yiisoftware/yii2-php:7.1-apache
  5 + volumes:
  6 + - ~/.composer-docker/cache:/root/.composer/cache:delegated
  7 + - ./:/app:delegated
  8 + ports:
  9 + - '8000:80'
0 10 \ No newline at end of file
... ...
mail/layouts/html.php 0 → 100644
  1 +++ a/mail/layouts/html.php
  1 +<?php
  2 +use yii\helpers\Html;
  3 +
  4 +/* @var $this \yii\web\View view component instance */
  5 +/* @var $message \yii\mail\MessageInterface the message being composed */
  6 +/* @var $content string main view render result */
  7 +?>
  8 +<?php $this->beginPage() ?>
  9 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  10 +<html xmlns="http://www.w3.org/1999/xhtml">
  11 +<head>
  12 + <meta http-equiv="Content-Type" content="text/html; charset=<?= Yii::$app->charset ?>" />
  13 + <title><?= Html::encode($this->title) ?></title>
  14 + <?php $this->head() ?>
  15 +</head>
  16 +<body>
  17 + <?php $this->beginBody() ?>
  18 + <?= $content ?>
  19 + <?php $this->endBody() ?>
  20 +</body>
  21 +</html>
  22 +<?php $this->endPage() ?>
... ...
models/ContactForm.php 0 → 100644
  1 +++ a/models/ContactForm.php
  1 +<?php
  2 +
  3 +namespace app\models;
  4 +
  5 +use Yii;
  6 +use yii\base\Model;
  7 +
  8 +/**
  9 + * ContactForm is the model behind the contact form.
  10 + */
  11 +class ContactForm extends Model
  12 +{
  13 + public $name;
  14 + public $email;
  15 + public $subject;
  16 + public $body;
  17 + public $verifyCode;
  18 +
  19 +
  20 + /**
  21 + * @return array the validation rules.
  22 + */
  23 + public function rules()
  24 + {
  25 + return [
  26 + // name, email, subject and body are required
  27 + [['name', 'email', 'subject', 'body'], 'required'],
  28 + // email has to be a valid email address
  29 + ['email', 'email'],
  30 + // verifyCode needs to be entered correctly
  31 + ['verifyCode', 'captcha'],
  32 + ];
  33 + }
  34 +
  35 + /**
  36 + * @return array customized attribute labels
  37 + */
  38 + public function attributeLabels()
  39 + {
  40 + return [
  41 + 'verifyCode' => 'Verification Code',
  42 + ];
  43 + }
  44 +
  45 + /**
  46 + * Sends an email to the specified email address using the information collected by this model.
  47 + * @param string $email the target email address
  48 + * @return bool whether the model passes validation
  49 + */
  50 + public function contact($email)
  51 + {
  52 + if ($this->validate()) {
  53 + Yii::$app->mailer->compose()
  54 + ->setTo($email)
  55 + ->setFrom([$this->email => $this->name])
  56 + ->setSubject($this->subject)
  57 + ->setTextBody($this->body)
  58 + ->send();
  59 +
  60 + return true;
  61 + }
  62 + return false;
  63 + }
  64 +}
... ...
models/LoginForm.php 0 → 100644
  1 +++ a/models/LoginForm.php
  1 +<?php
  2 +
  3 +namespace app\models;
  4 +
  5 +use Yii;
  6 +use yii\base\Model;
  7 +
  8 +/**
  9 + * LoginForm is the model behind the login form.
  10 + *
  11 + * @property User|null $user This property is read-only.
  12 + *
  13 + */
  14 +class LoginForm extends Model
  15 +{
  16 + public $username;
  17 + public $password;
  18 + public $rememberMe = true;
  19 +
  20 + private $_user = false;
  21 +
  22 +
  23 + /**
  24 + * @return array the validation rules.
  25 + */
  26 + public function rules()
  27 + {
  28 + return [
  29 + // username and password are both required
  30 + [['username', 'password'], 'required'],
  31 + // rememberMe must be a boolean value
  32 + ['rememberMe', 'boolean'],
  33 + // password is validated by validatePassword()
  34 + ['password', 'validatePassword'],
  35 + ];
  36 + }
  37 +
  38 + /**
  39 + * Validates the password.
  40 + * This method serves as the inline validation for password.
  41 + *
  42 + * @param string $attribute the attribute currently being validated
  43 + * @param array $params the additional name-value pairs given in the rule
  44 + */
  45 + public function validatePassword($attribute, $params)
  46 + {
  47 + if (!$this->hasErrors()) {
  48 + $user = $this->getUser();
  49 +
  50 + if (!$user || !$user->validatePassword($this->password)) {
  51 + $this->addError($attribute, 'Incorrect username or password.');
  52 + }
  53 + }
  54 + }
  55 +
  56 + /**
  57 + * Logs in a user using the provided username and password.
  58 + * @return bool whether the user is logged in successfully
  59 + */
  60 + public function login()
  61 + {
  62 + if ($this->validate()) {
  63 + return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
  64 + }
  65 + return false;
  66 + }
  67 +
  68 + /**
  69 + * Finds user by [[username]]
  70 + *
  71 + * @return User|null
  72 + */
  73 + public function getUser()
  74 + {
  75 + if ($this->_user === false) {
  76 + $this->_user = User::findByUsername($this->username);
  77 + }
  78 +
  79 + return $this->_user;
  80 + }
  81 +}
... ...
models/User.php 0 → 100644
  1 +++ a/models/User.php
  1 +<?php
  2 +
  3 +namespace app\models;
  4 +
  5 +class User extends \yii\base\BaseObject implements \yii\web\IdentityInterface
  6 +{
  7 + public $id;
  8 + public $username;
  9 + public $password;
  10 + public $authKey;
  11 + public $accessToken;
  12 +
  13 + private static $users = [
  14 + '100' => [
  15 + 'id' => '100',
  16 + 'username' => 'admin',
  17 + 'password' => 'admin',
  18 + 'authKey' => 'test100key',
  19 + 'accessToken' => '100-token',
  20 + ],
  21 + '101' => [
  22 + 'id' => '101',
  23 + 'username' => 'demo',
  24 + 'password' => 'demo',
  25 + 'authKey' => 'test101key',
  26 + 'accessToken' => '101-token',
  27 + ],
  28 + ];
  29 +
  30 +
  31 + /**
  32 + * {@inheritdoc}
  33 + */
  34 + public static function findIdentity($id)
  35 + {
  36 + return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
  37 + }
  38 +
  39 + /**
  40 + * {@inheritdoc}
  41 + */
  42 + public static function findIdentityByAccessToken($token, $type = null)
  43 + {
  44 + foreach (self::$users as $user) {
  45 + if ($user['accessToken'] === $token) {
  46 + return new static($user);
  47 + }
  48 + }
  49 +
  50 + return null;
  51 + }
  52 +
  53 + /**
  54 + * Finds user by username
  55 + *
  56 + * @param string $username
  57 + * @return static|null
  58 + */
  59 + public static function findByUsername($username)
  60 + {
  61 + foreach (self::$users as $user) {
  62 + if (strcasecmp($user['username'], $username) === 0) {
  63 + return new static($user);
  64 + }
  65 + }
  66 +
  67 + return null;
  68 + }
  69 +
  70 + /**
  71 + * {@inheritdoc}
  72 + */
  73 + public function getId()
  74 + {
  75 + return $this->id;
  76 + }
  77 +
  78 + /**
  79 + * {@inheritdoc}
  80 + */
  81 + public function getAuthKey()
  82 + {
  83 + return $this->authKey;
  84 + }
  85 +
  86 + /**
  87 + * {@inheritdoc}
  88 + */
  89 + public function validateAuthKey($authKey)
  90 + {
  91 + return $this->authKey === $authKey;
  92 + }
  93 +
  94 + /**
  95 + * Validates password
  96 + *
  97 + * @param string $password password to validate
  98 + * @return bool if password provided is valid for current user
  99 + */
  100 + public function validatePassword($password)
  101 + {
  102 + return $this->password === $password;
  103 + }
  104 +}
... ...
requirements.php 0 → 100644
  1 +++ a/requirements.php
  1 +<?php
  2 +/**
  3 + * Application requirement checker script.
  4 + *
  5 + * In order to run this script use the following console command:
  6 + * php requirements.php
  7 + *
  8 + * In order to run this script from the web, you should copy it to the web root.
  9 + * If you are using Linux you can create a hard link instead, using the following command:
  10 + * ln ../requirements.php requirements.php
  11 + */
  12 +
  13 +// you may need to adjust this path to the correct Yii framework path
  14 +// uncomment and adjust the following line if Yii is not located at the default path
  15 +//$frameworkPath = dirname(__FILE__) . '/vendor/yiisoft/yii2';
  16 +
  17 +
  18 +if (!isset($frameworkPath)) {
  19 + $searchPaths = [
  20 + dirname(__FILE__) . '/vendor/yiisoft/yii2',
  21 + dirname(__FILE__) . '/../vendor/yiisoft/yii2',
  22 + ];
  23 + foreach($searchPaths as $path) {
  24 + if (is_dir($path)) {
  25 + $frameworkPath = $path;
  26 + break;
  27 + }
  28 + }
  29 +}
  30 +
  31 +if (!isset($frameworkPath) || !is_dir($frameworkPath)) {
  32 + $message = "<h1>Error</h1>\n\n"
  33 + . "<p><strong>The path to yii framework seems to be incorrect.</strong></p>\n"
  34 + . '<p>You need to install Yii framework via composer or adjust the framework path in file <abbr title="' . __FILE__ . '">' . basename(__FILE__) . "</abbr>.</p>\n"
  35 + . '<p>Please refer to the <abbr title="' . dirname(__FILE__) . "/README.md\">README</abbr> on how to install Yii.</p>\n";
  36 +
  37 + if (!empty($_SERVER['argv'])) {
  38 + // do not print HTML when used in console mode
  39 + echo strip_tags($message);
  40 + } else {
  41 + echo $message;
  42 + }
  43 + exit(1);
  44 +}
  45 +
  46 +require_once($frameworkPath . '/requirements/YiiRequirementChecker.php');
  47 +$requirementsChecker = new YiiRequirementChecker();
  48 +
  49 +$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.';
  50 +$gdOK = $imagickOK = false;
  51 +
  52 +if (extension_loaded('imagick')) {
  53 + $imagick = new Imagick();
  54 + $imagickFormats = $imagick->queryFormats('PNG');
  55 + if (in_array('PNG', $imagickFormats)) {
  56 + $imagickOK = true;
  57 + } else {
  58 + $imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.';
  59 + }
  60 +}
  61 +
  62 +if (extension_loaded('gd')) {
  63 + $gdInfo = gd_info();
  64 + if (!empty($gdInfo['FreeType Support'])) {
  65 + $gdOK = true;
  66 + } else {
  67 + $gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.';
  68 + }
  69 +}
  70 +
  71 +/**
  72 + * Adjust requirements according to your application specifics.
  73 + */
  74 +$requirements = array(
  75 + // Database :
  76 + array(
  77 + 'name' => 'PDO extension',
  78 + 'mandatory' => true,
  79 + 'condition' => extension_loaded('pdo'),
  80 + 'by' => 'All DB-related classes',
  81 + ),
  82 + array(
  83 + 'name' => 'PDO SQLite extension',
  84 + 'mandatory' => false,
  85 + 'condition' => extension_loaded('pdo_sqlite'),
  86 + 'by' => 'All DB-related classes',
  87 + 'memo' => 'Required for SQLite database.',
  88 + ),
  89 + array(
  90 + 'name' => 'PDO MySQL extension',
  91 + 'mandatory' => false,
  92 + 'condition' => extension_loaded('pdo_mysql'),
  93 + 'by' => 'All DB-related classes',
  94 + 'memo' => 'Required for MySQL database.',
  95 + ),
  96 + array(
  97 + 'name' => 'PDO PostgreSQL extension',
  98 + 'mandatory' => false,
  99 + 'condition' => extension_loaded('pdo_pgsql'),
  100 + 'by' => 'All DB-related classes',
  101 + 'memo' => 'Required for PostgreSQL database.',
  102 + ),
  103 + // Cache :
  104 + array(
  105 + 'name' => 'Memcache extension',
  106 + 'mandatory' => false,
  107 + 'condition' => extension_loaded('memcache') || extension_loaded('memcached'),
  108 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-memcache.html">MemCache</a>',
  109 + 'memo' => extension_loaded('memcached') ? 'To use memcached set <a href="http://www.yiiframework.com/doc-2.0/yii-caching-memcache.html#$useMemcached-detail">MemCache::useMemcached</a> to <code>true</code>.' : ''
  110 + ),
  111 + // CAPTCHA:
  112 + array(
  113 + 'name' => 'GD PHP extension with FreeType support',
  114 + 'mandatory' => false,
  115 + 'condition' => $gdOK,
  116 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
  117 + 'memo' => $gdMemo,
  118 + ),
  119 + array(
  120 + 'name' => 'ImageMagick PHP extension with PNG support',
  121 + 'mandatory' => false,
  122 + 'condition' => $imagickOK,
  123 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
  124 + 'memo' => $imagickMemo,
  125 + ),
  126 + // PHP ini :
  127 + 'phpExposePhp' => array(
  128 + 'name' => 'Expose PHP',
  129 + 'mandatory' => false,
  130 + 'condition' => $requirementsChecker->checkPhpIniOff("expose_php"),
  131 + 'by' => 'Security reasons',
  132 + 'memo' => '"expose_php" should be disabled at php.ini',
  133 + ),
  134 + 'phpAllowUrlInclude' => array(
  135 + 'name' => 'PHP allow url include',
  136 + 'mandatory' => false,
  137 + 'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"),
  138 + 'by' => 'Security reasons',
  139 + 'memo' => '"allow_url_include" should be disabled at php.ini',
  140 + ),
  141 + 'phpSmtp' => array(
  142 + 'name' => 'PHP mail SMTP',
  143 + 'mandatory' => false,
  144 + 'condition' => strlen(ini_get('SMTP')) > 0,
  145 + 'by' => 'Email sending',
  146 + 'memo' => 'PHP mail SMTP server required',
  147 + ),
  148 +);
  149 +
  150 +// OPcache check
  151 +if (!version_compare(phpversion(), '5.5', '>=')) {
  152 + $requirements[] = array(
  153 + 'name' => 'APC extension',
  154 + 'mandatory' => false,
  155 + 'condition' => extension_loaded('apc'),
  156 + 'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-apccache.html">ApcCache</a>',
  157 + );
  158 +}
  159 +
  160 +$requirementsChecker->checkYii()->check($requirements)->render();
... ...
runtime/.gitignore 0 → 100644
  1 +++ a/runtime/.gitignore
  1 +*
  2 +!.gitignore
0 3 \ No newline at end of file
... ...
tests/_bootstrap.php 0 → 100644
  1 +++ a/tests/_bootstrap.php
  1 +<?php
  2 +define('YII_ENV', 'test');
  3 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  4 +
  5 +require_once __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
  6 +require __DIR__ .'/../vendor/autoload.php';
0 7 \ No newline at end of file
... ...
tests/_data/.gitkeep 0 → 100644
No preview for this file type
tests/_output/.gitignore 0 → 100644
  1 +++ a/tests/_output/.gitignore
  1 +*
  2 +!.gitignore
0 3 \ No newline at end of file
... ...
tests/_support/AcceptanceTester.php 0 → 100644
  1 +++ a/tests/_support/AcceptanceTester.php
  1 +<?php
  2 +
  3 +
  4 +/**
  5 + * Inherited Methods
  6 + * @method void wantToTest($text)
  7 + * @method void wantTo($text)
  8 + * @method void execute($callable)
  9 + * @method void expectTo($prediction)
  10 + * @method void expect($prediction)
  11 + * @method void amGoingTo($argumentation)
  12 + * @method void am($role)
  13 + * @method void lookForwardTo($achieveValue)
  14 + * @method void comment($description)
  15 + * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
  16 + *
  17 + * @SuppressWarnings(PHPMD)
  18 +*/
  19 +class AcceptanceTester extends \Codeception\Actor
  20 +{
  21 + use _generated\AcceptanceTesterActions;
  22 +
  23 + /**
  24 + * Define custom actions here
  25 + */
  26 +}
... ...
tests/_support/FunctionalTester.php 0 → 100644
  1 +++ a/tests/_support/FunctionalTester.php
  1 +<?php
  2 +
  3 +
  4 +/**
  5 + * Inherited Methods
  6 + * @method void wantToTest($text)
  7 + * @method void wantTo($text)
  8 + * @method void execute($callable)
  9 + * @method void expectTo($prediction)
  10 + * @method void expect($prediction)
  11 + * @method void amGoingTo($argumentation)
  12 + * @method void am($role)
  13 + * @method void lookForwardTo($achieveValue)
  14 + * @method void comment($description)
  15 + * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
  16 + *
  17 + * @SuppressWarnings(PHPMD)
  18 +*/
  19 +class FunctionalTester extends \Codeception\Actor
  20 +{
  21 + use _generated\FunctionalTesterActions;
  22 +
  23 +}
... ...
tests/_support/UnitTester.php 0 → 100644
  1 +++ a/tests/_support/UnitTester.php
  1 +<?php
  2 +
  3 +
  4 +/**
  5 + * Inherited Methods
  6 + * @method void wantToTest($text)
  7 + * @method void wantTo($text)
  8 + * @method void execute($callable)
  9 + * @method void expectTo($prediction)
  10 + * @method void expect($prediction)
  11 + * @method void amGoingTo($argumentation)
  12 + * @method void am($role)
  13 + * @method void lookForwardTo($achieveValue)
  14 + * @method void comment($description)
  15 + * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
  16 + *
  17 + * @SuppressWarnings(PHPMD)
  18 +*/
  19 +class UnitTester extends \Codeception\Actor
  20 +{
  21 + use _generated\UnitTesterActions;
  22 +
  23 + /**
  24 + * Define custom actions here
  25 + */
  26 +}
... ...
tests/acceptance.suite.yml.example 0 → 100644
  1 +++ a/tests/acceptance.suite.yml.example
  1 +class_name: AcceptanceTester
  2 +modules:
  3 + enabled:
  4 + - WebDriver:
  5 + url: http://127.0.0.1:8080/
  6 + browser: firefox
  7 + - Yii2:
  8 + part: orm
  9 + entryScript: index-test.php
  10 + cleanup: false
... ...
tests/acceptance/AboutCest.php 0 → 100644
  1 +++ a/tests/acceptance/AboutCest.php
  1 +<?php
  2 +
  3 +use yii\helpers\Url;
  4 +
  5 +class AboutCest
  6 +{
  7 + public function ensureThatAboutWorks(AcceptanceTester $I)
  8 + {
  9 + $I->amOnPage(Url::toRoute('/site/about'));
  10 + $I->see('About', 'h1');
  11 + }
  12 +}
... ...
tests/acceptance/ContactCest.php 0 → 100644
  1 +++ a/tests/acceptance/ContactCest.php
  1 +<?php
  2 +
  3 +use yii\helpers\Url;
  4 +
  5 +class ContactCest
  6 +{
  7 + public function _before(\AcceptanceTester $I)
  8 + {
  9 + $I->amOnPage(Url::toRoute('/site/contact'));
  10 + }
  11 +
  12 + public function contactPageWorks(AcceptanceTester $I)
  13 + {
  14 + $I->wantTo('ensure that contact page works');
  15 + $I->see('Contact', 'h1');
  16 + }
  17 +
  18 + public function contactFormCanBeSubmitted(AcceptanceTester $I)
  19 + {
  20 + $I->amGoingTo('submit contact form with correct data');
  21 + $I->fillField('#contactform-name', 'tester');
  22 + $I->fillField('#contactform-email', 'tester@example.com');
  23 + $I->fillField('#contactform-subject', 'test subject');
  24 + $I->fillField('#contactform-body', 'test content');
  25 + $I->fillField('#contactform-verifycode', 'testme');
  26 +
  27 + $I->click('contact-button');
  28 +
  29 + $I->wait(2); // wait for button to be clicked
  30 +
  31 + $I->dontSeeElement('#contact-form');
  32 + $I->see('Thank you for contacting us. We will respond to you as soon as possible.');
  33 + }
  34 +}
... ...
tests/acceptance/HomeCest.php 0 → 100644
  1 +++ a/tests/acceptance/HomeCest.php
  1 +<?php
  2 +
  3 +use yii\helpers\Url;
  4 +
  5 +class HomeCest
  6 +{
  7 + public function ensureThatHomePageWorks(AcceptanceTester $I)
  8 + {
  9 + $I->amOnPage(Url::toRoute('/site/index'));
  10 + $I->see('My Company');
  11 +
  12 + $I->seeLink('About');
  13 + $I->click('About');
  14 + $I->wait(2); // wait for page to be opened
  15 +
  16 + $I->see('This is the About page.');
  17 + }
  18 +}
... ...
tests/acceptance/LoginCest.php 0 → 100644
  1 +++ a/tests/acceptance/LoginCest.php
  1 +<?php
  2 +
  3 +use yii\helpers\Url;
  4 +
  5 +class LoginCest
  6 +{
  7 + public function ensureThatLoginWorks(AcceptanceTester $I)
  8 + {
  9 + $I->amOnPage(Url::toRoute('/site/login'));
  10 + $I->see('Login', 'h1');
  11 +
  12 + $I->amGoingTo('try to login with correct credentials');
  13 + $I->fillField('input[name="LoginForm[username]"]', 'admin');
  14 + $I->fillField('input[name="LoginForm[password]"]', 'admin');
  15 + $I->click('login-button');
  16 + $I->wait(2); // wait for button to be clicked
  17 +
  18 + $I->expectTo('see user info');
  19 + $I->see('Logout');
  20 + }
  21 +}
... ...
tests/acceptance/_bootstrap.php 0 → 100644
  1 +++ a/tests/acceptance/_bootstrap.php
  1 +<?php
... ...
tests/bin/yii 0 → 100755
  1 +++ a/tests/bin/yii
  1 +#!/usr/bin/env php
  2 +<?php
  3 +/**
  4 + * Yii console bootstrap file.
  5 + *
  6 + * @link http://www.yiiframework.com/
  7 + * @copyright Copyright (c) 2008 Yii Software LLC
  8 + * @license http://www.yiiframework.com/license/
  9 + */
  10 +
  11 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  12 +defined('YII_ENV') or define('YII_ENV', 'test');
  13 +
  14 +require __DIR__ . '/../../vendor/autoload.php';
  15 +require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
  16 +
  17 +$config = yii\helpers\ArrayHelper::merge(
  18 + require __DIR__ . '/../../config/console.php',
  19 + [
  20 + 'components' => [
  21 + 'db' => require __DIR__ . '/../../config/test_db.php'
  22 + ]
  23 + ]
  24 +);
  25 +
  26 +
  27 +$application = new yii\console\Application($config);
  28 +$exitCode = $application->run();
  29 +exit($exitCode);
... ...
tests/bin/yii.bat 0 → 100644
  1 +++ a/tests/bin/yii.bat
  1 +@echo off
  2 +
  3 +rem -------------------------------------------------------------
  4 +rem Yii command line bootstrap script for Windows.
  5 +rem
  6 +rem @author Qiang Xue <qiang.xue@gmail.com>
  7 +rem @link http://www.yiiframework.com/
  8 +rem @copyright Copyright (c) 2008 Yii Software LLC
  9 +rem @license http://www.yiiframework.com/license/
  10 +rem -------------------------------------------------------------
  11 +
  12 +@setlocal
  13 +
  14 +set YII_PATH=%~dp0
  15 +
  16 +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
  17 +
  18 +"%PHP_COMMAND%" "%YII_PATH%yii" %*
  19 +
  20 +@endlocal
... ...
tests/functional.suite.yml 0 → 100644
  1 +++ a/tests/functional.suite.yml
  1 +# Codeception Test Suite Configuration
  2 +
  3 +# suite for functional (integration) tests.
  4 +# emulate web requests and make application process them.
  5 +# (tip: better to use with frameworks).
  6 +
  7 +# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
  8 +#basic/web/index.php
  9 +class_name: FunctionalTester
  10 +modules:
  11 + enabled:
  12 + - Filesystem
  13 + - Yii2
... ...
tests/functional/ContactFormCest.php 0 → 100644
  1 +++ a/tests/functional/ContactFormCest.php
  1 +<?php
  2 +
  3 +class ContactFormCest
  4 +{
  5 + public function _before(\FunctionalTester $I)
  6 + {
  7 + $I->amOnPage(['site/contact']);
  8 + }
  9 +
  10 + public function openContactPage(\FunctionalTester $I)
  11 + {
  12 + $I->see('Contact', 'h1');
  13 + }
  14 +
  15 + public function submitEmptyForm(\FunctionalTester $I)
  16 + {
  17 + $I->submitForm('#contact-form', []);
  18 + $I->expectTo('see validations errors');
  19 + $I->see('Contact', 'h1');
  20 + $I->see('Name cannot be blank');
  21 + $I->see('Email cannot be blank');
  22 + $I->see('Subject cannot be blank');
  23 + $I->see('Body cannot be blank');
  24 + $I->see('The verification code is incorrect');
  25 + }
  26 +
  27 + public function submitFormWithIncorrectEmail(\FunctionalTester $I)
  28 + {
  29 + $I->submitForm('#contact-form', [
  30 + 'ContactForm[name]' => 'tester',
  31 + 'ContactForm[email]' => 'tester.email',
  32 + 'ContactForm[subject]' => 'test subject',
  33 + 'ContactForm[body]' => 'test content',
  34 + 'ContactForm[verifyCode]' => 'testme',
  35 + ]);
  36 + $I->expectTo('see that email address is wrong');
  37 + $I->dontSee('Name cannot be blank', '.help-inline');
  38 + $I->see('Email is not a valid email address.');
  39 + $I->dontSee('Subject cannot be blank', '.help-inline');
  40 + $I->dontSee('Body cannot be blank', '.help-inline');
  41 + $I->dontSee('The verification code is incorrect', '.help-inline');
  42 + }
  43 +
  44 + public function submitFormSuccessfully(\FunctionalTester $I)
  45 + {
  46 + $I->submitForm('#contact-form', [
  47 + 'ContactForm[name]' => 'tester',
  48 + 'ContactForm[email]' => 'tester@example.com',
  49 + 'ContactForm[subject]' => 'test subject',
  50 + 'ContactForm[body]' => 'test content',
  51 + 'ContactForm[verifyCode]' => 'testme',
  52 + ]);
  53 + $I->seeEmailIsSent();
  54 + $I->dontSeeElement('#contact-form');
  55 + $I->see('Thank you for contacting us. We will respond to you as soon as possible.');
  56 + }
  57 +}
... ...
tests/functional/LoginFormCest.php 0 → 100644
  1 +++ a/tests/functional/LoginFormCest.php
  1 +<?php
  2 +
  3 +class LoginFormCest
  4 +{
  5 + public function _before(\FunctionalTester $I)
  6 + {
  7 + $I->amOnRoute('site/login');
  8 + }
  9 +
  10 + public function openLoginPage(\FunctionalTester $I)
  11 + {
  12 + $I->see('Login', 'h1');
  13 +
  14 + }
  15 +
  16 + // demonstrates `amLoggedInAs` method
  17 + public function internalLoginById(\FunctionalTester $I)
  18 + {
  19 + $I->amLoggedInAs(100);
  20 + $I->amOnPage('/');
  21 + $I->see('Logout (admin)');
  22 + }
  23 +
  24 + // demonstrates `amLoggedInAs` method
  25 + public function internalLoginByInstance(\FunctionalTester $I)
  26 + {
  27 + $I->amLoggedInAs(\app\models\User::findByUsername('admin'));
  28 + $I->amOnPage('/');
  29 + $I->see('Logout (admin)');
  30 + }
  31 +
  32 + public function loginWithEmptyCredentials(\FunctionalTester $I)
  33 + {
  34 + $I->submitForm('#login-form', []);
  35 + $I->expectTo('see validations errors');
  36 + $I->see('Username cannot be blank.');
  37 + $I->see('Password cannot be blank.');
  38 + }
  39 +
  40 + public function loginWithWrongCredentials(\FunctionalTester $I)
  41 + {
  42 + $I->submitForm('#login-form', [
  43 + 'LoginForm[username]' => 'admin',
  44 + 'LoginForm[password]' => 'wrong',
  45 + ]);
  46 + $I->expectTo('see validations errors');
  47 + $I->see('Incorrect username or password.');
  48 + }
  49 +
  50 + public function loginSuccessfully(\FunctionalTester $I)
  51 + {
  52 + $I->submitForm('#login-form', [
  53 + 'LoginForm[username]' => 'admin',
  54 + 'LoginForm[password]' => 'admin',
  55 + ]);
  56 + $I->see('Logout (admin)');
  57 + $I->dontSeeElement('form#login-form');
  58 + }
  59 +}
0 60 \ No newline at end of file
... ...
tests/functional/_bootstrap.php 0 → 100644
  1 +++ a/tests/functional/_bootstrap.php
  1 +<?php
... ...
tests/unit.suite.yml 0 → 100644
  1 +++ a/tests/unit.suite.yml
  1 +# Codeception Test Suite Configuration
  2 +
  3 +# suite for unit (internal) tests.
  4 +# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
  5 +
  6 +class_name: UnitTester
  7 +modules:
  8 + enabled:
  9 + - Asserts
  10 + - Yii2:
  11 + part: [orm, email, fixtures]
... ...
tests/unit/_bootstrap.php 0 → 100644
  1 +++ a/tests/unit/_bootstrap.php
  1 +<?php
  2 +
  3 +// add unit testing specific bootstrap code here
... ...
tests/unit/models/ContactFormTest.php 0 → 100644
  1 +++ a/tests/unit/models/ContactFormTest.php
  1 +<?php
  2 +
  3 +namespace tests\models;
  4 +
  5 +class ContactFormTest extends \Codeception\Test\Unit
  6 +{
  7 + private $model;
  8 + /**
  9 + * @var \UnitTester
  10 + */
  11 + public $tester;
  12 +
  13 + public function testEmailIsSentOnContact()
  14 + {
  15 + /** @var ContactForm $model */
  16 + $this->model = $this->getMockBuilder('app\models\ContactForm')
  17 + ->setMethods(['validate'])
  18 + ->getMock();
  19 +
  20 + $this->model->expects($this->once())
  21 + ->method('validate')
  22 + ->will($this->returnValue(true));
  23 +
  24 + $this->model->attributes = [
  25 + 'name' => 'Tester',
  26 + 'email' => 'tester@example.com',
  27 + 'subject' => 'very important letter subject',
  28 + 'body' => 'body of current message',
  29 + ];
  30 +
  31 + expect_that($this->model->contact('admin@example.com'));
  32 +
  33 + // using Yii2 module actions to check email was sent
  34 + $this->tester->seeEmailIsSent();
  35 +
  36 + $emailMessage = $this->tester->grabLastSentEmail();
  37 + expect('valid email is sent', $emailMessage)->isInstanceOf('yii\mail\MessageInterface');
  38 + expect($emailMessage->getTo())->hasKey('admin@example.com');
  39 + expect($emailMessage->getFrom())->hasKey('tester@example.com');
  40 + expect($emailMessage->getSubject())->equals('very important letter subject');
  41 + expect($emailMessage->toString())->contains('body of current message');
  42 + }
  43 +}
... ...
tests/unit/models/LoginFormTest.php 0 → 100644
  1 +++ a/tests/unit/models/LoginFormTest.php
  1 +<?php
  2 +
  3 +namespace tests\models;
  4 +
  5 +use app\models\LoginForm;
  6 +
  7 +class LoginFormTest extends \Codeception\Test\Unit
  8 +{
  9 + private $model;
  10 +
  11 + protected function _after()
  12 + {
  13 + \Yii::$app->user->logout();
  14 + }
  15 +
  16 + public function testLoginNoUser()
  17 + {
  18 + $this->model = new LoginForm([
  19 + 'username' => 'not_existing_username',
  20 + 'password' => 'not_existing_password',
  21 + ]);
  22 +
  23 + expect_not($this->model->login());
  24 + expect_that(\Yii::$app->user->isGuest);
  25 + }
  26 +
  27 + public function testLoginWrongPassword()
  28 + {
  29 + $this->model = new LoginForm([
  30 + 'username' => 'demo',
  31 + 'password' => 'wrong_password',
  32 + ]);
  33 +
  34 + expect_not($this->model->login());
  35 + expect_that(\Yii::$app->user->isGuest);
  36 + expect($this->model->errors)->hasKey('password');
  37 + }
  38 +
  39 + public function testLoginCorrect()
  40 + {
  41 + $this->model = new LoginForm([
  42 + 'username' => 'demo',
  43 + 'password' => 'demo',
  44 + ]);
  45 +
  46 + expect_that($this->model->login());
  47 + expect_not(\Yii::$app->user->isGuest);
  48 + expect($this->model->errors)->hasntKey('password');
  49 + }
  50 +
  51 +}
... ...
tests/unit/models/UserTest.php 0 → 100644
  1 +++ a/tests/unit/models/UserTest.php
  1 +<?php
  2 +
  3 +namespace tests\models;
  4 +
  5 +use app\models\User;
  6 +
  7 +class UserTest extends \Codeception\Test\Unit
  8 +{
  9 + public function testFindUserById()
  10 + {
  11 + expect_that($user = User::findIdentity(100));
  12 + expect($user->username)->equals('admin');
  13 +
  14 + expect_not(User::findIdentity(999));
  15 + }
  16 +
  17 + public function testFindUserByAccessToken()
  18 + {
  19 + expect_that($user = User::findIdentityByAccessToken('100-token'));
  20 + expect($user->username)->equals('admin');
  21 +
  22 + expect_not(User::findIdentityByAccessToken('non-existing'));
  23 + }
  24 +
  25 + public function testFindUserByUsername()
  26 + {
  27 + expect_that($user = User::findByUsername('admin'));
  28 + expect_not(User::findByUsername('not-admin'));
  29 + }
  30 +
  31 + /**
  32 + * @depends testFindUserByUsername
  33 + */
  34 + public function testValidateUser($user)
  35 + {
  36 + $user = User::findByUsername('admin');
  37 + expect_that($user->validateAuthKey('test100key'));
  38 + expect_not($user->validateAuthKey('test102key'));
  39 +
  40 + expect_that($user->validatePassword('admin'));
  41 + expect_not($user->validatePassword('123456'));
  42 + }
  43 +
  44 +}
... ...
vagrant/config/.gitignore 0 → 100644
  1 +++ a/vagrant/config/.gitignore
  1 +# local configuration
  2 +vagrant-local.yml
0 3 \ No newline at end of file
... ...
vagrant/config/vagrant-local.example.yml 0 → 100644
  1 +++ a/vagrant/config/vagrant-local.example.yml
  1 +# Your personal GitHub token
  2 +github_token: <your-personal-github-token>
  3 +# Read more: https://github.com/blog/1509-personal-api-tokens
  4 +# You can generate it here: https://github.com/settings/tokens
  5 +
  6 +# Guest OS timezone
  7 +timezone: Europe/London
  8 +
  9 +# Are we need check box updates for every 'vagrant up'?
  10 +box_check_update: false
  11 +
  12 +# Virtual machine name
  13 +machine_name: yii2basic
  14 +
  15 +# Virtual machine IP
  16 +ip: 192.168.83.137
  17 +
  18 +# Virtual machine CPU cores number
  19 +cpus: 1
  20 +
  21 +# Virtual machine RAM
  22 +memory: 1024
... ...
vagrant/nginx/app.conf 0 → 100644
  1 +++ a/vagrant/nginx/app.conf
  1 +server {
  2 + charset utf-8;
  3 + client_max_body_size 128M;
  4 + sendfile off;
  5 +
  6 + listen 80; ## listen for ipv4
  7 + #listen [::]:80 default_server ipv6only=on; ## listen for ipv6
  8 +
  9 + server_name yii2basic.dev;
  10 + root /app/web/;
  11 + index index.php;
  12 +
  13 + access_log /app/vagrant/nginx/log/yii2basic.access.log;
  14 + error_log /app/vagrant/nginx/log/yii2basic.error.log;
  15 +
  16 + location / {
  17 + # Redirect everything that isn't a real file to index.php
  18 + try_files $uri $uri/ /index.php$is_args$args;
  19 + }
  20 +
  21 + # uncomment to avoid processing of calls to non-existing static files by Yii
  22 + #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
  23 + # try_files $uri =404;
  24 + #}
  25 + #error_page 404 /404.html;
  26 +
  27 + location ~ \.php$ {
  28 + include fastcgi_params;
  29 + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  30 + #fastcgi_pass 127.0.0.1:9000;
  31 + fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
  32 + try_files $uri =404;
  33 + }
  34 +
  35 + location ~ /\.(ht|svn|git) {
  36 + deny all;
  37 + }
  38 +}
... ...
vagrant/nginx/log/.gitignore 0 → 100644
  1 +++ a/vagrant/nginx/log/.gitignore
  1 +#nginx logs
  2 +yii2basic.access.log
  3 +yii2basic.error.log
0 4 \ No newline at end of file
... ...
vagrant/provision/always-as-root.sh 0 → 100644
  1 +++ a/vagrant/provision/always-as-root.sh
  1 +#!/usr/bin/env bash
  2 +
  3 +#== Bash helpers ==
  4 +
  5 +function info {
  6 + echo " "
  7 + echo "--> $1"
  8 + echo " "
  9 +}
  10 +
  11 +#== Provision script ==
  12 +
  13 +info "Provision-script user: `whoami`"
  14 +
  15 +info "Restart web-stack"
  16 +service php7.0-fpm restart
  17 +service nginx restart
  18 +service mysql restart
0 19 \ No newline at end of file
... ...
vagrant/provision/once-as-root.sh 0 → 100644
  1 +++ a/vagrant/provision/once-as-root.sh
  1 +#!/usr/bin/env bash
  2 +
  3 +#== Import script args ==
  4 +
  5 +timezone=$(echo "$1")
  6 +
  7 +#== Bash helpers ==
  8 +
  9 +function info {
  10 + echo " "
  11 + echo "--> $1"
  12 + echo " "
  13 +}
  14 +
  15 +#== Provision script ==
  16 +
  17 +info "Provision-script user: `whoami`"
  18 +
  19 +export DEBIAN_FRONTEND=noninteractive
  20 +
  21 +info "Configure timezone"
  22 +timedatectl set-timezone ${timezone} --no-ask-password
  23 +
  24 +info "Prepare root password for MySQL"
  25 +debconf-set-selections <<< "mariadb-server-10.0 mysql-server/root_password password \"''\""
  26 +debconf-set-selections <<< "mariadb-server-10.0 mysql-server/root_password_again password \"''\""
  27 +echo "Done!"
  28 +
  29 +info "Update OS software"
  30 +apt-get update
  31 +apt-get upgrade -y
  32 +
  33 +info "Install additional software"
  34 +apt-get install -y php7.0-curl php7.0-cli php7.0-intl php7.0-mysqlnd php7.0-gd php7.0-fpm php7.0-mbstring php7.0-xml unzip nginx mariadb-server-10.0 php.xdebug
  35 +
  36 +info "Configure MySQL"
  37 +sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/mariadb.conf.d/50-server.cnf
  38 +mysql -uroot <<< "CREATE USER 'root'@'%' IDENTIFIED BY ''"
  39 +mysql -uroot <<< "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'"
  40 +mysql -uroot <<< "DROP USER 'root'@'localhost'"
  41 +mysql -uroot <<< "FLUSH PRIVILEGES"
  42 +echo "Done!"
  43 +
  44 +info "Configure PHP-FPM"
  45 +sed -i 's/user = www-data/user = vagrant/g' /etc/php/7.0/fpm/pool.d/www.conf
  46 +sed -i 's/group = www-data/group = vagrant/g' /etc/php/7.0/fpm/pool.d/www.conf
  47 +sed -i 's/owner = www-data/owner = vagrant/g' /etc/php/7.0/fpm/pool.d/www.conf
  48 +cat << EOF > /etc/php/7.0/mods-available/xdebug.ini
  49 +zend_extension=xdebug.so
  50 +xdebug.remote_enable=1
  51 +xdebug.remote_connect_back=1
  52 +xdebug.remote_port=9000
  53 +xdebug.remote_autostart=1
  54 +EOF
  55 +echo "Done!"
  56 +
  57 +info "Configure NGINX"
  58 +sed -i 's/user www-data/user vagrant/g' /etc/nginx/nginx.conf
  59 +echo "Done!"
  60 +
  61 +info "Enabling site configuration"
  62 +ln -s /app/vagrant/nginx/app.conf /etc/nginx/sites-enabled/app.conf
  63 +echo "Done!"
  64 +
  65 +info "Removing default site configuration"
  66 +rm /etc/nginx/sites-enabled/default
  67 +echo "Done!"
  68 +
  69 +info "Initailize databases for MySQL"
  70 +mysql -uroot <<< "CREATE DATABASE yii2basic"
  71 +mysql -uroot <<< "CREATE DATABASE yii2basic_test"
  72 +echo "Done!"
  73 +
  74 +info "Install composer"
  75 +curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
0 76 \ No newline at end of file
... ...
vagrant/provision/once-as-vagrant.sh 0 → 100644
  1 +++ a/vagrant/provision/once-as-vagrant.sh
  1 +#!/usr/bin/env bash
  2 +
  3 +#== Import script args ==
  4 +
  5 +github_token=$(echo "$1")
  6 +
  7 +#== Bash helpers ==
  8 +
  9 +function info {
  10 + echo " "
  11 + echo "--> $1"
  12 + echo " "
  13 +}
  14 +
  15 +#== Provision script ==
  16 +
  17 +info "Provision-script user: `whoami`"
  18 +
  19 +info "Configure composer"
  20 +composer config --global github-oauth.github.com ${github_token}
  21 +echo "Done!"
  22 +
  23 +info "Install project dependencies"
  24 +cd /app
  25 +composer --no-progress --prefer-dist install
  26 +
  27 +info "Create bash-alias 'app' for vagrant user"
  28 +echo 'alias app="cd /app"' | tee /home/vagrant/.bash_aliases
  29 +
  30 +info "Enabling colorized prompt for guest console"
  31 +sed -i "s/#force_color_prompt=yes/force_color_prompt=yes/" /home/vagrant/.bashrc
... ...
views/layouts/main.php 0 → 100644
  1 +++ a/views/layouts/main.php
  1 +<?php
  2 +
  3 +/* @var $this \yii\web\View */
  4 +/* @var $content string */
  5 +
  6 +use app\widgets\Alert;
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\Nav;
  9 +use yii\bootstrap\NavBar;
  10 +use yii\widgets\Breadcrumbs;
  11 +use app\assets\AppAsset;
  12 +
  13 +AppAsset::register($this);
  14 +?>
  15 +<?php $this->beginPage() ?>
  16 +<!DOCTYPE html>
  17 +<html lang="<?= Yii::$app->language ?>">
  18 +<head>
  19 + <meta charset="<?= Yii::$app->charset ?>">
  20 + <meta http-equiv="X-UA-Compatible" content="IE=edge">
  21 + <meta name="viewport" content="width=device-width, initial-scale=1">
  22 + <?php $this->registerCsrfMetaTags() ?>
  23 + <title><?= Html::encode($this->title) ?></title>
  24 + <?php $this->head() ?>
  25 +</head>
  26 +<body>
  27 +<?php $this->beginBody() ?>
  28 +
  29 +<div class="wrap">
  30 + <?php
  31 + NavBar::begin([
  32 + 'brandLabel' => Yii::$app->name,
  33 + 'brandUrl' => Yii::$app->homeUrl,
  34 + 'options' => [
  35 + 'class' => 'navbar-inverse navbar-fixed-top',
  36 + ],
  37 + ]);
  38 + echo Nav::widget([
  39 + 'options' => ['class' => 'navbar-nav navbar-right'],
  40 + 'items' => [
  41 + ['label' => 'Home', 'url' => ['/site/index']],
  42 + ['label' => 'About', 'url' => ['/site/about']],
  43 + ['label' => 'Contact', 'url' => ['/site/contact']],
  44 + Yii::$app->user->isGuest ? (
  45 + ['label' => 'Login', 'url' => ['/site/login']]
  46 + ) : (
  47 + '<li>'
  48 + . Html::beginForm(['/site/logout'], 'post')
  49 + . Html::submitButton(
  50 + 'Logout (' . Yii::$app->user->identity->username . ')',
  51 + ['class' => 'btn btn-link logout']
  52 + )
  53 + . Html::endForm()
  54 + . '</li>'
  55 + )
  56 + ],
  57 + ]);
  58 + NavBar::end();
  59 + ?>
  60 +
  61 + <div class="container">
  62 + <?= Breadcrumbs::widget([
  63 + 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
  64 + ]) ?>
  65 + <?= Alert::widget() ?>
  66 + <?= $content ?>
  67 + </div>
  68 +</div>
  69 +
  70 +<footer class="footer">
  71 + <div class="container">
  72 + <p class="pull-left">&copy; My Company <?= date('Y') ?></p>
  73 +
  74 + <p class="pull-right"><?= Yii::powered() ?></p>
  75 + </div>
  76 +</footer>
  77 +
  78 +<?php $this->endBody() ?>
  79 +</body>
  80 +</html>
  81 +<?php $this->endPage() ?>
... ...
views/site/about.php 0 → 100644
  1 +++ a/views/site/about.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +
  5 +use yii\helpers\Html;
  6 +
  7 +$this->title = 'About';
  8 +$this->params['breadcrumbs'][] = $this->title;
  9 +?>
  10 +<div class="site-about">
  11 + <h1><?= Html::encode($this->title) ?></h1>
  12 +
  13 + <p>
  14 + This is the About page. You may modify the following file to customize its content:
  15 + </p>
  16 +
  17 + <code><?= __FILE__ ?></code>
  18 +</div>
... ...
views/site/contact.php 0 → 100644
  1 +++ a/views/site/contact.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model app\models\ContactForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +use yii\captcha\Captcha;
  10 +
  11 +$this->title = 'Contact';
  12 +$this->params['breadcrumbs'][] = $this->title;
  13 +?>
  14 +<div class="site-contact">
  15 + <h1><?= Html::encode($this->title) ?></h1>
  16 +
  17 + <?php if (Yii::$app->session->hasFlash('contactFormSubmitted')): ?>
  18 +
  19 + <div class="alert alert-success">
  20 + Thank you for contacting us. We will respond to you as soon as possible.
  21 + </div>
  22 +
  23 + <p>
  24 + Note that if you turn on the Yii debugger, you should be able
  25 + to view the mail message on the mail panel of the debugger.
  26 + <?php if (Yii::$app->mailer->useFileTransport): ?>
  27 + Because the application is in development mode, the email is not sent but saved as
  28 + a file under <code><?= Yii::getAlias(Yii::$app->mailer->fileTransportPath) ?></code>.
  29 + Please configure the <code>useFileTransport</code> property of the <code>mail</code>
  30 + application component to be false to enable email sending.
  31 + <?php endif; ?>
  32 + </p>
  33 +
  34 + <?php else: ?>
  35 +
  36 + <p>
  37 + If you have business inquiries or other questions, please fill out the following form to contact us.
  38 + Thank you.
  39 + </p>
  40 +
  41 + <div class="row">
  42 + <div class="col-lg-5">
  43 +
  44 + <?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
  45 +
  46 + <?= $form->field($model, 'name')->textInput(['autofocus' => true]) ?>
  47 +
  48 + <?= $form->field($model, 'email') ?>
  49 +
  50 + <?= $form->field($model, 'subject') ?>
  51 +
  52 + <?= $form->field($model, 'body')->textarea(['rows' => 6]) ?>
  53 +
  54 + <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
  55 + 'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
  56 + ]) ?>
  57 +
  58 + <div class="form-group">
  59 + <?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
  60 + </div>
  61 +
  62 + <?php ActiveForm::end(); ?>
  63 +
  64 + </div>
  65 + </div>
  66 +
  67 + <?php endif; ?>
  68 +</div>
... ...
views/site/error.php 0 → 100644
  1 +++ a/views/site/error.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $name string */
  5 +/* @var $message string */
  6 +/* @var $exception Exception */
  7 +
  8 +use yii\helpers\Html;
  9 +
  10 +$this->title = $name;
  11 +?>
  12 +<div class="site-error">
  13 +
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <div class="alert alert-danger">
  17 + <?= nl2br(Html::encode($message)) ?>
  18 + </div>
  19 +
  20 + <p>
  21 + The above error occurred while the Web server was processing your request.
  22 + </p>
  23 + <p>
  24 + Please contact us if you think this is a server error. Thank you.
  25 + </p>
  26 +
  27 +</div>
... ...
views/site/index.php 0 → 100644
  1 +++ a/views/site/index.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +
  5 +$this->title = 'My Yii Application';
  6 +?>
  7 +<div class="site-index">
  8 +
  9 + <div class="jumbotron">
  10 + <h1>Congratulations!</h1>
  11 +
  12 + <p class="lead">You have successfully created your Yii-powered application.</p>
  13 +
  14 + <p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p>
  15 + </div>
  16 +
  17 + <div class="body-content">
  18 +
  19 + <div class="row">
  20 + <div class="col-lg-4">
  21 + <h2>Heading</h2>
  22 +
  23 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  24 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  25 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  26 + fugiat nulla pariatur.</p>
  27 +
  28 + <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
  29 + </div>
  30 + <div class="col-lg-4">
  31 + <h2>Heading</h2>
  32 +
  33 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  34 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  35 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  36 + fugiat nulla pariatur.</p>
  37 +
  38 + <p><a class="btn btn-default" href="http://www.yiiframework.com/forum/">Yii Forum &raquo;</a></p>
  39 + </div>
  40 + <div class="col-lg-4">
  41 + <h2>Heading</h2>
  42 +
  43 + <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
  44 + dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
  45 + ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
  46 + fugiat nulla pariatur.</p>
  47 +
  48 + <p><a class="btn btn-default" href="http://www.yiiframework.com/extensions/">Yii Extensions &raquo;</a></p>
  49 + </div>
  50 + </div>
  51 +
  52 + </div>
  53 +</div>
... ...
views/site/login.php 0 → 100644
  1 +++ a/views/site/login.php
  1 +<?php
  2 +
  3 +/* @var $this yii\web\View */
  4 +/* @var $form yii\bootstrap\ActiveForm */
  5 +/* @var $model app\models\LoginForm */
  6 +
  7 +use yii\helpers\Html;
  8 +use yii\bootstrap\ActiveForm;
  9 +
  10 +$this->title = 'Login';
  11 +$this->params['breadcrumbs'][] = $this->title;
  12 +?>
  13 +<div class="site-login">
  14 + <h1><?= Html::encode($this->title) ?></h1>
  15 +
  16 + <p>Please fill out the following fields to login:</p>
  17 +
  18 + <?php $form = ActiveForm::begin([
  19 + 'id' => 'login-form',
  20 + 'layout' => 'horizontal',
  21 + 'fieldConfig' => [
  22 + 'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>",
  23 + 'labelOptions' => ['class' => 'col-lg-1 control-label'],
  24 + ],
  25 + ]); ?>
  26 +
  27 + <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>
  28 +
  29 + <?= $form->field($model, 'password')->passwordInput() ?>
  30 +
  31 + <?= $form->field($model, 'rememberMe')->checkbox([
  32 + 'template' => "<div class=\"col-lg-offset-1 col-lg-3\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>",
  33 + ]) ?>
  34 +
  35 + <div class="form-group">
  36 + <div class="col-lg-offset-1 col-lg-11">
  37 + <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>
  38 + </div>
  39 + </div>
  40 +
  41 + <?php ActiveForm::end(); ?>
  42 +
  43 + <div class="col-lg-offset-1" style="color:#999;">
  44 + You may login with <strong>admin/admin</strong> or <strong>demo/demo</strong>.<br>
  45 + To modify the username/password, please check out the code <code>app\models\User::$users</code>.
  46 + </div>
  47 +</div>
... ...
web/assets/.gitignore 0 → 100644
  1 +++ a/web/assets/.gitignore
  1 +*
  2 +!.gitignore
... ...
web/css/site.css 0 → 100644
  1 +++ a/web/css/site.css
  1 +html,
  2 +body {
  3 + height: 100%;
  4 +}
  5 +
  6 +.wrap {
  7 + min-height: 100%;
  8 + height: auto;
  9 + margin: 0 auto -60px;
  10 + padding: 0 0 60px;
  11 +}
  12 +
  13 +.wrap > .container {
  14 + padding: 70px 15px 20px;
  15 +}
  16 +
  17 +.footer {
  18 + height: 60px;
  19 + background-color: #f5f5f5;
  20 + border-top: 1px solid #ddd;
  21 + padding-top: 20px;
  22 +}
  23 +
  24 +.jumbotron {
  25 + text-align: center;
  26 + background-color: transparent;
  27 +}
  28 +
  29 +.jumbotron .btn {
  30 + font-size: 21px;
  31 + padding: 14px 24px;
  32 +}
  33 +
  34 +.not-set {
  35 + color: #c55;
  36 + font-style: italic;
  37 +}
  38 +
  39 +/* add sorting icons to gridview sort links */
  40 +a.asc:after, a.desc:after {
  41 + position: relative;
  42 + top: 1px;
  43 + display: inline-block;
  44 + font-family: 'Glyphicons Halflings';
  45 + font-style: normal;
  46 + font-weight: normal;
  47 + line-height: 1;
  48 + padding-left: 5px;
  49 +}
  50 +
  51 +a.asc:after {
  52 + content: /*"\e113"*/ "\e151";
  53 +}
  54 +
  55 +a.desc:after {
  56 + content: /*"\e114"*/ "\e152";
  57 +}
  58 +
  59 +.sort-numerical a.asc:after {
  60 + content: "\e153";
  61 +}
  62 +
  63 +.sort-numerical a.desc:after {
  64 + content: "\e154";
  65 +}
  66 +
  67 +.sort-ordinal a.asc:after {
  68 + content: "\e155";
  69 +}
  70 +
  71 +.sort-ordinal a.desc:after {
  72 + content: "\e156";
  73 +}
  74 +
  75 +.grid-view th {
  76 + white-space: nowrap;
  77 +}
  78 +
  79 +.hint-block {
  80 + display: block;
  81 + margin-top: 5px;
  82 + color: #999;
  83 +}
  84 +
  85 +.error-summary {
  86 + color: #a94442;
  87 + background: #fdf7f7;
  88 + border-left: 3px solid #eed3d7;
  89 + padding: 10px 20px;
  90 + margin: 0 0 15px 0;
  91 +}
  92 +
  93 +/* align the logout "link" (button in form) of the navbar */
  94 +.nav li > form > button.logout {
  95 + padding: 15px;
  96 + border: none;
  97 +}
  98 +
  99 +@media(max-width:767px) {
  100 + .nav li > form > button.logout {
  101 + display:block;
  102 + text-align: left;
  103 + width: 100%;
  104 + padding: 10px 15px;
  105 + }
  106 +}
  107 +
  108 +.nav > li > form > button.logout:focus,
  109 +.nav > li > form > button.logout:hover {
  110 + text-decoration: none;
  111 +}
  112 +
  113 +.nav > li > form > button.logout:focus {
  114 + outline: none;
  115 +}
... ...
web/favicon.ico 0 → 100644
No preview for this file type
web/index-test.php 0 → 100644
  1 +++ a/web/index-test.php
  1 +<?php
  2 +
  3 +// NOTE: Make sure this file is not accessible when deployed to production
  4 +if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
  5 + die('You are not allowed to access this file.');
  6 +}
  7 +
  8 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  9 +defined('YII_ENV') or define('YII_ENV', 'test');
  10 +
  11 +require __DIR__ . '/../vendor/autoload.php';
  12 +require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
  13 +
  14 +$config = require __DIR__ . '/../config/test.php';
  15 +
  16 +(new yii\web\Application($config))->run();
... ...
web/index.php 0 → 100644
  1 +++ a/web/index.php
  1 +<?php
  2 +
  3 +// comment out the following two lines when deployed to production
  4 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  5 +defined('YII_ENV') or define('YII_ENV', 'dev');
  6 +
  7 +require __DIR__ . '/../vendor/autoload.php';
  8 +require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
  9 +
  10 +$config = require __DIR__ . '/../config/web.php';
  11 +
  12 +(new yii\web\Application($config))->run();
... ...
web/robots.txt 0 → 100644
  1 +++ a/web/robots.txt
  1 +User-agent: *
  2 +Disallow:
0 3 \ No newline at end of file
... ...
widgets/Alert.php 0 → 100644
  1 +++ a/widgets/Alert.php
  1 +<?php
  2 +namespace app\widgets;
  3 +
  4 +use Yii;
  5 +
  6 +/**
  7 + * Alert widget renders a message from session flash. All flash messages are displayed
  8 + * in the sequence they were assigned using setFlash. You can set message as following:
  9 + *
  10 + * ```php
  11 + * Yii::$app->session->setFlash('error', 'This is the message');
  12 + * Yii::$app->session->setFlash('success', 'This is the message');
  13 + * Yii::$app->session->setFlash('info', 'This is the message');
  14 + * ```
  15 + *
  16 + * Multiple messages could be set as follows:
  17 + *
  18 + * ```php
  19 + * Yii::$app->session->setFlash('error', ['Error 1', 'Error 2']);
  20 + * ```
  21 + *
  22 + * @author Kartik Visweswaran <kartikv2@gmail.com>
  23 + * @author Alexander Makarov <sam@rmcreative.ru>
  24 + */
  25 +class Alert extends \yii\bootstrap\Widget
  26 +{
  27 + /**
  28 + * @var array the alert types configuration for the flash messages.
  29 + * This array is setup as $key => $value, where:
  30 + * - key: the name of the session flash variable
  31 + * - value: the bootstrap alert type (i.e. danger, success, info, warning)
  32 + */
  33 + public $alertTypes = [
  34 + 'error' => 'alert-danger',
  35 + 'danger' => 'alert-danger',
  36 + 'success' => 'alert-success',
  37 + 'info' => 'alert-info',
  38 + 'warning' => 'alert-warning'
  39 + ];
  40 + /**
  41 + * @var array the options for rendering the close button tag.
  42 + * Array will be passed to [[\yii\bootstrap\Alert::closeButton]].
  43 + */
  44 + public $closeButton = [];
  45 +
  46 +
  47 + /**
  48 + * {@inheritdoc}
  49 + */
  50 + public function run()
  51 + {
  52 + $session = Yii::$app->session;
  53 + $flashes = $session->getAllFlashes();
  54 + $appendClass = isset($this->options['class']) ? ' ' . $this->options['class'] : '';
  55 +
  56 + foreach ($flashes as $type => $flash) {
  57 + if (!isset($this->alertTypes[$type])) {
  58 + continue;
  59 + }
  60 +
  61 + foreach ((array) $flash as $i => $message) {
  62 + echo \yii\bootstrap\Alert::widget([
  63 + 'body' => $message,
  64 + 'closeButton' => $this->closeButton,
  65 + 'options' => array_merge($this->options, [
  66 + 'id' => $this->getId() . '-' . $type . '-' . $i,
  67 + 'class' => $this->alertTypes[$type] . $appendClass,
  68 + ]),
  69 + ]);
  70 + }
  71 +
  72 + $session->removeFlash($type);
  73 + }
  74 + }
  75 +}
... ...
yii 0 → 100755
  1 +++ a/yii
  1 +#!/usr/bin/env php
  2 +<?php
  3 +/**
  4 + * Yii console bootstrap file.
  5 + *
  6 + * @link http://www.yiiframework.com/
  7 + * @copyright Copyright (c) 2008 Yii Software LLC
  8 + * @license http://www.yiiframework.com/license/
  9 + */
  10 +
  11 +defined('YII_DEBUG') or define('YII_DEBUG', true);
  12 +defined('YII_ENV') or define('YII_ENV', 'dev');
  13 +
  14 +require __DIR__ . '/vendor/autoload.php';
  15 +require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';
  16 +
  17 +$config = require __DIR__ . '/config/console.php';
  18 +
  19 +$application = new yii\console\Application($config);
  20 +$exitCode = $application->run();
  21 +exit($exitCode);
... ...
yii.bat 0 → 100644
  1 +++ a/yii.bat
  1 +@echo off
  2 +
  3 +rem -------------------------------------------------------------
  4 +rem Yii command line bootstrap script for Windows.
  5 +rem
  6 +rem @author Qiang Xue <qiang.xue@gmail.com>
  7 +rem @link http://www.yiiframework.com/
  8 +rem @copyright Copyright (c) 2008 Yii Software LLC
  9 +rem @license http://www.yiiframework.com/license/
  10 +rem -------------------------------------------------------------
  11 +
  12 +@setlocal
  13 +
  14 +set YII_PATH=%~dp0
  15 +
  16 +if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
  17 +
  18 +"%PHP_COMMAND%" "%YII_PATH%yii" %*
  19 +
  20 +@endlocal
... ...