diff --git a/.gitignore b/.gitignore
index 6b70ddab..fc3bcd98 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,8 @@
/.settings
/.buildpath
/.project
-/.idea
-build
+/.idea/
+/build
+/deployment/clients/dev/data/
+/deployment/clients/test/data/
+/.vagrant
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..c3ddebfb
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,8 @@
+language: php
+php:
+ - '5.4'
+ - '5.5'
+ - '5.6'
+ - '7.0'
+ - hhvm
+ - nightly
\ No newline at end of file
diff --git a/Vagrantfile b/Vagrantfile
new file mode 100644
index 00000000..4d0f2b62
--- /dev/null
+++ b/Vagrantfile
@@ -0,0 +1,29 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+Vagrant.configure(2) do |config|
+ config.vm.box = "thilinah/jessie64_isotope"
+ config.vm.box_version = "0.0.1"
+ config.vm.network "private_network", ip: "192.168.40.40"
+ config.vm.synced_folder ".", "/vagrant", type: "nfs"
+
+ config.vm.provider "virtualbox" do |vb|
+ vb.memory = "1024"
+ vb.cpus = "2"
+ vb.name = "app.dev"
+ end
+
+
+ config.vm.provision "shell", inline: <<-SHELL
+ sudo apt-get update
+ SHELL
+
+ config.vm.hostname = "app.dev"
+
+ config.hostsupdater.aliases = [
+ "app.dev",
+ "app.app.dev",
+ "clients.app.dev"
+ ]
+
+end
diff --git a/build.xml b/build.xml
index 80c96b3d..0426957e 100644
--- a/build.xml
+++ b/build.xml
@@ -3,6 +3,7 @@
+
@@ -16,7 +17,7 @@
description=""/>
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+ description="Copy generated files to QA app">
+
+
+
+
+
+
+
+
+
+
+
+
@@ -215,7 +216,13 @@
-
+
+
+
+
+
+
+
Load($v[1]."= ?",array($item->$k));
- if($tObj->$v[1] == $item->$k){
+ if($tObj->{$v[1]} == $item->$k){
$v[2] = str_replace("+"," ",$v[2]);
$values = explode(" ", $v[2]);
if(count($values) == 1){
$idField = $k."_id";
$item->$idField = $item->$k;
- $item->$k = $tObj->$v[2];
+ $item->$k = $tObj->{$v[2]};
}else{
$objVal = "";
@@ -551,13 +552,13 @@ class BaseService{
$fTable = $v[0];
$tObj = new $fTable();
$tObj->Load($v[1]."= ?",array($obj->$k));
- if($tObj->$v[1] == $obj->$k){
+ if($tObj->{$v[1]} == $obj->$k){
$name = $k."_Name";
$values = explode("+", $v[2]);
if(count($values) == 1){
$idField = $name."_id";
$obj->$idField = $obj->$name;
- $obj->$name = $tObj->$v[2];
+ $obj->$name = $tObj->{$v[2]};
}else{
$objVal = "";
foreach($values as $v){
@@ -1244,6 +1245,14 @@ class BaseService{
return SettingsManager::getInstance()->getSetting('Analytics: Google Key');
}
+ public function setMigrationManager($migrationManager){
+ $this->migrationManager = $migrationManager;
+ }
+
+ public function getMigrationManager(){
+ return $this->migrationManager;
+ }
+
/**
* Set the audit manager
* @method setAuditManager
@@ -1575,6 +1584,11 @@ class CustomFieldManager {
return $object;
}
+
+
+ public function syncMigrations(){
+
+ }
}
diff --git a/src/classes/LanguageManager.php b/src/classes/LanguageManager.php
index 492da0eb..7ffdd69c 100644
--- a/src/classes/LanguageManager.php
+++ b/src/classes/LanguageManager.php
@@ -35,12 +35,13 @@ class LanguageManager{
private function getCurrentLang(){
$user = BaseService::getInstance()->getCurrentUser();
- LogManager::getInstance()->info("User:".json_encode($user));
if(empty($user) || empty($user->lang) || $user->lang == "NULL"){
$lang = SettingsManager::getInstance()->getSetting('System: Language');
LogManager::getInstance()->info("System Lang:".$lang);
}else{
- $lang = $user->lang;
+ $supportedLang = new SupportedLanguage();
+ $supportedLang->Load("id = ?",array($user->lang));
+ $lang = $supportedLang->name;
}
if(empty($lang) || !file_exists(APP_BASE_PATH.'lang/'.$lang.'.po')){
$lang = 'en';
@@ -72,4 +73,4 @@ class LanguageManager{
return $string;
}
-}
\ No newline at end of file
+}
diff --git a/src/classes/Migration.php b/src/classes/Migration.php
new file mode 100644
index 00000000..ab7c3e3d
--- /dev/null
+++ b/src/classes/Migration.php
@@ -0,0 +1,260 @@
+file = $file;
+ }
+
+ public function up(){
+ return true;
+ }
+
+ public function down(){
+ return true;
+ }
+
+ protected function db(){
+ if($this->db == null){
+ $this->db = NewADOConnection('mysqli');
+ $res = $this->db->Connect(APP_HOST, APP_USERNAME, APP_PASSWORD, APP_DB);
+ }
+ return $this->db;
+ }
+
+ public function getLastError(){
+ return $this->lastError;
+ }
+
+ public function executeQuery($sql){
+ $ret = $this->db()->Execute($sql);
+ if(!$ret){
+ $this->lastError = $this->db()->ErrorMsg();
+ }
+ return $ret;
+ }
+
+ /*
+ public function up()
+ {
+ $sql = <<<'SQL'
+ create table `Migrations` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `file` varchar(300) NOT NULL,
+ `version` int(11) NOT NULL,
+ `created` DATETIME default '0000-00-00 00:00:00',
+ `updated` DATETIME default '0000-00-00 00:00:00',
+ `status` enum('Pending','Up','Down','UpError','DownError') default 'Pending',
+ `last_error` varchar(500) NULL,
+ primary key (`id`),
+ unique key `KEY_Migrations_file` (`file`),
+ index `KEY_Migrations_status` (`status`),
+ index `KEY_Migrations_status` (`version`)
+ ) engine=innodb default charset=utf8;
+SQL;
+ return $this->db()->Execute($sql);
+ }
+
+ public function down()
+ {
+ return $this->db()->Execute('DROP TABLE Migrations');
+ }
+ */
+}
+
+
+class MigrationManager{
+
+ private $migration_path;
+
+ protected $db = null;
+
+ public function __construct()
+ {
+ $this->migration_path = APP_BASE_PATH .'/db_migrations/';
+ }
+
+ public function setMigrationPath($migration_path){
+ $this->migration_path = $migration_path;
+ }
+
+ public function getMigrationById($id){
+ $migration = new Migration();
+ $migration->Load("id = ?",array($id));
+ return $migration;
+ }
+
+ public function getCurrentMigrations(){
+ $migration = new Migration();
+ return $migration->Find("1 = 1");
+ }
+
+ public function getPendingMigrations(){
+ $migration = new Migration();
+ return $migration->Find("status = ?",array('Pending'));
+ }
+
+ public function getFirstAddedMigration($statuses){
+ $migration = new Migration();
+ return $migration->Find("status in ('".implode("','",$statuses)."') order by created limit 1",array());
+ }
+
+ public function getLastRunMigration($statuses){
+ $migration = new Migration();
+ return $migration->Find("status in ('".implode("','",$statuses)."') order by updated desc limit 1",array());
+ }
+
+ public function queueMigrations(){
+
+ $migrations = array();
+ $ams = scandir($this->migration_path);
+ foreach($ams as $am) {
+ if (is_file($this->migration_path . $am)) {
+ $migrations[$am] = $this->migration_path . $am;
+ }
+ }
+
+ ksort($migrations);
+
+ if(!empty($migrations)){
+ $migrationsInDB = $this->getCurrentMigrations();
+ $migrationsInDBKeyVal = array();
+ foreach ($migrationsInDB as $migration){
+ $migrationsInDBKeyVal[$migration->file] = $migration;
+ }
+
+ foreach($migrations as $file => $path){
+ if(!isset($migrationsInDBKeyVal[$file])){
+ if($file == 'list.php'){
+ continue;
+ }
+ $migration = new Migration();
+ $migration->file = $file;
+ $parts = explode("_",$file);
+ $migration->version = intval($parts[1]);
+ $migration->created = date("Y-m-d H:i:s");
+ $migration->updated = date("Y-m-d H:i:s");
+ $migration->status = 'Pending';
+ $migration->Save();
+ }
+ }
+ }
+ }
+
+ public function runPendingMigrations(){
+ $migrations = $this->getPendingMigrations();
+ foreach ($migrations as $migration){
+ $this->runMigrationUp($migration);
+ }
+ }
+
+ public function runMigration($action){
+ $method = 'runMigration'.ucfirst($action);
+
+ if($action == 'up'){
+ $statuses = array("Pending","Down");
+ $queryMethod = 'getFirstAddedMigration';
+ }else if($action == 'down'){
+ $statuses = array("Up");
+ $queryMethod = 'getLastRunMigration';
+ }else{
+ return false;
+ }
+ $migrations = $this->$queryMethod($statuses);
+ if(count($migrations) > 0){
+ $this->$method($migrations[0]);
+ return $this->getMigrationById($migrations[0]->id);
+ }else{
+ $this->queueMigrations();
+ $migrations = $this->$queryMethod($statuses);
+ if(count($migrations) > 0){
+ $this->$method($migrations[0]);
+ return $this->getMigrationById($migrations[0]->id);
+ }
+ }
+
+ return false;
+ }
+
+
+ public function runMigrationUp($migration){
+ if($migration->status != 'Pending' && $migration->status != 'UpError' && $migration->status != 'Down'){
+ return false;
+ }
+
+ $path = $this->migration_path . $migration->file;
+ if(!file_exists($path)){
+ return false;
+ }
+ $migrationName = str_replace('.php','',$migration->file);
+ if(!class_exists($migrationName)){
+ include $path;
+ }
+ $migClass = new $migrationName;
+ $res = $migClass->up();
+ if(!$res){
+ $migration->last_error = $migClass->getLastError();
+ $migration->status = "UpError";
+ $migration->updated = date("Y-m-d H:i:s");
+ $migration->Save();
+ }
+
+ $migration->status = "Up";
+ $migration->updated = date("Y-m-d H:i:s");
+ $migration->Save();
+ return $migration;
+
+ }
+
+ public function runMigrationDown($migration){
+ if($migration->status != 'Up' && $migration->status != 'UpError'){
+ return false;
+ }
+
+ $path = $this->migration_path . $migration->file;
+ if(!file_exists($path)){
+ return false;
+ }
+
+ $migrationName = str_replace('.php','',$migration->file);
+ if(!class_exists($migrationName)){
+ include $path;
+ }
+ $migClass = new $migrationName;
+ $res = $migClass->down();
+ if(!$res){
+ $migration->last_error = $migClass->getLastError();
+ $migration->status = "DownError";
+ $migration->updated = date("Y-m-d H:i:s");
+ $migration->Save();
+ }
+
+ $migration->status = "Down";
+ $migration->updated = date("Y-m-d H:i:s");
+ $migration->Save();
+ return $migration;
+ }
+
+ public function ensureMigrations(){
+
+ $migration = new Migration();
+ $migration->Load("1 = 1 order by id desc limit 1");
+
+ include $this->migration_path . "list.php";
+
+ if (count($migrationList) > 0 && (empty($migration->id) || $migrationList[0].".php" != $migration->file)) {
+ LogManager::getInstance()->info("ensureMigrations - execute migrations");
+ $this->queueMigrations();
+ $this->runPendingMigrations();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/classes/RestApiManager.php b/src/classes/RestApiManager.php
index 320a48e6..4db9f098 100644
--- a/src/classes/RestApiManager.php
+++ b/src/classes/RestApiManager.php
@@ -125,26 +125,124 @@ class RestApiManager{
class RestEndPoint{
public function process($type , $parameter = NULL){
- $resp = $this->$type($parameter);
- $this->printResponse($resp);
+
+ $accessTokenValidation = $this->validateAccessToken();
+ if($accessTokenValidation->getStatus() == IceResponse::ERROR){
+ $resp = $accessTokenValidation;
+ }else{
+ $resp = $this->$type($parameter);
+ }
+
+ if($resp->getStatus() == IceResponse::SUCCESS && $resp->getCode() == null){
+ header('Content-Type: application/json');
+ http_response_code(200);
+ $this->printResponse($resp->getObject());
+
+ }else if($resp->getStatus() == IceResponse::SUCCESS){
+ header('Content-Type: application/json');
+ http_response_code($resp->getCode());
+ $this->printResponse($resp->getObject());
+
+ }else{
+ header('Content-Type: application/json');
+ http_response_code($resp->getCode());
+ $messages = array();
+ $messages[] = array(
+ "code" => $resp->getCode(),
+ "message" => $resp->getObject()
+ );
+ $this->printResponse(array("error",[$messages]));
+ }
+
}
public function get($parameter){
- return new IceResponse(IceResponse::ERROR, "Method not Implemented");
+ return new IceResponse(IceResponse::ERROR, "Method not Implemented", 404);
}
public function post($parameter){
- return new IceResponse(IceResponse::ERROR, "Method not Implemented");
+ return new IceResponse(IceResponse::ERROR, "Method not Implemented", 404);
}
public function put($parameter){
- return new IceResponse(IceResponse::ERROR, "Method not Implemented");
+ return new IceResponse(IceResponse::ERROR, "Method not Implemented", 404);
}
public function delete($parameter){
- return new IceResponse(IceResponse::ERROR, "Method not Implemented");
+ return new IceResponse(IceResponse::ERROR, "Method not Implemented", 404);
}
+ public function basicValidation($map, $data){
+ $validator = new Validator();
+ $map = $this->getAssocMap($map);
+ unset($map['id']);
+ foreach ($data as $key=>$val) {
+ if(!isset($map[$key])){
+ unset($data[$key]);
+ continue;
+ }
+
+ $vrules = $map[$key];
+ if ((!isset($vrules['allow-null']) || $vrules['allow-null'] == false) && $vrules['validation'] != "none" && empty($data[$key])){
+ return new IceResponse(IceResponse::ERROR, "Field should have a value - ".$key, 400);
+ } else if(isset($vrules['remote-source'])){
+ $class = $vrules['remote-source'][0];
+ $obj = new $class();
+ $idField = $vrules['remote-source'][1];
+ $obj->Load($idField." = ?", array($val));
+ if(empty($obj->$idField) || $obj->$idField != $val){
+ if($vrules['allow-null'] == true ){
+ $data[$key] = null;
+ }else{
+ return new IceResponse(IceResponse::ERROR, "Not found - ".$key, 400);
+ }
+ }
+ }
+ if(!isset($vrules['remote-source'])){
+ if((!isset($vrules['validation']) || empty($vrules['validation']))){
+ if(!$validator->validateRequired($val)){
+ return new IceResponse(IceResponse::ERROR, "Required field value missing - ".$key, 400);
+ }
+ }else if($vrules['validation'] != "none"){
+ $validationRule = "validate". ucfirst($vrules['validation']);
+ if(!$validator->$validationRule($val)){
+ return new IceResponse(IceResponse::ERROR, "Validation failed - ".$key, 400);
+ }
+ }
+ }
+
+ }
+
+ //check if request has all required fields
+ foreach ($map as $key=>$val) {
+ $vrules = $map[$key];
+ if(!isset($vrules['remote-source'])) {
+ if ($vrules['validation'] != "none") {
+ if (!isset($data[$key])) {
+ return new IceResponse(IceResponse::ERROR, "Required field missing - " . $key, 400);
+ }
+ }
+ }else{
+ if (!isset($vrules['allow-null']) || $vrules['allow-null'] == false) {
+ if (!isset($data[$key])) {
+ return new IceResponse(IceResponse::ERROR, "Required field missing - " . $key, 400);
+ }
+ }
+ }
+ }
+
+ return new IceResponse(IceResponse::SUCCESS, null);
+
+ }
+
+ public function getAssocMap($map){
+ $amap = array();
+ foreach ($map as $item){
+ $amap[$item[0]] = $item[1];
+ }
+ return $amap;
+ }
+
public function clearObject($obj){
return BaseService::getInstance()->cleanUpAdoDB($obj);
}
@@ -155,8 +253,39 @@ class RestEndPoint{
return $accessTokenValidation;
}
+ public function getValidate($parameter, $data){
+ return new IceResponse(IceResponse::SUCCESS, null);
+ }
+
+ public function postValidate($parameter, $data){
+ return new IceResponse(IceResponse::SUCCESS, null);
+ }
+
+ public function putValidate($parameter, $data){
+ return new IceResponse(IceResponse::SUCCESS, null);
+ }
+
+ public function deleteValidate($parameter, $data){
+ return new IceResponse(IceResponse::SUCCESS, null);
+ }
+
+ public function cleanDBObject($obj){
+ unset($obj->keysToIgnore);
+ return $obj;
+ }
+
public function printResponse($response){
echo json_encode($response,JSON_PRETTY_PRINT);
}
+
+ public function getRequestBodyJSON() {
+ $rawInput = file_get_contents('php://input');
+ return json_decode($rawInput, true);
+ }
+
+ public function getRequestBody() {
+ $rawInput = file_get_contents('php://input');
+ return $rawInput;
+ }
}
diff --git a/src/classes/SubActionManager.php b/src/classes/SubActionManager.php
index 954da6ab..16d6b309 100644
--- a/src/classes/SubActionManager.php
+++ b/src/classes/SubActionManager.php
@@ -28,10 +28,12 @@ class IceResponse{
var $status;
var $data;
+ var $code;
- public function __construct($status,$data = null){
+ public function __construct($status, $data = null, $code = null){
$this->status = $status;
$this->data = $data;
+ $this->code = $code;
}
public function getStatus(){
@@ -45,6 +47,10 @@ class IceResponse{
public function getObject(){
return $this->data;
}
+
+ public function getCode(){
+ return $this->code;
+ }
public function getJsonArray(){
return array("status"=>$this->status,"data"=>$this->data);
diff --git a/src/classes/Validator.php b/src/classes/Validator.php
new file mode 100644
index 00000000..da149767
--- /dev/null
+++ b/src/classes/Validator.php
@@ -0,0 +1,46 @@
+=5.4.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "psr/log": "~1",
+ "symfony/console": "^2.8|~3",
+ "symfony/event-dispatcher": "^2.5|~3",
+ "symfony/finder": "^2.5|~3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "^2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\AnnotatedCommand\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Initialize Symfony Console commands from annotated command class methods.",
+ "time": "2016-11-19 01:02:43"
+ },
+ {
+ "name": "consolidation/log",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/log.git",
+ "reference": "74ba81b4edc585616747cc5c5309ce56fec41254"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/log/zipball/74ba81b4edc585616747cc5c5309ce56fec41254",
+ "reference": "74ba81b4edc585616747cc5c5309ce56fec41254",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "psr/log": "~1.0",
+ "symfony/console": "~2.5|~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.",
+ "time": "2016-03-23 23:46:42"
+ },
+ {
+ "name": "consolidation/output-formatters",
+ "version": "3.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/output-formatters.git",
+ "reference": "1e6c6ab49904a31c310940ec4efccf5f36e386e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/1e6c6ab49904a31c310940ec4efccf5f36e386e4",
+ "reference": "1e6c6ab49904a31c310940ec4efccf5f36e386e4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "symfony/console": "~2.5|~3.0",
+ "symfony/finder": "~2.5|~3.0",
+ "victorjonsson/markdowndocs": "^1.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\OutputFormatters\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Format text by applying transformations provided by plug-in formatters.",
+ "time": "2016-11-18 23:04:31"
+ },
+ {
+ "name": "consolidation/robo",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/Robo.git",
+ "reference": "bfe2246358298d7839114612f84bcfdca3c14066"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/Robo/zipball/bfe2246358298d7839114612f84bcfdca3c14066",
+ "reference": "bfe2246358298d7839114612f84bcfdca3c14066",
+ "shasum": ""
+ },
+ "require": {
+ "consolidation/annotated-command": "^2.0.1",
+ "consolidation/log": "~1",
+ "consolidation/output-formatters": "^2.1.2|~3",
+ "league/container": "^2.2",
+ "php": ">=5.5.0",
+ "symfony/console": "~2.8|~3.0",
+ "symfony/event-dispatcher": "~2.5|~3.0",
+ "symfony/filesystem": "~2.5|~3.0",
+ "symfony/finder": "~2.5|~3.0",
+ "symfony/process": "~2.5|~3.0"
+ },
+ "replace": {
+ "codegyre/robo": "< 1.0"
+ },
+ "require-dev": {
+ "codeception/aspect-mock": "~1",
+ "codeception/base": "^2.2.6",
+ "codeception/verify": "^0.3.2",
+ "henrikbjorn/lurker": "~1",
+ "natxet/cssmin": "~3",
+ "patchwork/jsqueeze": "~2",
+ "pear/archive_tar": "^1.4.2",
+ "phpunit/php-code-coverage": "~2|~4",
+ "satooshi/php-coveralls": "~1",
+ "squizlabs/php_codesniffer": "~2"
+ },
+ "suggest": {
+ "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch",
+ "natxet/CssMin": "For minifying JS files in taskMinify",
+ "patchwork/jsqueeze": "For minifying JS files in taskMinify",
+ "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively."
+ },
+ "bin": [
+ "robo"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "scripts/composer/ScriptHandler.php"
+ ],
+ "psr-4": {
+ "Robo\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Davert",
+ "email": "davert.php@resend.cc"
+ }
+ ],
+ "description": "Modern task runner",
+ "time": "2016-11-15 19:24:36"
+ },
+ {
+ "name": "container-interop/container-interop",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/container-interop/container-interop.git",
+ "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "time": "2014-12-30 15:22:37"
+ },
{
"name": "gettext/gettext",
"version": "v4.0.0",
@@ -121,6 +373,70 @@
],
"time": "2015-03-27 11:32:41"
},
+ {
+ "name": "league/container",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/container.git",
+ "reference": "c0e7d947b690891f700dc4967ead7bdb3d6708c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/container/zipball/c0e7d947b690891f700dc4967ead7bdb3d6708c1",
+ "reference": "c0e7d947b690891f700dc4967ead7bdb3d6708c1",
+ "shasum": ""
+ },
+ "require": {
+ "container-interop/container-interop": "^1.1",
+ "php": ">=5.4.0"
+ },
+ "provide": {
+ "container-interop/container-interop-implementation": "^1.1"
+ },
+ "replace": {
+ "orno/di": "~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Container\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Phil Bennett",
+ "email": "philipobenito@gmail.com",
+ "homepage": "http://www.philipobenito.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A fast and intuitive dependency injection container.",
+ "homepage": "https://github.com/thephpleague/container",
+ "keywords": [
+ "container",
+ "dependency",
+ "di",
+ "injection",
+ "league",
+ "provider",
+ "service"
+ ],
+ "time": "2016-03-17 11:07:59"
+ },
{
"name": "monolog/monolog",
"version": "1.13.1",
@@ -195,23 +511,177 @@
"time": "2015-03-09 09:58:04"
},
{
- "name": "psr/log",
- "version": "1.0.0",
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
"shasum": ""
},
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-12-27 11:43:31"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
"type": "library",
"autoload": {
- "psr-0": {
- "Psr\\Log\\": ""
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2016-09-30 07:12:33"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-06-10 07:14:17"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -225,12 +695,397 @@
}
],
"description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
],
- "time": "2012-12-21 11:40:51"
+ "time": "2016-10-10 12:19:37"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/debug": "~2.8|~3.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-06 01:44:51"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/class-loader": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-06 11:02:40"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/dependency-injection": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/stopwatch": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-13 06:28:43"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-18 04:30:12"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-28 00:11:12"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2016-11-14 01:06:16"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "66de154ae86b1a07001da9fbffd620206e4faf94"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/66de154ae86b1a07001da9fbffd620206e4faf94",
+ "reference": "66de154ae86b1a07001da9fbffd620206e4faf94",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-29 14:13:09"
},
{
"name": "twig/twig",
@@ -292,9 +1147,1210 @@
"templating"
],
"time": "2016-01-11 14:02:19"
+ },
+ {
+ "name": "victorjonsson/markdowndocs",
+ "version": "1.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator.git",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/victorjonsson/PHP-Markdown-Documentation-Generator/zipball/a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "symfony/console": ">=2.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.23"
+ },
+ "bin": [
+ "bin/phpdoc-md"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "PHPDocsMD": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Victor Jonsson",
+ "email": "kontakt@victorjonsson.se"
+ }
+ ],
+ "description": "Command line tool for generating markdown-formatted class documentation",
+ "homepage": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator",
+ "time": "2016-10-11 21:10:19"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3|^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2016-08-09 15:02:57"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14 21:17:01"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.5.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108",
+ "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2016-10-31 17:19:45"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2016-06-07 08:13:47"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "4.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "6cba06ff75a1a63a71033e1a01b89056f3af1e8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6cba06ff75a1a63a71033e1a01b89056f3af1e8d",
+ "reference": "6cba06ff75a1a63a71033e1a01b89056f3af1e8d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "^1.4.2",
+ "sebastian/code-unit-reverse-lookup": "~1.0",
+ "sebastian/environment": "^1.3.2 || ^2.0",
+ "sebastian/version": "~1.0|~2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.4.0",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2016-11-01 05:06:24"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2015-06-21 13:08:43"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21 13:50:34"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2016-05-12 18:03:57"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2016-11-15 14:06:22"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "5.5.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "3f67cee782c9abfaee5e32fd2f57cdd54bc257ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3f67cee782c9abfaee5e32fd2f57cdd54bc257ba",
+ "reference": "3f67cee782c9abfaee5e32fd2f57cdd54bc257ba",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "~1.3",
+ "php": "^5.6 || ^7.0",
+ "phpspec/prophecy": "^1.3.1",
+ "phpunit/php-code-coverage": "^4.0.1",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^3.2",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "^1.3 || ^2.0",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/object-enumerator": "~1.0",
+ "sebastian/resource-operations": "~1.0",
+ "sebastian/version": "~1.0|~2.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-tidy": "*",
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.5.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2016-10-03 13:04:15"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "3.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "45026c8383187ad1dcb14fbfec77dced265b9cfc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/45026c8383187ad1dcb14fbfec77dced265b9cfc",
+ "reference": "45026c8383187ad1dcb14fbfec77dced265b9cfc",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^1.2 || ^2.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2016-11-19 09:07:46"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2016-02-13 06:45:14"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
+ "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2 || ~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2016-11-19 09:18:40"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08 07:14:41"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-08-18 05:49:44"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2016-06-17 09:04:28"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12 03:26:01"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "d4ca2fb70344987502567bc50081c03e6192fb26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26",
+ "reference": "d4ca2fb70344987502567bc50081c03e6192fb26",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2016-01-28 13:25:10"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/938df7a6478e72795e5f8266cff24d06e3136f2e",
+ "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2016-11-15 06:55:36"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2015-07-28 20:34:47"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
+ "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-02-04 12:56:52"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-24 18:41:13"
}
],
- "packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
diff --git a/src/composer/vendor/bin/phpdoc-md b/src/composer/vendor/bin/phpdoc-md
new file mode 120000
index 00000000..95ab23ba
--- /dev/null
+++ b/src/composer/vendor/bin/phpdoc-md
@@ -0,0 +1 @@
+../victorjonsson/markdowndocs/bin/phpdoc-md
\ No newline at end of file
diff --git a/src/composer/vendor/bin/phpunit b/src/composer/vendor/bin/phpunit
new file mode 120000
index 00000000..2c489303
--- /dev/null
+++ b/src/composer/vendor/bin/phpunit
@@ -0,0 +1 @@
+../phpunit/phpunit/phpunit
\ No newline at end of file
diff --git a/src/composer/vendor/bin/robo b/src/composer/vendor/bin/robo
new file mode 120000
index 00000000..701d42dd
--- /dev/null
+++ b/src/composer/vendor/bin/robo
@@ -0,0 +1 @@
+../consolidation/robo/robo
\ No newline at end of file
diff --git a/src/composer/vendor/composer/autoload_classmap.php b/src/composer/vendor/composer/autoload_classmap.php
index 7a91153b..6bb4897d 100644
--- a/src/composer/vendor/composer/autoload_classmap.php
+++ b/src/composer/vendor/composer/autoload_classmap.php
@@ -6,4 +6,460 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'File_Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php',
+ 'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php',
+ 'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php',
+ 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/ForwardCompatibility/TestCase.php',
+ 'PHPUnit_Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php',
+ 'PHPUnit_Extensions_GroupTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php',
+ 'PHPUnit_Extensions_PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestCase.php',
+ 'PHPUnit_Extensions_PhptTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php',
+ 'PHPUnit_Extensions_RepeatedTest' => $vendorDir . '/phpunit/phpunit/src/Extensions/RepeatedTest.php',
+ 'PHPUnit_Extensions_TestDecorator' => $vendorDir . '/phpunit/phpunit/src/Extensions/TestDecorator.php',
+ 'PHPUnit_Extensions_TicketListener' => $vendorDir . '/phpunit/phpunit/src/Extensions/TicketListener.php',
+ 'PHPUnit_Framework_Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php',
+ 'PHPUnit_Framework_AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
+ 'PHPUnit_Framework_BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
+ 'PHPUnit_Framework_CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
+ 'PHPUnit_Framework_Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint.php',
+ 'PHPUnit_Framework_Constraint_And' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/And.php',
+ 'PHPUnit_Framework_Constraint_ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
+ 'PHPUnit_Framework_Constraint_ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
+ 'PHPUnit_Framework_Constraint_Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php',
+ 'PHPUnit_Framework_Constraint_Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php',
+ 'PHPUnit_Framework_Constraint_ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php',
+ 'PHPUnit_Framework_Constraint_Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php',
+ 'PHPUnit_Framework_Constraint_Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php',
+ 'PHPUnit_Framework_Constraint_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php',
+ 'PHPUnit_Framework_Constraint_ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php',
+ 'PHPUnit_Framework_Constraint_FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php',
+ 'PHPUnit_Framework_Constraint_GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php',
+ 'PHPUnit_Framework_Constraint_IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php',
+ 'PHPUnit_Framework_Constraint_IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php',
+ 'PHPUnit_Framework_Constraint_IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php',
+ 'PHPUnit_Framework_Constraint_IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php',
+ 'PHPUnit_Framework_Constraint_IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php',
+ 'PHPUnit_Framework_Constraint_IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php',
+ 'PHPUnit_Framework_Constraint_IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php',
+ 'PHPUnit_Framework_Constraint_IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php',
+ 'PHPUnit_Framework_Constraint_IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php',
+ 'PHPUnit_Framework_Constraint_IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php',
+ 'PHPUnit_Framework_Constraint_IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php',
+ 'PHPUnit_Framework_Constraint_IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php',
+ 'PHPUnit_Framework_Constraint_IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php',
+ 'PHPUnit_Framework_Constraint_LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php',
+ 'PHPUnit_Framework_Constraint_Not' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Not.php',
+ 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_Or' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Or.php',
+ 'PHPUnit_Framework_Constraint_PCREMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php',
+ 'PHPUnit_Framework_Constraint_SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php',
+ 'PHPUnit_Framework_Constraint_StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php',
+ 'PHPUnit_Framework_Constraint_StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php',
+ 'PHPUnit_Framework_Constraint_StringMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php',
+ 'PHPUnit_Framework_Constraint_StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php',
+ 'PHPUnit_Framework_Constraint_TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php',
+ 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php',
+ 'PHPUnit_Framework_Constraint_Xor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Xor.php',
+ 'PHPUnit_Framework_CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/PHPUnit_Framework_CoveredCodeNotExecutedException.php',
+ 'PHPUnit_Framework_Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error.php',
+ 'PHPUnit_Framework_Error_Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php',
+ 'PHPUnit_Framework_Error_Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php',
+ 'PHPUnit_Framework_Error_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php',
+ 'PHPUnit_Framework_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception.php',
+ 'PHPUnit_Framework_ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php',
+ 'PHPUnit_Framework_ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php',
+ 'PHPUnit_Framework_IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php',
+ 'PHPUnit_Framework_IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php',
+ 'PHPUnit_Framework_IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
+ 'PHPUnit_Framework_MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/PHPUnit_Framework_MissingCoversAnnotationException.php',
+ 'PHPUnit_Framework_MockObject_BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php',
+ 'PHPUnit_Framework_MockObject_Builder_Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php',
+ 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Builder_Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php',
+ 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Namespace' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php',
+ 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php',
+ 'PHPUnit_Framework_MockObject_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php',
+ 'PHPUnit_Framework_MockObject_Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php',
+ 'PHPUnit_Framework_MockObject_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php',
+ 'PHPUnit_Framework_MockObject_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Object' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Static' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php',
+ 'PHPUnit_Framework_MockObject_Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php',
+ 'PHPUnit_Framework_MockObject_Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php',
+ 'PHPUnit_Framework_MockObject_Matcher_MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php',
+ 'PHPUnit_Framework_MockObject_MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php',
+ 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php',
+ 'PHPUnit_Framework_MockObject_RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php',
+ 'PHPUnit_Framework_MockObject_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php',
+ 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
+ 'PHPUnit_Framework_MockObject_Stub_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php',
+ 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php',
+ 'PHPUnit_Framework_MockObject_Stub_Return' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnReference' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnReference.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php',
+ 'PHPUnit_Framework_MockObject_Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php',
+ 'PHPUnit_Framework_OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php',
+ 'PHPUnit_Framework_RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php',
+ 'PHPUnit_Framework_RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
+ 'PHPUnit_Framework_SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php',
+ 'PHPUnit_Framework_SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php',
+ 'PHPUnit_Framework_SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php',
+ 'PHPUnit_Framework_SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestError.php',
+ 'PHPUnit_Framework_SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php',
+ 'PHPUnit_Framework_SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/SyntheticError.php',
+ 'PHPUnit_Framework_Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php',
+ 'PHPUnit_Framework_TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php',
+ 'PHPUnit_Framework_TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php',
+ 'PHPUnit_Framework_TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php',
+ 'PHPUnit_Framework_TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php',
+ 'PHPUnit_Framework_TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php',
+ 'PHPUnit_Framework_TestSuite_DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php',
+ 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
+ 'PHPUnit_Framework_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php',
+ 'PHPUnit_Framework_WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php',
+ 'PHPUnit_Runner_BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
+ 'PHPUnit_Runner_Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php',
+ 'PHPUnit_Runner_Filter_Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
+ 'PHPUnit_Runner_Filter_GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group.php',
+ 'PHPUnit_Runner_Filter_Group_Exclude' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php',
+ 'PHPUnit_Runner_Filter_Group_Include' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php',
+ 'PHPUnit_Runner_Filter_Test' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Test.php',
+ 'PHPUnit_Runner_StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
+ 'PHPUnit_Runner_TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
+ 'PHPUnit_Runner_Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php',
+ 'PHPUnit_TextUI_Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php',
+ 'PHPUnit_TextUI_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
+ 'PHPUnit_TextUI_TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php',
+ 'PHPUnit_Util_Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php',
+ 'PHPUnit_Util_Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php',
+ 'PHPUnit_Util_ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php',
+ 'PHPUnit_Util_ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php',
+ 'PHPUnit_Util_Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php',
+ 'PHPUnit_Util_Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php',
+ 'PHPUnit_Util_Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php',
+ 'PHPUnit_Util_Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php',
+ 'PHPUnit_Util_GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php',
+ 'PHPUnit_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php',
+ 'PHPUnit_Util_Log_JSON' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JSON.php',
+ 'PHPUnit_Util_Log_JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php',
+ 'PHPUnit_Util_Log_TAP' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TAP.php',
+ 'PHPUnit_Util_Log_TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php',
+ 'PHPUnit_Util_PHP' => $vendorDir . '/phpunit/phpunit/src/Util/PHP.php',
+ 'PHPUnit_Util_PHP_Default' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Default.php',
+ 'PHPUnit_Util_PHP_Windows' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Windows.php',
+ 'PHPUnit_Util_Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php',
+ 'PHPUnit_Util_Regex' => $vendorDir . '/phpunit/phpunit/src/Util/Regex.php',
+ 'PHPUnit_Util_String' => $vendorDir . '/phpunit/phpunit/src/Util/String.php',
+ 'PHPUnit_Util_Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php',
+ 'PHPUnit_Util_TestDox_NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_Text' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_XML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/XML.php',
+ 'PHPUnit_Util_TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Util/TestSuiteIterator.php',
+ 'PHPUnit_Util_Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php',
+ 'PHPUnit_Util_XML' => $vendorDir . '/phpunit/phpunit/src/Util/XML.php',
+ 'PHP_Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php',
+ 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AWAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMPILER_HALT_OFFSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUALS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_OP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ONUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SHAPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SUPER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php',
+ 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
+ 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHERE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TEXT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'Robo\\composer\\ScriptHandler' => $vendorDir . '/consolidation/robo/scripts/composer/ScriptHandler.php',
+ 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php',
+ 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/HHVM.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php',
+ 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php',
+ 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php',
+ 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php',
+ 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php',
+ 'SebastianBergmann\\CodeCoverage\\RuntimeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php',
+ 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php',
+ 'SebastianBergmann\\CodeCoverage\\Util' => $vendorDir . '/phpunit/php-code-coverage/src/Util.php',
+ 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php',
+ 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php',
+ 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php',
+ 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php',
+ 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php',
+ 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php',
+ 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php',
+ 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php',
+ 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php',
+ 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php',
+ 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php',
+ 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php',
+ 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php',
+ 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php',
+ 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php',
+ 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php',
+ 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php',
+ 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => $vendorDir . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php',
+ 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php',
+ 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php',
+ 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php',
+ 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php',
+ 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php',
+ 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php',
+ 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php',
+ 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/Exception.php',
+ 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php',
+ 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/RuntimeException.php',
+ 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php',
+ 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php',
+ 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php',
+ 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php',
+ 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php',
+ 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php',
);
diff --git a/src/composer/vendor/composer/autoload_files.php b/src/composer/vendor/composer/autoload_files.php
new file mode 100644
index 00000000..315ab83b
--- /dev/null
+++ b/src/composer/vendor/composer/autoload_files.php
@@ -0,0 +1,10 @@
+ $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+);
diff --git a/src/composer/vendor/composer/autoload_namespaces.php b/src/composer/vendor/composer/autoload_namespaces.php
index 35f816d5..3163d160 100644
--- a/src/composer/vendor/composer/autoload_namespaces.php
+++ b/src/composer/vendor/composer/autoload_namespaces.php
@@ -7,5 +7,6 @@ $baseDir = dirname($vendorDir);
return array(
'Twig_' => array($vendorDir . '/twig/twig/lib'),
- 'Psr\\Log\\' => array($vendorDir . '/psr/log'),
+ 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'),
+ 'PHPDocsMD' => array($vendorDir . '/victorjonsson/markdowndocs/src'),
);
diff --git a/src/composer/vendor/composer/autoload_psr4.php b/src/composer/vendor/composer/autoload_psr4.php
index 11dca6fe..513028ae 100644
--- a/src/composer/vendor/composer/autoload_psr4.php
+++ b/src/composer/vendor/composer/autoload_psr4.php
@@ -6,7 +6,26 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'),
+ 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
+ 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
+ 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
+ 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
+ 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
+ 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
+ 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
+ 'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
+ 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
+ 'Robo\\' => array($vendorDir . '/consolidation/robo/src'),
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
+ 'League\\Container\\' => array($vendorDir . '/league/container/src'),
+ 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'),
'Gettext\\Languages\\' => array($vendorDir . '/gettext/languages/src'),
'Gettext\\' => array($vendorDir . '/gettext/gettext/src'),
+ 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
+ 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
+ 'Consolidation\\OutputFormatters\\' => array($vendorDir . '/consolidation/output-formatters/src'),
+ 'Consolidation\\Log\\' => array($vendorDir . '/consolidation/log/src'),
+ 'Consolidation\\AnnotatedCommand\\' => array($vendorDir . '/consolidation/annotated-command/src'),
);
diff --git a/src/composer/vendor/composer/autoload_real.php b/src/composer/vendor/composer/autoload_real.php
index e81e9eaf..64b2ec07 100644
--- a/src/composer/vendor/composer/autoload_real.php
+++ b/src/composer/vendor/composer/autoload_real.php
@@ -47,6 +47,24 @@ class ComposerAutoloaderInit91d733469d809ee1828b45ab2da48a10
$loader->register(true);
+ if ($useStaticLoader) {
+ $includeFiles = Composer\Autoload\ComposerStaticInit91d733469d809ee1828b45ab2da48a10::$files;
+ } else {
+ $includeFiles = require __DIR__ . '/autoload_files.php';
+ }
+ foreach ($includeFiles as $fileIdentifier => $file) {
+ composerRequire91d733469d809ee1828b45ab2da48a10($fileIdentifier, $file);
+ }
+
return $loader;
}
}
+
+function composerRequire91d733469d809ee1828b45ab2da48a10($fileIdentifier, $file)
+{
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+ require $file;
+
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+ }
+}
diff --git a/src/composer/vendor/composer/autoload_static.php b/src/composer/vendor/composer/autoload_static.php
index 2d99756d..ca1a40c9 100644
--- a/src/composer/vendor/composer/autoload_static.php
+++ b/src/composer/vendor/composer/autoload_static.php
@@ -6,23 +6,131 @@ namespace Composer\Autoload;
class ComposerStaticInit91d733469d809ee1828b45ab2da48a10
{
+ public static $files = array (
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
+ );
+
public static $prefixLengthsPsr4 = array (
+ 'p' =>
+ array (
+ 'phpDocumentor\\Reflection\\' => 25,
+ ),
+ 'W' =>
+ array (
+ 'Webmozart\\Assert\\' => 17,
+ ),
+ 'S' =>
+ array (
+ 'Symfony\\Polyfill\\Mbstring\\' => 26,
+ 'Symfony\\Component\\Yaml\\' => 23,
+ 'Symfony\\Component\\Process\\' => 26,
+ 'Symfony\\Component\\Finder\\' => 25,
+ 'Symfony\\Component\\Filesystem\\' => 29,
+ 'Symfony\\Component\\EventDispatcher\\' => 34,
+ 'Symfony\\Component\\Debug\\' => 24,
+ 'Symfony\\Component\\Console\\' => 26,
+ ),
+ 'R' =>
+ array (
+ 'Robo\\' => 5,
+ ),
+ 'P' =>
+ array (
+ 'Psr\\Log\\' => 8,
+ ),
'M' =>
array (
'Monolog\\' => 8,
),
+ 'L' =>
+ array (
+ 'League\\Container\\' => 17,
+ ),
+ 'I' =>
+ array (
+ 'Interop\\Container\\' => 18,
+ ),
'G' =>
array (
'Gettext\\Languages\\' => 18,
'Gettext\\' => 8,
),
+ 'D' =>
+ array (
+ 'Doctrine\\Instantiator\\' => 22,
+ 'DeepCopy\\' => 9,
+ ),
+ 'C' =>
+ array (
+ 'Consolidation\\OutputFormatters\\' => 31,
+ 'Consolidation\\Log\\' => 18,
+ 'Consolidation\\AnnotatedCommand\\' => 31,
+ ),
);
public static $prefixDirsPsr4 = array (
+ 'phpDocumentor\\Reflection\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
+ 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
+ 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
+ ),
+ 'Webmozart\\Assert\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/webmozart/assert/src',
+ ),
+ 'Symfony\\Polyfill\\Mbstring\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
+ ),
+ 'Symfony\\Component\\Yaml\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/yaml',
+ ),
+ 'Symfony\\Component\\Process\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/process',
+ ),
+ 'Symfony\\Component\\Finder\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/finder',
+ ),
+ 'Symfony\\Component\\Filesystem\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/filesystem',
+ ),
+ 'Symfony\\Component\\EventDispatcher\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/event-dispatcher',
+ ),
+ 'Symfony\\Component\\Debug\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/debug',
+ ),
+ 'Symfony\\Component\\Console\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/console',
+ ),
+ 'Robo\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/consolidation/robo/src',
+ ),
+ 'Psr\\Log\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
+ ),
'Monolog\\' =>
array (
0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',
),
+ 'League\\Container\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/league/container/src',
+ ),
+ 'Interop\\Container\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container',
+ ),
'Gettext\\Languages\\' =>
array (
0 => __DIR__ . '/..' . '/gettext/languages/src',
@@ -31,6 +139,26 @@ class ComposerStaticInit91d733469d809ee1828b45ab2da48a10
array (
0 => __DIR__ . '/..' . '/gettext/gettext/src',
),
+ 'Doctrine\\Instantiator\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator',
+ ),
+ 'DeepCopy\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy',
+ ),
+ 'Consolidation\\OutputFormatters\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/consolidation/output-formatters/src',
+ ),
+ 'Consolidation\\Log\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/consolidation/log/src',
+ ),
+ 'Consolidation\\AnnotatedCommand\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/consolidation/annotated-command/src',
+ ),
);
public static $prefixesPsr0 = array (
@@ -43,19 +171,483 @@ class ComposerStaticInit91d733469d809ee1828b45ab2da48a10
),
'P' =>
array (
- 'Psr\\Log\\' =>
+ 'Prophecy\\' =>
array (
- 0 => __DIR__ . '/..' . '/psr/log',
+ 0 => __DIR__ . '/..' . '/phpspec/prophecy/src',
+ ),
+ 'PHPDocsMD' =>
+ array (
+ 0 => __DIR__ . '/..' . '/victorjonsson/markdowndocs/src',
),
),
);
+ public static $classMap = array (
+ 'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php',
+ 'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php',
+ 'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php',
+ 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/ForwardCompatibility/TestCase.php',
+ 'PHPUnit_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php',
+ 'PHPUnit_Extensions_GroupTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php',
+ 'PHPUnit_Extensions_PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestCase.php',
+ 'PHPUnit_Extensions_PhptTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php',
+ 'PHPUnit_Extensions_RepeatedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/RepeatedTest.php',
+ 'PHPUnit_Extensions_TestDecorator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TestDecorator.php',
+ 'PHPUnit_Extensions_TicketListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TicketListener.php',
+ 'PHPUnit_Framework_Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php',
+ 'PHPUnit_Framework_AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
+ 'PHPUnit_Framework_BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
+ 'PHPUnit_Framework_CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
+ 'PHPUnit_Framework_Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint.php',
+ 'PHPUnit_Framework_Constraint_And' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/And.php',
+ 'PHPUnit_Framework_Constraint_ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
+ 'PHPUnit_Framework_Constraint_ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
+ 'PHPUnit_Framework_Constraint_Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php',
+ 'PHPUnit_Framework_Constraint_Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php',
+ 'PHPUnit_Framework_Constraint_ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php',
+ 'PHPUnit_Framework_Constraint_Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php',
+ 'PHPUnit_Framework_Constraint_Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php',
+ 'PHPUnit_Framework_Constraint_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php',
+ 'PHPUnit_Framework_Constraint_ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php',
+ 'PHPUnit_Framework_Constraint_FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php',
+ 'PHPUnit_Framework_Constraint_GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php',
+ 'PHPUnit_Framework_Constraint_IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php',
+ 'PHPUnit_Framework_Constraint_IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php',
+ 'PHPUnit_Framework_Constraint_IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php',
+ 'PHPUnit_Framework_Constraint_IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php',
+ 'PHPUnit_Framework_Constraint_IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php',
+ 'PHPUnit_Framework_Constraint_IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php',
+ 'PHPUnit_Framework_Constraint_IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php',
+ 'PHPUnit_Framework_Constraint_IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php',
+ 'PHPUnit_Framework_Constraint_IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php',
+ 'PHPUnit_Framework_Constraint_IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php',
+ 'PHPUnit_Framework_Constraint_IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php',
+ 'PHPUnit_Framework_Constraint_IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php',
+ 'PHPUnit_Framework_Constraint_IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php',
+ 'PHPUnit_Framework_Constraint_LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php',
+ 'PHPUnit_Framework_Constraint_Not' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Not.php',
+ 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_Or' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Or.php',
+ 'PHPUnit_Framework_Constraint_PCREMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php',
+ 'PHPUnit_Framework_Constraint_SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php',
+ 'PHPUnit_Framework_Constraint_StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php',
+ 'PHPUnit_Framework_Constraint_StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php',
+ 'PHPUnit_Framework_Constraint_StringMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php',
+ 'PHPUnit_Framework_Constraint_StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php',
+ 'PHPUnit_Framework_Constraint_TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php',
+ 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php',
+ 'PHPUnit_Framework_Constraint_Xor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Xor.php',
+ 'PHPUnit_Framework_CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/PHPUnit_Framework_CoveredCodeNotExecutedException.php',
+ 'PHPUnit_Framework_Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error.php',
+ 'PHPUnit_Framework_Error_Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php',
+ 'PHPUnit_Framework_Error_Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php',
+ 'PHPUnit_Framework_Error_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php',
+ 'PHPUnit_Framework_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception.php',
+ 'PHPUnit_Framework_ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php',
+ 'PHPUnit_Framework_ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php',
+ 'PHPUnit_Framework_IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php',
+ 'PHPUnit_Framework_IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php',
+ 'PHPUnit_Framework_IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
+ 'PHPUnit_Framework_MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/PHPUnit_Framework_MissingCoversAnnotationException.php',
+ 'PHPUnit_Framework_MockObject_BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php',
+ 'PHPUnit_Framework_MockObject_Builder_Identity' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php',
+ 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Builder_Match' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php',
+ 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Namespace' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php',
+ 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php',
+ 'PHPUnit_Framework_MockObject_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php',
+ 'PHPUnit_Framework_MockObject_Generator' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php',
+ 'PHPUnit_Framework_MockObject_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php',
+ 'PHPUnit_Framework_MockObject_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Object' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Static' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php',
+ 'PHPUnit_Framework_MockObject_Invokable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php',
+ 'PHPUnit_Framework_MockObject_Matcher' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php',
+ 'PHPUnit_Framework_MockObject_Matcher_MethodName' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Parameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php',
+ 'PHPUnit_Framework_MockObject_MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php',
+ 'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php',
+ 'PHPUnit_Framework_MockObject_RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php',
+ 'PHPUnit_Framework_MockObject_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php',
+ 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
+ 'PHPUnit_Framework_MockObject_Stub_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php',
+ 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php',
+ 'PHPUnit_Framework_MockObject_Stub_Return' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnReference.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php',
+ 'PHPUnit_Framework_MockObject_Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php',
+ 'PHPUnit_Framework_OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php',
+ 'PHPUnit_Framework_RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php',
+ 'PHPUnit_Framework_RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
+ 'PHPUnit_Framework_SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php',
+ 'PHPUnit_Framework_SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php',
+ 'PHPUnit_Framework_SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php',
+ 'PHPUnit_Framework_SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestError.php',
+ 'PHPUnit_Framework_SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php',
+ 'PHPUnit_Framework_SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SyntheticError.php',
+ 'PHPUnit_Framework_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php',
+ 'PHPUnit_Framework_TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php',
+ 'PHPUnit_Framework_TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php',
+ 'PHPUnit_Framework_TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php',
+ 'PHPUnit_Framework_TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php',
+ 'PHPUnit_Framework_TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php',
+ 'PHPUnit_Framework_TestSuite_DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php',
+ 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
+ 'PHPUnit_Framework_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php',
+ 'PHPUnit_Framework_WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php',
+ 'PHPUnit_Runner_BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
+ 'PHPUnit_Runner_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php',
+ 'PHPUnit_Runner_Filter_Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
+ 'PHPUnit_Runner_Filter_GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group.php',
+ 'PHPUnit_Runner_Filter_Group_Exclude' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php',
+ 'PHPUnit_Runner_Filter_Group_Include' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php',
+ 'PHPUnit_Runner_Filter_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Test.php',
+ 'PHPUnit_Runner_StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
+ 'PHPUnit_Runner_TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
+ 'PHPUnit_Runner_Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php',
+ 'PHPUnit_TextUI_Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php',
+ 'PHPUnit_TextUI_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
+ 'PHPUnit_TextUI_TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php',
+ 'PHPUnit_Util_Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php',
+ 'PHPUnit_Util_Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php',
+ 'PHPUnit_Util_ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php',
+ 'PHPUnit_Util_ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php',
+ 'PHPUnit_Util_Fileloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.php',
+ 'PHPUnit_Util_Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php',
+ 'PHPUnit_Util_Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php',
+ 'PHPUnit_Util_Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php',
+ 'PHPUnit_Util_GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php',
+ 'PHPUnit_Util_InvalidArgumentHelper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php',
+ 'PHPUnit_Util_Log_JSON' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JSON.php',
+ 'PHPUnit_Util_Log_JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php',
+ 'PHPUnit_Util_Log_TAP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TAP.php',
+ 'PHPUnit_Util_Log_TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php',
+ 'PHPUnit_Util_PHP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP.php',
+ 'PHPUnit_Util_PHP_Default' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Default.php',
+ 'PHPUnit_Util_PHP_Windows' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Windows.php',
+ 'PHPUnit_Util_Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php',
+ 'PHPUnit_Util_Regex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Regex.php',
+ 'PHPUnit_Util_String' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/String.php',
+ 'PHPUnit_Util_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php',
+ 'PHPUnit_Util_TestDox_NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/XML.php',
+ 'PHPUnit_Util_TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestSuiteIterator.php',
+ 'PHPUnit_Util_Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php',
+ 'PHPUnit_Util_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XML.php',
+ 'PHP_Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php',
+ 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ASYNC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AWAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMPILER_HALT_OFFSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENUM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUALS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_JOIN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_CP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_OP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ONUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SHAPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SUPER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php',
+ 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
+ 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHERE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_ATTRIBUTE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CHILDREN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_REQUIRED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TEXT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'Robo\\composer\\ScriptHandler' => __DIR__ . '/..' . '/consolidation/robo/scripts/composer/ScriptHandler.php',
+ 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php',
+ 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/HHVM.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php',
+ 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php',
+ 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php',
+ 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php',
+ 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php',
+ 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php',
+ 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php',
+ 'SebastianBergmann\\CodeCoverage\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php',
+ 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php',
+ 'SebastianBergmann\\CodeCoverage\\Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util.php',
+ 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php',
+ 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php',
+ 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php',
+ 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php',
+ 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php',
+ 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php',
+ 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php',
+ 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php',
+ 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php',
+ 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php',
+ 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php',
+ 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php',
+ 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php',
+ 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php',
+ 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php',
+ 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php',
+ 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php',
+ 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php',
+ 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php',
+ 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php',
+ 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php',
+ 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php',
+ 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php',
+ 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php',
+ 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php',
+ 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/Exception.php',
+ 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php',
+ 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/RuntimeException.php',
+ 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php',
+ 'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php',
+ 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php',
+ 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php',
+ 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php',
+ 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php',
+ 'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php',
+ );
+
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit91d733469d809ee1828b45ab2da48a10::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit91d733469d809ee1828b45ab2da48a10::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit91d733469d809ee1828b45ab2da48a10::$prefixesPsr0;
+ $loader->classMap = ComposerStaticInit91d733469d809ee1828b45ab2da48a10::$classMap;
}, null, ClassLoader::class);
}
diff --git a/src/composer/vendor/composer/installed.json b/src/composer/vendor/composer/installed.json
index b2b9de09..4afa3d00 100644
--- a/src/composer/vendor/composer/installed.json
+++ b/src/composer/vendor/composer/installed.json
@@ -1,44 +1,4 @@
[
- {
- "name": "psr/log",
- "version": "1.0.0",
- "version_normalized": "1.0.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
- "shasum": ""
- },
- "time": "2012-12-21 11:40:51",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-0": {
- "Psr\\Log\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ]
- },
{
"name": "monolog/monolog",
"version": "1.13.1",
@@ -294,5 +254,2178 @@
"po",
"translation"
]
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v3.1.6",
+ "version_normalized": "3.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/dependency-injection": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/stopwatch": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "time": "2016-10-13 06:28:43",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v3.1.6",
+ "version_normalized": "3.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "time": "2016-10-18 04:30:12",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v3.1.6",
+ "version_normalized": "3.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "66de154ae86b1a07001da9fbffd620206e4faf94"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/66de154ae86b1a07001da9fbffd620206e4faf94",
+ "reference": "66de154ae86b1a07001da9fbffd620206e4faf94",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "time": "2016-09-29 14:13:09",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-10-10 12:19:37",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ]
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.1.6",
+ "version_normalized": "3.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/class-loader": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0"
+ },
+ "time": "2016-09-06 11:02:40",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "time": "2016-11-14 01:06:16",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ]
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.1.6",
+ "version_normalized": "3.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/debug": "~2.8|~3.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/process": ""
+ },
+ "time": "2016-10-06 01:44:51",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v3.1.6",
+ "version_normalized": "3.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "time": "2016-09-28 00:11:12",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "container-interop/container-interop",
+ "version": "1.1.0",
+ "version_normalized": "1.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/container-interop/container-interop.git",
+ "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "shasum": ""
+ },
+ "time": "2014-12-30 15:22:37",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)"
+ },
+ {
+ "name": "league/container",
+ "version": "2.2.0",
+ "version_normalized": "2.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/container.git",
+ "reference": "c0e7d947b690891f700dc4967ead7bdb3d6708c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/container/zipball/c0e7d947b690891f700dc4967ead7bdb3d6708c1",
+ "reference": "c0e7d947b690891f700dc4967ead7bdb3d6708c1",
+ "shasum": ""
+ },
+ "require": {
+ "container-interop/container-interop": "^1.1",
+ "php": ">=5.4.0"
+ },
+ "provide": {
+ "container-interop/container-interop-implementation": "^1.1"
+ },
+ "replace": {
+ "orno/di": "~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*"
+ },
+ "time": "2016-03-17 11:07:59",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "League\\Container\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Phil Bennett",
+ "email": "philipobenito@gmail.com",
+ "homepage": "http://www.philipobenito.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A fast and intuitive dependency injection container.",
+ "homepage": "https://github.com/thephpleague/container",
+ "keywords": [
+ "container",
+ "dependency",
+ "di",
+ "injection",
+ "league",
+ "provider",
+ "service"
+ ]
+ },
+ {
+ "name": "victorjonsson/markdowndocs",
+ "version": "1.3.7",
+ "version_normalized": "1.3.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator.git",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/victorjonsson/PHP-Markdown-Documentation-Generator/zipball/a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "symfony/console": ">=2.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.23"
+ },
+ "time": "2016-10-11 21:10:19",
+ "bin": [
+ "bin/phpdoc-md"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "PHPDocsMD": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Victor Jonsson",
+ "email": "kontakt@victorjonsson.se"
+ }
+ ],
+ "description": "Command line tool for generating markdown-formatted class documentation",
+ "homepage": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator"
+ },
+ {
+ "name": "consolidation/log",
+ "version": "1.0.3",
+ "version_normalized": "1.0.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/log.git",
+ "reference": "74ba81b4edc585616747cc5c5309ce56fec41254"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/log/zipball/74ba81b4edc585616747cc5c5309ce56fec41254",
+ "reference": "74ba81b4edc585616747cc5c5309ce56fec41254",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "psr/log": "~1.0",
+ "symfony/console": "~2.5|~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "time": "2016-03-23 23:46:42",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components."
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.1.0",
+ "version_normalized": "1.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3|^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "time": "2016-08-09 15:02:57",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ]
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "time": "2015-12-27 11:43:31",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ]
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "version_normalized": "0.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "time": "2016-06-10 07:14:17",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ]
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.1",
+ "version_normalized": "3.1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "time": "2016-09-30 07:12:33",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock."
+ },
+ {
+ "name": "consolidation/robo",
+ "version": "1.0.4",
+ "version_normalized": "1.0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/Robo.git",
+ "reference": "bfe2246358298d7839114612f84bcfdca3c14066"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/Robo/zipball/bfe2246358298d7839114612f84bcfdca3c14066",
+ "reference": "bfe2246358298d7839114612f84bcfdca3c14066",
+ "shasum": ""
+ },
+ "require": {
+ "consolidation/annotated-command": "^2.0.1",
+ "consolidation/log": "~1",
+ "consolidation/output-formatters": "^2.1.2|~3",
+ "league/container": "^2.2",
+ "php": ">=5.5.0",
+ "symfony/console": "~2.8|~3.0",
+ "symfony/event-dispatcher": "~2.5|~3.0",
+ "symfony/filesystem": "~2.5|~3.0",
+ "symfony/finder": "~2.5|~3.0",
+ "symfony/process": "~2.5|~3.0"
+ },
+ "replace": {
+ "codegyre/robo": "< 1.0"
+ },
+ "require-dev": {
+ "codeception/aspect-mock": "~1",
+ "codeception/base": "^2.2.6",
+ "codeception/verify": "^0.3.2",
+ "henrikbjorn/lurker": "~1",
+ "natxet/cssmin": "~3",
+ "patchwork/jsqueeze": "~2",
+ "pear/archive_tar": "^1.4.2",
+ "phpunit/php-code-coverage": "~2|~4",
+ "satooshi/php-coveralls": "~1",
+ "squizlabs/php_codesniffer": "~2"
+ },
+ "suggest": {
+ "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch",
+ "natxet/CssMin": "For minifying JS files in taskMinify",
+ "patchwork/jsqueeze": "For minifying JS files in taskMinify",
+ "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively."
+ },
+ "time": "2016-11-15 19:24:36",
+ "bin": [
+ "robo"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "scripts/composer/ScriptHandler.php"
+ ],
+ "psr-4": {
+ "Robo\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Davert",
+ "email": "davert.php@resend.cc"
+ }
+ ],
+ "description": "Modern task runner"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.1.6",
+ "version_normalized": "3.1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "time": "2016-10-24 18:41:13",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "version_normalized": "1.1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "time": "2015-10-12 03:26:01",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ]
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.4",
+ "version_normalized": "1.0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/938df7a6478e72795e5f8266cff24d06e3136f2e",
+ "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2016-11-15 06:55:36",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.2",
+ "version_normalized": "1.2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2016-06-17 09:04:28",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ]
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.8",
+ "version_normalized": "1.3.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.0"
+ },
+ "time": "2016-08-18 05:49:44",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ]
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "version_normalized": "1.4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "time": "2015-12-08 07:14:41",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ]
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "version_normalized": "1.0.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "time": "2015-06-14 21:17:01",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ]
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.1",
+ "version_normalized": "1.6.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+ "time": "2016-06-07 08:13:47",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ]
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.0",
+ "version_normalized": "2.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
+ "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "time": "2016-02-04 12:56:52",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "time": "2015-07-28 20:34:47",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "d4ca2fb70344987502567bc50081c03e6192fb26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26",
+ "reference": "d4ca2fb70344987502567bc50081c03e6192fb26",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "time": "2016-01-28 13:25:10",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.2",
+ "version_normalized": "1.2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
+ "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2 || ~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2016-11-19 09:18:40",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ]
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "time": "2016-02-13 06:45:14",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.5.5",
+ "version_normalized": "1.5.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108",
+ "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ },
+ "time": "2016-10-31 17:19:45",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ]
+ },
+ {
+ "name": "consolidation/output-formatters",
+ "version": "3.1.3",
+ "version_normalized": "3.1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/output-formatters.git",
+ "reference": "1e6c6ab49904a31c310940ec4efccf5f36e386e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/1e6c6ab49904a31c310940ec4efccf5f36e386e4",
+ "reference": "1e6c6ab49904a31c310940ec4efccf5f36e386e4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "symfony/console": "~2.5|~3.0",
+ "symfony/finder": "~2.5|~3.0",
+ "victorjonsson/markdowndocs": "^1.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "time": "2016-11-18 23:04:31",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\OutputFormatters\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Format text by applying transformations provided by plug-in formatters."
+ },
+ {
+ "name": "consolidation/annotated-command",
+ "version": "2.1.3",
+ "version_normalized": "2.1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/annotated-command.git",
+ "reference": "6dcc442cbdc2c5145bb19e042d6b5f3979003b9f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/6dcc442cbdc2c5145bb19e042d6b5f3979003b9f",
+ "reference": "6dcc442cbdc2c5145bb19e042d6b5f3979003b9f",
+ "shasum": ""
+ },
+ "require": {
+ "consolidation/output-formatters": "^3.1.3",
+ "php": ">=5.4.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "psr/log": "~1",
+ "symfony/console": "^2.8|~3",
+ "symfony/event-dispatcher": "^2.5|~3",
+ "symfony/finder": "^2.5|~3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "^2.7"
+ },
+ "time": "2016-11-19 01:02:43",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\AnnotatedCommand\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Initialize Symfony Console commands from annotated command class methods."
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "version_normalized": "1.2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2015-06-21 13:50:34",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ]
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "3.4.1",
+ "version_normalized": "3.4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "45026c8383187ad1dcb14fbfec77dced265b9cfc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/45026c8383187ad1dcb14fbfec77dced265b9cfc",
+ "reference": "45026c8383187ad1dcb14fbfec77dced265b9cfc",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^1.2 || ^2.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "time": "2016-11-19 09:07:46",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ]
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.8",
+ "version_normalized": "1.0.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
+ "time": "2016-05-12 18:03:57",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ]
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.1",
+ "version_normalized": "1.4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2015-06-21 13:08:43",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ]
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.9",
+ "version_normalized": "1.4.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "time": "2016-11-15 14:06:22",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ]
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "4.0.2",
+ "version_normalized": "4.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "6cba06ff75a1a63a71033e1a01b89056f3af1e8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6cba06ff75a1a63a71033e1a01b89056f3af1e8d",
+ "reference": "6cba06ff75a1a63a71033e1a01b89056f3af1e8d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "^1.4.2",
+ "sebastian/code-unit-reverse-lookup": "~1.0",
+ "sebastian/environment": "^1.3.2 || ^2.0",
+ "sebastian/version": "~1.0|~2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.4.0",
+ "ext-xmlwriter": "*"
+ },
+ "time": "2016-11-01 05:06:24",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ]
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "5.5.7",
+ "version_normalized": "5.5.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "3f67cee782c9abfaee5e32fd2f57cdd54bc257ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3f67cee782c9abfaee5e32fd2f57cdd54bc257ba",
+ "reference": "3f67cee782c9abfaee5e32fd2f57cdd54bc257ba",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "~1.3",
+ "php": "^5.6 || ^7.0",
+ "phpspec/prophecy": "^1.3.1",
+ "phpunit/php-code-coverage": "^4.0.1",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^3.2",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "^1.3 || ^2.0",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/object-enumerator": "~1.0",
+ "sebastian/resource-operations": "~1.0",
+ "sebastian/version": "~1.0|~2.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-tidy": "*",
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "~1.1"
+ },
+ "time": "2016-10-03 13:04:15",
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.5.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ]
}
]
diff --git a/src/composer/vendor/consolidation/annotated-command/.editorconfig b/src/composer/vendor/consolidation/annotated-command/.editorconfig
new file mode 100644
index 00000000..095771e6
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/.editorconfig
@@ -0,0 +1,15 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[**.php]
+indent_style = space
+indent_size = 4
+
diff --git a/src/composer/vendor/consolidation/annotated-command/.github/issue_template.md b/src/composer/vendor/consolidation/annotated-command/.github/issue_template.md
new file mode 100644
index 00000000..97335f49
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/.github/issue_template.md
@@ -0,0 +1,11 @@
+### Steps to reproduce
+What did you do?
+
+### Expected behavior
+Tell us what should happen
+
+### Actual behavior
+Tell us what happens instead
+
+### System Configuration
+Which O.S. and PHP version are you using?
diff --git a/src/composer/vendor/consolidation/annotated-command/.github/pull_request_template.md b/src/composer/vendor/consolidation/annotated-command/.github/pull_request_template.md
new file mode 100644
index 00000000..a80b513c
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/.github/pull_request_template.md
@@ -0,0 +1,13 @@
+### Disposition
+This pull request:
+
+- [ ] Fixes a bug
+- [ ] Adds a feature
+- [ ] Breaks backwards compatibility
+- [ ] Has tests that cover changes
+
+### Summary
+Short overview of what changed.
+
+### Description
+Any additional information.
diff --git a/src/composer/vendor/consolidation/annotated-command/.gitignore b/src/composer/vendor/consolidation/annotated-command/.gitignore
new file mode 100644
index 00000000..48d3686b
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/.gitignore
@@ -0,0 +1,5 @@
+.DS_Store
+phpunit.xml
+vendor
+build
+.idea
diff --git a/src/composer/vendor/consolidation/annotated-command/.travis.yml b/src/composer/vendor/consolidation/annotated-command/.travis.yml
new file mode 100644
index 00000000..0966ef0d
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/.travis.yml
@@ -0,0 +1,34 @@
+language: php
+
+branches:
+ # Only test the master branch and SemVer tags.
+ only:
+ - master
+ - /^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+.*$/
+
+matrix:
+ include:
+ - php: 7.0
+ env: dependencies=highest
+ - php: 5.6
+ - php: 5.5
+ - php: 5.4
+ env: dependencies=lowest
+
+sudo: false
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+before_script:
+ - if [ -z "$dependencies" ]; then composer install --prefer-dist; fi;
+ - if [ "$dependencies" = "lowest" ]; then composer update --prefer-dist --prefer-lowest -n; fi;
+ - if [ "$dependencies" = "highest" ]; then composer update --prefer-dist -n; fi;
+
+script:
+ - vendor/bin/phpunit
+ - vendor/bin/phpcs --standard=PSR2 -n src
+
+after_success:
+ - travis_retry php vendor/bin/coveralls -v
diff --git a/src/composer/vendor/consolidation/annotated-command/CHANGELOG.md b/src/composer/vendor/consolidation/annotated-command/CHANGELOG.md
new file mode 100644
index 00000000..7a03b967
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/CHANGELOG.md
@@ -0,0 +1,51 @@
+# Change Log
+
+
+### 2.0.1 ~ 2.0.3 - 14 November 2016
+
+- Fix version requirement for output-formatters in composer.json
+- Use output-formatters ~3
+- Move php_codesniffer back to require-dev (moved to require by mistake)
+
+
+### 2.0.0 - 30 September 2016
+
+- **Breaking** Hooks with no command name now apply to all commands defined in the same class. This is a change of behavior from the 1.x branch, where hooks with no command name applied to a command with the same method name in a *different* class.
+- **Breaking** The interfaces ValidatorInterface, ProcessResultInterface and AlterResultInterface have been updated to be passed a CommandData object, which contains an Input and Output object, plus the AnnotationData.
+- **Breaking** The Symfony Command Event hook has been renamed to COMMAND_EVENT. There is a new COMMAND hook that behaves like the existing Drush command hook (i.e. the post-command event is called after the primary command method runs).
+- Add an accessor function AnnotatedCommandFactory::setIncludeAllPublicMethods() to control whether all public methods of a command class, or only those with a @command annotation will be treated as commands. Default remains to treat all public methods as commands. The parameters to AnnotatedCommandFactory::createCommandsFromClass() and AnnotatedCommandFactory::createCommandsFromClassInfo() still behave the same way, but are deprecated. If omitted, the value set by the accessor will be used.
+- @option and @usage annotations provided with @hook methods will be added to the help text of the command they hook. This should be done if a hook needs to add a new option, e.g. to control the behavior of the hook.
+- @option annotations can now be either `@option type $name description`, or just `@option name description`.
+- `@hook option` can be used to programatically add options to a command.
+- A CommandInfoAltererInterface can be added via AnnotatedCommandFactory::addCommandInfoAlterer(); it will be given the opportunity to adjust every CommandInfo object parsed from a command file prior to the creation of commands.
+- AnnotatedCommandFactory::setIncludeAllPublicMethods(false) may be used to require methods to be annotated with @commnad in order to be considered commands. This is in preference to the existing parameters of various command-creation methods of AnnotatedCommandFactory, which are now all deprecated in favor of this setter function.
+- If a --field option is given, it will also force the output format to 'string'.
+- Setter methods more consistently return $this.
+- Removed PassThroughArgsInput. This class was unnecessary.
+
+
+### 1.4.0 - 13 September 2016
+
+- Add basic annotation hook capability, to allow hook functions to be attached to commands with arbitrary annotations.
+
+
+### 1.3.0 - 8 September 2016
+
+- Add ComandFileDiscovery::setSearchDepth(). The search depth applies to each search location, unless there are no search locations, in which case it applies to the base directory.
+
+
+### 1.2.0 - 2 August 2016
+
+- Support both the 2.x and 3.x versions of phpdocumentor/reflection-docblock.
+- Support php 5.4.
+- **Bug** Do not allow an @param docblock comment for the options to override the meaning of the options.
+
+
+### 1.1.0 - 6 July 2016
+
+- Introduce AnnotatedCommandFactory::createSelectedCommandsFromClassInfo() method.
+
+
+### 1.0.0 - 20 May 2016
+
+- First stable release.
diff --git a/src/composer/vendor/consolidation/annotated-command/CONTRIBUTING.md b/src/composer/vendor/consolidation/annotated-command/CONTRIBUTING.md
new file mode 100644
index 00000000..7a526eb5
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/CONTRIBUTING.md
@@ -0,0 +1,31 @@
+# Contributing to Consolidation
+
+Thank you for your interest in contributing to the Consolidation effort! Consolidation aims to provide reusable, loosely-coupled components useful for building command-line tools. Consolidation is built on top of Symfony Console, but aims to separate the tool from the implementation details of Symfony.
+
+Here are some of the guidelines you should follow to make the most of your efforts:
+
+## Code Style Guidelines
+
+Consolidation adheres to the [PSR-2 Coding Style Guide](http://www.php-fig.org/psr/psr-2/) for PHP code.
+
+## Pull Request Guidelines
+
+Every pull request is run through:
+
+ - phpcs -n --standard=PSR2 src
+ - phpunit
+ - [Scrutinizer](https://scrutinizer-ci.com/g/consolidation/annotated-command/)
+
+It is easy to run the unit tests and code sniffer locally; just run:
+
+ - composer cs
+
+To run the code beautifier, which will fix many of the problems reported by phpcs:
+
+ - composer cbf
+
+These two commands (`composer cs` and `composer cbf`) are defined in the `scripts` section of [composer.json](composer.json).
+
+After submitting a pull request, please examine the Scrutinizer report. It is not required to fix all Scrutinizer issues; you may ignore recommendations that you disagree with. The spacing patches produced by Scrutinizer do not conform to PSR2 standards, and therefore should never be applied. DocBlock patches may be applied at your discression. Things that Scrutinizer identifies as a bug nearly always need to be addressed.
+
+Pull requests must pass phpcs and phpunit in order to be merged; ideally, new functionality will also include new unit tests.
diff --git a/src/composer/vendor/consolidation/annotated-command/LICENSE b/src/composer/vendor/consolidation/annotated-command/LICENSE
new file mode 100644
index 00000000..2078bd88
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/LICENSE
@@ -0,0 +1,8 @@
+Copyright (c) 2016 Consolidation Org Developers
+
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/composer/vendor/consolidation/annotated-command/README.md b/src/composer/vendor/consolidation/annotated-command/README.md
new file mode 100644
index 00000000..9e6d7728
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/README.md
@@ -0,0 +1,251 @@
+# Consolidation\AnnotatedCommand
+
+Initialize Symfony Console commands from annotated command class methods.
+
+[](https://travis-ci.org/consolidation/annotated-command) [](https://scrutinizer-ci.com/g/consolidation/annotated-command/?branch=master) [](https://coveralls.io/github/consolidation/annotated-command?branch=master) [](https://packagist.org/packages/consolidation/annotated-command)
+
+## Component Status
+
+Currently in use in [Robo](https://github.com/consolidation/Robo) (1.x+), [Drush](https://github.com/drush-ops/drush) (9.x+) and [Terminus](https://github.com/pantheon-systems/terminus) (1.x+).
+
+## Motivation
+
+Symfony Console provides a set of classes that are widely used to implement command line tools. Increasingly, it is becoming popular to use annotations to describe the characteristics of the command (e.g. its arguments, options and so on) implemented by the annotated method.
+
+Extant commandline tools that utilize this technique include:
+
+- [Robo](https://github.com/consolidation/Robo)
+- [wp-cli](https://github.com/wp-cli/wp-cli)
+- [Pantheon Terminus](https://github.com/pantheon-systems/terminus)
+
+This library provides routines to produce the Symfony\Component\Console\Command\Command from all public methods defined in the provided class.
+
+**Note** If you are looking for a very fast way to write a Symfony Console-base command-line tool, you should consider using [Robo](https://github.com/consolidation/Robo), which is built on top of this library, and adds additional conveniences to get you going quickly. See [Using Robo as a Framework](https://github.com/consolidation/Robo/docs/framework.md). It is possible to use this project without Robo if desired, of course.
+
+## Library Usage
+
+This is a library intended to be used in some other project. Require from your composer.json file:
+```
+ "require": {
+ "consolidation/annotated-command": "~2"
+ },
+```
+
+## Example Annotated Command Class
+The public methods of the command class define its commands, and the parameters of each method define its arguments and options. The command options, if any, are declared as the last parameter of the methods. The options will be passed in as an associative array; the default options of the last parameter should list the options recognized by the command.
+
+The rest of the parameters are arguments. Parameters with a default value are optional; those without a default value are required.
+```php
+class MyCommandClass
+{
+ /**
+ * This is the my:cat command
+ *
+ * This command will concatenate two parameters. If the --flip flag
+ * is provided, then the result is the concatenation of two and one.
+ *
+ * @command my:cat
+ * @param integer $one The first parameter.
+ * @param integer $two The other parameter.
+ * @option flip Whether or not the second parameter should come first in the result.
+ * @aliases c
+ * @usage bet alpha --flip
+ * Concatenate "alpha" and "bet".
+ */
+ public function myCat($one, $two, $options = ['flip' => false])
+ {
+ if ($options['flip']) {
+ return "{$two}{$one}";
+ }
+ return "{$one}{$two}";
+ }
+}
+```
+## Hooks
+
+Commandfiles may provide hooks in addition to commands. A commandfile method that contains a @hook annotation is registered as a hook instead of a command. The format of the hook annotation is:
+```
+@hook type commandname|annotation
+```
+The commandname may be the command's primary name (e.g. `my:command`), it's method name (e.g. myCommand) or any of its aliases.
+
+If an annotation is given instead, then this hook function will run for all commands with the specified annotation.
+
+There are ten types of hooks supported:
+
+- Command Event (Symfony)
+- Option
+- Initialize (Symfony)
+- Interact (Symfony)
+- Validate
+- Command
+- Process
+- Alter
+- Status
+- Extract
+
+Most of these also have "pre" and "post" varieties, to give more flexibility vis-a-vis hook ordering (and for consistency). Note that many validate, process and alter hooks may run, but the first status or extract hook that successfully returns a result will halt processing of further hooks of the same type.
+
+Each hook has an interface that defines its calling conventions; however, any callable may be used when registering a hook, which is convenient if versions of PHP prior to 7.0 (with no anonymous classes) need to be supported.
+
+### Command Event Hook
+
+The command-event hook is called via the Symfony Console command event notification callback mechanism. This happens prior to event dispatching and command / option validation. Note that Symfony does not allow the $input object to be altered in this hook; any change made here will be reset, as Symfony re-parses the object. Changes to arguments and options should be done in the initialize hook (non-interactive alterations) or the interact hook (which is naturally for interactive alterations).
+
+### Option Event Hook
+
+The option event hook ([OptionHookInterface](src/Hooks/OptionHookInterface.php)) is called for a specific command, whenever it is executed, or its help command is called. Any additional options for the command may be added here by instantiating and returnng an InputOption array.
+
+### Initialize Hook
+
+The initialize hook ([InitializeHookInterface](src/Hooks/InitializeHookInterface.php)) runs prior to the interact hook. It may supply command arguments and options from a configuration file or other sources. It should never do any user interaction.
+
+### Interact Hook
+
+The interact hook ([InteractorInterface](src/Hooks/InteractorInterface.php)) runs prior to argument and option validation. Required arguments and options not supplied on the command line may be provided during this phase by prompting the user. Note that the interact hook is not called if the --no-interaction flag is supplied, whereas the command-event hook and the inject-configuration hook are.
+
+### Validate Hook
+
+The purpose of the validate hook ([ValidatorInterface](src/Hooks/ValidatorInterface.php)) is to ensure the state of the targets of the current command are usabe in the context required by that command. Symfony has already validated the arguments and options prior to this hook. It is possible to alter the values of the arguments and options if necessary, although this is better done in the configure hook. A validation hook may take one of several actions:
+
+- Do nothing. This indicates that validation succeeded.
+- Return a CommandError. Validation fails, and execution stops. The CommandError contains a status result code and a message, which is printed.
+- Throw an exception. The exception is converted into a CommandError.
+- Return false. Message is empty, and status is 1. Deprecated.
+
+The validate hook may change the arguments and options of the command by modifying the Input object in the provided CommandData parameter. Any number of validation hooks may run, but if any fails, then execution of the command stops.
+
+### Command Hook
+
+The command hook is provided for semantic purposes. The pre-command and command hooks are equivalent to the post-validate hook, and should confirm to the interface ([ValidatorInterface](src/Hooks/ValidatorInterface.php)). All of the post-validate hooks will be called before the first pre-command hook is called. Similarly, the post-command hook is equivalent to the pre-process hook, and should implement the interface ([ProcessResultInterface](src/Hooks/ProcessResultInterface.php)).
+
+The command callback itself (the method annotated @command) is called after the last command hook, and prior to the first post-command hook.
+
+### Process Hook
+
+The process hook ([ProcessResultInterface](src/Hooks/ProcessResultInterface.php)) is specifically designed to convert a series of processing instructions into a final result. An example of this is implemented in Robo; if a Robo command returns a TaskInterface, then a Robo process hook will execute the task and return the result. This allows a pre-process hook to alter the task, e.g. by adding more operations to a task collection.
+
+The process hook should not be used for other purposes.
+
+### Alter Hook
+
+An alter hook ([AlterResultInterface](src/Hooks/AlterResultInterface.php)) changes the result object. Alter hooks should only operate on result objects of a type they explicitly recognize. They may return an object of the same type, or they may convert the object to some other type.
+
+If something goes wrong, and the alter hooks wishes to force the command to fail, then it may either return a CommandError object, or throw an exception.
+
+### Status Hook
+
+The status hook ([StatusDeterminerInterface](src/Hooks/StatusDeterminerInterface.php)) is responsible for determing whether a command succeeded (status code 0) or failed (status code > 0). The result object returned by a command may be a compound object that contains multiple bits of information about the command result. If the result object implements [ExitCodeInterface](ExitCodeInterface.php), then the `getExitCode()` method of the result object is called to determine what the status result code for the command should be. If ExitCodeInterface is not implemented, then all of the status hooks attached to this command are executed; the first one that successfully returns a result will stop further execution of status hooks, and the result it returned will be used as the status result code for this operation.
+
+If no status hook returns any result, then success is presumed.
+
+### Extract Hook
+
+The extract hook ([ExtractOutputInterface](src/Hooks/ExtractOutputInterface.php)) is responsible for determining what the actual rendered output for the command should be. The result object returned by a command may be a compound object that contains multiple bits of information about the command result. If the result object implements [OutputDataInterface](OutputDataInterface.php), then the `getOutputData()` method of the result object is called to determine what information should be displayed to the user as a result of the command's execution. If OutputDataInterface is not implemented, then all of the extract hooks attached to this command are executed; the first one that successfully returns output data will stop further execution of extract hooks.
+
+If no extract hook returns any data, then the result object itself is printed if it is a string; otherwise, no output is emitted (other than any produced by the command itself).
+
+## Output
+
+If a command method returns an integer, it is used as the command exit status code. If the command method returns a string, it is printed.
+
+If the [Consolidation/OutputFormatters](https://github.com/consolidation/output-formatters) project is used, then users may specify a --format option to select the formatter to use to transform the output from whatever form the command provides to a string. To make this work, the application must provide a formatter to the AnnotatedCommandFactory. See [API Usage](#api-usage) below.
+
+## Logging
+
+The Annotated-Command project is completely agnostic to logging. If a command wishes to log progress, then the CommandFile class should implement LoggerAwareInterface, and the Commandline tool should inject a logger for its use via the LoggerAwareTrait `setLogger()` method. Using [Robo](https://github.com/consolidation/robo) is recommended.
+
+## Access to Symfony Objects
+
+If you want to use annotations, but still want access to the Symfony Command, e.g. to get a reference to the helpers in order to call some legacy code, you may create an ordinary Symfony Command that extends \Consolidation\AnnotatedCommand\AnnotatedCommand, which is a \Symfony\Component\Console\Command\Command. Omit the configure method, and place your annotations on the `execute()` method.
+
+It is also possible to add InputInterface or OutputInterface parameters to any annotated method of a command file.
+
+## API Usage
+
+If you would like to use Annotated Commands to build a commandline tool, it is recommended that you use [Robo as a framework](http://robo.li/framework.md), as it will set up all of the various command classes for you. If you would like to integrate Annotated Commands into some other framework, see the sections below.
+
+### Set up Command Factory and Instantiate Commands
+
+To use annotated commands in an application, pass an instance of your command class in to AnnotatedCommandFactory::createCommandsFromClass(). The result will be a list of Commands that may be added to your application.
+```php
+$myCommandClassInstance = new MyCommandClass();
+$commandFactory = new AnnotatedCommandFactory();
+$commandFactory->setIncludeAllPublicMethods(true);
+$commandFactory->commandProcessor()->setFormatterManager(new FormatterManager());
+$commandList = $commandFactory->createCommandsFromClass($myCommandClassInstance);
+foreach ($commandList as $command) {
+ $application->add($command);
+}
+```
+You may have more than one command class, if you wish. If so, simply call AnnotatedCommandFactory::createCommandsFromClass() multiple times.
+
+If you do not wish every public method in your classes to be added as commands, use `AnnotatedCommandFactory::setIncludeAllPublicMethods(false)`, and only methods annotated with @command will become commands.
+
+Note that the `setFormatterManager()` operation is optional; omit this if not using [Consolidation/OutputFormatters](https://github.com/consolidation/output-formatters).
+
+A CommandInfoAltererInterface can be added via AnnotatedCommandFactory::addCommandInfoAlterer(); it will be given the opportunity to adjust every CommandInfo object parsed from a command file prior to the creation of commands.
+
+### Command File Discovery
+
+A discovery class, CommandFileDiscovery, is also provided to help find command files on the filesystem. Usage is as follows:
+```php
+$discovery = new CommandFileDiscovery();
+$myCommandFiles = $discovery->discover($path, '\Drupal');
+foreach ($myCommandFiles as $myCommandClass) {
+ $myCommandClassInstance = new $myCommandClass();
+ // ... as above
+}
+```
+For a discussion on command file naming conventions and search locations, see https://github.com/consolidation/annotated-command/issues/12.
+
+If different namespaces are used at different command file paths, change the call to discover as follows:
+```php
+$myCommandFiles = $discovery->discover(['\Ns1' => $path1, '\Ns2' => $path2]);
+```
+As a shortcut for the above, the method `discoverNamespaced()` will take the last directory name of each path, and append it to the base namespace provided. This matches the conventions used by Drupal modules, for example.
+
+### Configuring Output Formatts (e.g. to enable wordwrap)
+
+The Output Formatters project supports automatic formatting of tabular output. In order for wordwrapping to work correctly, the terminal width must be passed in to the Output Formatters handlers via `FormatterOptions::setWidth()`.
+
+In the Annotated Commands project, this is done via dependency injection. If a `PrepareFormatter` object is passed to `CommandProcessor::addPrepareFormatter()`, then it will be given an opportunity to set properties on the `FormatterOptions` when it is created.
+
+A `PrepareTerminalWidthOption` class is provided to use the Symfony Application class to fetch the terminal width, and provide it to the FormatterOptions. It is injected as follows:
+```php
+$terminalWidthOption = new PrepareTerminalWidthOption();
+$terminalWidthOption->setApplication($application);
+$commandFactory->commandProcessor()->addPrepareFormatter($terminalWidthOption);
+```
+To provide greater control over the width used, create your own `PrepareTerminalWidthOption` subclass, and adjust the width as needed.
+
+## Other Callbacks
+
+In addition to the hooks provided by the hook manager, there are additional callbacks available to alter the way the annotated command library operates.
+
+### Factory Listeners
+
+Factory listeners are notified every time a command file instance is used to create annotated commands.
+```
+public function AnnotatedCommandFactory::addListener(CommandCreationListenerInterface $listener);
+```
+Listeners can be used to construct command file instances as they are provided to the command factory.
+
+### Option Providers
+
+An option provider is given an opportunity to add options to a command as it is being constructed.
+```
+public function AnnotatedCommandFactory::addAutomaticOptionProvider(AutomaticOptionsProviderInterface $listener);
+```
+The complete CommandInfo record with all of the annotation data is available, so you can, for example, add an option `--foo` to every command whose method is annotated `@fooable`.
+
+### CommandInfo Alterers
+
+CommandInfo alterers can adjust information about a command immediately before it is created. Typically, these will be used to supply default values for annotations custom to the command, or take other actions based on the interfaces implemented by the commandfile instance.
+```
+public function alterCommandInfo(CommandInfo $commandInfo, $commandFileInstance);
+```
+
+## Comparison to Existing Solutions
+
+The existing solutions used their own hand-rolled regex-based parsers to process the contents of the DocBlock comments. consolidation/annotated-command uses the [phpdocumentor/reflection-docblock](https://github.com/phpDocumentor/ReflectionDocBlock) project (which is itself a regex-based parser) to interpret DocBlock contents.
diff --git a/src/composer/vendor/consolidation/annotated-command/composer.json b/src/composer/vendor/consolidation/annotated-command/composer.json
new file mode 100644
index 00000000..9132e750
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/composer.json
@@ -0,0 +1,49 @@
+{
+ "name": "consolidation/annotated-command",
+ "description": "Initialize Symfony Console commands from annotated command class methods.",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "autoload":{
+ "psr-4":{
+ "Consolidation\\AnnotatedCommand\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Consolidation\\TestUtils\\": "tests/src"
+ }
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "consolidation/output-formatters": "^3.1.3",
+ "psr/log": "~1",
+ "symfony/console": "^2.8|~3",
+ "symfony/event-dispatcher": "^2.5|~3",
+ "symfony/finder": "^2.5|~3",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "^2.7"
+ },
+ "scripts": {
+ "cs": "phpcs --standard=PSR2 -n src",
+ "cbf": "phpcbf --standard=PSR2 -n src",
+ "unit": "SHELL_INTERACTIVE=true phpunit --colors=always",
+ "test": [
+ "@unit",
+ "@cs"
+ ]
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/composer.lock b/src/composer/vendor/consolidation/annotated-command/composer.lock
new file mode 100644
index 00000000..fc3a9760
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/composer.lock
@@ -0,0 +1,1932 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "3022aec17694795060ac3d71280fbc23",
+ "content-hash": "3053742fe70568ac2d3264b50fad5a41",
+ "packages": [
+ {
+ "name": "consolidation/output-formatters",
+ "version": "3.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/output-formatters.git",
+ "reference": "1e6c6ab49904a31c310940ec4efccf5f36e386e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/1e6c6ab49904a31c310940ec4efccf5f36e386e4",
+ "reference": "1e6c6ab49904a31c310940ec4efccf5f36e386e4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "symfony/console": "~2.5|~3.0",
+ "symfony/finder": "~2.5|~3.0",
+ "victorjonsson/markdowndocs": "^1.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\OutputFormatters\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Format text by applying transformations provided by plug-in formatters.",
+ "time": "2016-11-18 23:04:31"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-12-27 11:43:31"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2016-09-30 07:12:33"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-06-10 07:14:17"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2016-10-10 12:19:37"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/debug": "~2.8|~3.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-06 01:44:51"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/class-loader": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-06 11:02:40"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/dependency-injection": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/stopwatch": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-13 06:28:43"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-28 00:11:12"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2016-11-14 01:06:16"
+ },
+ {
+ "name": "victorjonsson/markdowndocs",
+ "version": "1.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator.git",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/victorjonsson/PHP-Markdown-Documentation-Generator/zipball/a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "symfony/console": ">=2.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.23"
+ },
+ "bin": [
+ "bin/phpdoc-md"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "PHPDocsMD": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Victor Jonsson",
+ "email": "kontakt@victorjonsson.se"
+ }
+ ],
+ "description": "Command line tool for generating markdown-formatted class documentation",
+ "homepage": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator",
+ "time": "2016-10-11 21:10:19"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3|^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2016-08-09 15:02:57"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14 21:17:01"
+ },
+ {
+ "name": "guzzle/guzzle",
+ "version": "v3.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba",
+ "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": ">=5.3.3",
+ "symfony/event-dispatcher": ">=2.1"
+ },
+ "replace": {
+ "guzzle/batch": "self.version",
+ "guzzle/cache": "self.version",
+ "guzzle/common": "self.version",
+ "guzzle/http": "self.version",
+ "guzzle/inflection": "self.version",
+ "guzzle/iterator": "self.version",
+ "guzzle/log": "self.version",
+ "guzzle/parser": "self.version",
+ "guzzle/plugin": "self.version",
+ "guzzle/plugin-async": "self.version",
+ "guzzle/plugin-backoff": "self.version",
+ "guzzle/plugin-cache": "self.version",
+ "guzzle/plugin-cookie": "self.version",
+ "guzzle/plugin-curlauth": "self.version",
+ "guzzle/plugin-error-response": "self.version",
+ "guzzle/plugin-history": "self.version",
+ "guzzle/plugin-log": "self.version",
+ "guzzle/plugin-md5": "self.version",
+ "guzzle/plugin-mock": "self.version",
+ "guzzle/plugin-oauth": "self.version",
+ "guzzle/service": "self.version",
+ "guzzle/stream": "self.version"
+ },
+ "require-dev": {
+ "doctrine/cache": "*",
+ "monolog/monolog": "1.*",
+ "phpunit/phpunit": "3.7.*",
+ "psr/log": "1.0.*",
+ "symfony/class-loader": "*",
+ "zendframework/zend-cache": "<2.3",
+ "zendframework/zend-log": "<2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Guzzle": "src/",
+ "Guzzle\\Tests": "tests/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Guzzle Community",
+ "homepage": "https://github.com/guzzle/guzzle/contributors"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "abandoned": "guzzlehttp/guzzle",
+ "time": "2014-01-28 22:29:15"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2016-06-07 08:13:47"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "~1.3",
+ "sebastian/environment": "^1.3.2",
+ "sebastian/version": "~1.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2015-10-06 15:47:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2015-06-21 13:08:43"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21 13:50:34"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2016-05-12 18:03:57"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2016-11-15 14:06:22"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.8.28",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "558a3a0d28b4cb7e4a593a4fbd2220e787076225"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/558a3a0d28b4cb7e4a593a4fbd2220e787076225",
+ "reference": "558a3a0d28b4cb7e4a593a4fbd2220e787076225",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.3",
+ "phpspec/prophecy": "^1.3.1",
+ "phpunit/php-code-coverage": "~2.1",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "~1.3",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.8.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2016-11-14 06:25:28"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2015-10-02 06:51:40"
+ },
+ {
+ "name": "satooshi/php-coveralls",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/satooshi/php-coveralls.git",
+ "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/da51d304fe8622bf9a6da39a8446e7afd432115c",
+ "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-simplexml": "*",
+ "guzzle/guzzle": "^2.8|^3.0",
+ "php": ">=5.3.3",
+ "psr/log": "^1.0",
+ "symfony/config": "^2.1|^3.0",
+ "symfony/console": "^2.1|^3.0",
+ "symfony/stopwatch": "^2.0|^3.0",
+ "symfony/yaml": "^2.0|^3.0"
+ },
+ "suggest": {
+ "symfony/http-kernel": "Allows Symfony integration"
+ },
+ "bin": [
+ "bin/coveralls"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Satooshi\\": "src/Satooshi/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kitamura Satoshi",
+ "email": "with.no.parachute@gmail.com",
+ "homepage": "https://www.facebook.com/satooshi.jp"
+ }
+ ],
+ "description": "PHP client library for Coveralls API",
+ "homepage": "https://github.com/satooshi/php-coveralls",
+ "keywords": [
+ "ci",
+ "coverage",
+ "github",
+ "test"
+ ],
+ "time": "2016-01-20 17:35:46"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "ce2bda23a56456f19e35d98241446b581f648c14"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ce2bda23a56456f19e35d98241446b581f648c14",
+ "reference": "ce2bda23a56456f19e35d98241446b581f648c14",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2016-11-17 14:39:37"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08 07:14:41"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-08-18 05:49:44"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2016-06-17 09:04:28"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12 03:26:01"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/938df7a6478e72795e5f8266cff24d06e3136f2e",
+ "reference": "938df7a6478e72795e5f8266cff24d06e3136f2e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2016-11-15 06:55:36"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2015-06-21 13:59:46"
+ },
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "reference": "571e27b6348e5b3a637b2abc82ac0d01e6d7bbed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/571e27b6348e5b3a637b2abc82ac0d01e6d7bbed",
+ "reference": "571e27b6348e5b3a637b2abc82ac0d01e6d7bbed",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "bin": [
+ "scripts/phpcs",
+ "scripts/phpcbf"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "CodeSniffer.php",
+ "CodeSniffer/CLI.php",
+ "CodeSniffer/Exception.php",
+ "CodeSniffer/File.php",
+ "CodeSniffer/Fixer.php",
+ "CodeSniffer/Report.php",
+ "CodeSniffer/Reporting.php",
+ "CodeSniffer/Sniff.php",
+ "CodeSniffer/Tokens.php",
+ "CodeSniffer/Reports/",
+ "CodeSniffer/Tokenizers/",
+ "CodeSniffer/DocGenerators/",
+ "CodeSniffer/Standards/AbstractPatternSniff.php",
+ "CodeSniffer/Standards/AbstractScopeSniff.php",
+ "CodeSniffer/Standards/AbstractVariableSniff.php",
+ "CodeSniffer/Standards/IncorrectPatternException.php",
+ "CodeSniffer/Standards/Generic/Sniffs/",
+ "CodeSniffer/Standards/MySource/Sniffs/",
+ "CodeSniffer/Standards/PEAR/Sniffs/",
+ "CodeSniffer/Standards/PSR1/Sniffs/",
+ "CodeSniffer/Standards/PSR2/Sniffs/",
+ "CodeSniffer/Standards/Squiz/Sniffs/",
+ "CodeSniffer/Standards/Zend/Sniffs/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Sherwood",
+ "role": "lead"
+ }
+ ],
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+ "homepage": "http://www.squizlabs.com/php-codesniffer",
+ "keywords": [
+ "phpcs",
+ "standards"
+ ],
+ "time": "2016-09-01 23:53:02"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "949e7e846743a7f9e46dc50eb639d5fde1f53341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/949e7e846743a7f9e46dc50eb639d5fde1f53341",
+ "reference": "949e7e846743a7f9e46dc50eb639d5fde1f53341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/filesystem": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Config Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-25 08:27:07"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-18 04:30:12"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "bb42806b12c5f89db4ebf64af6741afe6d8457e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/bb42806b12c5f89db4ebf64af6741afe6d8457e1",
+ "reference": "bb42806b12c5f89db4ebf64af6741afe6d8457e1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Stopwatch Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-06-29 05:41:56"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-24 18:41:13"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.4.0"
+ },
+ "platform-dev": []
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/phpunit.xml.dist b/src/composer/vendor/consolidation/annotated-command/phpunit.xml.dist
new file mode 100644
index 00000000..a35a5042
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/phpunit.xml.dist
@@ -0,0 +1,19 @@
+
+
+
+ tests
+
+
+
+
+
+
+
+
+ src
+
+
+
diff --git a/src/composer/vendor/consolidation/annotated-command/src/AnnotatedCommand.php b/src/composer/vendor/consolidation/annotated-command/src/AnnotatedCommand.php
new file mode 100644
index 00000000..8db1e73e
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/AnnotatedCommand.php
@@ -0,0 +1,346 @@
+getName();
+ }
+ }
+ parent::__construct($name);
+ if ($commandInfo && $commandInfo->hasAnnotation('command')) {
+ $this->setCommandInfo($commandInfo);
+ $this->setCommandOptions($commandInfo);
+ }
+ }
+
+ public function setCommandCallback($commandCallback)
+ {
+ $this->commandCallback = $commandCallback;
+ return $this;
+ }
+
+ public function setCommandProcessor($commandProcessor)
+ {
+ $this->commandProcessor = $commandProcessor;
+ return $this;
+ }
+
+ public function commandProcessor()
+ {
+ // If someone is using an AnnotatedCommand, and is NOT getting
+ // it from an AnnotatedCommandFactory OR not correctly injecting
+ // a command processor via setCommandProcessor() (ideally via the
+ // DI container), then we'll just give each annotated command its
+ // own command processor. This is not ideal; preferably, there would
+ // only be one instance of the command processor in the application.
+ if (!isset($this->commandProcessor)) {
+ $this->commandProcessor = new CommandProcessor(new HookManager());
+ }
+ return $this->commandProcessor;
+ }
+
+ public function getReturnType()
+ {
+ return $this->returnType;
+ }
+
+ public function setReturnType($returnType)
+ {
+ $this->returnType = $returnType;
+ return $this;
+ }
+
+ public function getAnnotationData()
+ {
+ return $this->annotationData;
+ }
+
+ public function setAnnotationData($annotationData)
+ {
+ $this->annotationData = $annotationData;
+ return $this;
+ }
+
+ public function setCommandInfo($commandInfo)
+ {
+ $this->setDescription($commandInfo->getDescription());
+ $this->setHelp($commandInfo->getHelp());
+ $this->setAliases($commandInfo->getAliases());
+ $this->setAnnotationData($commandInfo->getAnnotations());
+ foreach ($commandInfo->getExampleUsages() as $usage => $description) {
+ // Symfony Console does not support attaching a description to a usage
+ $this->addUsage($usage);
+ }
+ $this->setCommandArguments($commandInfo);
+ $this->setReturnType($commandInfo->getReturnType());
+ return $this;
+ }
+
+ protected function setCommandArguments($commandInfo)
+ {
+ $this->setUsesInputInterface($commandInfo);
+ $this->setUsesOutputInterface($commandInfo);
+ $this->setCommandArgumentsFromParameters($commandInfo);
+ return $this;
+ }
+
+ /**
+ * Check whether the first parameter is an InputInterface.
+ */
+ protected function checkUsesInputInterface($params)
+ {
+ $firstParam = reset($params);
+ return $firstParam instanceof InputInterface;
+ }
+
+ /**
+ * Determine whether this command wants to get its inputs
+ * via an InputInterface or via its command parameters
+ */
+ protected function setUsesInputInterface($commandInfo)
+ {
+ $params = $commandInfo->getParameters();
+ $this->usesInputInterface = $this->checkUsesInputInterface($params);
+ return $this;
+ }
+
+ /**
+ * Determine whether this command wants to send its output directly
+ * to the provided OutputInterface, or whether it will returned
+ * structured output to be processed by the command processor.
+ */
+ protected function setUsesOutputInterface($commandInfo)
+ {
+ $params = $commandInfo->getParameters();
+ $index = $this->checkUsesInputInterface($params) ? 1 : 0;
+ $this->usesOutputInterface =
+ (count($params) > $index) &&
+ ($params[$index] instanceof OutputInterface);
+ return $this;
+ }
+
+ protected function setCommandArgumentsFromParameters($commandInfo)
+ {
+ $args = $commandInfo->arguments()->getValues();
+ foreach ($args as $name => $defaultValue) {
+ $description = $commandInfo->arguments()->getDescription($name);
+ $hasDefault = $commandInfo->arguments()->hasDefault($name);
+ $parameterMode = $this->getCommandArgumentMode($hasDefault, $defaultValue);
+ $this->addArgument($name, $parameterMode, $description, $defaultValue);
+ }
+ return $this;
+ }
+
+ protected function getCommandArgumentMode($hasDefault, $defaultValue)
+ {
+ if (!$hasDefault) {
+ return InputArgument::REQUIRED;
+ }
+ if (is_array($defaultValue)) {
+ return InputArgument::IS_ARRAY;
+ }
+ return InputArgument::OPTIONAL;
+ }
+
+ public function setCommandOptions($commandInfo, $automaticOptions = [])
+ {
+ $inputOptions = $commandInfo->inputOptions();
+
+ $this->addOptions($inputOptions + $automaticOptions, $automaticOptions);
+ return $this;
+ }
+
+ public function addOptions($inputOptions, $automaticOptions = [])
+ {
+ foreach ($inputOptions as $name => $inputOption) {
+ $description = $inputOption->getDescription();
+
+ if (empty($description) && isset($automaticOptions[$name])) {
+ $description = $automaticOptions[$name]->getDescription();
+ $inputOption = static::inputOptionSetDescription($inputOption, $description);
+ }
+ $this->getDefinition()->addOption($inputOption);
+ }
+ }
+
+ protected static function inputOptionSetDescription($inputOption, $description)
+ {
+ // Recover the 'mode' value, because Symfony is stubborn
+ $mode = 0;
+ if ($inputOption->isValueRequired()) {
+ $mode |= InputOption::VALUE_REQUIRED;
+ }
+ if ($inputOption->isValueOptional()) {
+ $mode |= InputOption::VALUE_OPTIONAL;
+ }
+ if ($inputOption->isArray()) {
+ $mode |= InputOption::VALUE_IS_ARRAY;
+ }
+ if (!$mode) {
+ $mode = InputOption::VALUE_NONE;
+ }
+
+ $inputOption = new InputOption(
+ $inputOption->getName(),
+ $inputOption->getShortcut(),
+ $mode,
+ $description,
+ $inputOption->getDefault()
+ );
+ return $inputOption;
+ }
+
+ /**
+ * Returns all of the hook names that may be called for this command.
+ *
+ * @return array
+ */
+ public function getNames()
+ {
+ return HookManager::getNames($this, $this->commandCallback);
+ }
+
+ /**
+ * Add any options to this command that are defined by hook implementations
+ */
+ public function optionsHook()
+ {
+ $this->commandProcessor()->optionsHook(
+ $this,
+ $this->getNames(),
+ $this->annotationData
+ );
+ }
+
+ public function optionsHookForHookAnnotations($commandInfoList)
+ {
+ foreach ($commandInfoList as $commandInfo) {
+ $inputOptions = $commandInfo->inputOptions();
+ $this->addOptions($inputOptions);
+ foreach ($commandInfo->getExampleUsages() as $usage => $description) {
+ if (!in_array($usage, $this->getUsages())) {
+ $this->addUsage($usage);
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function interact(InputInterface $input, OutputInterface $output)
+ {
+ $this->commandProcessor()->interact(
+ $input,
+ $output,
+ $this->getNames(),
+ $this->annotationData
+ );
+ }
+
+ protected function initialize(InputInterface $input, OutputInterface $output)
+ {
+ // Allow the hook manager a chance to provide configuration values,
+ // if there are any registered hooks to do that.
+ $this->commandProcessor()->initializeHook($input, $this->getNames(), $this->annotationData);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ // Validate, run, process, alter, handle results.
+ return $this->commandProcessor()->process(
+ $output,
+ $this->getNames(),
+ $this->commandCallback,
+ $this->createCommandData($input, $output)
+ );
+ }
+
+ /**
+ * This function is available for use by a class that may
+ * wish to extend this class rather than use annotations to
+ * define commands. Using this technique does allow for the
+ * use of annotations to define hooks.
+ */
+ public function processResults(InputInterface $input, OutputInterface $output, $results)
+ {
+ $commandData = $this->createCommandData($input, $output);
+ $commandProcessor = $this->commandProcessor();
+ $names = $this->getNames();
+ $results = $commandProcessor->processResults(
+ $names,
+ $results,
+ $commandData
+ );
+ return $commandProcessor->handleResults(
+ $output,
+ $names,
+ $results,
+ $commandData
+ );
+ }
+
+ protected function createCommandData(InputInterface $input, OutputInterface $output)
+ {
+ $commandData = new CommandData(
+ $this->annotationData,
+ $input,
+ $output
+ );
+
+ $commandData->setUseIOInterfaces(
+ $this->usesOutputInterface,
+ $this->usesInputInterface
+ );
+
+ return $commandData;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/AnnotatedCommandFactory.php b/src/composer/vendor/consolidation/annotated-command/src/AnnotatedCommandFactory.php
new file mode 100644
index 00000000..5765167f
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/AnnotatedCommandFactory.php
@@ -0,0 +1,327 @@
+commandProcessor = new CommandProcessor(new HookManager());
+ $this->addAutomaticOptionProvider($this);
+ }
+
+ public function setCommandProcessor(CommandProcessor $commandProcessor)
+ {
+ $this->commandProcessor = $commandProcessor;
+ return $this;
+ }
+
+ /**
+ * @return CommandProcessor
+ */
+ public function commandProcessor()
+ {
+ return $this->commandProcessor;
+ }
+
+ /**
+ * Set the 'include all public methods flag'. If true (the default), then
+ * every public method of each commandFile will be used to create commands.
+ * If it is false, then only those public methods annotated with @command
+ * or @name (deprecated) will be used to create commands.
+ */
+ public function setIncludeAllPublicMethods($includeAllPublicMethods)
+ {
+ $this->includeAllPublicMethods = $includeAllPublicMethods;
+ return $this;
+ }
+
+ public function getIncludeAllPublicMethods()
+ {
+ return $this->includeAllPublicMethods;
+ }
+
+ /**
+ * @return HookManager
+ */
+ public function hookManager()
+ {
+ return $this->commandProcessor()->hookManager();
+ }
+
+ /**
+ * Add a listener that is notified immediately before the command
+ * factory creates commands from a commandFile instance. This
+ * listener can use this opportunity to do more setup for the commandFile,
+ * and so on.
+ *
+ * @param CommandCreationListenerInterface $listener
+ */
+ public function addListener(CommandCreationListenerInterface $listener)
+ {
+ $this->listeners[] = $listener;
+ }
+
+ /**
+ * Call all command creation listeners
+ *
+ * @param object $commandFileInstance
+ */
+ protected function notify($commandFileInstance)
+ {
+ foreach ($this->listeners as $listener) {
+ $listener->notifyCommandFileAdded($commandFileInstance);
+ }
+ }
+
+ public function addAutomaticOptionProvider(AutomaticOptionsProviderInterface $optionsProvider)
+ {
+ $this->automaticOptionsProviderList[] = $optionsProvider;
+ }
+
+ public function addCommandInfoAlterer(CommandInfoAltererInterface $alterer)
+ {
+ $this->commandInfoAlterers[] = $alterer;
+ }
+
+ /**
+ * n.b. This registers all hooks from the commandfile instance as a side-effect.
+ */
+ public function createCommandsFromClass($commandFileInstance, $includeAllPublicMethods = null)
+ {
+ // Deprecated: avoid using the $includeAllPublicMethods in favor of the setIncludeAllPublicMethods() accessor.
+ if (!isset($includeAllPublicMethods)) {
+ $includeAllPublicMethods = $this->getIncludeAllPublicMethods();
+ }
+ $this->notify($commandFileInstance);
+ $commandInfoList = $this->getCommandInfoListFromClass($commandFileInstance);
+ $this->registerCommandHooksFromClassInfo($commandInfoList, $commandFileInstance);
+ return $this->createCommandsFromClassInfo($commandInfoList, $commandFileInstance, $includeAllPublicMethods);
+ }
+
+ public function getCommandInfoListFromClass($classNameOrInstance)
+ {
+ $commandInfoList = [];
+
+ // Ignore special functions, such as __construct and __call, which
+ // can never be commands.
+ $commandMethodNames = array_filter(
+ get_class_methods($classNameOrInstance) ?: [],
+ function ($m) {
+ return !preg_match('#^_#', $m);
+ }
+ );
+
+ foreach ($commandMethodNames as $commandMethodName) {
+ $commandInfoList[] = new CommandInfo($classNameOrInstance, $commandMethodName);
+ }
+
+ return $commandInfoList;
+ }
+
+ public function createCommandInfo($classNameOrInstance, $commandMethodName)
+ {
+ return new CommandInfo($classNameOrInstance, $commandMethodName);
+ }
+
+ public function createCommandsFromClassInfo($commandInfoList, $commandFileInstance, $includeAllPublicMethods = null)
+ {
+ // Deprecated: avoid using the $includeAllPublicMethods in favor of the setIncludeAllPublicMethods() accessor.
+ if (!isset($includeAllPublicMethods)) {
+ $includeAllPublicMethods = $this->getIncludeAllPublicMethods();
+ }
+ return $this->createSelectedCommandsFromClassInfo(
+ $commandInfoList,
+ $commandFileInstance,
+ function ($commandInfo) use ($includeAllPublicMethods) {
+ return static::isCommandMethod($commandInfo, $includeAllPublicMethods);
+ }
+ );
+ }
+
+ public function createSelectedCommandsFromClassInfo($commandInfoList, $commandFileInstance, callable $commandSelector)
+ {
+ $commandList = [];
+
+ foreach ($commandInfoList as $commandInfo) {
+ if ($commandSelector($commandInfo)) {
+ $command = $this->createCommand($commandInfo, $commandFileInstance);
+ $commandList[] = $command;
+ }
+ }
+
+ return $commandList;
+ }
+
+ public static function isCommandMethod($commandInfo, $includeAllPublicMethods)
+ {
+ // Ignore everything labeled @hook
+ if ($commandInfo->hasAnnotation('hook')) {
+ return false;
+ }
+ // Include everything labeled @command
+ if ($commandInfo->hasAnnotation('command')) {
+ return true;
+ }
+ // Skip anything named like an accessor ('get' or 'set')
+ if (preg_match('#^(get[A-Z]|set[A-Z])#', $commandInfo->getMethodName())) {
+ return false;
+ }
+
+ // Default to the setting of 'include all public methods'.
+ return $includeAllPublicMethods;
+ }
+
+ public function registerCommandHooksFromClassInfo($commandInfoList, $commandFileInstance)
+ {
+ foreach ($commandInfoList as $commandInfo) {
+ if ($commandInfo->hasAnnotation('hook')) {
+ $this->registerCommandHook($commandInfo, $commandFileInstance);
+ }
+ }
+ }
+
+ /**
+ * Register a command hook given the CommandInfo for a method.
+ *
+ * The hook format is:
+ *
+ * @hook type name type
+ *
+ * For example, the pre-validate hook for the core:init command is:
+ *
+ * @hook pre-validate core:init
+ *
+ * If no command name is provided, then this hook will affect every
+ * command that is defined in the same file.
+ *
+ * If no hook is provided, then we will presume that ALTER_RESULT
+ * is intended.
+ *
+ * @param CommandInfo $commandInfo Information about the command hook method.
+ * @param object $commandFileInstance An instance of the CommandFile class.
+ */
+ public function registerCommandHook(CommandInfo $commandInfo, $commandFileInstance)
+ {
+ // Ignore if the command info has no @hook
+ if (!$commandInfo->hasAnnotation('hook')) {
+ return;
+ }
+ $hookData = $commandInfo->getAnnotation('hook');
+ $hook = $this->getNthWord($hookData, 0, HookManager::ALTER_RESULT);
+ $commandName = $this->getNthWord($hookData, 1);
+
+ // Register the hook
+ $callback = [$commandFileInstance, $commandInfo->getMethodName()];
+ $this->commandProcessor()->hookManager()->add($callback, $hook, $commandName);
+
+ // If the hook has options, then also register the commandInfo
+ // with the hook manager, so that we can add options and such to
+ // the commands they hook.
+ if (!$commandInfo->options()->isEmpty()) {
+ $this->commandProcessor()->hookManager()->recordHookOptions($commandInfo, $commandName);
+ }
+ }
+
+ protected function getNthWord($string, $n, $default = '', $delimiter = ' ')
+ {
+ $words = explode($delimiter, $string);
+ if (!empty($words[$n])) {
+ return $words[$n];
+ }
+ return $default;
+ }
+
+ public function createCommand(CommandInfo $commandInfo, $commandFileInstance)
+ {
+ $this->alterCommandInfo($commandInfo, $commandFileInstance);
+ $command = new AnnotatedCommand($commandInfo->getName());
+ $commandCallback = [$commandFileInstance, $commandInfo->getMethodName()];
+ $command->setCommandCallback($commandCallback);
+ $command->setCommandProcessor($this->commandProcessor);
+ $command->setCommandInfo($commandInfo);
+ $automaticOptions = $this->callAutomaticOptionsProviders($commandInfo);
+ $command->setCommandOptions($commandInfo, $automaticOptions);
+ // Annotation commands are never bootstrap-aware, but for completeness
+ // we will notify on every created command, as some clients may wish to
+ // use this notification for some other purpose.
+ $this->notify($command);
+ return $command;
+ }
+
+ /**
+ * Give plugins an opportunity to update the commandInfo
+ */
+ public function alterCommandInfo(CommandInfo $commandInfo, $commandFileInstance)
+ {
+ foreach ($this->commandInfoAlterers as $alterer) {
+ $alterer->alterCommandInfo($commandInfo, $commandFileInstance);
+ }
+ }
+
+ /**
+ * Get the options that are implied by annotations, e.g. @fields implies
+ * that there should be a --fields and a --format option.
+ *
+ * @return InputOption[]
+ */
+ public function callAutomaticOptionsProviders(CommandInfo $commandInfo)
+ {
+ $automaticOptions = [];
+ foreach ($this->automaticOptionsProviderList as $automaticOptionsProvider) {
+ $automaticOptions += $automaticOptionsProvider->automaticOptions($commandInfo);
+ }
+ return $automaticOptions;
+ }
+
+ /**
+ * Get the options that are implied by annotations, e.g. @fields implies
+ * that there should be a --fields and a --format option.
+ *
+ * @return InputOption[]
+ */
+ public function automaticOptions(CommandInfo $commandInfo)
+ {
+ $automaticOptions = [];
+ $formatManager = $this->commandProcessor()->formatterManager();
+ if ($formatManager) {
+ $annotationData = $commandInfo->getAnnotations()->getArrayCopy();
+ $formatterOptions = new FormatterOptions($annotationData);
+ $dataType = $commandInfo->getReturnType();
+ $automaticOptions = $formatManager->automaticOptions($formatterOptions, $dataType);
+ }
+ return $automaticOptions;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/AnnotationData.php b/src/composer/vendor/consolidation/annotated-command/src/AnnotationData.php
new file mode 100644
index 00000000..c5728ecd
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/AnnotationData.php
@@ -0,0 +1,20 @@
+has($key) ? $this[$key] : $default;
+ }
+
+ public function has($key)
+ {
+ return isset($this[$key]);
+ }
+
+ public function keys()
+ {
+ return array_keys($this->getArrayCopy());
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/CommandCreationListenerInterface.php b/src/composer/vendor/consolidation/annotated-command/src/CommandCreationListenerInterface.php
new file mode 100644
index 00000000..f3a50eae
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/CommandCreationListenerInterface.php
@@ -0,0 +1,15 @@
+annotationData = $annotationData;
+ $this->input = $input;
+ $this->output = $output;
+ $this->usesInputInterface = false;
+ $this->usesOutputInterface = false;
+ $this->includeOptionsInArgs = true;
+ }
+
+ /**
+ * For internal use only; indicates that the function to be called
+ * should be passed an InputInterface &/or an OutputInterface.
+ * @param booean $usesInputInterface
+ * @param boolean $usesOutputInterface
+ * @return self
+ */
+ public function setUseIOInterfaces($usesInputInterface, $usesOutputInterface)
+ {
+ $this->usesInputInterface = $usesInputInterface;
+ $this->usesOutputInterface = $usesOutputInterface;
+ return $this;
+ }
+
+ /**
+ * For backwards-compatibility mode only: disable addition of
+ * options on the end of the arguments list.
+ */
+ public function setIncludeOptionsInArgs($includeOptionsInArgs)
+ {
+ $this->includeOptionsInArgs = $includeOptionsInArgs;
+ return $this;
+ }
+
+ public function annotationData()
+ {
+ return $this->annotationData;
+ }
+
+ public function input()
+ {
+ return $this->input;
+ }
+
+ public function output()
+ {
+ return $this->output;
+ }
+
+ public function arguments()
+ {
+ return $this->input->getArguments();
+ }
+
+ public function options()
+ {
+ return $this->input->getOptions();
+ }
+
+ public function getArgsWithoutAppName()
+ {
+ $args = $this->arguments();
+
+ // When called via the Application, the first argument
+ // will be the command name. The Application alters the
+ // input definition to match, adding a 'command' argument
+ // to the beginning.
+ array_shift($args);
+
+ if ($this->usesInputInterface) {
+ array_unshift($args, $this->input());
+ }
+
+ if ($this->usesOutputInterface) {
+ array_unshift($args, $this->output());
+ }
+
+ return $args;
+ }
+
+ public function getArgsAndOptions()
+ {
+ // Get passthrough args, and add the options on the end.
+ $args = $this->getArgsWithoutAppName();
+ if ($this->includeOptionsInArgs) {
+ $args['options'] = $this->options();
+ }
+ return $args;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/CommandError.php b/src/composer/vendor/consolidation/annotated-command/src/CommandError.php
new file mode 100644
index 00000000..bfe257bd
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/CommandError.php
@@ -0,0 +1,32 @@
+message = $message;
+ // Ensure the exit code is non-zero. The exit code may have
+ // come from an exception, and those often default to zero if
+ // a specific value is not provided.
+ $this->exitCode = $exitCode == 0 ? 1 : $exitCode;
+ }
+ public function getExitCode()
+ {
+ return $this->exitCode;
+ }
+
+ public function getOutputData()
+ {
+ return $this->message;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/CommandFileDiscovery.php b/src/composer/vendor/consolidation/annotated-command/src/CommandFileDiscovery.php
new file mode 100644
index 00000000..7c47528d
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/CommandFileDiscovery.php
@@ -0,0 +1,383 @@
+discoverNamespaced($moduleList, '\Drupal');
+ *
+ * To discover global commands:
+ *
+ * $commandFiles = $discovery->discover($drupalRoot, '\Drupal');
+ */
+class CommandFileDiscovery
+{
+ /** @var string[] */
+ protected $excludeList;
+ /** @var string[] */
+ protected $searchLocations;
+ /** @var string */
+ protected $searchPattern = '*Commands.php';
+ /** @var boolean */
+ protected $includeFilesAtBase = true;
+ /** @var integer */
+ protected $searchDepth = 2;
+
+ public function __construct()
+ {
+ $this->excludeList = ['Exclude'];
+ $this->searchLocations = [
+ 'Command',
+ 'CliTools', // TODO: Maybe remove
+ ];
+ }
+
+ /**
+ * Specify whether to search for files at the base directory
+ * ($directoryList parameter to discover and discoverNamespaced
+ * methods), or only in the directories listed in the search paths.
+ *
+ * @param boolean $includeFilesAtBase
+ */
+ public function setIncludeFilesAtBase($includeFilesAtBase)
+ {
+ $this->includeFilesAtBase = $includeFilesAtBase;
+ return $this;
+ }
+
+ /**
+ * Set the list of excludes to add to the finder, replacing
+ * whatever was there before.
+ *
+ * @param array $excludeList The list of directory names to skip when
+ * searching for command files.
+ */
+ public function setExcludeList($excludeList)
+ {
+ $this->excludeList = $excludeList;
+ return $this;
+ }
+
+ /**
+ * Add one more location to the exclude list.
+ *
+ * @param string $exclude One directory name to skip when searching
+ * for command files.
+ */
+ public function addExclude($exclude)
+ {
+ $this->excludeList[] = $exclude;
+ return $this;
+ }
+
+ /**
+ * Set the search depth. By default, fills immediately in the
+ * base directory are searched, plus all of the search locations
+ * to this specified depth. If the search locations is set to
+ * an empty array, then the base directory is searched to this
+ * depth.
+ */
+ public function setSearchDepth($searchDepth)
+ {
+ $this->searchDepth = $searchDepth;
+ return $this;
+ }
+
+ /**
+ * Set the list of search locations to examine in each directory where
+ * command files may be found. This replaces whatever was there before.
+ *
+ * @param array $searchLocations The list of locations to search for command files.
+ */
+ public function setSearchLocations($searchLocations)
+ {
+ $this->searchLocations = $searchLocations;
+ return $this;
+ }
+
+ /**
+ * Add one more location to the search location list.
+ *
+ * @param string $location One more relative path to search
+ * for command files.
+ */
+ public function addSearchLocation($location)
+ {
+ $this->searchLocations[] = $location;
+ return $this;
+ }
+
+ /**
+ * Specify the pattern / regex used by the finder to search for
+ * command files.
+ */
+ public function setSearchPattern($searchPattern)
+ {
+ $this->searchPattern = $searchPattern;
+ return $this;
+ }
+
+ /**
+ * Given a list of directories, e.g. Drupal modules like:
+ *
+ * core/modules/block
+ * core/modules/dblog
+ * modules/default_content
+ *
+ * Discover command files in any of these locations.
+ *
+ * @param string|string[] $directoryList Places to search for commands.
+ *
+ * @return array
+ */
+ public function discoverNamespaced($directoryList, $baseNamespace = '')
+ {
+ return $this->discover($this->convertToNamespacedList((array)$directoryList), $baseNamespace);
+ }
+
+ /**
+ * Given a simple list containing paths to directories, where
+ * the last component of the path should appear in the namespace,
+ * after the base namespace, this function will return an
+ * associative array mapping the path's basename (e.g. the module
+ * name) to the directory path.
+ *
+ * Module names must be unique.
+ *
+ * @param string[] $directoryList A list of module locations
+ *
+ * @return array
+ */
+ public function convertToNamespacedList($directoryList)
+ {
+ $namespacedArray = [];
+ foreach ((array)$directoryList as $directory) {
+ $namespacedArray[basename($directory)] = $directory;
+ }
+ return $namespacedArray;
+ }
+
+ /**
+ * Search for command files in the specified locations. This is the function that
+ * should be used for all locations that are NOT modules of a framework.
+ *
+ * @param string|string[] $directoryList Places to search for commands.
+ * @return array
+ */
+ public function discover($directoryList, $baseNamespace = '')
+ {
+ $commandFiles = [];
+ foreach ((array)$directoryList as $key => $directory) {
+ $itemsNamespace = $this->joinNamespace([$baseNamespace, $key]);
+ $commandFiles = array_merge(
+ $commandFiles,
+ $this->discoverCommandFiles($directory, $itemsNamespace),
+ $this->discoverCommandFiles("$directory/src", $itemsNamespace)
+ );
+ }
+ return $commandFiles;
+ }
+
+ /**
+ * Search for command files in specific locations within a single directory.
+ *
+ * In each location, we will accept only a few places where command files
+ * can be found. This will reduce the need to search through many unrelated
+ * files.
+ *
+ * The default search locations include:
+ *
+ * .
+ * CliTools
+ * src/CliTools
+ *
+ * The pattern we will look for is any file whose name ends in 'Commands.php'.
+ * A list of paths to found files will be returned.
+ */
+ protected function discoverCommandFiles($directory, $baseNamespace)
+ {
+ $commandFiles = [];
+ // In the search location itself, we will search for command files
+ // immediately inside the directory only.
+ if ($this->includeFilesAtBase) {
+ $commandFiles = $this->discoverCommandFilesInLocation(
+ $directory,
+ $this->getBaseDirectorySearchDepth(),
+ $baseNamespace
+ );
+ }
+
+ // In the other search locations,
+ foreach ($this->searchLocations as $location) {
+ $itemsNamespace = $this->joinNamespace([$baseNamespace, $location]);
+ $commandFiles = array_merge(
+ $commandFiles,
+ $this->discoverCommandFilesInLocation(
+ "$directory/$location",
+ $this->getSearchDepth(),
+ $itemsNamespace
+ )
+ );
+ }
+ return $commandFiles;
+ }
+
+ /**
+ * Return a Finder search depth appropriate for our selected search depth.
+ *
+ * @return string
+ */
+ protected function getSearchDepth()
+ {
+ return $this->searchDepth <= 0 ? '== 0' : '<= ' . $this->searchDepth;
+ }
+
+ /**
+ * Return a Finder search depth for the base directory. If the
+ * searchLocations array has been populated, then we will only search
+ * for files immediately inside the base directory; no traversal into
+ * deeper directories will be done, as that would conflict with the
+ * specification provided by the search locations. If there is no
+ * search location, then we will search to whatever depth was specified
+ * by the client.
+ *
+ * @return string
+ */
+ protected function getBaseDirectorySearchDepth()
+ {
+ if (!empty($this->searchLocations)) {
+ return '== 0';
+ }
+ return $this->getSearchDepth();
+ }
+
+ /**
+ * Search for command files in just one particular location. Returns
+ * an associative array mapping from the pathname of the file to the
+ * classname that it contains. The pathname may be ignored if the search
+ * location is included in the autoloader.
+ *
+ * @param string $directory The location to search
+ * @param string $depth How deep to search (e.g. '== 0' or '< 2')
+ * @param string $baseNamespace Namespace to prepend to each classname
+ *
+ * @return array
+ */
+ protected function discoverCommandFilesInLocation($directory, $depth, $baseNamespace)
+ {
+ if (!is_dir($directory)) {
+ return [];
+ }
+ $finder = $this->createFinder($directory, $depth);
+
+ $commands = [];
+ foreach ($finder as $file) {
+ $relativePathName = $file->getRelativePathname();
+ $relativeNamespaceAndClassname = str_replace(
+ ['/', '.php'],
+ ['\\', ''],
+ $relativePathName
+ );
+ $classname = $this->joinNamespace([$baseNamespace, $relativeNamespaceAndClassname]);
+ $commandFilePath = $this->joinPaths([$directory, $relativePathName]);
+ $commands[$commandFilePath] = $classname;
+ }
+
+ return $commands;
+ }
+
+ /**
+ * Create a Finder object for use in searching a particular directory
+ * location.
+ *
+ * @param string $directory The location to search
+ * @param string $depth The depth limitation
+ *
+ * @return Finder
+ */
+ protected function createFinder($directory, $depth)
+ {
+ $finder = new Finder();
+ $finder->files()
+ ->name($this->searchPattern)
+ ->in($directory)
+ ->depth($depth);
+
+ foreach ($this->excludeList as $item) {
+ $finder->exclude($item);
+ }
+
+ return $finder;
+ }
+
+ /**
+ * Combine the items of the provied array into a backslash-separated
+ * namespace string. Empty and numeric items are omitted.
+ *
+ * @param array $namespaceParts List of components of a namespace
+ *
+ * @return string
+ */
+ protected function joinNamespace(array $namespaceParts)
+ {
+ return $this->joinParts(
+ '\\',
+ $namespaceParts,
+ function ($item) {
+ return !is_numeric($item) && !empty($item);
+ }
+ );
+ }
+
+ /**
+ * Combine the items of the provied array into a slash-separated
+ * pathname. Empty items are omitted.
+ *
+ * @param array $pathParts List of components of a path
+ *
+ * @return string
+ */
+ protected function joinPaths(array $pathParts)
+ {
+ return $this->joinParts(
+ '/',
+ $pathParts,
+ function ($item) {
+ return !empty($item);
+ }
+ );
+ }
+
+ /**
+ * Simple wrapper around implode and array_filter.
+ *
+ * @param string $delimiter
+ * @param array $parts
+ * @param callable $filterFunction
+ */
+ protected function joinParts($delimiter, $parts, $filterFunction)
+ {
+ return implode(
+ $delimiter,
+ array_filter($parts, $filterFunction)
+ );
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/CommandInfoAltererInterface.php b/src/composer/vendor/consolidation/annotated-command/src/CommandInfoAltererInterface.php
new file mode 100644
index 00000000..55376d14
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/CommandInfoAltererInterface.php
@@ -0,0 +1,9 @@
+hookManager = $hookManager;
+ }
+
+ /**
+ * Return the hook manager
+ * @return HookManager
+ */
+ public function hookManager()
+ {
+ return $this->hookManager;
+ }
+
+ public function addPrepareFormatter(PrepareFormatter $preparer)
+ {
+ $this->prepareOptionsList[] = $preparer;
+ }
+
+ public function setFormatterManager(FormatterManager $formatterManager)
+ {
+ $this->formatterManager = $formatterManager;
+ return $this;
+ }
+
+ public function setDisplayErrorFunction(callable $fn)
+ {
+ $this->displayErrorFunction = $fn;
+ return $this;
+ }
+
+ /**
+ * Return the formatter manager
+ * @return FormatterManager
+ */
+ public function formatterManager()
+ {
+ return $this->formatterManager;
+ }
+
+ public function initializeHook(
+ InputInterface $input,
+ $names,
+ AnnotationData $annotationData
+ ) {
+ return $this->hookManager()->initializeHook($input, $names, $annotationData);
+ }
+
+ public function optionsHook(
+ AnnotatedCommand $command,
+ $names,
+ AnnotationData $annotationData
+ ) {
+ $this->hookManager()->optionsHook($command, $names, $annotationData);
+ }
+
+ public function interact(
+ InputInterface $input,
+ OutputInterface $output,
+ $names,
+ AnnotationData $annotationData
+ ) {
+ return $this->hookManager()->interact($input, $output, $names, $annotationData);
+ }
+
+ public function process(
+ OutputInterface $output,
+ $names,
+ $commandCallback,
+ CommandData $commandData
+ ) {
+ $result = [];
+ try {
+ $result = $this->validateRunAndAlter(
+ $names,
+ $commandCallback,
+ $commandData
+ );
+ return $this->handleResults($output, $names, $result, $commandData);
+ } catch (\Exception $e) {
+ $result = new CommandError($e->getMessage(), $e->getCode());
+ return $this->handleResults($output, $names, $result, $commandData);
+ }
+ }
+
+ public function validateRunAndAlter(
+ $names,
+ $commandCallback,
+ CommandData $commandData
+ ) {
+ // Validators return any object to signal a validation error;
+ // if the return an array, it replaces the arguments.
+ $validated = $this->hookManager()->validateArguments($names, $commandData);
+ if (is_object($validated)) {
+ return $validated;
+ }
+
+ // Run the command, alter the results, and then handle output and status
+ $result = $this->runCommandCallback($commandCallback, $commandData);
+ return $this->processResults($names, $result, $commandData);
+ }
+
+ public function processResults($names, $result, CommandData $commandData)
+ {
+ return $this->hookManager()->alterResult($names, $result, $commandData);
+ }
+
+ /**
+ * Handle the result output and status code calculation.
+ */
+ public function handleResults(OutputInterface $output, $names, $result, CommandData $commandData)
+ {
+ $status = $this->hookManager()->determineStatusCode($names, $result);
+ // If the result is an integer and no separate status code was provided, then use the result as the status and do no output.
+ if (is_integer($result) && !isset($status)) {
+ return $result;
+ }
+ $status = $this->interpretStatusCode($status);
+
+ // Get the structured output, the output stream and the formatter
+ $structuredOutput = $this->hookManager()->extractOutput($names, $result);
+ $output = $this->chooseOutputStream($output, $status);
+ if ($status != 0) {
+ return $this->writeErrorMessage($output, $status, $structuredOutput, $result);
+ }
+ if ($this->dataCanBeFormatted($structuredOutput) && isset($this->formatterManager)) {
+ return $this->writeUsingFormatter($output, $structuredOutput, $commandData);
+ }
+ return $this->writeCommandOutput($output, $structuredOutput);
+ }
+
+ protected function dataCanBeFormatted($structuredOutput)
+ {
+ if (!isset($this->formatterManager)) {
+ return false;
+ }
+ return
+ is_object($structuredOutput) ||
+ is_array($structuredOutput);
+ }
+
+ /**
+ * Run the main command callback
+ */
+ protected function runCommandCallback($commandCallback, CommandData $commandData)
+ {
+ $result = false;
+ try {
+ $args = $commandData->getArgsAndOptions();
+ $result = call_user_func_array($commandCallback, $args);
+ } catch (\Exception $e) {
+ $result = new CommandError($e->getMessage(), $e->getCode());
+ }
+ return $result;
+ }
+
+ /**
+ * Determine the formatter that should be used to render
+ * output.
+ *
+ * If the user specified a format via the --format option,
+ * then always return that. Otherwise, return the default
+ * format, unless --pipe was specified, in which case
+ * return the default pipe format, format-pipe.
+ *
+ * n.b. --pipe is a handy option introduced in Drush 2
+ * (or perhaps even Drush 1) that indicates that the command
+ * should select the output format that is most appropriate
+ * for use in scripts (e.g. to pipe to another command).
+ *
+ * @return string
+ */
+ protected function getFormat(FormatterOptions $options)
+ {
+ // In Symfony Console, there is no way for us to differentiate
+ // between the user specifying '--format=table', and the user
+ // not specifying --format when the default value is 'table'.
+ // Therefore, we must make --field always override --format; it
+ // cannot become the default value for --format.
+ if ($options->get('field')) {
+ return 'string';
+ }
+ $defaults = [];
+ if ($options->get('pipe')) {
+ return $options->get('pipe-format', [], 'tsv');
+ }
+ return $options->getFormat($defaults);
+ }
+
+ /**
+ * Determine whether we should use stdout or stderr.
+ */
+ protected function chooseOutputStream(OutputInterface $output, $status)
+ {
+ // If the status code indicates an error, then print the
+ // result to stderr rather than stdout
+ if ($status && ($output instanceof ConsoleOutputInterface)) {
+ return $output->getErrorOutput();
+ }
+ return $output;
+ }
+
+ /**
+ * Call the formatter to output the provided data.
+ */
+ protected function writeUsingFormatter(OutputInterface $output, $structuredOutput, CommandData $commandData)
+ {
+ $formatterOptions = $this->createFormatterOptions($commandData);
+ $format = $this->getFormat($formatterOptions);
+ $this->formatterManager->write(
+ $output,
+ $format,
+ $structuredOutput,
+ $formatterOptions
+ );
+ return 0;
+ }
+
+ /**
+ * Create a FormatterOptions object for use in writing the formatted output.
+ * @param CommandData $commandData
+ * @return FormatterOptions
+ */
+ protected function createFormatterOptions($commandData)
+ {
+ $options = $commandData->input()->getOptions();
+ $formatterOptions = new FormatterOptions($commandData->annotationData()->getArrayCopy(), $options);
+ foreach ($this->prepareOptionsList as $preparer) {
+ $preparer->prepare($commandData, $formatterOptions);
+ }
+ return $formatterOptions;
+ }
+
+ /**
+ * Description
+ * @param OutputInterface $output
+ * @param int $status
+ * @param string $structuredOutput
+ * @param mixed $originalResult
+ * @return type
+ */
+ protected function writeErrorMessage($output, $status, $structuredOutput, $originalResult)
+ {
+ if (isset($this->displayErrorFunction)) {
+ call_user_func($this->displayErrorFunction, $output, $structuredOutput, $status, $originalResult);
+ } else {
+ $this->writeCommandOutput($output, $structuredOutput);
+ }
+ return $status;
+ }
+
+ /**
+ * If the result object is a string, then print it.
+ */
+ protected function writeCommandOutput(
+ OutputInterface $output,
+ $structuredOutput
+ ) {
+ // If there is no formatter, we will print strings,
+ // but can do no more than that.
+ if (is_string($structuredOutput)) {
+ $output->writeln($structuredOutput);
+ }
+ return 0;
+ }
+
+ /**
+ * If a status code was set, then return it; otherwise,
+ * presume success.
+ */
+ protected function interpretStatusCode($status)
+ {
+ if (isset($status)) {
+ return $status;
+ }
+ return 0;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/ExitCodeInterface.php b/src/composer/vendor/consolidation/annotated-command/src/ExitCodeInterface.php
new file mode 100644
index 00000000..bec902bb
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/ExitCodeInterface.php
@@ -0,0 +1,12 @@
+hooks;
+ }
+
+ /**
+ * Add a hook
+ *
+ * @param mixed $callback The callback function to call
+ * @param string $hook The name of the hook to add
+ * @param string $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function add(callable $callback, $hook, $name = '*')
+ {
+ if (empty($name)) {
+ $name = static::getClassNameFromCallback($callback);
+ }
+ $this->hooks[$name][$hook][] = $callback;
+ return $this;
+ }
+
+ public function recordHookOptions($commandInfo, $name)
+ {
+ $this->hookOptions[$name][] = $commandInfo;
+ return $this;
+ }
+
+ public static function getNames($command, $callback)
+ {
+ return array_filter(
+ array_merge(
+ static::getNamesUsingCommands($command),
+ [static::getClassNameFromCallback($callback)]
+ )
+ );
+ }
+
+ protected static function getNamesUsingCommands($command)
+ {
+ return array_merge(
+ [$command->getName()],
+ $command->getAliases()
+ );
+ }
+
+ /**
+ * If a command hook does not specify any particular command
+ * name that it should be attached to, then it will be applied
+ * to every command that is defined in the same class as the hook.
+ * This is controlled by using the namespace + class name of
+ * the implementing class of the callback hook.
+ */
+ protected static function getClassNameFromCallback($callback)
+ {
+ if (!is_array($callback)) {
+ return '';
+ }
+ $reflectionClass = new \ReflectionClass($callback[0]);
+ return $reflectionClass->getName();
+ }
+
+ /**
+ * Add an configuration provider hook
+ *
+ * @param type InitializeHookInterface $provider
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addInitializeHook(InitializeHookInterface $initializeHook, $name = '*')
+ {
+ $this->hooks[$name][self::INITIALIZE][] = $initializeHook;
+ return $this;
+ }
+
+ /**
+ * Add an option hook
+ *
+ * @param type ValidatorInterface $validator
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addOptionHook(OptionHookInterface $interactor, $name = '*')
+ {
+ $this->hooks[$name][self::INTERACT][] = $interactor;
+ return $this;
+ }
+
+ /**
+ * Add an interact hook
+ *
+ * @param type ValidatorInterface $validator
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addInteractor(InteractorInterface $interactor, $name = '*')
+ {
+ $this->hooks[$name][self::INTERACT][] = $interactor;
+ return $this;
+ }
+
+ /**
+ * Add a pre-validator hook
+ *
+ * @param type ValidatorInterface $validator
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addPreValidator(ValidatorInterface $validator, $name = '*')
+ {
+ $this->hooks[$name][self::PRE_ARGUMENT_VALIDATOR][] = $validator;
+ return $this;
+ }
+
+ /**
+ * Add a validator hook
+ *
+ * @param type ValidatorInterface $validator
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addValidator(ValidatorInterface $validator, $name = '*')
+ {
+ $this->hooks[$name][self::ARGUMENT_VALIDATOR][] = $validator;
+ return $this;
+ }
+
+ /**
+ * Add a pre-command hook. This is the same as a validator hook, except
+ * that it will run after all of the post-validator hooks.
+ *
+ * @param type ValidatorInterface $preCommand
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addPreCommandHook(ValidatorInterface $preCommand, $name = '*')
+ {
+ $this->hooks[$name][self::PRE_COMMAND_HOOK][] = $preCommand;
+ return $this;
+ }
+
+ /**
+ * Add a post-command hook. This is the same as a pre-process hook,
+ * except that it will run before the first pre-process hook.
+ *
+ * @param type ProcessResultInterface $postCommand
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addPostCommandHook(ProcessResultInterface $postCommand, $name = '*')
+ {
+ $this->hooks[$name][self::POST_COMMAND_HOOK][] = $postCommand;
+ return $this;
+ }
+
+ /**
+ * Add a result processor.
+ *
+ * @param type ProcessResultInterface $resultProcessor
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addResultProcessor(ProcessResultInterface $resultProcessor, $name = '*')
+ {
+ $this->hooks[$name][self::PROCESS_RESULT][] = $resultProcessor;
+ return $this;
+ }
+
+ /**
+ * Add a result alterer. After a result is processed
+ * by a result processor, an alter hook may be used
+ * to convert the result from one form to another.
+ *
+ * @param type AlterResultInterface $resultAlterer
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addAlterResult(AlterResultInterface $resultAlterer, $name = '*')
+ {
+ $this->hooks[$name][self::ALTER_RESULT][] = $resultAlterer;
+ return $this;
+ }
+
+ /**
+ * Add a status determiner. Usually, a command should return
+ * an integer on error, or a result object on success (which
+ * implies a status code of zero). If a result contains the
+ * status code in some other field, then a status determiner
+ * can be used to call the appropriate accessor method to
+ * determine the status code. This is usually not necessary,
+ * though; a command that fails may return a CommandError
+ * object, which contains a status code and a result message
+ * to display.
+ * @see CommandError::getExitCode()
+ *
+ * @param type StatusDeterminerInterface $statusDeterminer
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addStatusDeterminer(StatusDeterminerInterface $statusDeterminer, $name = '*')
+ {
+ $this->hooks[$name][self::STATUS_DETERMINER][] = $statusDeterminer;
+ return $this;
+ }
+
+ /**
+ * Add an output extractor. If a command returns an object
+ * object, by default it is passed directly to the output
+ * formatter (if in use) for rendering. If the result object
+ * contains more information than just the data to render, though,
+ * then an output extractor can be used to call the appopriate
+ * accessor method of the result object to get the data to
+ * rendered. This is usually not necessary, though; it is preferable
+ * to have complex result objects implement the OutputDataInterface.
+ * @see OutputDataInterface::getOutputData()
+ *
+ * @param type ExtractOutputInterface $outputExtractor
+ * @param type $name The name of the command to hook
+ * ('*' for all)
+ */
+ public function addOutputExtractor(ExtractOutputInterface $outputExtractor, $name = '*')
+ {
+ $this->hooks[$name][self::EXTRACT_OUTPUT][] = $outputExtractor;
+ return $this;
+ }
+
+ public function initializeHook(
+ InputInterface $input,
+ $names,
+ AnnotationData $annotationData
+ ) {
+ $providers = $this->getInitializeHooks($names, $annotationData);
+ foreach ($providers as $provider) {
+ $this->callInjectConfigurationHook($provider, $input, $annotationData);
+ }
+ }
+
+ public function optionsHook(
+ \Consolidation\AnnotatedCommand\AnnotatedCommand $command,
+ $names,
+ AnnotationData $annotationData
+ ) {
+ $optionHooks = $this->getOptionHooks($names, $annotationData);
+ foreach ($optionHooks as $optionHook) {
+ $this->callOptionHook($optionHook, $command, $annotationData);
+ }
+ $commandInfoList = $this->getHookOptionsForCommand($command);
+ $command->optionsHookForHookAnnotations($commandInfoList);
+ }
+
+ public function getHookOptionsForCommand($command)
+ {
+ $names = $this->addWildcardHooksToNames($command->getNames(), $command->getAnnotationData());
+ return $this->getHookOptions($names);
+ }
+
+ /**
+ * @return CommandInfo[]
+ */
+ public function getHookOptions($names)
+ {
+ $result = [];
+ foreach ($names as $name) {
+ if (isset($this->hookOptions[$name])) {
+ $result = array_merge($result, $this->hookOptions[$name]);
+ }
+ }
+ return $result;
+ }
+
+ public function interact(
+ InputInterface $input,
+ OutputInterface $output,
+ $names,
+ AnnotationData $annotationData
+ ) {
+ $interactors = $this->getInteractors($names, $annotationData);
+ foreach ($interactors as $interactor) {
+ $this->callInteractor($interactor, $input, $output, $annotationData);
+ }
+ }
+
+ public function validateArguments($names, CommandData $commandData)
+ {
+ $validators = $this->getValidators($names, $commandData->annotationData());
+ foreach ($validators as $validator) {
+ $validated = $this->callValidator($validator, $commandData);
+ if ($validated === false) {
+ return new CommandError();
+ }
+ if (is_object($validated)) {
+ return $validated;
+ }
+ }
+ }
+
+ /**
+ * Process result and decide what to do with it.
+ * Allow client to add transformation / interpretation
+ * callbacks.
+ */
+ public function alterResult($names, $result, CommandData $commandData)
+ {
+ $processors = $this->getProcessResultHooks($names, $commandData->annotationData());
+ foreach ($processors as $processor) {
+ $result = $this->callProcessor($processor, $result, $commandData);
+ }
+ $alterers = $this->getAlterResultHooks($names, $commandData->annotationData());
+ foreach ($alterers as $alterer) {
+ $result = $this->callProcessor($alterer, $result, $commandData);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Call all status determiners, and see if any of them
+ * know how to convert to a status code.
+ */
+ public function determineStatusCode($names, $result)
+ {
+ // If the result (post-processing) is an object that
+ // implements ExitCodeInterface, then we will ask it
+ // to give us the status code.
+ if ($result instanceof ExitCodeInterface) {
+ return $result->getExitCode();
+ }
+
+ // If the result does not implement ExitCodeInterface,
+ // then we'll see if there is a determiner that can
+ // extract a status code from the result.
+ $determiners = $this->getStatusDeterminers($names);
+ foreach ($determiners as $determiner) {
+ $status = $this->callDeterminer($determiner, $result);
+ if (isset($status)) {
+ return $status;
+ }
+ }
+ }
+
+ /**
+ * Convert the result object to printable output in
+ * structured form.
+ */
+ public function extractOutput($names, $result)
+ {
+ if ($result instanceof OutputDataInterface) {
+ return $result->getOutputData();
+ }
+
+ $extractors = $this->getOutputExtractors($names);
+ foreach ($extractors as $extractor) {
+ $structuredOutput = $this->callExtractor($extractor, $result);
+ if (isset($structuredOutput)) {
+ return $structuredOutput;
+ }
+ }
+
+ return $result;
+ }
+
+ protected function getCommandEventHooks($names)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::PRE_COMMAND_EVENT,
+ self::COMMAND_EVENT,
+ self::POST_COMMAND_EVENT
+ ]
+ );
+ }
+
+ protected function getInitializeHooks($names, AnnotationData $annotationData)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::PRE_INITIALIZE,
+ self::INITIALIZE,
+ self::POST_INITIALIZE
+ ],
+ $annotationData
+ );
+ }
+
+ protected function getOptionHooks($names, AnnotationData $annotationData)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::PRE_OPTION_HOOK,
+ self::OPTION_HOOK,
+ self::POST_OPTION_HOOK
+ ],
+ $annotationData
+ );
+ }
+
+ protected function getInteractors($names, AnnotationData $annotationData)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::PRE_INTERACT,
+ self::INTERACT,
+ self::POST_INTERACT
+ ],
+ $annotationData
+ );
+ }
+
+ protected function getValidators($names, AnnotationData $annotationData)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::PRE_ARGUMENT_VALIDATOR,
+ self::ARGUMENT_VALIDATOR,
+ self::POST_ARGUMENT_VALIDATOR,
+ self::PRE_COMMAND_HOOK,
+ self::COMMAND_HOOK,
+ ],
+ $annotationData
+ );
+ }
+
+ protected function getProcessResultHooks($names, AnnotationData $annotationData)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::PRE_PROCESS_RESULT,
+ self::PROCESS_RESULT,
+ self::POST_PROCESS_RESULT
+ ],
+ $annotationData
+ );
+ }
+
+ protected function getAlterResultHooks($names, AnnotationData $annotationData)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::PRE_ALTER_RESULT,
+ self::ALTER_RESULT,
+ self::POST_ALTER_RESULT,
+ self::POST_COMMAND_HOOK,
+ ],
+ $annotationData
+ );
+ }
+
+ protected function getStatusDeterminers($names)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::STATUS_DETERMINER,
+ ]
+ );
+ }
+
+ protected function getOutputExtractors($names)
+ {
+ return $this->getHooks(
+ $names,
+ [
+ self::EXTRACT_OUTPUT,
+ ]
+ );
+ }
+
+ /**
+ * Get a set of hooks with the provided name(s). Include the
+ * pre- and post- hooks, and also include the global hooks ('*')
+ * in addition to the named hooks provided.
+ *
+ * @param string|array $names The name of the function being hooked.
+ * @param string[] $hooks A list of hooks (e.g. [HookManager::ALTER_RESULT])
+ *
+ * @return callable[]
+ */
+ public function getHooks($names, $hooks, $annotationData = null)
+ {
+ return $this->get($this->addWildcardHooksToNames($names, $annotationData), $hooks);
+ }
+
+ protected function addWildcardHooksToNames($names, $annotationData = null)
+ {
+ $names = array_merge(
+ (array)$names,
+ ($annotationData == null) ? [] : array_map(function ($item) {
+ return "@$item";
+ }, $annotationData->keys())
+ );
+ $names[] = '*';
+ return array_unique($names);
+ }
+
+ /**
+ * Get a set of hooks with the provided name(s).
+ *
+ * @param string|array $names The name of the function being hooked.
+ * @param string[] $hooks The list of hook names (e.g. [HookManager::ALTER_RESULT])
+ *
+ * @return callable[]
+ */
+ public function get($names, $hooks)
+ {
+ $result = [];
+ foreach ((array)$hooks as $hook) {
+ foreach ((array)$names as $name) {
+ $result = array_merge($result, $this->getHook($name, $hook));
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Get a single named hook.
+ *
+ * @param string $name The name of the hooked method
+ * @param string $hook The specific hook name (e.g. alter)
+ *
+ * @return callable[]
+ */
+ protected function getHook($name, $hook)
+ {
+ if (isset($this->hooks[$name][$hook])) {
+ return $this->hooks[$name][$hook];
+ }
+ return [];
+ }
+
+ protected function callInjectConfigurationHook($provider, $input, AnnotationData $annotationData)
+ {
+ if ($provider instanceof InitializeHookInterface) {
+ return $provider->applyConfiguration($input, $annotationData);
+ }
+ if (is_callable($provider)) {
+ return $provider($input, $annotationData);
+ }
+ }
+
+ protected function callOptionHook($optionHook, $command, AnnotationData $annotationData)
+ {
+ if ($optionHook instanceof OptionHookInterface) {
+ return $optionHook->getOptions($command, $annotationData);
+ }
+ if (is_callable($optionHook)) {
+ return $optionHook($command, $annotationData);
+ }
+ }
+
+ protected function callInteractor($interactor, $input, $output, AnnotationData $annotationData)
+ {
+ if ($interactor instanceof InteractorInterface) {
+ return $interactor->interact($input, $output, $annotationData);
+ }
+ if (is_callable($interactor)) {
+ return $interactor($input, $output, $annotationData);
+ }
+ }
+
+ protected function callValidator($validator, CommandData $commandData)
+ {
+ if ($validator instanceof ValidatorInterface) {
+ return $validator->validate($commandData);
+ }
+ if (is_callable($validator)) {
+ return $validator($commandData);
+ }
+ }
+
+ protected function callProcessor($processor, $result, CommandData $commandData)
+ {
+ $processed = null;
+ if ($processor instanceof ProcessResultInterface) {
+ $processed = $processor->process($result, $commandData);
+ }
+ if (is_callable($processor)) {
+ $processed = $processor($result, $commandData);
+ }
+ if (isset($processed)) {
+ return $processed;
+ }
+ return $result;
+ }
+
+ protected function callDeterminer($determiner, $result)
+ {
+ if ($determiner instanceof StatusDeterminerInterface) {
+ return $determiner->determineStatusCode($result);
+ }
+ if (is_callable($determiner)) {
+ return $determiner($result);
+ }
+ }
+
+ protected function callExtractor($extractor, $result)
+ {
+ if ($extractor instanceof ExtractOutputInterface) {
+ return $extractor->extractOutput($result);
+ }
+ if (is_callable($extractor)) {
+ return $extractor($result);
+ }
+ }
+
+ /**
+ * @param ConsoleCommandEvent $event
+ */
+ public function callCommandEventHooks(ConsoleCommandEvent $event)
+ {
+ /* @var Command $command */
+ $command = $event->getCommand();
+ $names = [$command->getName()];
+ $commandEventHooks = $this->getCommandEventHooks($names);
+ foreach ($commandEventHooks as $commandEvent) {
+ if (is_callable($commandEvent)) {
+ $commandEvent($event);
+ }
+ }
+ }
+
+ public function findAndAddHookOptions($command)
+ {
+ if (!$command instanceof \Consolidation\AnnotatedCommand\AnnotatedCommand) {
+ return;
+ }
+ $command->optionsHook();
+ }
+
+ /**
+ * @{@inheritdoc}
+ */
+ public static function getSubscribedEvents()
+ {
+ return [ConsoleEvents::COMMAND => 'callCommandEventHooks'];
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/Hooks/InitializeHookInterface.php b/src/composer/vendor/consolidation/annotated-command/src/Hooks/InitializeHookInterface.php
new file mode 100644
index 00000000..8e70ef11
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/Hooks/InitializeHookInterface.php
@@ -0,0 +1,15 @@
+application = $application;
+ }
+
+ /**
+ * @param ConsoleCommandEvent $event
+ */
+ public function alterCommandOptions(ConsoleCommandEvent $event)
+ {
+ /* @var Command $command */
+ $command = $event->getCommand();
+ $input = $event->getInput();
+ if ($command->getName() == 'help') {
+ // Symfony 3.x prepares $input for us; Symfony 2.x, on the other
+ // hand, passes it in prior to binding with the command definition,
+ // so we have to go to a little extra work. It may be inadvisable
+ // to do these steps for commands other than 'help'.
+ if (!$input->hasArgument('command_name')) {
+ $command->ignoreValidationErrors();
+ $command->mergeApplicationDefinition();
+ $input->bind($command->getDefinition());
+ }
+
+ $nameOfCommandToDescribe = $event->getInput()->getArgument('command_name');
+ $commandToDescribe = $this->application->find($nameOfCommandToDescribe);
+ $this->findAndAddHookOptions($commandToDescribe);
+ } else {
+ $this->findAndAddHookOptions($command);
+ }
+ }
+
+ public function findAndAddHookOptions($command)
+ {
+ if (!$command instanceof AnnotatedCommand) {
+ return;
+ }
+ $command->optionsHook();
+ }
+
+
+ /**
+ * @{@inheritdoc}
+ */
+ public static function getSubscribedEvents()
+ {
+ return [ConsoleEvents::COMMAND => 'alterCommandOptions'];
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/Options/AutomaticOptionsProviderInterface.php b/src/composer/vendor/consolidation/annotated-command/src/Options/AutomaticOptionsProviderInterface.php
new file mode 100644
index 00000000..1349fe79
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/Options/AutomaticOptionsProviderInterface.php
@@ -0,0 +1,21 @@
+defaultWidth = $defaultWidth;
+ }
+
+ public function setApplication(Application $application)
+ {
+ $this->application = $application;
+ }
+
+ public function prepare(CommandData $commandData, FormatterOptions $options)
+ {
+ $width = $this->getTerminalWidth();
+ if (!$width) {
+ $width = $this->defaultWidth;
+ }
+
+ // Enforce minimum and maximum widths
+ $width = min($width, $this->getMaxWidth($commandData));
+ $width = max($width, $this->getMinWidth($commandData));
+
+ $options->setWidth($width);
+ }
+
+ protected function getTerminalWidth()
+ {
+ if (!$this->application) {
+ return 0;
+ }
+
+ $dimensions = $this->application->getTerminalDimensions();
+ if ($dimensions[0] == null) {
+ return 0;
+ }
+
+ return $dimensions[0];
+ }
+
+ protected function getMaxWidth(CommandData $commandData)
+ {
+ return $this->maxWidth;
+ }
+
+ protected function getMinWidth(CommandData $commandData)
+ {
+ return $this->minWidth;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/OutputDataInterface.php b/src/composer/vendor/consolidation/annotated-command/src/OutputDataInterface.php
new file mode 100644
index 00000000..9102764d
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/OutputDataInterface.php
@@ -0,0 +1,13 @@
+reflection = new \ReflectionMethod($classNameOrInstance, $methodName);
+ $this->methodName = $methodName;
+ $this->otherAnnotations = new AnnotationData();
+ // Set up a default name for the command from the method name.
+ // This can be overridden via @command or @name annotations.
+ $this->name = $this->convertName($this->reflection->name);
+ $this->options = new DefaultsWithDescriptions($this->determineOptionsFromParameters(), false);
+ $this->arguments = $this->determineAgumentClassifications();
+ // Remember the name of the last parameter, if it holds the options.
+ // We will use this information to ignore @param annotations for the options.
+ if (!empty($this->options)) {
+ $this->optionParamName = $this->lastParameterName();
+ }
+ }
+
+ /**
+ * Recover the method name provided to the constructor.
+ *
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * Return the primary name for this command.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ $this->parseDocBlock();
+ return $this->name;
+ }
+
+ /**
+ * Set the primary name for this command.
+ *
+ * @param string $name
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+ return $this;
+ }
+
+ public function getReturnType()
+ {
+ $this->parseDocBlock();
+ return $this->returnType;
+ }
+
+ public function setReturnType($returnType)
+ {
+ $this->returnType = $returnType;
+ return $this;
+ }
+
+ /**
+ * Get any annotations included in the docblock comment for the
+ * implementation method of this command that are not already
+ * handled by the primary methods of this class.
+ *
+ * @return AnnotationData
+ */
+ public function getRawAnnotations()
+ {
+ $this->parseDocBlock();
+ return $this->otherAnnotations;
+ }
+
+ /**
+ * Get any annotations included in the docblock comment,
+ * also including default values such as @command. We add
+ * in the default @command annotation late, and only in a
+ * copy of the annotation data because we use the existance
+ * of a @command to indicate that this CommandInfo is
+ * a command, and not a hook or anything else.
+ *
+ * @return AnnotationData
+ */
+ public function getAnnotations()
+ {
+ return new AnnotationData(
+ $this->getRawAnnotations()->getArrayCopy() +
+ [
+ 'command' => $this->getName(),
+ ]
+ );
+ }
+
+ /**
+ * Return a specific named annotation for this command.
+ *
+ * @param string $annotation The name of the annotation.
+ * @return string
+ */
+ public function getAnnotation($annotation)
+ {
+ // hasAnnotation parses the docblock
+ if (!$this->hasAnnotation($annotation)) {
+ return null;
+ }
+ return $this->otherAnnotations[$annotation];
+ }
+
+ /**
+ * Check to see if the specified annotation exists for this command.
+ *
+ * @param string $annotation The name of the annotation.
+ * @return boolean
+ */
+ public function hasAnnotation($annotation)
+ {
+ $this->parseDocBlock();
+ return isset($this->otherAnnotations[$annotation]);
+ }
+
+ /**
+ * Save any tag that we do not explicitly recognize in the
+ * 'otherAnnotations' map.
+ */
+ public function addAnnotation($name, $content)
+ {
+ $this->otherAnnotations[$name] = $content;
+ }
+
+ /**
+ * Remove an annotation that was previoudly set.
+ */
+ public function removeAnnotation($name)
+ {
+ unset($this->otherAnnotations[$name]);
+ }
+
+ /**
+ * Get the synopsis of the command (~first line).
+ *
+ * @return string
+ */
+ public function getDescription()
+ {
+ $this->parseDocBlock();
+ return $this->description;
+ }
+
+ /**
+ * Set the command description.
+ *
+ * @param string $description The description to set.
+ */
+ public function setDescription($description)
+ {
+ $this->description = $description;
+ return $this;
+ }
+
+ /**
+ * Get the help text of the command (the description)
+ */
+ public function getHelp()
+ {
+ $this->parseDocBlock();
+ return $this->help;
+ }
+ /**
+ * Set the help text for this command.
+ *
+ * @param string $help The help text.
+ */
+ public function setHelp($help)
+ {
+ $this->help = $help;
+ return $this;
+ }
+
+ /**
+ * Return the list of aliases for this command.
+ * @return string[]
+ */
+ public function getAliases()
+ {
+ $this->parseDocBlock();
+ return $this->aliases;
+ }
+
+ /**
+ * Set aliases that can be used in place of the command's primary name.
+ *
+ * @param string|string[] $aliases
+ */
+ public function setAliases($aliases)
+ {
+ if (is_string($aliases)) {
+ $aliases = explode(',', static::convertListToCommaSeparated($aliases));
+ }
+ $this->aliases = array_filter($aliases);
+ return $this;
+ }
+
+ /**
+ * Return the examples for this command. This is @usage instead of
+ * @example because the later is defined by the phpdoc standard to
+ * be example method calls.
+ *
+ * @return string[]
+ */
+ public function getExampleUsages()
+ {
+ $this->parseDocBlock();
+ return $this->exampleUsage;
+ }
+
+ /**
+ * Add an example usage for this command.
+ *
+ * @param string $usage An example of the command, including the command
+ * name and all of its example arguments and options.
+ * @param string $description An explanation of what the example does.
+ */
+ public function setExampleUsage($usage, $description)
+ {
+ $this->exampleUsage[$usage] = $description;
+ return $this;
+ }
+
+ /**
+ * Return the list of refleaction parameters.
+ *
+ * @return ReflectionParameter[]
+ */
+ public function getParameters()
+ {
+ return $this->reflection->getParameters();
+ }
+
+ /**
+ * Descriptions of commandline arguements for this command.
+ *
+ * @return DefaultsWithDescriptions
+ */
+ public function arguments()
+ {
+ return $this->arguments;
+ }
+
+ /**
+ * Descriptions of commandline options for this command.
+ *
+ * @return DefaultsWithDescriptions
+ */
+ public function options()
+ {
+ return $this->options;
+ }
+
+ /**
+ * Return the name of the last parameter if it holds the options.
+ */
+ public function optionParamName()
+ {
+ return $this->optionParamName;
+ }
+
+ /**
+ * Get the inputOptions for the options associated with this CommandInfo
+ * object, e.g. via @option annotations, or from
+ * $options = ['someoption' => 'defaultvalue'] in the command method
+ * parameter list.
+ *
+ * @return InputOption[]
+ */
+ public function inputOptions()
+ {
+ $explicitOptions = [];
+
+ $opts = $this->options()->getValues();
+ foreach ($opts as $name => $defaultValue) {
+ $description = $this->options()->getDescription($name);
+
+ $fullName = $name;
+ $shortcut = '';
+ if (strpos($name, '|')) {
+ list($fullName, $shortcut) = explode('|', $name, 2);
+ }
+
+ if (is_bool($defaultValue)) {
+ $explicitOptions[$fullName] = new InputOption($fullName, $shortcut, InputOption::VALUE_NONE, $description);
+ } elseif ($defaultValue === InputOption::VALUE_REQUIRED) {
+ $explicitOptions[$fullName] = new InputOption($fullName, $shortcut, InputOption::VALUE_REQUIRED, $description);
+ } else {
+ $explicitOptions[$fullName] = new InputOption($fullName, $shortcut, InputOption::VALUE_OPTIONAL, $description, $defaultValue);
+ }
+ }
+
+ return $explicitOptions;
+ }
+
+ /**
+ * An option might have a name such as 'silent|s'. In this
+ * instance, we will allow the @option or @default tag to
+ * reference the option only by name (e.g. 'silent' or 's'
+ * instead of 'silent|s').
+ *
+ * @param string $optionName
+ * @return string
+ */
+ public function findMatchingOption($optionName)
+ {
+ // Exit fast if there's an exact match
+ if ($this->options->exists($optionName)) {
+ return $optionName;
+ }
+ $existingOptionName = $this->findExistingOption($optionName);
+ if (isset($existingOptionName)) {
+ return $existingOptionName;
+ }
+ return $this->findOptionAmongAlternatives($optionName);
+ }
+
+ /**
+ * @param string $optionName
+ * @return string
+ */
+ protected function findOptionAmongAlternatives($optionName)
+ {
+ // Check the other direction: if the annotation contains @silent|s
+ // and the options array has 'silent|s'.
+ $checkMatching = explode('|', $optionName);
+ if (count($checkMatching) > 1) {
+ foreach ($checkMatching as $checkName) {
+ if ($this->options->exists($checkName)) {
+ $this->options->rename($checkName, $optionName);
+ return $optionName;
+ }
+ }
+ }
+ return $optionName;
+ }
+
+ /**
+ * @param string $optionName
+ * @return string|null
+ */
+ protected function findExistingOption($optionName)
+ {
+ // Check to see if we can find the option name in an existing option,
+ // e.g. if the options array has 'silent|s' => false, and the annotation
+ // is @silent.
+ foreach ($this->options()->getValues() as $name => $default) {
+ if (in_array($optionName, explode('|', $name))) {
+ return $name;
+ }
+ }
+ }
+
+ /**
+ * Examine the parameters of the method for this command, and
+ * build a list of commandline arguements for them.
+ *
+ * @return array
+ */
+ protected function determineAgumentClassifications()
+ {
+ $result = new DefaultsWithDescriptions();
+ $params = $this->reflection->getParameters();
+ $optionsFromParameters = $this->determineOptionsFromParameters();
+ if (!empty($optionsFromParameters)) {
+ array_pop($params);
+ }
+ foreach ($params as $param) {
+ $this->addParameterToResult($result, $param);
+ }
+ return $result;
+ }
+
+ /**
+ * Examine the provided parameter, and determine whether it
+ * is a parameter that will be filled in with a positional
+ * commandline argument.
+ */
+ protected function addParameterToResult($result, $param)
+ {
+ // Commandline arguments must be strings, so ignore any
+ // parameter that is typehinted to any non-primative class.
+ if ($param->getClass() != null) {
+ return;
+ }
+ $result->add($param->name);
+ if ($param->isDefaultValueAvailable()) {
+ $defaultValue = $param->getDefaultValue();
+ if (!$this->isAssoc($defaultValue)) {
+ $result->setDefaultValue($param->name, $defaultValue);
+ }
+ } elseif ($param->isArray()) {
+ $result->setDefaultValue($param->name, []);
+ }
+ }
+
+ /**
+ * Examine the parameters of the method for this command, and determine
+ * the disposition of the options from them.
+ *
+ * @return array
+ */
+ protected function determineOptionsFromParameters()
+ {
+ $params = $this->reflection->getParameters();
+ if (empty($params)) {
+ return [];
+ }
+ $param = end($params);
+ if (!$param->isDefaultValueAvailable()) {
+ return [];
+ }
+ if (!$this->isAssoc($param->getDefaultValue())) {
+ return [];
+ }
+ return $param->getDefaultValue();
+ }
+
+ protected function lastParameterName()
+ {
+ $params = $this->reflection->getParameters();
+ $param = end($params);
+ if (!$param) {
+ return '';
+ }
+ return $param->name;
+ }
+
+ /**
+ * Helper; determine if an array is associative or not. An array
+ * is not associative if its keys are numeric, and numbered sequentially
+ * from zero. All other arrays are considered to be associative.
+ *
+ * @param arrau $arr The array
+ * @return boolean
+ */
+ protected function isAssoc($arr)
+ {
+ if (!is_array($arr)) {
+ return false;
+ }
+ return array_keys($arr) !== range(0, count($arr) - 1);
+ }
+
+ /**
+ * Convert from a method name to the corresponding command name. A
+ * method 'fooBar' will become 'foo:bar', and 'fooBarBazBoz' will
+ * become 'foo:bar-baz-boz'.
+ *
+ * @param string $camel method name.
+ * @return string
+ */
+ protected function convertName($camel)
+ {
+ $splitter="-";
+ $camel=preg_replace('/(?!^)[[:upper:]][[:lower:]]/', '$0', preg_replace('/(?!^)[[:upper:]]+/', $splitter.'$0', $camel));
+ $camel = preg_replace("/$splitter/", ':', $camel, 1);
+ return strtolower($camel);
+ }
+
+ /**
+ * Parse the docBlock comment for this command, and set the
+ * fields of this class with the data thereby obtained.
+ */
+ protected function parseDocBlock()
+ {
+ if (!$this->docBlockIsParsed) {
+ // The parse function will insert data from the provided method
+ // into this object, using our accessors.
+ CommandDocBlockParserFactory::parse($this, $this->reflection);
+ $this->docBlockIsParsed = true;
+ }
+ }
+
+ /**
+ * Given a list that might be 'a b c' or 'a, b, c' or 'a,b,c',
+ * convert the data into the last of these forms.
+ */
+ protected static function convertListToCommaSeparated($text)
+ {
+ return preg_replace('#[ \t\n\r,]+#', ',', $text);
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/Parser/DefaultsWithDescriptions.php b/src/composer/vendor/consolidation/annotated-command/src/Parser/DefaultsWithDescriptions.php
new file mode 100644
index 00000000..8f9e8173
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/Parser/DefaultsWithDescriptions.php
@@ -0,0 +1,160 @@
+values = $values;
+ $this->hasDefault = [];
+ $this->descriptions = [];
+ $this->defaultDefault = $defaultDefault;
+ }
+
+ /**
+ * Return just the key : default values mapping
+ *
+ * @return array
+ */
+ public function getValues()
+ {
+ return $this->values;
+ }
+
+ /**
+ * Return true if this set of options is empty
+ *
+ * @return
+ */
+ public function isEmpty()
+ {
+ return empty($this->values);
+ }
+
+ /**
+ * Check to see whether the speicifed key exists in the collection.
+ *
+ * @param string $key
+ * @return boolean
+ */
+ public function exists($key)
+ {
+ return array_key_exists($key, $this->values);
+ }
+
+ /**
+ * Get the value of one entry.
+ *
+ * @param string $key The key of the item.
+ * @return string
+ */
+ public function get($key)
+ {
+ if (array_key_exists($key, $this->values)) {
+ return $this->values[$key];
+ }
+ return $this->defaultDefault;
+ }
+
+ /**
+ * Get the description of one entry.
+ *
+ * @param string $key The key of the item.
+ * @return string
+ */
+ public function getDescription($key)
+ {
+ if (array_key_exists($key, $this->descriptions)) {
+ return $this->descriptions[$key];
+ }
+ return '';
+ }
+
+ /**
+ * Add another argument to this command.
+ *
+ * @param string $key Name of the argument.
+ * @param string $description Help text for the argument.
+ * @param mixed $defaultValue The default value for the argument.
+ */
+ public function add($key, $description = '', $defaultValue = null)
+ {
+ if (!$this->exists($key) || isset($defaultValue)) {
+ $this->values[$key] = isset($defaultValue) ? $defaultValue : $this->defaultDefault;
+ }
+ unset($this->descriptions[$key]);
+ if (!empty($description)) {
+ $this->descriptions[$key] = $description;
+ }
+ }
+
+ /**
+ * Change the default value of an entry.
+ *
+ * @param string $key
+ * @param mixed $defaultValue
+ */
+ public function setDefaultValue($key, $defaultValue)
+ {
+ $this->values[$key] = $defaultValue;
+ $this->hasDefault[$key] = true;
+ return $this;
+ }
+
+ /**
+ * Check to see if the named argument definitively has a default value.
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function hasDefault($key)
+ {
+ return array_key_exists($key, $this->hasDefault);
+ }
+
+ /**
+ * Remove an entry
+ *
+ * @param string $key The entry to remove
+ */
+ public function clear($key)
+ {
+ unset($this->values[$key]);
+ unset($this->descriptions[$key]);
+ }
+
+ /**
+ * Rename an existing option to something else.
+ */
+ public function rename($oldName, $newName)
+ {
+ $this->add($newName, $this->getDescription($oldName), $this->get($oldName));
+ $this->clear($oldName);
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/AbstractCommandDocBlockParser.php b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/AbstractCommandDocBlockParser.php
new file mode 100644
index 00000000..0534a994
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/AbstractCommandDocBlockParser.php
@@ -0,0 +1,252 @@
+ 'processCommandTag',
+ 'name' => 'processCommandTag',
+ 'arg' => 'processArgumentTag',
+ 'param' => 'processParamTag',
+ 'return' => 'processReturnTag',
+ 'option' => 'processOptionTag',
+ 'default' => 'processDefaultTag',
+ 'aliases' => 'processAliases',
+ 'usage' => 'processUsageTag',
+ 'description' => 'processAlternateDescriptionTag',
+ 'desc' => 'processAlternateDescriptionTag',
+ ];
+
+ public function __construct(CommandInfo $commandInfo, \ReflectionMethod $reflection)
+ {
+ $this->commandInfo = $commandInfo;
+ $this->reflection = $reflection;
+ }
+
+ protected function processAllTags($phpdoc)
+ {
+ // Iterate over all of the tags, and process them as necessary.
+ foreach ($phpdoc->getTags() as $tag) {
+ $processFn = [$this, 'processGenericTag'];
+ if (array_key_exists($tag->getName(), $this->tagProcessors)) {
+ $processFn = [$this, $this->tagProcessors[$tag->getName()]];
+ }
+ $processFn($tag);
+ }
+ }
+
+ abstract protected function getTagContents($tag);
+
+ /**
+ * Parse the docBlock comment for this command, and set the
+ * fields of this class with the data thereby obtained.
+ */
+ abstract public function parse();
+
+ /**
+ * Save any tag that we do not explicitly recognize in the
+ * 'otherAnnotations' map.
+ */
+ protected function processGenericTag($tag)
+ {
+ $this->commandInfo->addAnnotation($tag->getName(), $this->getTagContents($tag));
+ }
+
+ /**
+ * Set the name of the command from a @command or @name annotation.
+ */
+ protected function processCommandTag($tag)
+ {
+ $commandName = $this->getTagContents($tag);
+ $this->commandInfo->setName($commandName);
+ // We also store the name in the 'other annotations' so that is is
+ // possible to determine if the method had a @command annotation.
+ $this->commandInfo->addAnnotation($tag->getName(), $commandName);
+ }
+
+ /**
+ * The @description and @desc annotations may be used in
+ * place of the synopsis (which we call 'description').
+ * This is discouraged.
+ *
+ * @deprecated
+ */
+ protected function processAlternateDescriptionTag($tag)
+ {
+ $this->commandInfo->setDescription($this->getTagContents($tag));
+ }
+
+ /**
+ * Store the data from a @arg annotation in our argument descriptions.
+ */
+ protected function processArgumentTag($tag)
+ {
+ if (!$this->pregMatchNameAndDescription((string)$tag->getDescription(), $match)) {
+ return;
+ }
+ $this->addOptionOrArgumentTag($tag, $this->commandInfo->arguments(), $match);
+ }
+
+ /**
+ * Store the data from an @option annotation in our option descriptions.
+ */
+ protected function processOptionTag($tag)
+ {
+ if (!$this->pregMatchOptionNameAndDescription((string)$tag->getDescription(), $match)) {
+ return;
+ }
+ $this->addOptionOrArgumentTag($tag, $this->commandInfo->options(), $match);
+ }
+
+ protected function addOptionOrArgumentTag($tag, DefaultsWithDescriptions $set, $nameAndDescription)
+ {
+ $variableName = $this->commandInfo->findMatchingOption($nameAndDescription['name']);
+ $desc = $nameAndDescription['description'];
+ $description = static::removeLineBreaks($desc);
+ $set->add($variableName, $description);
+ }
+
+ /**
+ * Store the data from a @default annotation in our argument or option store,
+ * as appropriate.
+ */
+ protected function processDefaultTag($tag)
+ {
+ if (!$this->pregMatchNameAndDescription((string)$tag->getDescription(), $match)) {
+ return;
+ }
+ $variableName = $match['name'];
+ $defaultValue = $this->interpretDefaultValue($match['description']);
+ if ($this->commandInfo->arguments()->exists($variableName)) {
+ $this->commandInfo->arguments()->setDefaultValue($variableName, $defaultValue);
+ return;
+ }
+ $variableName = $this->commandInfo->findMatchingOption($variableName);
+ if ($this->commandInfo->options()->exists($variableName)) {
+ $this->commandInfo->options()->setDefaultValue($variableName, $defaultValue);
+ }
+ }
+
+ /**
+ * Store the data from a @usage annotation in our example usage list.
+ */
+ protected function processUsageTag($tag)
+ {
+ $lines = explode("\n", $this->getTagContents($tag));
+ $usage = array_shift($lines);
+ $description = static::removeLineBreaks(implode("\n", $lines));
+
+ $this->commandInfo->setExampleUsage($usage, $description);
+ }
+
+ /**
+ * Process the comma-separated list of aliases
+ */
+ protected function processAliases($tag)
+ {
+ $this->commandInfo->setAliases((string)$tag->getDescription());
+ }
+
+ /**
+ * Store the data from a @param annotation in our argument descriptions.
+ */
+ protected function processParamTag($tag)
+ {
+ $variableName = $tag->getVariableName();
+ $variableName = str_replace('$', '', $variableName);
+ $description = static::removeLineBreaks((string)$tag->getDescription());
+ if ($variableName == $this->commandInfo->optionParamName()) {
+ return;
+ }
+ $this->commandInfo->arguments()->add($variableName, $description);
+ }
+
+ /**
+ * Store the data from a @return annotation in our argument descriptions.
+ */
+ abstract protected function processReturnTag($tag);
+
+ protected function interpretDefaultValue($defaultValue)
+ {
+ $defaults = [
+ 'null' => null,
+ 'true' => true,
+ 'false' => false,
+ "''" => '',
+ '[]' => [],
+ ];
+ foreach ($defaults as $defaultName => $defaultTypedValue) {
+ if ($defaultValue == $defaultName) {
+ return $defaultTypedValue;
+ }
+ }
+ return $defaultValue;
+ }
+
+ /**
+ * Given a docblock description in the form "$variable description",
+ * return the variable name and description via the 'match' parameter.
+ */
+ protected function pregMatchNameAndDescription($source, &$match)
+ {
+ $nameRegEx = '\\$(?P[^ \t]+)[ \t]+';
+ $descriptionRegEx = '(?P.*)';
+ $optionRegEx = "/{$nameRegEx}{$descriptionRegEx}/s";
+
+ return preg_match($optionRegEx, $source, $match);
+ }
+
+ /**
+ * Given a docblock description in the form "$variable description",
+ * return the variable name and description via the 'match' parameter.
+ */
+ protected function pregMatchOptionNameAndDescription($source, &$match)
+ {
+ // Strip type and $ from the text before the @option name, if present.
+ $source = preg_replace('/^[a-zA-Z]* ?\\$/', '', $source);
+ $nameRegEx = '(?P[^ \t]+)[ \t]+';
+ $descriptionRegEx = '(?P.*)';
+ $optionRegEx = "/{$nameRegEx}{$descriptionRegEx}/s";
+
+ return preg_match($optionRegEx, $source, $match);
+ }
+
+ /**
+ * Given a list that might be 'a b c' or 'a, b, c' or 'a,b,c',
+ * convert the data into the last of these forms.
+ */
+ protected static function convertListToCommaSeparated($text)
+ {
+ return preg_replace('#[ \t\n\r,]+#', ',', $text);
+ }
+
+ /**
+ * Take a multiline description and convert it into a single
+ * long unbroken line.
+ */
+ protected static function removeLineBreaks($text)
+ {
+ return trim(preg_replace('#[ \t\n\r]+#', ' ', $text));
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParser2.php b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParser2.php
new file mode 100644
index 00000000..22ecad2b
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParser2.php
@@ -0,0 +1,70 @@
+reflection->getDocComment();
+ $phpdoc = new DocBlock($docblockComment);
+
+ // First set the description (synopsis) and help.
+ $this->commandInfo->setDescription((string)$phpdoc->getShortDescription());
+ $this->commandInfo->setHelp((string)$phpdoc->getLongDescription());
+
+ $this->processAllTags($phpdoc);
+ }
+
+ protected function getTagContents($tag)
+ {
+ return $tag->getContent();
+ }
+
+ /**
+ * Store the data from a @arg annotation in our argument descriptions.
+ */
+ protected function processArgumentTag($tag)
+ {
+ if (!$this->pregMatchNameAndDescription((string)$tag->getDescription(), $match)) {
+ return;
+ }
+ $this->addOptionOrArgumentTag($tag, $this->commandInfo->arguments(), $match);
+ }
+
+ /**
+ * Store the data from a @param annotation in our argument descriptions.
+ */
+ protected function processParamTag($tag)
+ {
+ if (!$tag instanceof ParamTag) {
+ return;
+ }
+ return parent::processParamTag($tag);
+ }
+
+ /**
+ * Store the data from a @return annotation in our argument descriptions.
+ */
+ protected function processReturnTag($tag)
+ {
+ if (!$tag instanceof ReturnTag) {
+ return;
+ }
+ $this->commandInfo->setReturnType($tag->getType());
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParser3.php b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParser3.php
new file mode 100644
index 00000000..ed0eb580
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParser3.php
@@ -0,0 +1,74 @@
+reflection->getDocComment();
+ if (empty($docComment)) {
+ return;
+ }
+ $phpdoc = $this->createDocBlock();
+
+ // First set the description (synopsis) and help.
+ $this->commandInfo->setDescription((string)$phpdoc->getSummary());
+ $this->commandInfo->setHelp((string)$phpdoc->getDescription());
+
+ $this->processAllTags($phpdoc);
+ }
+
+ public function createDocBlock()
+ {
+ $docBlockFactory = \phpDocumentor\Reflection\DocBlockFactory::createInstance();
+ $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
+
+ return $docBlockFactory->create(
+ $this->reflection,
+ $contextFactory->createFromReflector($this->reflection)
+ );
+ }
+
+ protected function getTagContents($tag)
+ {
+ return (string)$tag;
+ }
+
+ /**
+ * Store the data from a @param annotation in our argument descriptions.
+ */
+ protected function processParamTag($tag)
+ {
+ if (!$tag instanceof Param) {
+ return;
+ }
+ return parent::processParamTag($tag);
+ }
+
+ /**
+ * Store the data from a @return annotation in our argument descriptions.
+ */
+ protected function processReturnTag($tag)
+ {
+ if (!$tag instanceof Return_) {
+ return;
+ }
+ // If there is a spurrious trailing space on the return type, remove it.
+ $this->commandInfo->setReturnType(trim($this->getTagContents($tag)));
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParserFactory.php b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParserFactory.php
new file mode 100644
index 00000000..fe1bdecd
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/src/Parser/Internal/CommandDocBlockParserFactory.php
@@ -0,0 +1,28 @@
+parse();
+ }
+
+ private static function create(CommandInfo $commandInfo, \ReflectionMethod $reflection)
+ {
+ if (static::hasReflectionDocBlock3()) {
+ return new CommandDocBlockParser3($commandInfo, $reflection);
+ }
+ return new CommandDocBlockParser2($commandInfo, $reflection);
+ }
+
+ private static function hasReflectionDocBlock3()
+ {
+ return class_exists('phpDocumentor\Reflection\DocBlockFactory') && class_exists('phpDocumentor\Reflection\Types\ContextFactory');
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/src/ApplicationWithTerminalWidth.php b/src/composer/vendor/consolidation/annotated-command/tests/src/ApplicationWithTerminalWidth.php
new file mode 100644
index 00000000..1efaf6d8
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/src/ApplicationWithTerminalWidth.php
@@ -0,0 +1,26 @@
+width = $width;
+ $this->height = $height;
+ }
+
+ public function getTerminalDimensions()
+ {
+ return [ $this->width, $this->height ];
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleAnnotatedCommand.php b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleAnnotatedCommand.php
new file mode 100644
index 00000000..e114f8be
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleAnnotatedCommand.php
@@ -0,0 +1,60 @@
+getArgument('one');
+ $two = $input->getArgument('two');
+ $flip = $input->getOption('flip');
+
+ $result = $this->myCat($one, $two, $flip);
+
+ // We could also just use $output->writeln($result) here,
+ // but calling processResults enables the use of output
+ // formatters. Note also that if you use processResults, you
+ // should correctly inject the command processor into your
+ // annotated command via AnnotatedCommand::setCommandProcessor().
+ return $this->processResults($input, $output, $result);
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleCommandFile.php b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleCommandFile.php
new file mode 100644
index 00000000..3c6d8a0d
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleCommandFile.php
@@ -0,0 +1,351 @@
+state = $state;
+ }
+
+ public function setOutput($output)
+ {
+ $this->output = $output;
+ }
+
+ /**
+ * This is the my:cat command
+ *
+ * This command will concatenate two parameters. If the --flip flag
+ * is provided, then the result is the concatenation of two and one.
+ *
+ * @param string $one The first parameter.
+ * @param string $two The other parameter.
+ * @option boolean $flip Whether or not the second parameter should come first in the result.
+ * @aliases c
+ * @usage bet alpha --flip
+ * Concatenate "alpha" and "bet".
+ * @arbitrary This annotation is here merely as a marker used in testing.
+ */
+ public function myCat($one, $two = '', $options = ['flip' => false])
+ {
+ if ($options['flip']) {
+ return "{$two}{$one}";
+ }
+ return "{$one}{$two}";
+ }
+
+ /**
+ * @command my:repeat
+ */
+ public function myRepeat($one, $two = '', $options = ['repeat' => 1])
+ {
+ return str_repeat("{$one}{$two}", $options['repeat']);
+ }
+
+ /**
+ * @command my:join
+ */
+ public function myJoin(array $args, $options = ['flip' => false, 'repeat' => 1])
+ {
+ if ($options['flip']) {
+ $args = array_reverse($args);
+ }
+ $result = implode('', $args);
+ return str_repeat($result, $options['repeat']);
+ }
+
+ /**
+ * This is a command with no options
+ *
+ * This command will concatenate two parameters.
+ *
+ * @param $one The first parameter.
+ * @param $two The other parameter.
+ * @aliases nope
+ * @usage alpha bet
+ * Concatenate "alpha" and "bet".
+ */
+ public function commandWithNoOptions($one, $two = 'default')
+ {
+ return "{$one}{$two}";
+ }
+
+ /**
+ * This command has no arguments--only options
+ *
+ * Return a result only if not silent.
+ *
+ * @option silent Supress output.
+ */
+ public function commandWithNoArguments($opts = ['silent|s' => false])
+ {
+ if (!$opts['silent']) {
+ return "Hello, world";
+ }
+ }
+
+ /**
+ * Shortcut on annotation
+ *
+ * This command defines the option shortcut on the annotation instead of in the options array.
+ *
+ * @param $opts The options
+ * @option silent|s Supress output.
+ */
+ public function shortcutOnAnnotation($opts = ['silent' => false])
+ {
+ if (!$opts['silent']) {
+ return "Hello, world";
+ }
+ }
+
+ /**
+ * This is the test:arithmatic command
+ *
+ * This command will add one and two. If the --negate flag
+ * is provided, then the result is negated.
+ *
+ * @command test:arithmatic
+ * @param integer $one The first number to add.
+ * @param integer $two The other number to add.
+ * @option negate Whether or not the result should be negated.
+ * @aliases arithmatic
+ * @usage 2 2 --negate
+ * Add two plus two and then negate.
+ * @custom
+ */
+ public function testArithmatic($one, $two, $options = ['negate' => false])
+ {
+ $result = $one + $two;
+ if ($options['negate']) {
+ $result = -$result;
+ }
+
+ // Integer return codes are exit codes (errors), so
+ // return a the result as a string so that it will be printed.
+ return "$result";
+ }
+
+ /**
+ * This is the test:state command
+ *
+ * This command tests to see if the state of the Commandfile instance
+ */
+ public function testState()
+ {
+ return $this->state;
+ }
+
+ /**
+ * This is the test:passthrough command
+ *
+ * This command takes a variable number of parameters as
+ * an array and returns them as a csv.
+ */
+ public function testPassthrough(array $params)
+ {
+ return implode(',', $params);
+ }
+
+ /**
+ * This command wraps its parameter in []; its alter hook
+ * then wraps the result in <>.
+ */
+ public function testHook($parameter)
+ {
+ return "[$parameter]";
+ }
+
+ /**
+ * Wrap the results of test:hook in <>.
+ *
+ * @hook alter test:hook
+ */
+ public function hookTestHook($result)
+ {
+ return "<$result>";
+ }
+
+ /**
+ * This test is very similar to the preceding test, except
+ * it uses an annotation hook instead of a named-function hook.
+ *
+ * @hookme
+ * @before >
+ * @after <
+ */
+ public function testAnnotationHook($parameter)
+ {
+ return "($parameter)";
+ }
+
+ /**
+ * Wrap the results of test:hook in whatever the @before and @after
+ * annotations contain.
+ *
+ * @hook alter @hookme
+ */
+ public function hookTestAnnotatedHook($result, CommandData $commandData)
+ {
+ $before = $commandData->annotationData()->get('before', '-');
+ $after = $commandData->annotationData()->get('after', '-');
+ return "$before$result$after";
+ }
+
+ /**
+ * Alter the results of the hook with its command name.
+ *
+ * @hook alter @addmycommandname
+ */
+ public function hookAddCommandName($result, CommandData $commandData)
+ {
+ $annotationData = $commandData->annotationData();
+ return "$result from " . $annotationData['command'];
+ }
+
+ /**
+ * Here is a hook with an explicit command annotation that we will alter
+ * with the preceeding hook
+ *
+ * @command alter-me
+ * @addmycommandname
+ */
+ public function alterMe()
+ {
+ return "splendiferous";
+ }
+
+ /**
+ * Here is another hook that has no command annotation that should be
+ * altered with the default value for the command name
+ *
+ * @addmycommandname
+ */
+ public function alterMeToo()
+ {
+ return "fantabulous";
+ }
+
+ /**
+ * @hook pre-command test:post-command
+ */
+ public function hookTestPreCommandHook(CommandData $commandData)
+ {
+ // Use 'writeln' to detect order that hooks are called
+ $this->output->writeln("foo");
+ }
+
+ /**
+ * @command test:post-command
+ */
+ public function testPostCommand($value)
+ {
+ $this->output->writeln($value);
+ }
+
+ /**
+ * @hook post-command test:post-command
+ */
+ public function hookTestPostCommandHook($result, CommandData $commandData)
+ {
+ // Use 'writeln' to detect order that hooks are called
+ $this->output->writeln("baz");
+ }
+
+ public function testHello($who)
+ {
+ return "Hello, $who.";
+ }
+
+ public function testException($what)
+ {
+ throw new \Exception($what);
+ }
+
+ /**
+ * @hook init test:hello
+ */
+ public function initializeTestHello($input, AnnotationData $annotationData)
+ {
+ $who = $input->getArgument('who');
+ if (!$who) {
+ $input->setArgument('who', 'Huey');
+ }
+ }
+
+ /**
+ * @hook command-event test:hello
+ */
+ public function commandEventTestHello(ConsoleCommandEvent $event)
+ {
+ // Note that Symfony Console will not allow us to alter the
+ // input from this hook, so we'll just print something to
+ // show that this hook was executed.
+ $input = $event->getInput();
+ $who = $input->getArgument('who');
+ $this->output->writeln("Here comes $who!");
+ }
+
+ /**
+ * @hook interact test:hello
+ */
+ public function interactTestHello($input, $output)
+ {
+ $who = $input->getArgument('who');
+ if (!$who) {
+ $input->setArgument('who', 'Goofey');
+ }
+ }
+
+ /**
+ * @hook validate test:hello
+ */
+ public function validateTestHello($commandData)
+ {
+ $args = $commandData->arguments();
+ if ($args['who'] == 'Donald Duck') {
+ return new CommandError("I won't say hello to Donald Duck.");
+ }
+ if ($args['who'] == 'Drumph') {
+ throw new \Exception('Irrational value error.');
+ }
+ }
+
+ /**
+ * Test default values in arguments
+ *
+ * @param string|null $one
+ * @param string|null $two
+ * @return string
+ */
+ public function defaults($one = null, $two = null)
+ {
+ if ($one && $two) {
+ return "$one and $two";
+ }
+ if ($one) {
+ return "only $one";
+ }
+ return "nothing provided";
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleCommandInfoAlterer.php b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleCommandInfoAlterer.php
new file mode 100644
index 00000000..824122d3
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleCommandInfoAlterer.php
@@ -0,0 +1,15 @@
+hasAnnotation('arbitrary')) {
+ $commandInfo->addAnnotation('dynamic', "This annotation was dynamically added by ExampleCommandInfoAlterer");
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleHookAllCommandFile.php b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleHookAllCommandFile.php
new file mode 100644
index 00000000..12319aa4
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/src/ExampleHookAllCommandFile.php
@@ -0,0 +1,41 @@
+ false])
+ {
+ if ($options['flip']) {
+ return "{$two}{$one}";
+ }
+ return "{$one}{$two}";
+ }
+
+ public function doRepeat($one, $two = '', $options = ['repeat' => 1])
+ {
+ return str_repeat("{$one}{$two}", $options['repeat']);
+ }
+
+ /**
+ * This hook function does not specify which command or annotation
+ * it is hooking; that makes it apply to every command in the same class.
+ *
+ * @hook alter
+ */
+ public function alterAllCommands($result)
+ {
+ if (is_string($result)) {
+ $result = "*** $result ***";
+ }
+ return $result;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/src/alpha/AlphaCommandFile.php b/src/composer/vendor/consolidation/annotated-command/tests/src/alpha/AlphaCommandFile.php
new file mode 100644
index 00000000..a58817ba
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/src/alpha/AlphaCommandFile.php
@@ -0,0 +1,243 @@
+ 42];
+ }
+
+ /**
+ * @command example:output
+ */
+ public function exampleOutput()
+ {
+ return 'Hello, World.';
+ }
+
+ /**
+ * @command example:cat
+ */
+ public function exampleCat($one, $two = '', $options = ['flip' => false])
+ {
+ if ($options['flip']) {
+ return "{$two}{$one}";
+ }
+ return "{$one}{$two}";
+ }
+
+ /**
+ * @command example:echo
+ */
+ public function exampleEcho(array $args)
+ {
+ return ['item-list' => $args];
+ }
+
+ /**
+ * @command example:message
+ */
+ public function exampleMessage()
+ {
+ return ['message' => 'Shipwrecked; send bananas.'];
+ }
+
+ /**
+ * Test command with formatters
+ *
+ * @command example:table
+ * @field-labels
+ * first: I
+ * second: II
+ * third: III
+ * @usage example:table --format=yaml
+ * @usage example:table --format=csv
+ * @usage example:table --fields=first,third
+ * @usage example:table --fields=III,II
+ * @return \Consolidation\OutputFormatters\StructuredData\RowsOfFields
+ */
+ public function exampleTable($options = ['format' => 'table', 'fields' => ''])
+ {
+ $outputData = [
+ [ 'first' => 'One', 'second' => 'Two', 'third' => 'Three' ],
+ [ 'first' => 'Eins', 'second' => 'Zwei', 'third' => 'Drei' ],
+ [ 'first' => 'Ichi', 'second' => 'Ni', 'third' => 'San' ],
+ [ 'first' => 'Uno', 'second' => 'Dos', 'third' => 'Tres' ],
+ ];
+ return new RowsOfFields($outputData);
+ }
+
+ /**
+ * Test word wrapping
+ *
+ * @command example:wrap
+ * @field-labels
+ * first: First
+ * second: Second
+ *
+ * @return \Consolidation\OutputFormatters\StructuredData\RowsOfFields
+ */
+ public function exampleWrap()
+ {
+ $data = [
+ [
+ 'first' => 'This is a really long cell that contains a lot of data. When it is rendered, it should be wrapped across multiple lines.',
+ 'second' => 'This is the second column of the same table. It is also very long, and should be wrapped across multiple lines, just like the first column.',
+ ]
+ ];
+ return new RowsOfFields($data);
+ }
+
+ /**
+ * @hook option example:table
+ */
+ public function additionalOptionForExampleTable($command, $annotationData)
+ {
+ $command->addOption(
+ 'dynamic',
+ '',
+ InputOption::VALUE_NONE,
+ 'Option added by @hook option example:table'
+ );
+ }
+
+ /**
+ * Demonstrate an alter hook with an option
+ *
+ * @hook alter example:table
+ * @option french Add a row with French numbers.
+ * @usage example:table --french
+ */
+ public function alterFormatters($result, CommandData $commandData)
+ {
+ if ($commandData->input()->getOption('french')) {
+ $result[] = [ 'first' => 'Un', 'second' => 'Deux', 'third' => 'Trois' ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Test command with formatters using an associative list
+ *
+ * @command example:list
+ * @field-labels
+ * sftp_command: SFTP Command
+ * sftp_username: SFTP Username
+ * sftp_host: SFTP Host
+ * sftp_password: SFTP Password
+ * sftp_url: SFTP URL
+ * git_command: Git Command
+ * git_username: Git Username
+ * git_host: Git Host
+ * git_port: Git Port
+ * git_url: Git URL
+ * mysql_command: MySQL Command
+ * mysql_username: MySQL Username
+ * mysql_host: MySQL Host
+ * mysql_password: MySQL Password
+ * mysql_url: MySQL URL
+ * mysql_port: MySQL Port
+ * mysql_database: MySQL Database
+ * redis_command: Redis Command
+ * redis_port: Redis Port
+ * redis_url: Redis URL
+ * redis_password: Redis Password
+ * @default-fields *_command
+ * @return \Consolidation\OutputFormatters\StructuredData\AssociativeList
+ */
+ public function exampleAssociativeList()
+ {
+ $outputData = [
+ 'sftp_command' => 'sftp -o Port=2222 dev@appserver.dev.drush.in',
+ 'sftp_username' => 'dev',
+ 'sftp_host' => 'appserver.dev.drush.in',
+ 'sftp_password' => 'Use your account password',
+ 'sftp_url' => 'sftp://dev@appserver.dev.drush.in:2222',
+ 'git_command' => 'git clone ssh://codeserver.dev@codeserver.dev.drush.in:2222/~/repository.git wp-update',
+ 'git_username' => 'codeserver.dev',
+ 'git_host' => 'codeserver.dev.drush.in',
+ 'git_port' => 2222,
+ 'git_url' => 'ssh://codeserver.dev@codeserver.dev.drush.in:2222/~/repository.git',
+ 'mysql_command' => 'mysql -u pantheon -p4b33cb -h dbserver.dev.drush.in -P 16191 pantheon',
+ 'mysql_username' => 'pantheon',
+ 'mysql_host' => 'dbserver.dev.drush.in',
+ 'mysql_password' => '4b33cb',
+ 'mysql_url' => 'mysql://pantheon:4b33cb@dbserver.dev.drush.in:16191/pantheon',
+ 'mysql_port' => 16191,
+ 'mysql_database' => 'pantheon',
+ ];
+ return new AssociativeList($outputData);
+ }
+
+ /**
+ * This command has no annotations; this means that it will not be
+ * found when createCommandsFromClass() is called with
+ * '$includeAllPublicMethods' set to false.
+ */
+ public function withoutAnnotations()
+ {
+ return 'ok';
+ }
+
+ /**
+ * @command command:with-one-optional-argument
+ *
+ * This command has just one optional argument.
+ *
+ * Return a result only if not silent.
+ *
+ * @option silent Supress output.
+ */
+ public function commandWithOneOptionalArgument($who = 'world', $opts = ['silent|s' => false])
+ {
+ if (!$opts['silent']) {
+ return "Hello, $who";
+ }
+ }
+
+ /**
+ * This should be a command, because it is annotated like one.
+ *
+ * @command get:serious
+ */
+ public function getSerious()
+ {
+ return 'very serious';
+ }
+
+ /**
+ * This should not be a command, because it looks like an accessor and
+ * has no @command annotation.
+ */
+ public function getLost()
+ {
+ return 'very lost';
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/src/alpha/Exclude/ExcludedCommandFile.php b/src/composer/vendor/consolidation/annotated-command/tests/src/alpha/Exclude/ExcludedCommandFile.php
new file mode 100644
index 00000000..d4f50b6e
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/src/alpha/Exclude/ExcludedCommandFile.php
@@ -0,0 +1,14 @@
+input()->getOption('chinese')) {
+ $result[] = [ 'first' => '壹', 'second' => '貳', 'third' => '叁' ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Demonstrate an alter hook with an option
+ *
+ * @hook alter *
+ * @option kanji Add a row with Kanji numbers.
+ * @usage example:table --kanji
+ */
+ public function alterFormattersKanji($result, CommandData $commandData)
+ {
+ if ($commandData->input()->getOption('kanji')) {
+ $result[] = [ 'first' => '一', 'second' => '二', 'third' => '三' ];
+ }
+
+ return $result;
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/testAnnotatedCommand.php b/src/composer/vendor/consolidation/annotated-command/tests/testAnnotatedCommand.php
new file mode 100644
index 00000000..098be138
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/testAnnotatedCommand.php
@@ -0,0 +1,45 @@
+assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('my:cat', $command->getName());
+ $this->assertEquals('This is the my:cat command implemented as an AnnotatedCommand subclass.', $command->getDescription());
+ $this->assertEquals("This command will concatenate two parameters. If the --flip flag\nis provided, then the result is the concatenation of two and one.", $command->getHelp());
+ $this->assertEquals('c', implode(',', $command->getAliases()));
+ // Symfony Console composes the synopsis; perhaps we should not test it. Remove if this gives false failures.
+ $this->assertEquals('my:cat [--flip] [--] []', $command->getSynopsis());
+ $this->assertEquals('my:cat bet alpha --flip', implode(',', $command->getUsages()));
+
+ $input = new StringInput('my:cat bet alpha --flip');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'alphabet');
+ }
+
+ // TODO: Make a base test class to hold this.
+ function assertRunCommandViaApplicationEquals($command, $input, $expectedOutput, $expectedStatusCode = 0)
+ {
+ $output = new BufferedOutput();
+
+ $application = new Application('TestApplication', '0.0.0');
+ $application->setAutoExit(false);
+ $application->add($command);
+
+ $statusCode = $application->run($input, $output);
+ $commandOutput = trim($output->fetch());
+
+ $this->assertEquals($expectedOutput, $commandOutput);
+ $this->assertEquals($expectedStatusCode, $statusCode);
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/testAnnotatedCommandFactory.php b/src/composer/vendor/consolidation/annotated-command/tests/testAnnotatedCommandFactory.php
new file mode 100644
index 00000000..1a0755d7
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/testAnnotatedCommandFactory.php
@@ -0,0 +1,639 @@
+commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testArithmatic');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:arithmatic', $command->getName());
+ $this->assertEquals('This is the test:arithmatic command', $command->getDescription());
+ $this->assertEquals("This command will add one and two. If the --negate flag\nis provided, then the result is negated.", $command->getHelp());
+ $this->assertEquals('arithmatic', implode(',', $command->getAliases()));
+ $this->assertEquals('test:arithmatic [--negate] [--] ', $command->getSynopsis());
+ $this->assertEquals('test:arithmatic 2 2 --negate', implode(',', $command->getUsages()));
+
+ $input = new StringInput('arithmatic 2 3 --negate');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '-5');
+ }
+
+ /**
+ * Test CommandInfo command annotation altering.
+ */
+ function testAnnotatedCommandInfoAlteration()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'myCat');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $annotationData = $command->getAnnotationData();
+ $this->assertTrue($annotationData->has('arbitrary'));
+ $this->assertFalse($annotationData->has('dynamic'));
+
+ $this->commandFactory->addCommandInfoAlterer(new ExampleCommandInfoAlterer());
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $annotationData = $command->getAnnotationData();
+ $this->assertTrue($annotationData->has('arbitrary'));
+ $this->assertTrue($annotationData->has('dynamic'));
+ }
+
+ function testMyCatCommand()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'myCat');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('my:cat', $command->getName());
+ $this->assertEquals('This is the my:cat command', $command->getDescription());
+ $this->assertEquals("This command will concatenate two parameters. If the --flip flag\nis provided, then the result is the concatenation of two and one.", $command->getHelp());
+ $this->assertEquals('c', implode(',', $command->getAliases()));
+ $this->assertEquals('my:cat [--flip] [--] []', $command->getSynopsis());
+ $this->assertEquals('my:cat bet alpha --flip', implode(',', $command->getUsages()));
+
+ $input = new StringInput('my:cat bet alpha --flip');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'alphabet');
+ }
+
+ function testDefaultsCommand()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'defaults');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('defaults', $command->getName());
+ $this->assertEquals('Test default values in arguments', $command->getDescription());
+
+ $input = new StringInput('defaults');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'nothing provided');
+
+ $input = new StringInput('defaults ichi');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'only ichi');
+
+ $input = new StringInput('defaults I II');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'I and II');
+ }
+
+ function testCommandWithNoOptions()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'commandWithNoOptions');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('command:with-no-options', $command->getName());
+ $this->assertEquals('This is a command with no options', $command->getDescription());
+ $this->assertEquals("This command will concatenate two parameters.", $command->getHelp());
+ $this->assertEquals('nope', implode(',', $command->getAliases()));
+ $this->assertEquals('command:with-no-options []', $command->getSynopsis());
+ $this->assertEquals('command:with-no-options alpha bet', implode(',', $command->getUsages()));
+
+ $input = new StringInput('command:with-no-options something');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'somethingdefault');
+ }
+
+ function testCommandWithNoArguments()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'commandWithNoArguments');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('command:with-no-arguments', $command->getName());
+ $this->assertEquals('This command has no arguments--only options', $command->getDescription());
+ $this->assertEquals("Return a result only if not silent.", $command->getHelp());
+ $this->assertEquals('command:with-no-arguments [-s|--silent]', $command->getSynopsis());
+
+ $input = new StringInput('command:with-no-arguments');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'Hello, world');
+ $input = new StringInput('command:with-no-arguments -s');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '');
+ $input = new StringInput('command:with-no-arguments --silent');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '');
+ }
+
+ function testCommandWithShortcutOnAnnotation()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'shortcutOnAnnotation');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('shortcut:on-annotation', $command->getName());
+ $this->assertEquals('Shortcut on annotation', $command->getDescription());
+ $this->assertEquals("This command defines the option shortcut on the annotation instead of in the options array.", $command->getHelp());
+ $this->assertEquals('shortcut:on-annotation [-s|--silent]', $command->getSynopsis());
+
+ $input = new StringInput('shortcut:on-annotation');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'Hello, world');
+ $input = new StringInput('shortcut:on-annotation -s');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '');
+ $input = new StringInput('shortcut:on-annotation --silent');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '');
+ }
+
+ function testState()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile('secret secret');
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testState');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:state', $command->getName());
+
+ $input = new StringInput('test:state');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'secret secret');
+ }
+
+ function testPassthroughArray()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testPassthrough');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:passthrough', $command->getName());
+
+ $input = new StringInput('test:passthrough a b c -- x y z');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'a,b,c,x,y,z');
+ }
+
+ function testPassThroughNonArray()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'myJoin');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $input = new StringInput('my:join bet --flip -- x y z');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'zyxbet');
+ // Can't look at 'hasOption' until after the command initializes the
+ // option, because Symfony.
+ $this->assertTrue($input->hasOption('flip'));
+ }
+
+ function testPassThroughWithInputManipulation()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile;
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'myJoin');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $input = new StringInput('my:join bet --repeat=2 -- x y z');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'betxyzbetxyz');
+ // Symfony does not allow us to manipulate the options via setOption until
+ // the definition from the command object has been set up.
+ $input->setOption('repeat', 3);
+ $this->assertEquals(3, $input->getOption('repeat'));
+ $input->setArgument(0, 'q');
+ // Manipulating $input does not work -- the changes are not effective.
+ // The end result here should be 'qx y yqx y yqx y y'
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'betxyzbetxyz');
+ }
+
+ function testHookedCommand()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'hookTestHook');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals('alter test:hook', $hookInfo->getAnnotation('hook'));
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('test:hook', [HookManager::ALTER_RESULT]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('hookTestHook', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testHook');
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:hook', $command->getName());
+
+ $input = new StringInput('test:hook bar');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '<[bar]>');
+ }
+
+ function testPostCommandCalledAfterCommand()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'hookTestPostCommandHook');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals('post-command test:post-command', $hookInfo->getAnnotation('hook'));
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('test:post-command', [HookManager::POST_COMMAND_HOOK]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('hookTestPostCommandHook', $hookCallback[0][1]);
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'hookTestPreCommandHook');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals('pre-command test:post-command', $hookInfo->getAnnotation('hook'));
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('test:post-command', [HookManager::PRE_COMMAND_HOOK]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('hookTestPreCommandHook', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testPostCommand');
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:post-command', $command->getName());
+
+ $input = new StringInput('test:post-command bar');
+ $this->assertRunCommandViaApplicationEquals($command, $input, "foo\nbar\nbaz", 0, $this->commandFileInstance);
+ }
+
+ function testHookAllCommands()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleHookAllCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'alterAllCommands');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals('alter', $hookInfo->getAnnotation('hook'));
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('Consolidation\TestUtils\ExampleHookAllCommandFile', [HookManager::ALTER_RESULT]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('alterAllCommands', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'doCat');
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('do:cat', $command->getName());
+
+ $input = new StringInput('do:cat bar');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '*** bar ***');
+ }
+
+ function testAnnotatedHookedCommand()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'hookTestAnnotatedHook');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals('alter @hookme', $hookInfo->getAnnotation('hook'));
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+ $hookCallback = $this->commandFactory->hookManager()->get('@hookme', [HookManager::ALTER_RESULT]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('hookTestAnnotatedHook', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testAnnotationHook');
+ $annotationData = $commandInfo->getRawAnnotations();
+ $this->assertEquals('hookme,before,after', implode(',', $annotationData->keys()));
+ $this->assertEquals('@hookme,@before,@after', implode(',', array_map(function ($item) { return "@$item"; }, $annotationData->keys())));
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:annotation-hook', $command->getName());
+
+ $input = new StringInput('test:annotation-hook baz');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '>(baz)<');
+ }
+
+ function testHookHasCommandAnnotation()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'hookAddCommandName');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals('alter @addmycommandname', $hookInfo->getAnnotation('hook'));
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+ $hookCallback = $this->commandFactory->hookManager()->get('@addmycommandname', [HookManager::ALTER_RESULT]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('hookAddCommandName', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'alterMe');
+ $annotationData = $commandInfo->getRawAnnotations();
+ $this->assertEquals('command,addmycommandname', implode(',', $annotationData->keys()));
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('alter-me', $command->getName());
+
+ $input = new StringInput('alter-me');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'splendiferous from alter-me');
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'alterMeToo');
+ $annotationData = $commandInfo->getRawAnnotations();
+ $this->assertEquals('addmycommandname', implode(',', $annotationData->keys()));
+ $annotationData = $commandInfo->getAnnotations();
+ $this->assertEquals('addmycommandname,command', implode(',', $annotationData->keys()));
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('alter:me-too', $command->getName());
+
+ $input = new StringInput('alter:me-too');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'fantabulous from alter:me-too');
+ }
+
+
+ function testHookedCommandWithHookAddedLater()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testHook');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:hook', $command->getName());
+
+ // Run the command once without the hook
+ $input = new StringInput('test:hook foo');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '[foo]');
+
+ // Register the hook and run the command again
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'hookTestHook');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals('alter test:hook', $hookInfo->getAnnotation('hook'));
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+ $hookCallback = $this->commandFactory->hookManager()->get('test:hook', [HookManager::ALTER_RESULT]);;
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('hookTestHook', $hookCallback[0][1]);
+
+ $input = new StringInput('test:hook bar');
+ $this->assertRunCommandViaApplicationEquals($command, $input, '<[bar]>');
+ }
+
+ function testInitializeHook()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'initializeTestHello');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals($hookInfo->getAnnotation('hook'), 'init test:hello');
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('test:hello', [HookManager::INITIALIZE]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('initializeTestHello', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testHello');
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:hello', $command->getName());
+ $commandGetNames = $this->callProtected($command, 'getNames');
+ $this->assertEquals('test:hello,Consolidation\TestUtils\ExampleCommandFile', implode(',', $commandGetNames));
+
+ $hookCallback = $command->commandProcessor()->hookManager()->get('test:hello', 'init');
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals('initializeTestHello', $hookCallback[0][1]);
+
+ $input = new StringInput('test:hello');
+ $this->assertRunCommandViaApplicationEquals($command, $input, "Hello, Huey.");
+ }
+
+ function testCommandEventHook()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'commandEventTestHello');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals($hookInfo->getAnnotation('hook'), 'command-event test:hello');
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('test:hello', [HookManager::COMMAND_EVENT]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('commandEventTestHello', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testHello');
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:hello', $command->getName());
+ $commandGetNames = $this->callProtected($command, 'getNames');
+ $this->assertEquals('test:hello,Consolidation\TestUtils\ExampleCommandFile', implode(',', $commandGetNames));
+
+ $hookCallback = $command->commandProcessor()->hookManager()->get('test:hello', 'command-event');
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals('commandEventTestHello', $hookCallback[0][1]);
+
+ $input = new StringInput('test:hello Pluto');
+ $this->assertRunCommandViaApplicationEquals($command, $input, "Here comes Pluto!\nHello, Pluto.");
+ }
+
+
+ function testInteractAndValidate()
+ {
+ $this->commandFileInstance = new \Consolidation\TestUtils\ExampleCommandFile();
+ $this->commandFactory = new AnnotatedCommandFactory();
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'interactTestHello');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals($hookInfo->getAnnotation('hook'), 'interact test:hello');
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'validateTestHello');
+
+ $this->assertTrue($hookInfo->hasAnnotation('hook'));
+ $this->assertEquals($hookInfo->getAnnotation('hook'), 'validate test:hello');
+
+ $this->commandFactory->registerCommandHook($hookInfo, $this->commandFileInstance);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('test:hello', [HookManager::ARGUMENT_VALIDATOR]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('validateTestHello', $hookCallback[0][1]);
+
+ $hookCallback = $this->commandFactory->hookManager()->get('test:hello', [HookManager::INTERACT]);
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals(1, count($hookCallback));
+ $this->assertEquals(2, count($hookCallback[0]));
+ $this->assertTrue(is_callable($hookCallback[0]));
+ $this->assertEquals('interactTestHello', $hookCallback[0][1]);
+
+ $commandInfo = $this->commandFactory->createCommandInfo($this->commandFileInstance, 'testHello');
+ $command = $this->commandFactory->createCommand($commandInfo, $this->commandFileInstance);
+
+ $this->assertInstanceOf('\Symfony\Component\Console\Command\Command', $command);
+ $this->assertEquals('test:hello', $command->getName());
+ $commandGetNames = $this->callProtected($command, 'getNames');
+ $this->assertEquals('test:hello,Consolidation\TestUtils\ExampleCommandFile', implode(',', $commandGetNames));
+
+ $testInteractInput = new StringInput('test:hello');
+ $definition = new \Symfony\Component\Console\Input\InputDefinition(
+ [
+ new \Symfony\Component\Console\Input\InputArgument('application', \Symfony\Component\Console\Input\InputArgument::REQUIRED),
+ new \Symfony\Component\Console\Input\InputArgument('who', \Symfony\Component\Console\Input\InputArgument::REQUIRED),
+ ]
+ );
+ $testInteractInput->bind($definition);
+ $testInteractOutput = new BufferedOutput();
+ $command->commandProcessor()->interact(
+ $testInteractInput,
+ $testInteractOutput,
+ $commandGetNames,
+ $command->getAnnotationData()
+ );
+ $this->assertEquals('Goofey', $testInteractInput->getArgument('who'));
+
+ $hookCallback = $command->commandProcessor()->hookManager()->get('test:hello', 'interact');
+ $this->assertTrue($hookCallback != null);
+ $this->assertEquals('interactTestHello', $hookCallback[0][1]);
+
+ $input = new StringInput('test:hello "Mickey Mouse"');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'Hello, Mickey Mouse.');
+
+ $input = new StringInput('test:hello');
+ $this->assertRunCommandViaApplicationEquals($command, $input, 'Hello, Goofey.');
+
+ $input = new StringInput('test:hello "Donald Duck"');
+ $this->assertRunCommandViaApplicationEquals($command, $input, "I won't say hello to Donald Duck.", 1);
+
+ $input = new StringInput('test:hello "Drumph"');
+ $this->assertRunCommandViaApplicationEquals($command, $input, "Irrational value error.", 1);
+
+ // Try the last test again with a display error function installed.
+ $this->commandFactory->commandProcessor()->setDisplayErrorFunction(
+ function ($output, $message) {
+ $output->writeln("*** $message ****");
+ }
+ );
+
+ $input = new StringInput('test:hello "Drumph"');
+ $this->assertRunCommandViaApplicationEquals($command, $input, "*** Irrational value error. ****", 1);
+ }
+
+ function callProtected($object, $method, $args = [])
+ {
+ $r = new \ReflectionMethod($object, $method);
+ $r->setAccessible(true);
+ return $r->invokeArgs($object, $args);
+ }
+
+ function assertRunCommandViaApplicationEquals($command, $input, $expectedOutput, $expectedStatusCode = 0)
+ {
+ $output = new BufferedOutput();
+ if ($this->commandFileInstance && method_exists($this->commandFileInstance, 'setOutput')) {
+ $this->commandFileInstance->setOutput($output);
+ }
+
+ $application = new Application('TestApplication', '0.0.0');
+ $alterOptionsEventManager = new AlterOptionsCommandEvent($application);
+
+ $eventDispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
+ $eventDispatcher->addSubscriber($this->commandFactory->commandProcessor()->hookManager());
+ $eventDispatcher->addSubscriber($alterOptionsEventManager);
+ $application->setDispatcher($eventDispatcher);
+
+ $application->setAutoExit(false);
+ $application->add($command);
+
+ $statusCode = $application->run($input, $output);
+ $commandOutput = trim($output->fetch());
+
+ $this->assertEquals($expectedOutput, $commandOutput);
+ $this->assertEquals($expectedStatusCode, $statusCode);
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/testCommandFileDiscovery.php b/src/composer/vendor/consolidation/annotated-command/tests/testCommandFileDiscovery.php
new file mode 100644
index 00000000..c03c5ba6
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/testCommandFileDiscovery.php
@@ -0,0 +1,82 @@
+setSearchPattern('*CommandFile.php')
+ ->setSearchLocations(['alpha']);
+
+ chdir(__DIR__);
+ $commandFiles = $discovery->discover('.', '\Consolidation\TestUtils');
+
+ $commandFilePaths = array_keys($commandFiles);
+ $commandFileNamespaces = array_values($commandFiles);
+
+ // Ensure that the command files that we expected to
+ // find were all found. We don't find anything in
+ // 'beta' because only 'alpha' is in the search path.
+ $this->assertContains('./src/ExampleCommandFile.php', $commandFilePaths);
+ $this->assertContains('./src/ExampleHookAllCommandFile.php', $commandFilePaths);
+ $this->assertContains('./src/alpha/AlphaCommandFile.php', $commandFilePaths);
+ $this->assertContains('./src/alpha/Inclusive/IncludedCommandFile.php', $commandFilePaths);
+
+ // Make sure that there are no additional items found.
+ $this->assertEquals(4, count($commandFilePaths));
+
+ // Ensure that the command file namespaces that we expected
+ // to be generated all match.
+ $this->assertContains('\Consolidation\TestUtils\ExampleCommandFile', $commandFileNamespaces);
+ $this->assertContains('\Consolidation\TestUtils\ExampleHookAllCommandFile', $commandFileNamespaces);
+ $this->assertContains('\Consolidation\TestUtils\alpha\AlphaCommandFile', $commandFileNamespaces);
+ $this->assertContains('\Consolidation\TestUtils\alpha\Inclusive\IncludedCommandFile', $commandFileNamespaces);
+
+ // We do not need to test for additional namespace items, because we
+ // know that the length of the array_keys must be the same as the
+ // length of the array_values.
+ }
+
+ function testDeepCommandDiscovery()
+ {
+ $discovery = new CommandFileDiscovery();
+ $discovery
+ ->setSearchPattern('*CommandFile.php')
+ ->setSearchDepth(1)
+ ->setSearchLocations([]);
+
+ chdir(__DIR__);
+ $commandFiles = $discovery->discover('.', '\Consolidation\TestUtils');
+
+ $commandFilePaths = array_keys($commandFiles);
+ $commandFileNamespaces = array_values($commandFiles);
+
+ // Ensure that the command files that we expected to
+ // find were all found. We find both 'alpha' and 'beta'
+ // items because the search locations is empty, which
+ // causes the search at the base directory to be deep.
+ // We do not find alpha/Inclusive, though, as the search
+ // depth is only 2, which excludes directories that are
+ // three levels deep.
+ $this->assertContains('./src/ExampleCommandFile.php', $commandFilePaths);
+ $this->assertContains('./src/ExampleHookAllCommandFile.php', $commandFilePaths);
+ $this->assertContains('./src/alpha/AlphaCommandFile.php', $commandFilePaths);
+ $this->assertContains('./src/beta/BetaCommandFile.php', $commandFilePaths);
+
+ // Make sure that there are no additional items found.
+ $this->assertEquals(4, count($commandFilePaths));
+
+ // Ensure that the command file namespaces that we expected
+ // to be generated all match.
+ $this->assertContains('\Consolidation\TestUtils\ExampleCommandFile', $commandFileNamespaces);
+ $this->assertContains('\Consolidation\TestUtils\ExampleHookAllCommandFile', $commandFileNamespaces);
+ $this->assertContains('\Consolidation\TestUtils\alpha\AlphaCommandFile', $commandFileNamespaces);
+ $this->assertContains('\Consolidation\TestUtils\beta\BetaCommandFile', $commandFileNamespaces);
+
+ // We do not need to test for additional namespace items, because we
+ // know that the length of the array_keys must be the same as the
+ // length of the array_values.
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/testCommandInfo.php b/src/composer/vendor/consolidation/annotated-command/tests/testCommandInfo.php
new file mode 100644
index 00000000..29fb2ebf
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/testCommandInfo.php
@@ -0,0 +1,61 @@
+ $value) {
+ if (!is_string($value)) {
+ $value = var_export($value, true);
+ }
+ $result[] = "{$key}=>{$value}";
+ }
+ return implode("\n", $result);
+ }
+
+ /**
+ * Test CommandInfo command annotation parsing.
+ */
+ function testParsing()
+ {
+ $commandInfo = new CommandInfo('\Consolidation\TestUtils\ExampleCommandFile', 'testArithmatic');
+
+ $this->assertEquals('test:arithmatic', $commandInfo->getName());
+ $this->assertEquals(
+ 'This is the test:arithmatic command',
+ $commandInfo->getDescription()
+ );
+ $this->assertEquals(
+ "This command will add one and two. If the --negate flag\nis provided, then the result is negated.",
+ $commandInfo->getHelp()
+ );
+ $this->assertEquals('arithmatic', implode(',', $commandInfo->getAliases()));
+ $this->assertEquals(
+ '2 2 --negate=>Add two plus two and then negate.',
+ $this->flattenArray($commandInfo->getExampleUsages())
+ );
+ $this->assertEquals(
+ 'The first number to add.',
+ $commandInfo->arguments()->getDescription('one')
+ );
+ $this->assertEquals(
+ 'The other number to add.',
+ $commandInfo->arguments()->getDescription('two')
+ );
+ $this->assertEquals(
+ 'Whether or not the result should be negated.',
+ $commandInfo->options()->getDescription('negate')
+ );
+ }
+
+ function testReturnValue()
+ {
+ $commandInfo = new CommandInfo('\Consolidation\TestUtils\alpha\AlphaCommandFile', 'exampleTable');
+ $this->assertEquals('example:table', $commandInfo->getName());
+ $this->assertEquals('\Consolidation\OutputFormatters\StructuredData\RowsOfFields', $commandInfo->getReturnType());
+ }
+}
diff --git a/src/composer/vendor/consolidation/annotated-command/tests/testFullStack.php b/src/composer/vendor/consolidation/annotated-command/tests/testFullStack.php
new file mode 100644
index 00000000..8f3e10ad
--- /dev/null
+++ b/src/composer/vendor/consolidation/annotated-command/tests/testFullStack.php
@@ -0,0 +1,508 @@
+application = new ApplicationWithTerminalWidth('TestApplication', '0.0.0');
+ $this->commandFactory = new AnnotatedCommandFactory();
+ $alterOptionsEventManager = new AlterOptionsCommandEvent($this->application);
+ $eventDispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher();
+ $eventDispatcher->addSubscriber($this->commandFactory->commandProcessor()->hookManager());
+ $eventDispatcher->addSubscriber($alterOptionsEventManager);
+ $this->application->setDispatcher($eventDispatcher);
+ $this->application->setAutoExit(false);
+ }
+
+ function testValidFormats()
+ {
+ $formatter = new FormatterManager();
+ $formatter->addDefaultFormatters();
+ $formatter->addDefaultSimplifiers();
+ $commandInfo = new CommandInfo('\Consolidation\TestUtils\alpha\AlphaCommandFile', 'exampleTable');
+ $this->assertEquals('example:table', $commandInfo->getName());
+ $this->assertEquals('\Consolidation\OutputFormatters\StructuredData\RowsOfFields', $commandInfo->getReturnType());
+ }
+
+ function testAutomaticOptions()
+ {
+ $commandFileInstance = new \Consolidation\TestUtils\alpha\AlphaCommandFile;
+ $formatter = new FormatterManager();
+ $formatter->addDefaultFormatters();
+ $formatter->addDefaultSimplifiers();
+
+ $this->commandFactory->commandProcessor()->setFormatterManager($formatter);
+ $commandInfo = $this->commandFactory->createCommandInfo($commandFileInstance, 'exampleTable');
+
+ $command = $this->commandFactory->createCommand($commandInfo, $commandFileInstance);
+ $this->application->add($command);
+
+ $containsList =
+ [
+ '--format[=FORMAT] Format the result data. Available formats: csv,json,list,php,print-r,sections,string,table,tsv,var_export,xml,yaml [default: "table"]',
+ '--fields[=FIELDS] Available fields: I (first), II (second), III (third) [default: ""]',
+ ];
+ $this->assertRunCommandViaApplicationContains('help example:table', $containsList);
+ }
+
+ function testCommandsAndHooks()
+ {
+ // First, search for commandfiles in the 'alpha'
+ // directory. Note that this same functionality
+ // is tested more thoroughly in isolation in
+ // testCommandFileDiscovery.php
+ $discovery = new CommandFileDiscovery();
+ $discovery
+ ->setSearchPattern('*CommandFile.php')
+ ->setIncludeFilesAtBase(false)
+ ->setSearchLocations(['alpha']);
+
+ chdir(__DIR__);
+ $commandFiles = $discovery->discover('.', '\Consolidation\TestUtils');
+
+ $formatter = new FormatterManager();
+ $formatter->addDefaultFormatters();
+ $formatter->addDefaultSimplifiers();
+ $hookManager = new HookManager();
+ $terminalWidthOption = new PrepareTerminalWidthOption();
+ $terminalWidthOption->setApplication($this->application);
+ $commandProcessor = new CommandProcessor($hookManager);
+ $commandProcessor->setFormatterManager($formatter);
+ $commandProcessor->addPrepareFormatter($terminalWidthOption);
+
+ // Create a new factory, and load all of the files
+ // discovered above. The command factory class is
+ // tested in isolation in testAnnotatedCommandFactory.php,
+ // but this is the only place where
+ $factory = new AnnotatedCommandFactory();
+ $factory->setCommandProcessor($commandProcessor);
+ // $factory->addListener(...);
+ $factory->setIncludeAllPublicMethods(false);
+ $this->addDiscoveredCommands($factory, $commandFiles);
+
+ $this->assertRunCommandViaApplicationContains('list', ['example:table'], ['additional:option', 'without:annotations']);
+
+ $this->assertTrue($this->application->has('example:table'));
+ $this->assertFalse($this->application->has('without:annotations'));
+
+ // Fetch a reference to the 'example:table' command and test its valid format types
+ $exampleTableCommand = $this->application->find('example:table');
+ $returnType = $exampleTableCommand->getReturnType();
+ $this->assertEquals('\Consolidation\OutputFormatters\StructuredData\RowsOfFields', $returnType);
+ $validFormats = $formatter->validFormats($returnType);
+ $this->assertEquals('csv,json,list,php,print-r,sections,string,table,tsv,var_export,xml,yaml', implode(',', $validFormats));
+
+ // Control: run commands without hooks.
+ $this->assertRunCommandViaApplicationEquals('always:fail', 'This command always fails.', 13);
+ $this->assertRunCommandViaApplicationEquals('simulated:status', '42');
+ $this->assertRunCommandViaApplicationEquals('example:output', 'Hello, World.');
+ $this->assertRunCommandViaApplicationEquals('example:cat bet alpha --flip', 'alphabet');
+ $this->assertRunCommandViaApplicationEquals('example:echo a b c', "a\tb\tc");
+ $this->assertRunCommandViaApplicationEquals('example:message', 'Shipwrecked; send bananas.');
+ $this->assertRunCommandViaApplicationEquals('command:with-one-optional-argument', 'Hello, world');
+ $this->assertRunCommandViaApplicationEquals('command:with-one-optional-argument Joe', 'Hello, Joe');
+
+ // Add some hooks.
+ $factory->hookManager()->addValidator(new ExampleValidator());
+ $factory->hookManager()->addResultProcessor(new ExampleResultProcessor());
+ $factory->hookManager()->addAlterResult(new ExampleResultAlterer());
+ $factory->hookManager()->addStatusDeterminer(new ExampleStatusDeterminer());
+ $factory->hookManager()->addOutputExtractor(new ExampleOutputExtractor());
+
+ // Run the same commands as before, and confirm that results
+ // are different now that the hooks are in place.
+ $this->assertRunCommandViaApplicationEquals('simulated:status', '', 42);
+ $this->assertRunCommandViaApplicationEquals('example:output', 'Hello, World!');
+ $this->assertRunCommandViaApplicationEquals('example:cat bet alpha --flip', 'alphareplaced');
+ $this->assertRunCommandViaApplicationEquals('example:echo a b c', 'a,b,c');
+ $this->assertRunCommandViaApplicationEquals('example:message', 'Shipwrecked; send bananas.');
+
+ $expected = <<assertRunCommandViaApplicationEquals('example:table', $expected);
+
+ $expected = <<assertRunCommandViaApplicationEquals('example:table --fields=III,II', $expected);
+
+ $expectedSingleField = <<assertRunCommandViaApplicationEquals('example:table --field=II', $expectedSingleField);
+
+ // Check the help for the example table command and see if the options
+ // from the alter hook were added. We expect that we should not see
+ // any of the information from the alter hook in the 'beta' folder yet.
+ $this->assertRunCommandViaApplicationContains('help example:table',
+ [
+ 'Option added by @hook option example:table',
+ 'example:table --french',
+ 'Add a row with French numbers.'
+ ],
+ [
+ 'chinese',
+ 'kanji',
+ ]
+ );
+
+ $expectedOutputWithFrench = <<assertRunCommandViaApplicationEquals('example:table --french', $expectedOutputWithFrench);
+
+ $expectedAssociativeListTable = <<assertRunCommandViaApplicationEquals('example:list', $expectedAssociativeListTable);
+ $this->assertRunCommandViaApplicationEquals('example:list --field=sftp_command', 'sftp -o Port=2222 dev@appserver.dev.drush.in');
+
+ $this->assertRunCommandViaApplicationEquals('get:serious', 'very serious');
+ $this->assertRunCommandViaApplicationContains('get:lost', 'Command "get:lost" is not defined.', [], 1);
+
+ $this->assertRunCommandViaApplicationContains('help example:wrap',
+ [
+ 'Test word wrapping',
+ '[default: "table"]',
+ ]
+ );
+
+ $expectedUnwrappedOutput = <<application->setWidthAndHeight(0, 0);
+ $this->assertRunCommandViaApplicationEquals('example:wrap', $expectedUnwrappedOutput);
+
+ $expectedWrappedOutput = <<application->setWidthAndHeight(42, 24);
+ $this->assertRunCommandViaApplicationEquals('example:wrap', $expectedWrappedOutput);
+ }
+
+ function testCommandsAndHooksIncludeAllPublicMethods()
+ {
+ // First, search for commandfiles in the 'alpha'
+ // directory. Note that this same functionality
+ // is tested more thoroughly in isolation in
+ // testCommandFileDiscovery.php
+ $discovery = new CommandFileDiscovery();
+ $discovery
+ ->setSearchPattern('*CommandFile.php')
+ ->setIncludeFilesAtBase(false)
+ ->setSearchLocations(['alpha']);
+
+ chdir(__DIR__);
+ $commandFiles = $discovery->discover('.', '\Consolidation\TestUtils');
+
+ $formatter = new FormatterManager();
+ $formatter->addDefaultFormatters();
+ $formatter->addDefaultSimplifiers();
+ $hookManager = new HookManager();
+ $commandProcessor = new CommandProcessor($hookManager);
+ $commandProcessor->setFormatterManager($formatter);
+
+ // Create a new factory, and load all of the files
+ // discovered above. The command factory class is
+ // tested in isolation in testAnnotatedCommandFactory.php,
+ // but this is the only place where
+ $factory = new AnnotatedCommandFactory();
+ $factory->setCommandProcessor($commandProcessor);
+ // $factory->addListener(...);
+
+ // Now we will once again add all commands, this time including all
+ // public methods. The command 'withoutAnnotations' should now be found.
+ $factory->setIncludeAllPublicMethods(true);
+ $this->addDiscoveredCommands($factory, $commandFiles);
+ $this->assertTrue($this->application->has('without:annotations'));
+
+ $this->assertRunCommandViaApplicationContains('list', ['example:table', 'without:annotations'], ['alter:formatters']);
+
+ $this->assertRunCommandViaApplicationEquals('get:serious', 'very serious');
+ $this->assertRunCommandViaApplicationContains('get:lost', 'Command "get:lost" is not defined.', [], 1);
+ }
+
+ function testCommandsAndHooksWithBetaFolder()
+ {
+ // First, search for commandfiles in the 'alpha'
+ // directory. Note that this same functionality
+ // is tested more thoroughly in isolation in
+ // testCommandFileDiscovery.php
+ $discovery = new CommandFileDiscovery();
+ $discovery
+ ->setSearchPattern('*CommandFile.php')
+ ->setIncludeFilesAtBase(false)
+ ->setSearchLocations(['alpha', 'beta']);
+
+ chdir(__DIR__);
+ $commandFiles = $discovery->discover('.', '\Consolidation\TestUtils');
+
+ $formatter = new FormatterManager();
+ $formatter->addDefaultFormatters();
+ $formatter->addDefaultSimplifiers();
+ $hookManager = new HookManager();
+ $commandProcessor = new CommandProcessor($hookManager);
+ $commandProcessor->setFormatterManager($formatter);
+
+ // Create a new factory, and load all of the files
+ // discovered above. The command factory class is
+ // tested in isolation in testAnnotatedCommandFactory.php,
+ // but this is the only place where
+ $factory = new AnnotatedCommandFactory();
+ $factory->setCommandProcessor($commandProcessor);
+ // $factory->addListener(...);
+ $factory->setIncludeAllPublicMethods(true);
+ $this->addDiscoveredCommands($factory, $commandFiles);
+
+ // A few asserts, to make sure that our hooks all get registered.
+ $allRegisteredHooks = $hookManager->getAllHooks();
+ $registeredHookNames = array_keys($allRegisteredHooks);
+ sort($registeredHookNames);
+ $this->assertEquals('*,example:table', implode(',', $registeredHookNames));
+ $allHooksForExampleTable = $allRegisteredHooks['example:table'];
+ $allHookPhasesForExampleTable = array_keys($allHooksForExampleTable);
+ sort($allHookPhasesForExampleTable);
+ $this->assertEquals('alter,option', implode(',', $allHookPhasesForExampleTable));
+
+ $this->assertContains('alterFormattersChinese', var_export($allHooksForExampleTable, true));
+
+ $alterHooksForExampleTable = $this->callProtected($hookManager, 'getHooks', [['example:table'], 'alter']);
+ $this->assertContains('alterFormattersKanji', var_export($alterHooksForExampleTable, true));
+
+ $allHooksForAnyCommand = $allRegisteredHooks['*'];
+ $allHookPhasesForAnyCommand = array_keys($allHooksForAnyCommand);
+ sort($allHookPhasesForAnyCommand);
+ $this->assertEquals('alter', implode(',', $allHookPhasesForAnyCommand));
+
+ $this->assertContains('alterFormattersKanji', var_export($allHooksForAnyCommand, true));
+
+ // Help should have the information from the hooks in the 'beta' folder
+ $this->assertRunCommandViaApplicationContains('help example:table',
+ [
+ 'Option added by @hook option example:table',
+ 'example:table --french',
+ 'Add a row with French numbers.',
+ 'chinese',
+ 'kanji',
+ ]
+ );
+
+ // Confirm that the "unavailable" command is now available
+ $this->assertTrue($this->application->has('unavailable:command'));
+
+ $expectedOutputWithChinese = <<assertRunCommandViaApplicationEquals('example:table --chinese', $expectedOutputWithChinese);
+
+ $expectedOutputWithKanji = <<assertRunCommandViaApplicationEquals('example:table --kanji', $expectedOutputWithKanji);
+ }
+
+ public function addDiscoveredCommands($factory, $commandFiles) {
+ foreach ($commandFiles as $path => $commandClass) {
+ $this->assertFileExists($path);
+ if (!class_exists($commandClass)) {
+ include $path;
+ }
+ $commandInstance = new $commandClass();
+ $commandList = $factory->createCommandsFromClass($commandInstance);
+ foreach ($commandList as $command) {
+ $this->application->add($command);
+ }
+ }
+ }
+
+ function assertRunCommandViaApplicationEquals($cmd, $expectedOutput, $expectedStatusCode = 0)
+ {
+ $input = new StringInput($cmd);
+ $output = new BufferedOutput();
+
+ $statusCode = $this->application->run($input, $output);
+ $commandOutput = trim($output->fetch());
+
+ $expectedOutput = $this->simplifyWhitespace($expectedOutput);
+ $commandOutput = $this->simplifyWhitespace($commandOutput);
+
+ $this->assertEquals($expectedOutput, $commandOutput);
+ $this->assertEquals($expectedStatusCode, $statusCode);
+ }
+
+ function assertRunCommandViaApplicationContains($cmd, $containsList, $doesNotContainList = [], $expectedStatusCode = 0)
+ {
+ $input = new StringInput($cmd);
+ $output = new BufferedOutput();
+ $containsList = (array) $containsList;
+
+ $statusCode = $this->application->run($input, $output);
+ $commandOutput = trim($output->fetch());
+
+ $commandOutput = $this->simplifyWhitespace($commandOutput);
+
+ foreach ($containsList as $expectedToContain) {
+ $this->assertContains($this->simplifyWhitespace($expectedToContain), $commandOutput);
+ }
+ foreach ($doesNotContainList as $expectedToNotContain) {
+ $this->assertNotContains($this->simplifyWhitespace($expectedToNotContain), $commandOutput);
+ }
+ $this->assertEquals($expectedStatusCode, $statusCode);
+ }
+
+ function simplifyWhitespace($data)
+ {
+ return trim(preg_replace('#[ \t]+$#m', '', $data));
+ }
+
+ function callProtected($object, $method, $args = [])
+ {
+ $r = new \ReflectionMethod($object, $method);
+ $r->setAccessible(true);
+ return $r->invokeArgs($object, $args);
+ }
+
+}
+
+class ExampleValidator implements ValidatorInterface
+{
+ public function validate(CommandData $commandData)
+ {
+ $args = $commandData->arguments();
+ if (isset($args['one']) && ($args['one'] == 'bet')) {
+ $commandData->input()->setArgument('one', 'replaced');
+ return $args;
+ }
+ }
+}
+
+class ExampleResultProcessor implements ProcessResultInterface
+{
+ public function process($result, CommandData $commandData)
+ {
+ if (is_array($result) && array_key_exists('item-list', $result)) {
+ return implode(',', $result['item-list']);
+ }
+ }
+}
+
+class ExampleResultAlterer implements AlterResultInterface
+{
+ public function process($result, CommandData $commandData)
+ {
+ if (is_string($result) && ($result == 'Hello, World.')) {
+ return 'Hello, World!';
+ }
+ }
+}
+
+class ExampleStatusDeterminer implements StatusDeterminerInterface
+{
+ public function determineStatusCode($result)
+ {
+ if (is_array($result) && array_key_exists('status-code', $result)) {
+ return $result['status-code'];
+ }
+ }
+}
+
+class ExampleOutputExtractor implements ExtractOutputInterface
+{
+ public function extractOutput($result)
+ {
+ if (is_array($result) && array_key_exists('message', $result)) {
+ return $result['message'];
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/.gitignore b/src/composer/vendor/consolidation/log/.gitignore
new file mode 100644
index 00000000..c1cea0a5
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+vendor
+composer.lock
diff --git a/src/composer/vendor/consolidation/log/LICENSE b/src/composer/vendor/consolidation/log/LICENSE
new file mode 100644
index 00000000..2078bd88
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/LICENSE
@@ -0,0 +1,8 @@
+Copyright (c) 2016 Consolidation Org Developers
+
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/composer/vendor/consolidation/log/README.md b/src/composer/vendor/consolidation/log/README.md
new file mode 100644
index 00000000..a11a8e8e
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/README.md
@@ -0,0 +1,33 @@
+# Consolidation\Log
+
+Improved Psr-3 / Psr\Log logger based on Symfony Console components.
+
+[](https://circleci.com/gh/consolidation-org/log) [](https://scrutinizer-ci.com/g/consolidation-org/log/?branch=master) [](https://packagist.org/packages/consolidation/log) [](https://packagist.org/packages/consolidation/log) [](https://packagist.org/packages/consolidation/log) [](https://packagist.org/packages/consolidation/log)
+
+## Component Status
+
+In use in https://github.com/Codegyre/Robo
+
+## Motivation
+
+Consolication\Log provides a Psr-3 compatible logger that provides styled log output to the standard error (stderr) stream. By default, styling is provided by the SymfonyStyle class from the Symfony Console component; however, alternative stylers may be provided if desired.
+
+## Usage
+```
+$logger = new \Consolidation\Log\Logger($output);
+$logger->setLogOutputStyler(new LogOutputStyler()); // optional
+$logger->warning('The file {name} does not exist.', ['name' => $filename]);
+```
+n.b. Substitution of replacements, such as `{name}` in the example above, is not required by Psr-3' however, this is often done (e.g. in the Symfony Console logger).
+
+## Comparison to Existing Solutions
+
+Many Symfony Console compoenents use SymfonyStyle to format their output messages. This helper class has methods named things like `success` and `warning`, making it seem like a natural choice for reporting status.
+
+However, in practice it is much more convenient to use an actual Psr-3 logger for logging. Doing this allows a Symfony Console component to call an external library that may not need to depend on Symfony Style. Having the Psr\Log\LoggerInterface serve as the only shared IO-related interface in common between the console tool and the libraries it depends on promots loose coupling, allowing said libraries to be re-used in other contexts which may wish to log in different ways.
+
+Symfony Console provides the ConsoleLogger to fill this need; however, ConsoleLogger does not provide any facility for styling output, leaving SymfonyStyle as the preferred logging mechanism for style-conscienscious console coders.
+
+Consolidation\Log provides the benefits of both classes, allowing for code that both behaved technically correctly (redirecting to stderr) without sacrificing on style.
+
+Monlog also provides a full-featured Console logger that might be applicable for some use cases.
diff --git a/src/composer/vendor/consolidation/log/circle.yml b/src/composer/vendor/consolidation/log/circle.yml
new file mode 100644
index 00000000..2be28fa5
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/circle.yml
@@ -0,0 +1,12 @@
+machine:
+ php:
+ version: 5.5.11
+ hosts:
+ localhost: 127.0.0.1
+
+test:
+ override:
+ - vendor/bin/phpcs --standard=PSR2 -n src
+ # See: https://circleci.com/docs/test-metadata#phpunit
+ - mkdir -p $CIRCLE_TEST_REPORTS/phpunit
+ - vendor/bin/phpunit --log-junit $CIRCLE_TEST_REPORTS/phpunit/junit.xml
diff --git a/src/composer/vendor/consolidation/log/composer.json b/src/composer/vendor/consolidation/log/composer.json
new file mode 100644
index 00000000..b6ba0018
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/composer.json
@@ -0,0 +1,35 @@
+{
+ "name": "consolidation/log",
+ "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "autoload":{
+ "psr-4":{
+ "Consolidation\\Log\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Consolidation\\TestUtils\\": "tests/src"
+ }
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "psr/log": "~1.0",
+ "symfony/console": "~2.5|~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/phpunit.xml.dist b/src/composer/vendor/consolidation/log/phpunit.xml.dist
new file mode 100644
index 00000000..4c5e0b93
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/phpunit.xml.dist
@@ -0,0 +1,7 @@
+
+
+
+ tests
+
+
+
diff --git a/src/composer/vendor/consolidation/log/src/ConsoleLogLevel.php b/src/composer/vendor/consolidation/log/src/ConsoleLogLevel.php
new file mode 100644
index 00000000..013e9737
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/src/ConsoleLogLevel.php
@@ -0,0 +1,25 @@
+
+ */
+class ConsoleLogLevel extends \Psr\Log\LogLevel
+{
+ /**
+ * Command successfully completed some operation.
+ * Displayed at VERBOSITY_NORMAL.
+ */
+ const SUCCESS = 'success';
+}
diff --git a/src/composer/vendor/consolidation/log/src/LogOutputStyler.php b/src/composer/vendor/consolidation/log/src/LogOutputStyler.php
new file mode 100644
index 00000000..5788215b
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/src/LogOutputStyler.php
@@ -0,0 +1,115 @@
+ LogLevel::INFO,
+ ];
+ protected $labelStyles = [
+ LogLevel::EMERGENCY => self::TASK_STYLE_ERROR,
+ LogLevel::ALERT => self::TASK_STYLE_ERROR,
+ LogLevel::CRITICAL => self::TASK_STYLE_ERROR,
+ LogLevel::ERROR => self::TASK_STYLE_ERROR,
+ LogLevel::WARNING => self::TASK_STYLE_WARNING,
+ LogLevel::NOTICE => self::TASK_STYLE_INFO,
+ LogLevel::INFO => self::TASK_STYLE_INFO,
+ LogLevel::DEBUG => self::TASK_STYLE_INFO,
+ ConsoleLogLevel::SUCCESS => self::TASK_STYLE_SUCCESS,
+ ];
+ protected $messageStyles = [
+ LogLevel::EMERGENCY => self::TASK_STYLE_ERROR,
+ LogLevel::ALERT => self::TASK_STYLE_ERROR,
+ LogLevel::CRITICAL => self::TASK_STYLE_ERROR,
+ LogLevel::ERROR => self::TASK_STYLE_ERROR,
+ LogLevel::WARNING => '',
+ LogLevel::NOTICE => '',
+ LogLevel::INFO => '',
+ LogLevel::DEBUG => '',
+ ConsoleLogLevel::SUCCESS => '',
+ ];
+
+ public function __construct($labelStyles = [], $messageStyles = [])
+ {
+ $this->labelStyles = $labelStyles + $this->labelStyles;
+ $this->messageStyles = $messageStyles + $this->messageStyles;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function defaultStyles()
+ {
+ return $this->defaultStyles;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function style($context)
+ {
+ $context += ['_style' => []];
+ $context['_style'] += $this->defaultStyles();
+ foreach ($context as $key => $value) {
+ $styleKey = $key;
+ if (!isset($context['_style'][$styleKey])) {
+ $styleKey = '*';
+ }
+ if (is_string($value) && isset($context['_style'][$styleKey])) {
+ $style = $context['_style'][$styleKey];
+ $context[$key] = $this->wrapFormatString($context[$key], $style);
+ }
+ }
+ return $context;
+ }
+
+ /**
+ * Wrap a string in a format element.
+ */
+ protected function wrapFormatString($string, $style)
+ {
+ if ($style) {
+ return "<{$style}>$string>";
+ }
+ return $string;
+ }
+
+ /**
+ * Look up the label and message styles for the specified log level,
+ * and use the log level as the label for the log message.
+ */
+ protected function formatMessageByLevel($level, $message, $context)
+ {
+ $label = $level;
+ return $this->formatMessage($label, $message, $context, $this->labelStyles[$level], $this->messageStyles[$level]);
+ }
+
+ /**
+ * Apply styling with the provided label and message styles.
+ */
+ protected function formatMessage($label, $message, $context, $labelStyle, $messageStyle = '')
+ {
+ if (!empty($messageStyle)) {
+ $message = $this->wrapFormatString(" $message ", $messageStyle);
+ }
+ if (!empty($label)) {
+ $message = ' ' . $this->wrapFormatString("[$label]", $labelStyle) . ' ' . $message;
+ }
+
+ return $message;
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/src/LogOutputStylerInterface.php b/src/composer/vendor/consolidation/log/src/LogOutputStylerInterface.php
new file mode 100644
index 00000000..ff2e420f
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/src/LogOutputStylerInterface.php
@@ -0,0 +1,105 @@
+ 'pwd']
+ * default styles: ['*' => 'info']
+ * result: 'Running pwd>'
+ */
+ public function defaultStyles();
+
+ /**
+ * Apply styles specified in the STYLE_CONTEXT_KEY context variable to
+ * the other named variables stored in the context. The styles from
+ * the context are unioned with the default styles.
+ */
+ public function style($context);
+
+ /**
+ * Create a wrapper object for the output stream. If this styler
+ * does not require an output wrapper, it should just return
+ * its $output parameter.
+ */
+ public function createOutputWrapper(OutputInterface $output);
+
+ /**
+ * Print an ordinary log message, usually unstyled.
+ */
+ public function log($output, $level, $message, $context);
+
+ /**
+ * Print a success message.
+ */
+ public function success($output, $level, $message, $context);
+
+ /**
+ * Print an error message. Used when log level is:
+ * - LogLevel::EMERGENCY
+ * - LogLevel::ALERT
+ * - LogLevel::CRITICAL
+ * - LogLevel::ERROR
+ */
+ public function error($output, $level, $message, $context);
+
+ /**
+ * Print a warning message. Used when log level is:
+ * - LogLevel::WARNING
+ */
+ public function warning($output, $level, $message, $context);
+
+ /**
+ * Print a note. Similar to 'text', but may contain additional
+ * styling (e.g. the task name). Used when log level is:
+ * - LogLevel::NOTICE
+ * - LogLevel::INFO
+ * - LogLevel::DEBUG
+ *
+ * IMPORTANT: Symfony loggers only display LogLevel::NOTICE when the
+ * the verbosity level is VERBOSITY_VERBOSE, unless overridden in the
+ * constructor. Robo\Common\Logger emits LogLevel::NOTICE at
+ * VERBOSITY_NORMAL so that these messages will always be displayed.
+ */
+ public function note($output, $level, $message, $context);
+
+ /**
+ * Print an error message. Not used by default by StyledConsoleLogger.
+ */
+ public function caution($output, $level, $message, $context);
+}
diff --git a/src/composer/vendor/consolidation/log/src/Logger.php b/src/composer/vendor/consolidation/log/src/Logger.php
new file mode 100644
index 00000000..bb10d1b5
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/src/Logger.php
@@ -0,0 +1,269 @@
+
+ */
+class Logger extends AbstractLogger // extends ConsoleLogger
+{
+ /**
+ * @var OutputInterface
+ */
+ protected $output;
+ /**
+ * @var OutputInterface
+ */
+ protected $error;
+ /**
+ * @var LogOutputStylerInterface
+ */
+ protected $outputStyler;
+ /**
+ * @var OutputInterface|SymfonyStyle|other
+ */
+ protected $outputStreamWrapper;
+ protected $errorStreamWrapper;
+
+ protected $formatFunctionMap = [
+ LogLevel::EMERGENCY => 'error',
+ LogLevel::ALERT => 'error',
+ LogLevel::CRITICAL => 'error',
+ LogLevel::ERROR => 'error',
+ LogLevel::WARNING => 'warning',
+ LogLevel::NOTICE => 'note',
+ LogLevel::INFO => 'note',
+ LogLevel::DEBUG => 'note',
+ ConsoleLogLevel::SUCCESS => 'success',
+ ];
+
+ /**
+ * @param OutputInterface $output
+ * @param array $verbosityLevelMap
+ * @param array $formatLevelMap
+ * @param array $formatFunctionMap
+ */
+ public function __construct(OutputInterface $output, array $verbosityLevelMap = array(), array $formatLevelMap = array(), array $formatFunctionMap = array())
+ {
+ $this->output = $output;
+
+ $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap;
+ $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap;
+ $this->formatFunctionMap = $formatFunctionMap + $this->formatFunctionMap;
+ }
+
+ public function setLogOutputStyler(LogOutputStylerInterface $outputStyler, array $formatFunctionMap = array())
+ {
+ $this->outputStyler = $outputStyler;
+ $this->formatFunctionMap = $formatFunctionMap + $this->formatFunctionMap;
+ $this->outputStreamWrapper = null;
+ $this->errorStreamWrapper = null;
+ }
+
+ public function getLogOutputStyler()
+ {
+ if (!isset($this->outputStyler)) {
+ $this->outputStyler = new SymfonyLogOutputStyler();
+ }
+ return $this->outputStyler;
+ }
+
+ protected function getOutputStream()
+ {
+ return $this->output;
+ }
+
+ protected function getErrorStream()
+ {
+ if (!isset($this->error)) {
+ $output = $this->getOutputStream();
+ if ($output instanceof ConsoleOutputInterface) {
+ $output = $output->getErrorOutput();
+ }
+ $this->error = $output;
+ }
+ return $this->error;
+ }
+
+ public function setOutputStream($output)
+ {
+ $this->output = $output;
+ $this->outputStreamWrapper = null;
+ }
+
+ public function setErrorStream($error)
+ {
+ $this->error = $error;
+ $this->errorStreamWrapper = null;
+ }
+
+ protected function getOutputStreamWrapper()
+ {
+ if (!isset($this->outputStreamWrapper)) {
+ $this->outputStreamWrapper = $this->getLogOutputStyler()->createOutputWrapper($this->getOutputStream());
+ }
+ return $this->outputStreamWrapper;
+ }
+
+ protected function getErrorStreamWrapper()
+ {
+ if (!isset($this->errorStreamWrapper)) {
+ $this->errorStreamWrapper = $this->getLogOutputStyler()->createOutputWrapper($this->getErrorStream());
+ }
+ return $this->errorStreamWrapper;
+ }
+
+ protected function getOutputStreamForLogLevel($level)
+ {
+ // Write to the error output if necessary and available.
+ // Usually, loggers that log to a terminal should send
+ // all log messages to stderr.
+ if (array_key_exists($level, $this->formatLevelMap) && ($this->formatLevelMap[$level] !== self::ERROR)) {
+ return $this->getOutputStreamWrapper();
+ }
+ return $this->getErrorStreamWrapper();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function log($level, $message, array $context = array())
+ {
+ // We use the '_level' context variable to allow log messages
+ // to be logged at one level (e.g. NOTICE) and formatted at another
+ // level (e.g. SUCCESS). This helps in instances where we want
+ // to style log messages at a custom log level that might not
+ // be available in all loggers. If the logger does not recognize
+ // the log level, then it is treated like the original log level.
+ if (array_key_exists('_level', $context) && array_key_exists($context['_level'], $this->verbosityLevelMap)) {
+ $level = $context['_level'];
+ }
+ // It is a runtime error if someone logs at a log level that
+ // we do not recognize.
+ if (!isset($this->verbosityLevelMap[$level])) {
+ throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level));
+ }
+
+ // Write to the error output if necessary and available.
+ // Usually, loggers that log to a terminal should send
+ // all log messages to stderr.
+ $outputStreamWrapper = $this->getOutputStreamForLogLevel($level);
+
+ // Ignore messages that are not at the right verbosity level
+ if ($this->getOutputStream()->getVerbosity() >= $this->verbosityLevelMap[$level]) {
+ $this->doLog($outputStreamWrapper, $level, $message, $context);
+ }
+ }
+
+ /**
+ * Interpolate and style the message, and then send it to the log.
+ */
+ protected function doLog($outputStreamWrapper, $level, $message, $context)
+ {
+ $formatFunction = 'log';
+ if (array_key_exists($level, $this->formatFunctionMap)) {
+ $formatFunction = $this->formatFunctionMap[$level];
+ }
+ $interpolated = $this->interpolate(
+ $message,
+ $this->getLogOutputStyler()->style($context)
+ );
+ $this->getLogOutputStyler()->$formatFunction(
+ $outputStreamWrapper,
+ $level,
+ $interpolated,
+ $context
+ );
+ }
+
+ public function success($message, array $context = array())
+ {
+ $this->log(ConsoleLogLevel::SUCCESS, $message, $context);
+ }
+
+ // The functions below could be eliminated if made `protected` intead
+ // of `private` in ConsoleLogger
+
+ const INFO = 'info';
+ const ERROR = 'error';
+
+ /**
+ * @var OutputInterface
+ */
+ //private $output;
+ /**
+ * @var array
+ */
+ private $verbosityLevelMap = [
+ LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL,
+ LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL,
+ LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL,
+ LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL,
+ LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL,
+ LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE,
+ LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE,
+ LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG,
+ ConsoleLogLevel::SUCCESS => OutputInterface::VERBOSITY_NORMAL,
+ ];
+
+ /**
+ * @var array
+ *
+ * Send all log messages to stderr. Symfony should have the same default.
+ * See: https://en.wikipedia.org/wiki/Standard_streams
+ * "Standard error was added to Unix after several wasted phototypesetting runs ended with error messages being typeset instead of displayed on the user's terminal."
+ *
+ */
+ private $formatLevelMap = [
+ LogLevel::EMERGENCY => self::ERROR,
+ LogLevel::ALERT => self::ERROR,
+ LogLevel::CRITICAL => self::ERROR,
+ LogLevel::ERROR => self::ERROR,
+ LogLevel::WARNING => self::ERROR,
+ LogLevel::NOTICE => self::ERROR,
+ LogLevel::INFO => self::ERROR,
+ LogLevel::DEBUG => self::ERROR,
+ ConsoleLogLevel::SUCCESS => self::ERROR,
+ ];
+
+ /**
+ * Interpolates context values into the message placeholders.
+ *
+ * @author PHP Framework Interoperability Group
+ *
+ * @param string $message
+ * @param array $context
+ *
+ * @return string
+ */
+ private function interpolate($message, array $context)
+ {
+ // build a replacement array with braces around the context keys
+ $replace = array();
+ foreach ($context as $key => $val) {
+ if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
+ $replace[sprintf('{%s}', $key)] = $val;
+ }
+ }
+
+ // interpolate replacement values into the message and return
+ return strtr($message, $replace);
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/src/SymfonyLogOutputStyler.php b/src/composer/vendor/consolidation/log/src/SymfonyLogOutputStyler.php
new file mode 100644
index 00000000..12ce49f3
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/src/SymfonyLogOutputStyler.php
@@ -0,0 +1,65 @@
+text($message);
+ }
+
+ public function success($symfonyStyle, $level, $message, $context)
+ {
+ $symfonyStyle->success($message);
+ }
+
+ public function error($symfonyStyle, $level, $message, $context)
+ {
+ $symfonyStyle->error($message);
+ }
+
+ public function warning($symfonyStyle, $level, $message, $context)
+ {
+ $symfonyStyle->warning($message);
+ }
+
+ public function note($symfonyStyle, $level, $message, $context)
+ {
+ $symfonyStyle->note($message);
+ }
+
+ public function caution($symfonyStyle, $level, $message, $context)
+ {
+ $symfonyStyle->caution($message);
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/src/UnstyledLogOutputStyler.php b/src/composer/vendor/consolidation/log/src/UnstyledLogOutputStyler.php
new file mode 100644
index 00000000..6513ce34
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/src/UnstyledLogOutputStyler.php
@@ -0,0 +1,97 @@
+writeln($message);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function log($output, $level, $message, $context)
+ {
+ return $this->write($output, $this->formatMessageByLevel($level, $message, $context), $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function success($output, $level, $message, $context)
+ {
+ return $this->write($output, $this->formatMessageByLevel($level, $message, $context), $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function error($output, $level, $message, $context)
+ {
+ return $this->write($output, $this->formatMessageByLevel($level, $message, $context), $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function warning($output, $level, $message, $context)
+ {
+ return $this->write($output, $this->formatMessageByLevel($level, $message, $context), $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function note($output, $level, $message, $context)
+ {
+ return $this->write($output, $this->formatMessageByLevel($level, $message, $context), $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function caution($output, $level, $message, $context)
+ {
+ return $this->write($output, $this->formatMessageByLevel($level, $message, $context), $context);
+ }
+
+ /**
+ * Look up the label and message styles for the specified log level,
+ * and use the log level as the label for the log message.
+ */
+ protected function formatMessageByLevel($level, $message, $context)
+ {
+ return " [$level] $message";
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/tests/src/TestDataPermuter.php b/src/composer/vendor/consolidation/log/tests/src/TestDataPermuter.php
new file mode 100644
index 00000000..c44ef53a
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/tests/src/TestDataPermuter.php
@@ -0,0 +1,81 @@
+ $values) {
+ $tests = static::expandOneValue($tests, $substitute, $values);
+ }
+ return $tests;
+ }
+
+ /**
+ * Given an array of test data, where each element is
+ * data to pass to a unit test, find any element in any
+ * one test item whose value is exactly $substitute.
+ * Make a new test item for every item in $values, using
+ * each as the substitution for $substitute.
+ */
+ public static function expandOneValue($tests, $substitute, $values)
+ {
+ $result = [];
+
+ foreach($tests as $test) {
+ $position = array_search($substitute, $test);
+ if ($position === FALSE) {
+ $result[] = $test;
+ }
+ else {
+ foreach($values as $replacement) {
+ $test[$position] = $replacement;
+ $result[] = $test;
+ }
+ }
+ }
+
+ return $result;
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/tests/testLogMethods.php b/src/composer/vendor/consolidation/log/tests/testLogMethods.php
new file mode 100644
index 00000000..5c7e19f0
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/tests/testLogMethods.php
@@ -0,0 +1,54 @@
+output = new BufferedOutput();
+ $this->output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
+ $this->logger = new Logger($this->output);
+ $this->logger->setLogOutputStyler(new UnstyledLogOutputStyler());
+ }
+
+ function testError() {
+ $this->logger->error('Do not enter - wrong way.');
+ $outputText = rtrim($this->output->fetch());
+ $this->assertEquals(' [error] Do not enter - wrong way.', $outputText);
+ }
+
+ function testWarning() {
+ $this->logger->warning('Steep grade.');
+ $outputText = rtrim($this->output->fetch());
+ $this->assertEquals(' [warning] Steep grade.', $outputText);
+ }
+
+ function testNotice() {
+ $this->logger->notice('No loitering.');
+ $outputText = rtrim($this->output->fetch());
+ $this->assertEquals(' [notice] No loitering.', $outputText);
+ }
+
+ function testInfo() {
+ $this->logger->info('Scenic route.');
+ $outputText = rtrim($this->output->fetch());
+ $this->assertEquals(' [info] Scenic route.', $outputText);
+ }
+
+ function testDebug() {
+ $this->logger->debug('Counter incremented.');
+ $outputText = rtrim($this->output->fetch());
+ $this->assertEquals(' [debug] Counter incremented.', $outputText);
+ }
+
+ function testSuccess() {
+ $this->logger->success('It worked!');
+ $outputText = rtrim($this->output->fetch());
+ $this->assertEquals(' [success] It worked!', $outputText);
+ }
+}
diff --git a/src/composer/vendor/consolidation/log/tests/testLoggerVerbosityAndStyles.php b/src/composer/vendor/consolidation/log/tests/testLoggerVerbosityAndStyles.php
new file mode 100644
index 00000000..5b17fcff
--- /dev/null
+++ b/src/composer/vendor/consolidation/log/tests/testLoggerVerbosityAndStyles.php
@@ -0,0 +1,164 @@
+output = new BufferedOutput();
+ //$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
+ $this->logger = new Logger($this->output);
+ }
+
+ public static function logTestValues()
+ {
+ /**
+ * Use TEST_ALL_LOG_LEVELS to ensure that output is the same
+ * in instances where the output does not vary by log level.
+ */
+ $TEST_ALL_LOG_LEVELS = [
+ OutputInterface::VERBOSITY_DEBUG,
+ OutputInterface::VERBOSITY_VERY_VERBOSE,
+ OutputInterface::VERBOSITY_VERBOSE,
+ OutputInterface::VERBOSITY_NORMAL
+ ];
+
+ // Tests that return the same value for multiple inputs
+ // may use the expandProviderDataArrays method, and list
+ // repeated scalars as array values. All permutations of
+ // all array items will be calculated, and one test will
+ // be generated for each one.
+ return TestDataPermuter::expandProviderDataArrays([
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ $TEST_ALL_LOG_LEVELS,
+ LogLevel::ERROR,
+ 'Do not enter - wrong way.',
+ ' [error] Do not enter - wrong way.',
+ ],
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ $TEST_ALL_LOG_LEVELS,
+ LogLevel::WARNING,
+ 'Steep grade.',
+ ' [warning] Steep grade.',
+ ],
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ [
+ OutputInterface::VERBOSITY_DEBUG,
+ OutputInterface::VERBOSITY_VERY_VERBOSE,
+ OutputInterface::VERBOSITY_VERBOSE,
+ ],
+ LogLevel::NOTICE,
+ 'No loitering.',
+ ' [notice] No loitering.',
+ ],
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ OutputInterface::VERBOSITY_NORMAL,
+ LogLevel::NOTICE,
+ 'No loitering.',
+ '',
+ ],
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ OutputInterface::VERBOSITY_DEBUG,
+ LogLevel::INFO,
+ 'Scenic route.',
+ ' [info] Scenic route.',
+ ],
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ OutputInterface::VERBOSITY_DEBUG,
+ LogLevel::DEBUG,
+ 'Counter incremented.',
+ ' [debug] Counter incremented.',
+ ],
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ [
+ OutputInterface::VERBOSITY_VERY_VERBOSE,
+ OutputInterface::VERBOSITY_VERBOSE,
+ OutputInterface::VERBOSITY_NORMAL
+ ],
+ LogLevel::DEBUG,
+ 'Counter incremented.',
+ '',
+ ],
+ [
+ '\Consolidation\Log\UnstyledLogOutputStyler',
+ $TEST_ALL_LOG_LEVELS,
+ ConsoleLogLevel::SUCCESS,
+ 'It worked!',
+ ' [success] It worked!',
+ ],
+ [
+ '\Consolidation\Log\LogOutputStyler',
+ OutputInterface::VERBOSITY_NORMAL,
+ ConsoleLogLevel::SUCCESS,
+ 'It worked!',
+ ' [success] It worked!',
+ ],
+ [
+ '\Consolidation\Log\SymfonyLogOutputStyler',
+ OutputInterface::VERBOSITY_DEBUG,
+ LogLevel::WARNING,
+ 'Steep grade.',
+ "\n [WARNING] Steep grade.",
+ ],
+ [
+ '\Consolidation\Log\SymfonyLogOutputStyler',
+ OutputInterface::VERBOSITY_DEBUG,
+ LogLevel::NOTICE,
+ 'No loitering.',
+ "\n ! [NOTE] No loitering.",
+ ],
+ [
+ '\Consolidation\Log\SymfonyLogOutputStyler',
+ OutputInterface::VERBOSITY_DEBUG,
+ LogLevel::INFO,
+ 'Scenic route.',
+ "\n ! [NOTE] Scenic route.",
+ ],
+ [
+ '\Consolidation\Log\SymfonyLogOutputStyler',
+ OutputInterface::VERBOSITY_DEBUG,
+ LogLevel::DEBUG,
+ 'Counter incremented.',
+ "\n ! [NOTE] Counter incremented.",
+ ],
+ [
+ '\Consolidation\Log\SymfonyLogOutputStyler',
+ OutputInterface::VERBOSITY_NORMAL,
+ ConsoleLogLevel::SUCCESS,
+ 'It worked!',
+ "\n [OK] It worked!",
+ ],
+ ]);
+ }
+
+ /**
+ * This is our only test method. It accepts all of the
+ * permuted data from the data provider, and runs one
+ * test on each one.
+ *
+ * @dataProvider logTestValues
+ */
+ function testLogging($styleClass, $verbocity, $level, $message, $expected) {
+ $logStyler = new $styleClass;
+ $this->logger->setLogOutputStyler($logStyler);
+ $this->output->setVerbosity($verbocity);
+ $this->logger->log($level, $message);
+ $outputText = rtrim($this->output->fetch(), "\n\r\t ");
+ $this->assertEquals($expected, $outputText);
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/.editorconfig b/src/composer/vendor/consolidation/output-formatters/.editorconfig
new file mode 100644
index 00000000..095771e6
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/.editorconfig
@@ -0,0 +1,15 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[**.php]
+indent_style = space
+indent_size = 4
+
diff --git a/src/composer/vendor/consolidation/output-formatters/.github/issue_template.md b/src/composer/vendor/consolidation/output-formatters/.github/issue_template.md
new file mode 100644
index 00000000..97335f49
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/.github/issue_template.md
@@ -0,0 +1,11 @@
+### Steps to reproduce
+What did you do?
+
+### Expected behavior
+Tell us what should happen
+
+### Actual behavior
+Tell us what happens instead
+
+### System Configuration
+Which O.S. and PHP version are you using?
diff --git a/src/composer/vendor/consolidation/output-formatters/.github/pull_request_template.md b/src/composer/vendor/consolidation/output-formatters/.github/pull_request_template.md
new file mode 100644
index 00000000..da95f480
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/.github/pull_request_template.md
@@ -0,0 +1,13 @@
+### Overview
+This pull request:
+
+- [ ] Fixes a bug
+- [ ] Adds a feature
+- [ ] Breaks backwards compatibility
+- [ ] Has tests that cover changes
+
+### Summary
+Short overview of what changed.
+
+### Description
+Any additional information.
diff --git a/src/composer/vendor/consolidation/output-formatters/.gitignore b/src/composer/vendor/consolidation/output-formatters/.gitignore
new file mode 100644
index 00000000..ae5ae728
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/.gitignore
@@ -0,0 +1,7 @@
+.DS_Store
+.idea
+phpunit.xml
+build
+vendor
+composer.lock
+main.php
diff --git a/src/composer/vendor/consolidation/output-formatters/.travis.yml b/src/composer/vendor/consolidation/output-formatters/.travis.yml
new file mode 100644
index 00000000..2c11c39c
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/.travis.yml
@@ -0,0 +1,30 @@
+language: php
+
+branches:
+ # Only test the master branch and SemVer tags.
+ only:
+ - master
+ - /^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+.*$/
+
+php:
+ - 7.0
+ - 5.6
+ - 5.5
+ - 5.4
+
+sudo: false
+
+cache:
+ directories:
+ - vendor
+ - $HOME/.composer/cache
+
+before_script:
+ - composer install
+
+script:
+ - vendor/bin/phpunit
+ - vendor/bin/phpcs --standard=PSR2 -n src
+
+after_success:
+ - travis_retry php vendor/bin/coveralls -v
diff --git a/src/composer/vendor/consolidation/output-formatters/CHANGELOG.md b/src/composer/vendor/consolidation/output-formatters/CHANGELOG.md
new file mode 100644
index 00000000..776c5b62
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/CHANGELOG.md
@@ -0,0 +1,35 @@
+# Change Log
+
+### 3.0.0 - 14 November 2016
+
+- **Breaking** The RenderCellInterface is now provided a reference to the entire row data. Existing clients need only add the new parameter to their method defnition to update.
+- Rename AssociativeList to PropertyList, as many people seemed to find the former name confusing. AssociativeList is still available for use to preserve backwards compatibility, but it is deprecated.
+
+
+### 2.1.0 - 7 November 2016
+
+- Add RenderCellCollections to structured lists, so that commands may add renderers to structured data without defining a new structured data subclass.
+
+
+### 2.0.1 - 4 October 2016
+
+- Throw an exception if the client requests a field that does not exist.
+- Remove unwanted extra layer of nesting when formatting an PropertyList with an array formatter (json, yaml, etc.).
+
+
+### 2.0.0 - 30 September 2016
+
+- **Breaking** The default `string` format now converts non-string results into a tab-separated-value table if possible. Commands may select a single field to emit in this instance with an annotation: `@default-string-field email`. By this means, a given command may by default emit a single value, but also provide more rich output that may be shown by selecting --format=table, --format=yaml or the like. This change might cause some commands to produce output in situations that previously were not documented as producing output.
+- **Breaking** FormatterManager::addFormatter() now takes the format identifier and a FormatterInterface, rather than an identifier and a Formatter classname (string).
+- --field is a synonym for --fields with a single field.
+- Wildcards and regular expressions can now be used in --fields expressions.
+
+
+### 1.1.0 - 14 September 2016
+
+Add tab-separated-value (tsv) formatter.
+
+
+### 1.0.0 - 19 May 2016
+
+First stable release.
diff --git a/src/composer/vendor/consolidation/output-formatters/CONTRIBUTING.md b/src/composer/vendor/consolidation/output-formatters/CONTRIBUTING.md
new file mode 100644
index 00000000..4d843cf7
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/CONTRIBUTING.md
@@ -0,0 +1,31 @@
+# Contributing to Consolidation
+
+Thank you for your interest in contributing to the Consolidation effort! Consolidation aims to provide reusable, loosely-coupled components useful for building command-line tools. Consolidation is built on top of Symfony Console, but aims to separate the tool from the implementation details of Symfony.
+
+Here are some of the guidelines you should follow to make the most of your efforts:
+
+## Code Style Guidelines
+
+Consolidation adheres to the [PSR-2 Coding Style Guide](http://www.php-fig.org/psr/psr-2/) for PHP code.
+
+## Pull Request Guidelines
+
+Every pull request is run through:
+
+ - phpcs -n --standard=PSR2 src
+ - phpunit
+ - [Scrutinizer](https://scrutinizer-ci.com/g/consolidation/output-formatters/)
+
+It is easy to run the unit tests and code sniffer locally; just run:
+
+ - composer cs
+
+To run the code beautifier, which will fix many of the problems reported by phpcs:
+
+ - composer cbf
+
+These two commands (`composer cs` and `composer cbf`) are defined in the `scripts` section of [composer.json](composer.json).
+
+After submitting a pull request, please examine the Scrutinizer report. It is not required to fix all Scrutinizer issues; you may ignore recommendations that you disagree with. The spacing patches produced by Scrutinizer do not conform to PSR2 standards, and therefore should never be applied. DocBlock patches may be applied at your discression. Things that Scrutinizer identifies as a bug nearly always need to be addressed.
+
+Pull requests must pass phpcs and phpunit in order to be merged; ideally, new functionality will also include new unit tests.
diff --git a/src/composer/vendor/consolidation/output-formatters/LICENSE b/src/composer/vendor/consolidation/output-formatters/LICENSE
new file mode 100644
index 00000000..2078bd88
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/LICENSE
@@ -0,0 +1,8 @@
+Copyright (c) 2016 Consolidation Org Developers
+
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/composer/vendor/consolidation/output-formatters/README.md b/src/composer/vendor/consolidation/output-formatters/README.md
new file mode 100644
index 00000000..7b9b912f
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/README.md
@@ -0,0 +1,130 @@
+# Consolidation\OutputFormatters
+
+Apply transformations to structured data to write output in different formats.
+
+[](https://travis-ci.org/consolidation/output-formatters) [](https://scrutinizer-ci.com/g/consolidation/output-formatters/?branch=master) [](https://coveralls.io/github/consolidation/output-formatters?branch=master) [](https://packagist.org/packages/consolidation/output-formatters)
+
+## Component Status
+
+Currently in use in [Robo](https://github.com/consolidation/Robo) (1.x+), [Drush](https://github.com/drush-ops/drush) (9.x+) and [Terminus](https://github.com/pantheon-systems/terminus) (1.x+).
+
+## Motivation
+
+Formatters are used to allow simple commandline tool commands to be implemented in a manner that is completely independent from the Symfony Console output interfaces. A command receives its input via its method parameters, and returns its result as structured data (e.g. a php standard object or array). The structured data is then formatted by a formatter, and the result is printed.
+
+This process is managed by the [Consolidation/AnnotationCommand](https://github.com/consolidation/annotation-command) project.
+
+## Library Usage
+
+This is a library intended to be used in some other project. Require from your composer.json file:
+```
+ "require": {
+ "consolidation/output-formatters": "~3"
+ },
+```
+If you require the feature that allows a data table to be automatically reduced to a single element when the `string` format is selected, then you should require version "~2" instead. In most other respects, the 1.x and 2.x versions are compatible. See the [CHANGELOG](CHANGELOG.md) for details.
+
+## Example Formatter
+
+Simple formatters are very easy to write.
+```php
+class YamlFormatter implements FormatterInterface
+{
+ public function write(OutputInterface $output, $data, FormatterOptions $options)
+ {
+ $dumper = new Dumper();
+ $output->writeln($dumper->dump($data));
+ }
+}
+```
+The formatter is passed the set of `$options` that the user provided on the command line. These may optionally be examined to alter the behavior of the formatter, if needed.
+
+Formatters may also implement different interfaces to alter the behavior of the rendering engine.
+
+- `ValidationInterface`: A formatter should implement this interface to test to see if the provided data type can be processed. Any formatter that does **not** implement this interface is presumed to operate exclusively on php arrays. The formatter manager will always convert any provided data into an array before passing it to a formatter that does not implement ValidationInterface. These formatters will not be made available when the returned data type cannot be converted into an array.
+- `OverrideRestructureInterface`: A formatter that implements this interface will be given the option to act on the provided structured data object before it restructures itself. See the section below on structured data for details on data restructuring.
+
+## Structured Data
+
+Most formatters will operate on any array or ArrayObject data. Some formatters require that specific data types be used. The following data types, all of which are subclasses of ArrayObject, are available for use:
+
+- `RowsOfFields`: Each row contains an associative array of field:value pairs. It is also assumed that the fields of each row are the same for every row. This format is ideal for displaying in a table, with labels in the top row.
+- `PropertyList`: Each row contains a field:value pair. Each field is unique. This format is ideal for displaying in a table, with labels in the first column and values in the second common.
+- `DOMDocument`: The standard PHP DOM document class may be used by functions that need to be able to presicely specify the exact attributes and children when the XML output format is used.
+
+Commands that return table structured data with fields can be filtered and/or re-ordered by using the --fields option. These structured data types can also be formatted into a more generic type such as yaml or json, even after being filtered. This capabilities are not available if the data is returned in a bare php array.
+
+The formatter manager will do its best to convert from an array to a DOMDocument, or from a DOMDocument to an array. It is important to note that a DOMDocument does not have a 1-to-1 mapping with a PHP array. DOM elements contain both attributes and elements; a simple string property 'foo' may be represented either as or value. Also, there may be multiple XML elements with the same name, whereas php associative arrays must always have unique keys. When converting from an array to a DOM document, the XML formatter will default to representing the string properties of an array as attributes of the element. Sets of elements with the same name may be used only if they are wrapped in a containing parent element--e.g. onetwo. The XMLSchema class may be used to provide control over whether a property is rendered as an attribute or an element; however, in instances where the schema of the XML output is important, it is best for a function to return its result as a DOMDocument rather than an array.
+
+A function may also define its own structured data type to return, usually by extending one of the types mentioned above. If a custom structured data class implements an appropriate interface, then it can provide its own conversion function to one of the other data types:
+
+- `DomDataInterface`: The data object may produce a DOMDocument via its `getDomData()` method, which will be called in any instance where a DOM document is needed--typically with the xml formatter.
+- `ListDataInterface`: Any structured data object that implements this interface may use the `getListData()` method to produce the data set that will be used with the list formatter.
+- `TableDataInterface`: Any structured data object that implements this interface may use the `getTableData()` method to produce the data set that will be used with the table formatter.
+- `RenderCellInterface`: Structured data can also provide fine-grain control over how each cell in a table is rendered by implementing the RenderCellInterface. See the section below for information on how this is done.
+- `RestructureInterface`: The restructure interface can be implemented by a structured data object to restructure the data in response to options provided by the user. For example, the RowsOfFields and PropertyList data types use this interface to select and reorder the fields that were selected to appear in the output. Custom data types usually will not need to implement this interface, as they can inherit this behavior by extending RowsOfFields or PropertyList.
+
+Additionally, structured data may be simplified to arrays via an array simplification object. To provide an array simplifier, implement `SimplifyToArrayInterface`, and register the simplifier via `FormatterManager::addSimplifier()`.
+
+## Rendering Table Cells
+
+By default, both the RowsOfFields and PropertyList data types presume that the contents of each cell is a simple string. To render more complicated cell contents, create a custom structured data class by extending either RowsOfFields or PropertyList, as desired, and implement RenderCellInterface. The `renderCell()` method of your class will then be called for each cell, and you may act on it as appropriate.
+```php
+public function renderCell($key, $cellData, FormatterOptions $options, $rowData)
+{
+ // 'my-field' is always an array; convert it to a comma-separated list.
+ if ($key == 'my-field') {
+ return implode(',', $cellData);
+ }
+ // MyStructuredCellType has its own render function
+ if ($cellData instanceof MyStructuredCellType) {
+ return $cellData->myRenderfunction();
+ }
+ // If we do not recognize the cell data, return it unchnaged.
+ return $cellData;
+}
+```
+Note that if your data structure is printed with a formatter other than one such as the table formatter, it will still be reordered per the selected fields, but cell rendering will **not** be done.
+
+## API Usage
+
+It is recommended to use [Consolidation/AnnotationCommand](https://github.com/consolidation/annotation-command) to manage commands and formatters. See the [AnnotationCommand API Usage](https://github.com/consolidation/annotation-command#api-usage) for details.
+
+The FormatterManager may also be used directly, if desired:
+```php
+/**
+ * @param OutputInterface $output Output stream to write to
+ * @param string $format Data format to output in
+ * @param mixed $structuredOutput Data to output
+ * @param FormatterOptions $options Configuration informatin and User options
+ */
+function doFormat(
+ OutputInterface $output,
+ string $format,
+ array $data,
+ FormatterOptions $options)
+{
+ $formatterManager = new FormatterManager();
+ $formatterManager->write(output, $format, $data, $options);
+}
+```
+The FormatterOptions class is used to hold the configuration for the command output--things such as the default field list for tabular output, and so on--and also the current user-selected options to use during rendering, which may be provided using a Symfony InputInterface object:
+```
+public function execute(InputInterface $input, OutputInterface $output)
+{
+ $options = new FormatterOptions();
+ $options
+ ->setInput($input)
+ ->setFieldLabels(['id' => 'ID', 'one' => 'First', 'two' => 'Second'])
+ ->setDefaultStringField('id');
+
+ $data = new RowsOfFields($this->getSomeData($input));
+ return $this->doFormat($output, $options->getFormat(), $data, $options);
+}
+```
+## Comparison to Existing Solutions
+
+Formatters have been in use in Drush since version 5. Drush allows formatters to be defined using simple classes, some of which may be configured using metadata. Furthermore, nested formatters are also allowed; for example, a list formatter may be given another formatter to use to format each of its rows. Nested formatters also require nested metadata, causing the code that constructed formatters to become very complicated and unweildy.
+
+Consolidation/OutputFormatters maintains the simplicity of use provided by Drush formatters, but abandons nested metadata configuration in favor of using code in the formatter to configure itself, in order to keep the code simpler.
+
diff --git a/src/composer/vendor/consolidation/output-formatters/composer.json b/src/composer/vendor/consolidation/output-formatters/composer.json
new file mode 100644
index 00000000..4a1a92a2
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "consolidation/output-formatters",
+ "description": "Format text by applying transformations provided by plug-in formatters.",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "autoload":{
+ "psr-4":{
+ "Consolidation\\OutputFormatters\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Consolidation\\TestUtils\\": "tests/src"
+ }
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "symfony/console": "~2.5|~3.0",
+ "symfony/finder": "~2.5|~3.0",
+ "victorjonsson/markdowndocs": "^1.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "scripts": {
+ "api": "phpdoc-md generate src > docs/api.md",
+ "cs": "phpcs --standard=PSR2 -n src",
+ "cbf": "phpcbf --standard=PSR2 -n src",
+ "test": "phpunit --colors=always"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/docs/api.md b/src/composer/vendor/consolidation/output-formatters/docs/api.md
new file mode 100644
index 00000000..279f5c16
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/docs/api.md
@@ -0,0 +1,658 @@
+## Table of contents
+
+- [\Consolidation\OutputFormatters\FormatterManager](#class-consolidationoutputformattersformattermanager)
+- [\Consolidation\OutputFormatters\Exception\AbstractDataFormatException (abstract)](#class-consolidationoutputformattersexceptionabstractdataformatexception-abstract)
+- [\Consolidation\OutputFormatters\Exception\IncompatibleDataException](#class-consolidationoutputformattersexceptionincompatibledataexception)
+- [\Consolidation\OutputFormatters\Exception\InvalidFormatException](#class-consolidationoutputformattersexceptioninvalidformatexception)
+- [\Consolidation\OutputFormatters\Exception\UnknownFieldException](#class-consolidationoutputformattersexceptionunknownfieldexception)
+- [\Consolidation\OutputFormatters\Exception\UnknownFormatException](#class-consolidationoutputformattersexceptionunknownformatexception)
+- [\Consolidation\OutputFormatters\Formatters\CsvFormatter](#class-consolidationoutputformattersformatterscsvformatter)
+- [\Consolidation\OutputFormatters\Formatters\FormatterInterface (interface)](#interface-consolidationoutputformattersformattersformatterinterface)
+- [\Consolidation\OutputFormatters\Formatters\JsonFormatter](#class-consolidationoutputformattersformattersjsonformatter)
+- [\Consolidation\OutputFormatters\Formatters\ListFormatter](#class-consolidationoutputformattersformatterslistformatter)
+- [\Consolidation\OutputFormatters\Formatters\PrintRFormatter](#class-consolidationoutputformattersformattersprintrformatter)
+- [\Consolidation\OutputFormatters\Formatters\RenderDataInterface (interface)](#interface-consolidationoutputformattersformattersrenderdatainterface)
+- [\Consolidation\OutputFormatters\Formatters\SectionsFormatter](#class-consolidationoutputformattersformatterssectionsformatter)
+- [\Consolidation\OutputFormatters\Formatters\SerializeFormatter](#class-consolidationoutputformattersformattersserializeformatter)
+- [\Consolidation\OutputFormatters\Formatters\StringFormatter](#class-consolidationoutputformattersformattersstringformatter)
+- [\Consolidation\OutputFormatters\Formatters\TableFormatter](#class-consolidationoutputformattersformatterstableformatter)
+- [\Consolidation\OutputFormatters\Formatters\TsvFormatter](#class-consolidationoutputformattersformatterstsvformatter)
+- [\Consolidation\OutputFormatters\Formatters\VarExportFormatter](#class-consolidationoutputformattersformattersvarexportformatter)
+- [\Consolidation\OutputFormatters\Formatters\XmlFormatter](#class-consolidationoutputformattersformattersxmlformatter)
+- [\Consolidation\OutputFormatters\Formatters\YamlFormatter](#class-consolidationoutputformattersformattersyamlformatter)
+- [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
+- [\Consolidation\OutputFormatters\Options\OverrideOptionsInterface (interface)](#interface-consolidationoutputformattersoptionsoverrideoptionsinterface)
+- [\Consolidation\OutputFormatters\StructuredData\AbstractStructuredList (abstract)](#class-consolidationoutputformattersstructureddataabstractstructuredlist-abstract)
+- [\Consolidation\OutputFormatters\StructuredData\AssociativeList](#class-consolidationoutputformattersstructureddataassociativelist)
+- [\Consolidation\OutputFormatters\StructuredData\CallableRenderer](#class-consolidationoutputformattersstructureddatacallablerenderer)
+- [\Consolidation\OutputFormatters\StructuredData\ListDataInterface (interface)](#interface-consolidationoutputformattersstructureddatalistdatainterface)
+- [\Consolidation\OutputFormatters\StructuredData\OriginalDataInterface (interface)](#interface-consolidationoutputformattersstructureddataoriginaldatainterface)
+- [\Consolidation\OutputFormatters\StructuredData\PropertyList](#class-consolidationoutputformattersstructureddatapropertylist)
+- [\Consolidation\OutputFormatters\StructuredData\RenderCellCollectionInterface (interface)](#interface-consolidationoutputformattersstructureddatarendercellcollectioninterface)
+- [\Consolidation\OutputFormatters\StructuredData\RenderCellInterface (interface)](#interface-consolidationoutputformattersstructureddatarendercellinterface)
+- [\Consolidation\OutputFormatters\StructuredData\RestructureInterface (interface)](#interface-consolidationoutputformattersstructureddatarestructureinterface)
+- [\Consolidation\OutputFormatters\StructuredData\RowsOfFields](#class-consolidationoutputformattersstructureddatarowsoffields)
+- [\Consolidation\OutputFormatters\StructuredData\TableDataInterface (interface)](#interface-consolidationoutputformattersstructureddatatabledatainterface)
+- [\Consolidation\OutputFormatters\StructuredData\Xml\DomDataInterface (interface)](#interface-consolidationoutputformattersstructureddataxmldomdatainterface)
+- [\Consolidation\OutputFormatters\StructuredData\Xml\XmlSchema](#class-consolidationoutputformattersstructureddataxmlxmlschema)
+- [\Consolidation\OutputFormatters\StructuredData\Xml\XmlSchemaInterface (interface)](#interface-consolidationoutputformattersstructureddataxmlxmlschemainterface)
+- [\Consolidation\OutputFormatters\Transformations\DomToArraySimplifier](#class-consolidationoutputformatterstransformationsdomtoarraysimplifier)
+- [\Consolidation\OutputFormatters\Transformations\OverrideRestructureInterface (interface)](#interface-consolidationoutputformatterstransformationsoverriderestructureinterface)
+- [\Consolidation\OutputFormatters\Transformations\PropertyListTableTransformation](#class-consolidationoutputformatterstransformationspropertylisttabletransformation)
+- [\Consolidation\OutputFormatters\Transformations\PropertyParser](#class-consolidationoutputformatterstransformationspropertyparser)
+- [\Consolidation\OutputFormatters\Transformations\ReorderFields](#class-consolidationoutputformatterstransformationsreorderfields)
+- [\Consolidation\OutputFormatters\Transformations\SimplifyToArrayInterface (interface)](#interface-consolidationoutputformatterstransformationssimplifytoarrayinterface)
+- [\Consolidation\OutputFormatters\Transformations\TableTransformation](#class-consolidationoutputformatterstransformationstabletransformation)
+- [\Consolidation\OutputFormatters\Transformations\WordWrapper](#class-consolidationoutputformatterstransformationswordwrapper)
+- [\Consolidation\OutputFormatters\Validate\ValidationInterface (interface)](#interface-consolidationoutputformattersvalidatevalidationinterface)
+- [\Consolidation\OutputFormatters\Validate\ValidDataTypesInterface (interface)](#interface-consolidationoutputformattersvalidatevaliddatatypesinterface)
+
+
+### Class: \Consolidation\OutputFormatters\FormatterManager
+
+> Manage a collection of formatters; return one on request.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct() : void |
+| public | addDefaultFormatters() : void |
+| public | addDefaultSimplifiers() : void |
+| public | addFormatter(string $key, string/[\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter) : [\Consolidation\OutputFormatters\FormatterManager](#class-consolidationoutputformattersformattermanager)
Add a formatter |
+| public | addSimplifier([\Consolidation\OutputFormatters\Transformations\SimplifyToArrayInterface](#interface-consolidationoutputformatterstransformationssimplifytoarrayinterface) $simplifier) : [\Consolidation\OutputFormatters\FormatterManager](#class-consolidationoutputformattersformattermanager)
Add a simplifier |
+| public | automaticOptions([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options, mixed $dataType) : \Symfony\Component\Console\Input\InputOption[]
Return a set of InputOption based on the annotations of a command. |
+| public | getFormatter(string $format) : [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface)
Fetch the requested formatter. |
+| public | hasFormatter(mixed $format) : bool
Test to see if the stipulated format exists |
+| public | isValidDataType([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, [\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool |
+| public | isValidFormat([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, mixed $dataType) : bool |
+| public | overrideOptions([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
Allow the formatter to mess with the configuration options before any transformations et. al. get underway. |
+| public | overrideRestructure([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Allow the formatter access to the raw structured data prior to restructuring. For example, the 'list' formatter may wish to display the row keys when provided table output. If this function returns a result that does not evaluate to 'false', then that result will be used as-is, and restructuring and validation will not occur. |
+| public | renderData([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Render the data as necessary (e.g. to select or reorder fields). |
+| public | restructureData(mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Restructure the data as necessary (e.g. to select or reorder fields). |
+| public | validFormats(mixed $dataType) : array
Return the identifiers for all valid data types that have been registered. |
+| public | validateData([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Determine if the provided data is compatible with the formatter being used. |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, string $format, mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void
Format and write output |
+| protected | availableFieldsList(mixed $availableFields) : string[]
Given a list of available fields, return a list of field descriptions. |
+| protected | canSimplifyToArray([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $structuredOutput) : bool |
+| protected | simplifyToArray(mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+| protected | validateAndRestructure([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+
+
+### Class: \Consolidation\OutputFormatters\Exception\AbstractDataFormatException (abstract)
+
+> Contains some helper functions used by exceptions in this project.
+
+| Visibility | Function |
+|:-----------|:---------|
+| protected static | describeAllowedTypes(mixed $allowedTypes) : void |
+| protected static | describeDataType([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $data) : string
Return a description of the data type represented by the provided parameter. \ArrayObject is used as a proxy to mean an array primitive (or an ArrayObject). |
+| protected static | describeListOfAllowedTypes(mixed $allowedTypes) : void |
+
+*This class extends \Exception*
+
+*This class implements \Throwable*
+
+
+### Class: \Consolidation\OutputFormatters\Exception\IncompatibleDataException
+
+> Represents an incompatibility between the output data and selected formatter.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct([\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface) $formatter, mixed $data, mixed $allowedTypes) : void |
+
+*This class extends [\Consolidation\OutputFormatters\Exception\AbstractDataFormatException](#class-consolidationoutputformattersexceptionabstractdataformatexception-abstract)*
+
+*This class implements \Throwable*
+
+
+### Class: \Consolidation\OutputFormatters\Exception\InvalidFormatException
+
+> Represents an incompatibility between the output data and selected formatter.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(mixed $format, mixed $data, mixed $validFormats) : void |
+
+*This class extends [\Consolidation\OutputFormatters\Exception\AbstractDataFormatException](#class-consolidationoutputformattersexceptionabstractdataformatexception-abstract)*
+
+*This class implements \Throwable*
+
+
+### Class: \Consolidation\OutputFormatters\Exception\UnknownFieldException
+
+> Indicates that the requested format does not exist.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(mixed $field) : void |
+
+*This class extends \Exception*
+
+*This class implements \Throwable*
+
+
+### Class: \Consolidation\OutputFormatters\Exception\UnknownFormatException
+
+> Indicates that the requested format does not exist.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(mixed $format) : void |
+
+*This class extends \Exception*
+
+*This class implements \Throwable*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\CsvFormatter
+
+> Comma-separated value formatters Display the provided structured data in a comma-separated list. If there are multiple records provided, then they will be printed one per line. The primary data types accepted are RowsOfFields and PropertyList. The later behaves exactly like the former, save for the fact that it contains but a single row. This formmatter can also accept a PHP array; this is also interpreted as a single-row of data with no header.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | isValidDataType([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool
Return the list of data types acceptable to this formatter |
+| public | renderData(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Convert the contents of the output data just before it is to be printed, prior to output but after restructuring and validation. |
+| public | validDataTypes() : void |
+| public | validate(mixed $structuredData) : void |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+| protected | csvEscape(mixed $data, string $delimiter=`','`) : void |
+| protected | getDefaultFormatterOptions() : array
Return default values for formatter options |
+| protected | renderEachCell(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+| protected | writeOneLine(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, mixed $options) : void |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface), [\Consolidation\OutputFormatters\Validate\ValidDataTypesInterface](#interface-consolidationoutputformattersvalidatevaliddatatypesinterface), [\Consolidation\OutputFormatters\Validate\ValidationInterface](#interface-consolidationoutputformattersvalidatevalidationinterface), [\Consolidation\OutputFormatters\Formatters\RenderDataInterface](#interface-consolidationoutputformattersformattersrenderdatainterface)*
+
+
+### Interface: \Consolidation\OutputFormatters\Formatters\FormatterInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\JsonFormatter
+
+> Json formatter Convert an array or ArrayObject into Json.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\ListFormatter
+
+> Display the data in a simple list. This formatter prints a plain, unadorned list of data, with each data item appearing on a separate line. If you wish your list to contain headers, then use the table formatter, and wrap your data in an PropertyList.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | overrideRestructure(mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Select data to use directly from the structured output, before the restructure operation has been executed. |
+| public | renderData(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Convert the contents of the output data just before it is to be printed, prior to output but after restructuring and validation. |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+| protected | renderEachCell(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface), [\Consolidation\OutputFormatters\Transformations\OverrideRestructureInterface](#interface-consolidationoutputformatterstransformationsoverriderestructureinterface), [\Consolidation\OutputFormatters\Formatters\RenderDataInterface](#interface-consolidationoutputformattersformattersrenderdatainterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\PrintRFormatter
+
+> Print_r formatter Run provided date thruogh print_r.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface)*
+
+
+### Interface: \Consolidation\OutputFormatters\Formatters\RenderDataInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | renderData(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Convert the contents of the output data just before it is to be printed, prior to output but after restructuring and validation. |
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\SectionsFormatter
+
+> Display sections of data. This formatter takes data in the RowsOfFields data type. Each row represents one section; the data in each section is rendered in two columns, with the key in the first column and the value in the second column.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | isValidDataType([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool
Return the list of data types acceptable to this formatter |
+| public | renderData(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Convert the contents of the output data just before it is to be printed, prior to output but after restructuring and validation. |
+| public | validDataTypes() : void |
+| public | validate(mixed $structuredData) : mixed
Throw an IncompatibleDataException if the provided data cannot be processed by this formatter. Return the source data if it is valid. The data may be encapsulated or converted if necessary. |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+| protected | renderEachCell(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface), [\Consolidation\OutputFormatters\Validate\ValidDataTypesInterface](#interface-consolidationoutputformattersvalidatevaliddatatypesinterface), [\Consolidation\OutputFormatters\Validate\ValidationInterface](#interface-consolidationoutputformattersvalidatevalidationinterface), [\Consolidation\OutputFormatters\Formatters\RenderDataInterface](#interface-consolidationoutputformattersformattersrenderdatainterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\SerializeFormatter
+
+> Serialize formatter Run provided date thruogh serialize.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\StringFormatter
+
+> String formatter This formatter is used as the default action when no particular formatter is requested. It will print the provided data only if it is a string; if any other type is given, then nothing is printed.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | isValidDataType([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool
All data types are acceptable. |
+| public | overrideOptions(mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
Allow the formatter to mess with the configuration options before any transformations et. al. get underway. |
+| public | validate(mixed $structuredData) : void
Always validate any data, though. This format will never cause an error if it is selected for an incompatible data type; at worse, it simply does not print any data. |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+| protected | reduceToSigleFieldAndWrite(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void
If the data provided to a 'string' formatter is a table, then try to emit it as a TSV value. |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface), [\Consolidation\OutputFormatters\Validate\ValidationInterface](#interface-consolidationoutputformattersvalidatevalidationinterface), [\Consolidation\OutputFormatters\Options\OverrideOptionsInterface](#interface-consolidationoutputformattersoptionsoverrideoptionsinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\TableFormatter
+
+> Display a table of data with the Symfony Table class. This formatter takes data of either the RowsOfFields or PropertyList data type. Tables can be rendered with the rows running either vertically (the normal orientation) or horizontally. By default, associative lists will be displayed as two columns, with the key in the first column and the value in the second column.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct() : void |
+| public | isValidDataType([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool
Return the list of data types acceptable to this formatter |
+| public | renderData(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Convert the contents of the output data just before it is to be printed, prior to output but after restructuring and validation. |
+| public | validDataTypes() : void |
+| public | validate(mixed $structuredData) : mixed
Throw an IncompatibleDataException if the provided data cannot be processed by this formatter. Return the source data if it is valid. The data may be encapsulated or converted if necessary. |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+| protected static | addCustomTableStyles(mixed $table) : void
Add our custom table style(s) to the table. |
+| protected | renderEachCell(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+| protected | wrap(mixed $headers, array $data, \Symfony\Component\Console\Helper\TableStyle $tableStyle, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : array
Wrap the table data |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface), [\Consolidation\OutputFormatters\Validate\ValidDataTypesInterface](#interface-consolidationoutputformattersvalidatevaliddatatypesinterface), [\Consolidation\OutputFormatters\Validate\ValidationInterface](#interface-consolidationoutputformattersvalidatevalidationinterface), [\Consolidation\OutputFormatters\Formatters\RenderDataInterface](#interface-consolidationoutputformattersformattersrenderdatainterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\TsvFormatter
+
+> Tab-separated value formatters Display the provided structured data in a tab-separated list. Output escaping is much lighter, since there is no allowance for altering the delimiter.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | renderData(mixed $originalData, mixed $restructuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Convert the contents of the output data just before it is to be printed, prior to output but after restructuring and validation. |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+| protected | getDefaultFormatterOptions() : mixed |
+| protected | tsvEscape(mixed $data) : void |
+| protected | writeOneLine(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, mixed $options) : void |
+
+*This class extends [\Consolidation\OutputFormatters\Formatters\CsvFormatter](#class-consolidationoutputformattersformatterscsvformatter)*
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\RenderDataInterface](#interface-consolidationoutputformattersformattersrenderdatainterface), [\Consolidation\OutputFormatters\Validate\ValidationInterface](#interface-consolidationoutputformattersvalidatevalidationinterface), [\Consolidation\OutputFormatters\Validate\ValidDataTypesInterface](#interface-consolidationoutputformattersvalidatevaliddatatypesinterface), [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\VarExportFormatter
+
+> Var_export formatter Run provided date thruogh var_export.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\XmlFormatter
+
+> Display a table of data with the Symfony Table class. This formatter takes data of either the RowsOfFields or PropertyList data type. Tables can be rendered with the rows running either vertically (the normal orientation) or horizontally. By default, associative lists will be displayed as two columns, with the key in the first column and the value in the second column.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct() : void |
+| public | isValidDataType([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool
Return the list of data types acceptable to this formatter |
+| public | validDataTypes() : void |
+| public | validate(mixed $structuredData) : mixed
Throw an IncompatibleDataException if the provided data cannot be processed by this formatter. Return the source data if it is valid. The data may be encapsulated or converted if necessary. |
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface), [\Consolidation\OutputFormatters\Validate\ValidDataTypesInterface](#interface-consolidationoutputformattersvalidatevaliddatatypesinterface), [\Consolidation\OutputFormatters\Validate\ValidationInterface](#interface-consolidationoutputformattersvalidatevalidationinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Formatters\YamlFormatter
+
+> Yaml formatter Convert an array or ArrayObject into Yaml.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | write(\Symfony\Component\Console\Output\OutputInterface $output, mixed $data, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : string
Given structured data, apply appropriate formatting, and return a printable string. |
+
+*This class implements [\Consolidation\OutputFormatters\Formatters\FormatterInterface](#interface-consolidationoutputformattersformattersformatterinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Options\FormatterOptions
+
+> FormetterOptions holds information that affects the way a formatter renders its output. There are three places where a formatter might get options from: 1. Configuration associated with the command that produced the output. This is passed in to FormatterManager::write() along with the data to format. It might originally come from annotations on the command, or it might come from another source. Examples include the field labels for a table, or the default list of fields to display. 2. Options specified by the user, e.g. by commandline options. 3. Default values associated with the formatter itself. This class caches configuration from sources (1) and (2), and expects to be provided the defaults, (3), whenever a value is requested.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(array $configurationData=array(), array $options=array()) : void
Create a new FormatterOptions with the configuration data and the user-specified options for this request. |
+| public | get(string $key, array $defaults=array(), bool/mixed $default=false) : mixed
Get a formatter option |
+| public | getConfigurationData() : array
Return a reference to the configuration data for this object. |
+| public | getFormat(array $defaults=array()) : string
Determine the format that was requested by the caller. |
+| public | getInputOptions(array $defaults) : array
Return all of the options from the provided $defaults array that exist in our InputInterface object. |
+| public | getOptions() : array
Return a reference to the user-specified options for this request. |
+| public | getXmlSchema() : [\Consolidation\OutputFormatters\StructuredData\Xml\XmlSchema](#class-consolidationoutputformattersstructureddataxmlxmlschema)
Return the XmlSchema to use with --format=xml for data types that support that. This is used when an array needs to be converted into xml. |
+| public | override(array $configurationData) : [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
Create a new FormatterOptions object with new configuration data (provided), and the same options data as this instance. |
+| public | parsePropertyList(string $value) : array
Convert from a textual list to an array |
+| public | setConfigurationData(array $configurationData) : [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
Change the configuration data for this formatter options object. |
+| public | setConfigurationDefault(string $key, mixed $value) : \Consolidation\OutputFormatters\Options\FormetterOptions
Change one configuration value for this formatter option, but only if it does not already have a value set. |
+| public | setDefaultFields(mixed $fields) : void |
+| public | setDefaultStringField(mixed $defaultStringField) : void |
+| public | setFieldLabels(mixed $fieldLabels) : void |
+| public | setIncludeFieldLables(mixed $includFieldLables) : void |
+| public | setInput(\Symfony\Component\Console\Input\InputInterface $input) : \Consolidation\OutputFormatters\Options\type
Provide a Symfony Console InputInterface containing the user-specified options for this request. |
+| public | setListOrientation(mixed $listOrientation) : void |
+| public | setOption(string $key, mixed $value) : [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
Change one option value specified by the user for this request. |
+| public | setOptions(array $options) : [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
Set all of the options that were specified by the user for this request. |
+| public | setRowLabels(mixed $rowLabels) : void |
+| public | setTableStyle(mixed $style) : void |
+| public | setWidth(mixed $width) : void |
+| protected | defaultsForKey(string $key, array $defaults, bool $default=false) : array
Reduce provided defaults to the single item identified by '$key', if it exists, or an empty array otherwise. |
+| protected | fetch(string $key, array $defaults=array(), bool/mixed $default=false) : mixed
Look up a key, and return its raw value. |
+| protected | fetchRawValues(array $defaults=array()) : array
Look up all of the items associated with the provided defaults. |
+| protected | getOptionFormat(string $key) : string
Given a specific key, return the class method name of the parsing method for data stored under this key. |
+| protected | parse(string $key, mixed $value) : mixed
Given the raw value for a specific key, do any type conversion (e.g. from a textual list to an array) needed for the data. |
+| protected | setConfigurationValue(string $key, mixed $value) : \Consolidation\OutputFormatters\Options\FormetterOptions
Change one configuration value for this formatter option. |
+
+
+### Interface: \Consolidation\OutputFormatters\Options\OverrideOptionsInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | overrideOptions(mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions)
Allow the formatter to mess with the configuration options before any transformations et. al. get underway. |
+
+
+### Class: \Consolidation\OutputFormatters\StructuredData\AbstractStructuredList (abstract)
+
+> Holds an array where each element of the array is one row, and each row contains an associative array where the keys are the field names, and the values are the field data. It is presumed that every row contains the same keys.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(mixed $data) : void |
+| public | addRenderer([\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface) $renderer, string $priority=`'normal'`) : \Consolidation\OutputFormatters\StructuredData\$this
Add a renderer |
+| public | addRendererFunction(\callable $rendererFn, string $priority=`'normal'`) : \Consolidation\OutputFormatters\StructuredData\$this
Add a callable as a renderer |
+| public | abstract getListData([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed |
+| public | renderCell(mixed $key, mixed $cellData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options, mixed $rowData) : void |
+| public | abstract restructure([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+| protected | createTableTransformation(mixed $data, mixed $options) : mixed |
+| protected | defaultOptions() : array
A structured list may provide its own set of default options. These will be used in place of the command's default options (from the annotations) in instances where the user does not provide the options explicitly (on the commandline) or implicitly (via a configuration file). |
+| protected | getFields(mixed $options, mixed $defaults) : mixed |
+| protected | getReorderedFieldLabels(mixed $data, mixed $options, mixed $defaults) : mixed |
+| protected | instantiateTableTransformation(mixed $data, mixed $fieldLabels, mixed $rowLabels) : void |
+
+*This class extends \ArrayObject*
+
+*This class implements \Countable, \Serializable, \ArrayAccess, \Traversable, \IteratorAggregate, [\Consolidation\OutputFormatters\StructuredData\RestructureInterface](#interface-consolidationoutputformattersstructureddatarestructureinterface), [\Consolidation\OutputFormatters\StructuredData\ListDataInterface](#interface-consolidationoutputformattersstructureddatalistdatainterface), [\Consolidation\OutputFormatters\StructuredData\RenderCellCollectionInterface](#interface-consolidationoutputformattersstructureddatarendercellcollectioninterface), [\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\StructuredData\AssociativeList
+
+> Old name for PropertyList class.
+
+| Visibility | Function |
+|:-----------|:---------|
+
+*This class extends [\Consolidation\OutputFormatters\StructuredData\PropertyList](#class-consolidationoutputformattersstructureddatapropertylist)*
+
+*This class implements \Countable, \Serializable, \ArrayAccess, \Traversable, \IteratorAggregate, [\Consolidation\OutputFormatters\StructuredData\RestructureInterface](#interface-consolidationoutputformattersstructureddatarestructureinterface), [\Consolidation\OutputFormatters\StructuredData\ListDataInterface](#interface-consolidationoutputformattersstructureddatalistdatainterface), [\Consolidation\OutputFormatters\StructuredData\RenderCellCollectionInterface](#interface-consolidationoutputformattersstructureddatarendercellcollectioninterface), [\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface)*
+
+
+### Class: \Consolidation\OutputFormatters\StructuredData\CallableRenderer
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(\callable $renderFunction) : void |
+| public | renderCell(mixed $key, mixed $cellData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options, mixed $rowData) : void |
+
+*This class implements [\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface)*
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\ListDataInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | getListData([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : array
Convert data to a format suitable for use in a list. By default, the array values will be used. Implement ListDataInterface to use some other criteria (e.g. array keys). |
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\OriginalDataInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | getOriginalData() : mixed
Return the original data for this table. Used by any formatter that expects an array. |
+
+
+### Class: \Consolidation\OutputFormatters\StructuredData\PropertyList
+
+> Holds an array where each element of the array is one key : value pair. The keys must be unique, as is typically the case for associative arrays.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | getListData([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed |
+| public | restructure([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : \Consolidation\OutputFormatters\StructuredData\Consolidation\OutputFormatters\Transformations\TableTransformation
Restructure this data for output by converting it into a table transformation object. |
+| protected | defaultOptions() : void |
+| protected | instantiateTableTransformation(mixed $data, mixed $fieldLabels, mixed $rowLabels) : void |
+
+*This class extends [\Consolidation\OutputFormatters\StructuredData\AbstractStructuredList](#class-consolidationoutputformattersstructureddataabstractstructuredlist-abstract)*
+
+*This class implements [\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface), [\Consolidation\OutputFormatters\StructuredData\RenderCellCollectionInterface](#interface-consolidationoutputformattersstructureddatarendercellcollectioninterface), [\Consolidation\OutputFormatters\StructuredData\ListDataInterface](#interface-consolidationoutputformattersstructureddatalistdatainterface), [\Consolidation\OutputFormatters\StructuredData\RestructureInterface](#interface-consolidationoutputformattersstructureddatarestructureinterface), \IteratorAggregate, \Traversable, \ArrayAccess, \Serializable, \Countable*
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\RenderCellCollectionInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | addRenderer([\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface) $renderer) : \Consolidation\OutputFormatters\StructuredData\$this
Add a renderer |
+
+*This class implements [\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface)*
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\RenderCellInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | renderCell(string $key, mixed $cellData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options, array $rowData) : mixed
Convert the contents of one table cell into a string, so that it may be placed in the table. Renderer should return the $cellData passed to it if it does not wish to process it. |
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\RestructureInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | restructure([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void
Allow structured data to be restructured -- i.e. to select fields to show, reorder fields, etc. |
+
+
+### Class: \Consolidation\OutputFormatters\StructuredData\RowsOfFields
+
+> Holds an array where each element of the array is one row, and each row contains an associative array where the keys are the field names, and the values are the field data. It is presumed that every row contains the same keys.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | getListData([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed |
+| public | restructure([\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : \Consolidation\OutputFormatters\StructuredData\Consolidation\OutputFormatters\Transformations\TableTransformation
Restructure this data for output by converting it into a table transformation object. |
+| protected | defaultOptions() : void |
+
+*This class extends [\Consolidation\OutputFormatters\StructuredData\AbstractStructuredList](#class-consolidationoutputformattersstructureddataabstractstructuredlist-abstract)*
+
+*This class implements [\Consolidation\OutputFormatters\StructuredData\RenderCellInterface](#interface-consolidationoutputformattersstructureddatarendercellinterface), [\Consolidation\OutputFormatters\StructuredData\RenderCellCollectionInterface](#interface-consolidationoutputformattersstructureddatarendercellcollectioninterface), [\Consolidation\OutputFormatters\StructuredData\ListDataInterface](#interface-consolidationoutputformattersstructureddatalistdatainterface), [\Consolidation\OutputFormatters\StructuredData\RestructureInterface](#interface-consolidationoutputformattersstructureddatarestructureinterface), \IteratorAggregate, \Traversable, \ArrayAccess, \Serializable, \Countable*
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\TableDataInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | getOriginalData() : mixed
Return the original data for this table. Used by any formatter that is -not- a table. |
+| public | getTableData(bool/boolean $includeRowKey=false) : array
Convert structured data into a form suitable for use by the table formatter. key from each row. |
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\Xml\DomDataInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | getDomData() : [\DomDocument](http://php.net/manual/en/class.domdocument.php)
Convert data into a \DomDocument. |
+
+
+### Class: \Consolidation\OutputFormatters\StructuredData\Xml\XmlSchema
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(array $elementList=array()) : void |
+| public | arrayToXML(mixed $structuredData) : void |
+| protected | addXmlChildren([\DOMDocument](http://php.net/manual/en/class.domdocument.php) $dom, mixed $xmlParent, mixed $elementName, mixed $structuredData) : void |
+| protected | addXmlData([\DOMDocument](http://php.net/manual/en/class.domdocument.php) $dom, mixed $xmlParent, mixed $elementName, mixed $structuredData) : void |
+| protected | addXmlDataOrAttribute([\DOMDocument](http://php.net/manual/en/class.domdocument.php) $dom, mixed $xmlParent, mixed $elementName, mixed $key, mixed $value) : void |
+| protected | getDefaultElementName(mixed $parentElementName) : mixed |
+| protected | getTopLevelElementName(mixed $structuredData) : mixed |
+| protected | inElementList(mixed $parentElementName, mixed $elementName) : void |
+| protected | isAssoc(mixed $data) : bool |
+| protected | isAttribute(mixed $parentElementName, mixed $elementName, mixed $value) : bool |
+| protected | singularForm(mixed $name) : void |
+
+*This class implements [\Consolidation\OutputFormatters\StructuredData\Xml\XmlSchemaInterface](#interface-consolidationoutputformattersstructureddataxmlxmlschemainterface)*
+
+
+### Interface: \Consolidation\OutputFormatters\StructuredData\Xml\XmlSchemaInterface
+
+> When using arrays, we could represent XML data in a number of different ways. For example, given the following XML data strucutre: blah a b c This could be: [ 'id' => 1, 'name' => 'doc', 'foobars' => [ [ 'id' => '123', 'name' => 'blah', 'widgets' => [ [ 'foo' => 'a', 'bar' => 'b', 'baz' => 'c', ] ], ], ] ] The challenge is more in going from an array back to the more structured xml format. Note that any given key => string mapping could represent either an attribute, or a simple XML element containing only a string value. In general, we do *not* want to add extra layers of nesting in the data structure to disambiguate between these kinds of data, as we want the source data to render cleanly into other formats, e.g. yaml, json, et. al., and we do not want to force every data provider to have to consider the optimal xml schema for their data. Our strategy, therefore, is to expect clients that wish to provide a very specific xml representation to return a DOMDocument, and, for other data structures where xml is a secondary concern, then we will use some default heuristics to convert from arrays to xml.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | arrayToXml(mixed $structuredData) : [\DOMDocument](http://php.net/manual/en/class.domdocument.php)
Convert data to a format suitable for use in a list. By default, the array values will be used. Implement ListDataInterface to use some other criteria (e.g. array keys). |
+
+
+### Class: \Consolidation\OutputFormatters\Transformations\DomToArraySimplifier
+
+> Simplify a DOMDocument to an array.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct() : void |
+| public | canSimplify([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool |
+| public | simplifyToArray(mixed $structuredData, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : void |
+| protected | elementToArray([\DOMNode](http://php.net/manual/en/class.domnode.php) $element) : array
Recursively convert the provided DOM element into a php array. |
+| protected | getNodeAttributes([\DOMNode](http://php.net/manual/en/class.domnode.php) $element) : array
Get all of the attributes of the provided element. |
+| protected | getNodeChildren([\DOMNode](http://php.net/manual/en/class.domnode.php) $element) : array
Get all of the children of the provided element, with simplification. |
+| protected | getNodeChildrenData([\DOMNode](http://php.net/manual/en/class.domnode.php) $element) : array
Get the data from the children of the provided node in preliminary form. |
+| protected | getUniformChildren(string $parentKey, [\DOMNode](http://php.net/manual/en/class.domnode.php) $element) : array
Convert the children of the provided DOM element into an array. Here, 'uniform' means that all of the element names of the children are identical, and further, the element name of the parent is the plural form of the child names. When the children are uniform in this way, then the parent element name will be used as the key to store the children in, and the child list will be returned as a simple list with their (duplicate) element names omitted. |
+| protected | getUniqueChildren(string $parentKey, [\DOMNode](http://php.net/manual/en/class.domnode.php) $element) : array
Convert the children of the provided DOM element into an array. Here, 'unique' means that all of the element names of the children are different. Since the element names will become the key of the associative array that is returned, so duplicates are not supported. If there are any duplicates, then an exception will be thrown. |
+| protected | hasUniformChildren([\DOMNode](http://php.net/manual/en/class.domnode.php) $element) : boolean
Determine whether the children of the provided element are uniform. |
+| protected | valueCanBeSimplified([\DOMNode](http://php.net/manual/en/class.domnode.php) $value) : boolean
Determine whether the provided value has additional unnecessary nesting. {"color": "red"} is converted to "red". No other simplification is done. |
+
+*This class implements [\Consolidation\OutputFormatters\Transformations\SimplifyToArrayInterface](#interface-consolidationoutputformatterstransformationssimplifytoarrayinterface)*
+
+
+### Interface: \Consolidation\OutputFormatters\Transformations\OverrideRestructureInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | overrideRestructure(mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : mixed
Select data to use directly from the structured output, before the restructure operation has been executed. |
+
+
+### Class: \Consolidation\OutputFormatters\Transformations\PropertyListTableTransformation
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | getOriginalData() : mixed |
+
+*This class extends [\Consolidation\OutputFormatters\Transformations\TableTransformation](#class-consolidationoutputformatterstransformationstabletransformation)*
+
+*This class implements [\Consolidation\OutputFormatters\StructuredData\OriginalDataInterface](#interface-consolidationoutputformattersstructureddataoriginaldatainterface), [\Consolidation\OutputFormatters\StructuredData\TableDataInterface](#interface-consolidationoutputformattersstructureddatatabledatainterface), \IteratorAggregate, \Traversable, \ArrayAccess, \Serializable, \Countable*
+
+
+### Class: \Consolidation\OutputFormatters\Transformations\PropertyParser
+
+> Transform a string of properties into a PHP associative array. Input: one: red two: white three: blue Output: [ 'one' => 'red', 'two' => 'white', 'three' => 'blue', ]
+
+| Visibility | Function |
+|:-----------|:---------|
+| public static | parse(mixed $data) : void |
+
+
+### Class: \Consolidation\OutputFormatters\Transformations\ReorderFields
+
+> Reorder the field labels based on the user-selected fields to display.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | reorder(string/array $fields, array $fieldLabels, array $data) : array
Given a simple list of user-supplied field keys or field labels, return a reordered version of the field labels matching the user selection. key to the field label |
+| protected | convertToRegex(mixed $str) : void
Convert the provided string into a regex suitable for use in preg_match. Matching occurs in the same way as the Symfony Finder component: http://symfony.com/doc/current/components/finder.html#file-name |
+| protected | getSelectedFieldKeys(mixed $fields, mixed $fieldLabels) : mixed |
+| protected | isRegex(string $str) : bool Whether the given string is a regex
Checks whether the string is a regex. This function is copied from MultiplePcreFilterIterator in the Symfony Finder component. |
+| protected | matchFieldInLabelMap(mixed $field, mixed $fieldLabels) : void |
+| protected | reorderFieldLabels(mixed $fields, mixed $fieldLabels, mixed $data) : void |
+
+
+### Interface: \Consolidation\OutputFormatters\Transformations\SimplifyToArrayInterface
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | canSimplify([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $structuredOutput) : bool
Indicate whether or not the given data type can be simplified to an array |
+| public | simplifyToArray(mixed $structuredOutput, [\Consolidation\OutputFormatters\Options\FormatterOptions](#class-consolidationoutputformattersoptionsformatteroptions) $options) : array
Convert structured data into a generic array, usable by generic array-based formatters. Objects that implement this interface may be attached to the FormatterManager, and will be used on any data structure that needs to be simplified into an array. An array simplifier should take no action other than to return its input data if it cannot simplify the provided data into an array. |
+
+
+### Class: \Consolidation\OutputFormatters\Transformations\TableTransformation
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(mixed $data, mixed $fieldLabels, array $rowLabels=array()) : void |
+| public | getHeader(mixed $key) : mixed |
+| public | getHeaders() : mixed |
+| public | getLayout() : mixed |
+| public | getOriginalData() : mixed |
+| public | getRowLabel(mixed $rowid) : mixed |
+| public | getRowLabels() : mixed |
+| public | getTableData(bool $includeRowKey=false) : mixed |
+| public | isList() : bool |
+| public | setLayout(mixed $layout) : void |
+| protected | convertTableToList() : void |
+| protected | getRowDataWithKey(mixed $data) : mixed |
+| protected static | transformRow(mixed $row, mixed $fieldLabels) : void |
+| protected static | transformRows(mixed $data, mixed $fieldLabels) : void |
+
+*This class extends \ArrayObject*
+
+*This class implements \Countable, \Serializable, \ArrayAccess, \Traversable, \IteratorAggregate, [\Consolidation\OutputFormatters\StructuredData\TableDataInterface](#interface-consolidationoutputformattersstructureddatatabledatainterface), [\Consolidation\OutputFormatters\StructuredData\OriginalDataInterface](#interface-consolidationoutputformattersstructureddataoriginaldatainterface)*
+
+
+### Class: \Consolidation\OutputFormatters\Transformations\WordWrapper
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | __construct(mixed $width) : void |
+| public | setMinimumWidths(array $minimumWidths) : void
If columns have minimum widths, then set them here. |
+| public | setPaddingFromStyle(\Symfony\Component\Console\Helper\TableStyle $style) : void
Calculate our padding widths from the specified table style. |
+| public | wrap(array $rows, array $widths=array()) : array
Wrap the cells in each part of the provided data table |
+| protected | columnAutowidth(array $rows, array $widths) : void
Determine the best fit for column widths. Ported from Drush. (in characters) - these will be left as is. |
+| protected static | longestWordLength(string $str) : int
Return the length of the longest word in the string. |
+| protected | selectColumnToReduce(mixed $col_dist, mixed $auto_widths, mixed $max_word_lens) : void |
+| protected | shouldSelectThisColumn(mixed $count, mixed $counts, mixed $width) : bool |
+| protected | wrapCell(mixed $cell, string $cellWidth) : mixed
Wrap one cell. Guard against modifying non-strings and then call through to wordwrap(). |
+
+
+### Interface: \Consolidation\OutputFormatters\Validate\ValidationInterface
+
+> Formatters may implement ValidationInterface in order to indicate whether a particular data structure is supported. Any formatter that does not implement ValidationInterface is assumed to only operate on arrays, or data types that implement SimplifyToArrayInterface.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | isValidDataType([\ReflectionClass](http://php.net/manual/en/class.reflectionclass.php) $dataType) : bool
Return true if the specified format is valid for use with this formatter. |
+| public | validate(mixed $structuredData) : mixed
Throw an IncompatibleDataException if the provided data cannot be processed by this formatter. Return the source data if it is valid. The data may be encapsulated or converted if necessary. |
+
+
+### Interface: \Consolidation\OutputFormatters\Validate\ValidDataTypesInterface
+
+> Formatters may implement ValidDataTypesInterface in order to indicate exactly which formats they support. The validDataTypes method can be called to retrieve a list of data types useful in providing hints in exception messages about which data types can be used with the formatter. Note that it is OPTIONAL for formatters to implement this interface. If a formatter implements only ValidationInterface, then clients that request the formatter via FormatterManager::write() will still get a list (via an InvalidFormatException) of all of the formats that are usable with the provided data type. Implementing ValidDataTypesInterface is benefitial to clients who instantiate a formatter directly (via `new`). Formatters that implement ValidDataTypesInterface may wish to use ValidDataTypesTrait.
+
+| Visibility | Function |
+|:-----------|:---------|
+| public | validDataTypes() : [\ReflectionClass[]](http://php.net/manual/en/class.reflectionclass.php)
Return the list of data types acceptable to this formatter |
+
+*This class implements [\Consolidation\OutputFormatters\Validate\ValidationInterface](#interface-consolidationoutputformattersvalidatevalidationinterface)*
+
diff --git a/src/composer/vendor/consolidation/output-formatters/docs/index.md b/src/composer/vendor/consolidation/output-formatters/docs/index.md
new file mode 100644
index 00000000..385392d1
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/docs/index.md
@@ -0,0 +1,3 @@
+# Consolidation Output Formatters
+
+This is a placeholder for the output formatters documentation.
diff --git a/src/composer/vendor/consolidation/output-formatters/mkdocs.yml b/src/composer/vendor/consolidation/output-formatters/mkdocs.yml
new file mode 100644
index 00000000..4f36f2fa
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/mkdocs.yml
@@ -0,0 +1,7 @@
+site_name: Consolidation Output Formatters docs
+theme: readthedocs
+repo_url: https://github.com/consolidation/output-formatters
+include_search: true
+pages:
+- Home: index.md
+- API: api.md
diff --git a/src/composer/vendor/consolidation/output-formatters/phpunit.xml.dist b/src/composer/vendor/consolidation/output-formatters/phpunit.xml.dist
new file mode 100644
index 00000000..6f1cce7d
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/phpunit.xml.dist
@@ -0,0 +1,29 @@
+
+
+
+ tests
+
+
+
+
+
+
+
+
+ src
+
+ FormatterInterface.php.php
+ OverrideRestructureInterface.php.php
+ RestructureInterface.php.php
+ ValidationInterface.php
+ Formatters/RenderDataInterface.php
+ StructuredData/ListDataInterface.php.php
+ StructuredData/RenderCellInterface.php.php
+ StructuredData/TableDataInterface.php.php
+
+
+
+
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Exception/AbstractDataFormatException.php b/src/composer/vendor/consolidation/output-formatters/src/Exception/AbstractDataFormatException.php
new file mode 100644
index 00000000..fa29b1dd
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Exception/AbstractDataFormatException.php
@@ -0,0 +1,57 @@
+getName() == 'ArrayObject')) {
+ return 'an array';
+ }
+ return 'an instance of ' . $data->getName();
+ }
+ if (is_string($data)) {
+ return 'a string';
+ }
+ if (is_object($data)) {
+ return 'an instance of ' . get_class($data);
+ }
+ throw new \Exception("Undescribable data error: " . var_export($data, true));
+ }
+
+ protected static function describeAllowedTypes($allowedTypes)
+ {
+ if (is_array($allowedTypes) && !empty($allowedTypes)) {
+ if (count($allowedTypes) > 1) {
+ return static::describeListOfAllowedTypes($allowedTypes);
+ }
+ $allowedTypes = $allowedTypes[0];
+ }
+ return static::describeDataType($allowedTypes);
+ }
+
+ protected static function describeListOfAllowedTypes($allowedTypes)
+ {
+ $descriptions = [];
+ foreach ($allowedTypes as $oneAllowedType) {
+ $descriptions[] = static::describeDataType($oneAllowedType);
+ }
+ if (count($descriptions) == 2) {
+ return "either {$descriptions[0]} or {$descriptions[1]}";
+ }
+ $lastDescription = array_pop($descriptions);
+ $otherDescriptions = implode(', ', $descriptions);
+ return "one of $otherDescriptions or $lastDescription";
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Exception/IncompatibleDataException.php b/src/composer/vendor/consolidation/output-formatters/src/Exception/IncompatibleDataException.php
new file mode 100644
index 00000000..ca13a65f
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Exception/IncompatibleDataException.php
@@ -0,0 +1,19 @@
+ '\Consolidation\OutputFormatters\Formatters\StringFormatter',
+ 'yaml' => '\Consolidation\OutputFormatters\Formatters\YamlFormatter',
+ 'xml' => '\Consolidation\OutputFormatters\Formatters\XmlFormatter',
+ 'json' => '\Consolidation\OutputFormatters\Formatters\JsonFormatter',
+ 'print-r' => '\Consolidation\OutputFormatters\Formatters\PrintRFormatter',
+ 'php' => '\Consolidation\OutputFormatters\Formatters\SerializeFormatter',
+ 'var_export' => '\Consolidation\OutputFormatters\Formatters\VarExportFormatter',
+ 'list' => '\Consolidation\OutputFormatters\Formatters\ListFormatter',
+ 'csv' => '\Consolidation\OutputFormatters\Formatters\CsvFormatter',
+ 'tsv' => '\Consolidation\OutputFormatters\Formatters\TsvFormatter',
+ 'table' => '\Consolidation\OutputFormatters\Formatters\TableFormatter',
+ 'sections' => '\Consolidation\OutputFormatters\Formatters\SectionsFormatter',
+ ];
+ foreach ($defaultFormatters as $id => $formatterClassname) {
+ $formatter = new $formatterClassname;
+ $this->addFormatter($id, $formatter);
+ }
+ $this->addFormatter('', $this->formatters['string']);
+ }
+
+ public function addDefaultSimplifiers()
+ {
+ // Add our default array simplifier (DOMDocument to array)
+ $this->addSimplifier(new DomToArraySimplifier());
+ }
+
+ /**
+ * Add a formatter
+ *
+ * @param string $key the identifier of the formatter to add
+ * @param string $formatter the class name of the formatter to add
+ * @return FormatterManager
+ */
+ public function addFormatter($key, FormatterInterface $formatter)
+ {
+ $this->formatters[$key] = $formatter;
+ return $this;
+ }
+
+ /**
+ * Add a simplifier
+ *
+ * @param SimplifyToArrayInterface $simplifier the array simplifier to add
+ * @return FormatterManager
+ */
+ public function addSimplifier(SimplifyToArrayInterface $simplifier)
+ {
+ $this->arraySimplifiers[] = $simplifier;
+ return $this;
+ }
+
+ /**
+ * Return a set of InputOption based on the annotations of a command.
+ * @param FormatterOptions $options
+ * @return InputOption[]
+ */
+ public function automaticOptions(FormatterOptions $options, $dataType)
+ {
+ $automaticOptions = [];
+
+ // At the moment, we only support automatic options for --format
+ // and --fields, so exit if the command returns no data.
+ if (!isset($dataType)) {
+ return [];
+ }
+
+ $validFormats = $this->validFormats($dataType);
+ if (empty($validFormats)) {
+ return [];
+ }
+
+ $availableFields = $options->get(FormatterOptions::FIELD_LABELS);
+ $hasDefaultStringField = $options->get(FormatterOptions::DEFAULT_STRING_FIELD);
+ $defaultFormat = $hasDefaultStringField ? 'string' : ($availableFields ? 'table' : 'yaml');
+
+ if (count($validFormats) > 1) {
+ // Make an input option for --format
+ $description = 'Format the result data. Available formats: ' . implode(',', $validFormats);
+ $automaticOptions[FormatterOptions::FORMAT] = new InputOption(FormatterOptions::FORMAT, '', InputOption::VALUE_OPTIONAL, $description, $defaultFormat);
+ }
+
+ if ($availableFields) {
+ $defaultFields = $options->get(FormatterOptions::DEFAULT_FIELDS, [], '');
+ $description = 'Available fields: ' . implode(', ', $this->availableFieldsList($availableFields));
+ $automaticOptions[FormatterOptions::FIELDS] = new InputOption(FormatterOptions::FIELDS, '', InputOption::VALUE_OPTIONAL, $description, $defaultFields);
+ $automaticOptions[FormatterOptions::FIELD] = new InputOption(FormatterOptions::FIELD, '', InputOption::VALUE_OPTIONAL, "Select just one field, and force format to 'string'.", '');
+ }
+
+ return $automaticOptions;
+ }
+
+ /**
+ * Given a list of available fields, return a list of field descriptions.
+ * @return string[]
+ */
+ protected function availableFieldsList($availableFields)
+ {
+ return array_map(
+ function ($key) use ($availableFields) {
+ return $availableFields[$key] . " ($key)";
+ },
+ array_keys($availableFields)
+ );
+ }
+
+ /**
+ * Return the identifiers for all valid data types that have been registered.
+ *
+ * @param mixed $dataType \ReflectionObject or other description of the produced data type
+ * @return array
+ */
+ public function validFormats($dataType)
+ {
+ $validFormats = [];
+ foreach ($this->formatters as $formatId => $formatterName) {
+ $formatter = $this->getFormatter($formatId);
+ if (!empty($formatId) && $this->isValidFormat($formatter, $dataType)) {
+ $validFormats[] = $formatId;
+ }
+ }
+ sort($validFormats);
+ return $validFormats;
+ }
+
+ public function isValidFormat(FormatterInterface $formatter, $dataType)
+ {
+ if (is_array($dataType)) {
+ $dataType = new \ReflectionClass('\ArrayObject');
+ }
+ if (!is_object($dataType) && !class_exists($dataType)) {
+ return false;
+ }
+ if (!$dataType instanceof \ReflectionClass) {
+ $dataType = new \ReflectionClass($dataType);
+ }
+ return $this->isValidDataType($formatter, $dataType);
+ }
+
+ public function isValidDataType(FormatterInterface $formatter, \ReflectionClass $dataType)
+ {
+ if ($this->canSimplifyToArray($dataType)) {
+ if ($this->isValidFormat($formatter, [])) {
+ return true;
+ }
+ }
+ // If the formatter does not implement ValidationInterface, then
+ // it is presumed that the formatter only accepts arrays.
+ if (!$formatter instanceof ValidationInterface) {
+ return $dataType->isSubclassOf('ArrayObject') || ($dataType->getName() == 'ArrayObject');
+ }
+ return $formatter->isValidDataType($dataType);
+ }
+
+ /**
+ * Format and write output
+ *
+ * @param OutputInterface $output Output stream to write to
+ * @param string $format Data format to output in
+ * @param mixed $structuredOutput Data to output
+ * @param FormatterOptions $options Formatting options
+ */
+ public function write(OutputInterface $output, $format, $structuredOutput, FormatterOptions $options)
+ {
+ $formatter = $this->getFormatter((string)$format);
+ if (!is_string($structuredOutput) && !$this->isValidFormat($formatter, $structuredOutput)) {
+ $validFormats = $this->validFormats($structuredOutput);
+ throw new InvalidFormatException((string)$format, $structuredOutput, $validFormats);
+ }
+ // Give the formatter a chance to override the options
+ $options = $this->overrideOptions($formatter, $structuredOutput, $options);
+ $structuredOutput = $this->validateAndRestructure($formatter, $structuredOutput, $options);
+ $formatter->write($output, $structuredOutput, $options);
+ }
+
+ protected function validateAndRestructure(FormatterInterface $formatter, $structuredOutput, FormatterOptions $options)
+ {
+ // Give the formatter a chance to do something with the
+ // raw data before it is restructured.
+ $overrideRestructure = $this->overrideRestructure($formatter, $structuredOutput, $options);
+ if ($overrideRestructure) {
+ return $overrideRestructure;
+ }
+
+ // Restructure the output data (e.g. select fields to display, etc.).
+ $restructuredOutput = $this->restructureData($structuredOutput, $options);
+
+ // Make sure that the provided data is in the correct format for the selected formatter.
+ $restructuredOutput = $this->validateData($formatter, $restructuredOutput, $options);
+
+ // Give the original data a chance to re-render the structured
+ // output after it has been restructured and validated.
+ $restructuredOutput = $this->renderData($formatter, $structuredOutput, $restructuredOutput, $options);
+
+ return $restructuredOutput;
+ }
+
+ /**
+ * Fetch the requested formatter.
+ *
+ * @param string $format Identifier for requested formatter
+ * @return FormatterInterface
+ */
+ public function getFormatter($format)
+ {
+ // The client must inject at least one formatter before asking for
+ // any formatters; if not, we will provide all of the usual defaults
+ // as a convenience.
+ if (empty($this->formatters)) {
+ $this->addDefaultFormatters();
+ $this->addDefaultSimplifiers();
+ }
+ if (!$this->hasFormatter($format)) {
+ throw new UnknownFormatException($format);
+ }
+ $formatter = $this->formatters[$format];
+ return $formatter;
+ }
+
+ /**
+ * Test to see if the stipulated format exists
+ */
+ public function hasFormatter($format)
+ {
+ return array_key_exists($format, $this->formatters);
+ }
+
+ /**
+ * Render the data as necessary (e.g. to select or reorder fields).
+ *
+ * @param FormatterInterface $formatter
+ * @param mixed $originalData
+ * @param mixed $restructuredData
+ * @param FormatterOptions $options Formatting options
+ * @return mixed
+ */
+ public function renderData(FormatterInterface $formatter, $originalData, $restructuredData, FormatterOptions $options)
+ {
+ if ($formatter instanceof RenderDataInterface) {
+ return $formatter->renderData($originalData, $restructuredData, $options);
+ }
+ return $restructuredData;
+ }
+
+ /**
+ * Determine if the provided data is compatible with the formatter being used.
+ *
+ * @param FormatterInterface $formatter Formatter being used
+ * @param mixed $structuredOutput Data to validate
+ * @return mixed
+ */
+ public function validateData(FormatterInterface $formatter, $structuredOutput, FormatterOptions $options)
+ {
+ // If the formatter implements ValidationInterface, then let it
+ // test the data and throw or return an error
+ if ($formatter instanceof ValidationInterface) {
+ return $formatter->validate($structuredOutput);
+ }
+ // If the formatter does not implement ValidationInterface, then
+ // it will never be passed an ArrayObject; we will always give
+ // it a simple array.
+ $structuredOutput = $this->simplifyToArray($structuredOutput, $options);
+ // If we could not simplify to an array, then throw an exception.
+ // We will never give a formatter anything other than an array
+ // unless it validates that it can accept the data type.
+ if (!is_array($structuredOutput)) {
+ throw new IncompatibleDataException(
+ $formatter,
+ $structuredOutput,
+ []
+ );
+ }
+ return $structuredOutput;
+ }
+
+ protected function simplifyToArray($structuredOutput, FormatterOptions $options)
+ {
+ // We can do nothing unless the provided data is an object.
+ if (!is_object($structuredOutput)) {
+ return $structuredOutput;
+ }
+ // Check to see if any of the simplifiers can convert the given data
+ // set to an array.
+ $outputDataType = new \ReflectionClass($structuredOutput);
+ foreach ($this->arraySimplifiers as $simplifier) {
+ if ($simplifier->canSimplify($outputDataType)) {
+ $structuredOutput = $simplifier->simplifyToArray($structuredOutput, $options);
+ }
+ }
+ // Convert data structure back into its original form, if necessary.
+ if ($structuredOutput instanceof OriginalDataInterface) {
+ return $structuredOutput->getOriginalData();
+ }
+ // Convert \ArrayObjects to a simple array.
+ if ($structuredOutput instanceof \ArrayObject) {
+ return $structuredOutput->getArrayCopy();
+ }
+ return $structuredOutput;
+ }
+
+ protected function canSimplifyToArray(\ReflectionClass $structuredOutput)
+ {
+ foreach ($this->arraySimplifiers as $simplifier) {
+ if ($simplifier->canSimplify($structuredOutput)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Restructure the data as necessary (e.g. to select or reorder fields).
+ *
+ * @param mixed $structuredOutput
+ * @param FormatterOptions $options
+ * @return mixed
+ */
+ public function restructureData($structuredOutput, FormatterOptions $options)
+ {
+ if ($structuredOutput instanceof RestructureInterface) {
+ return $structuredOutput->restructure($options);
+ }
+ return $structuredOutput;
+ }
+
+ /**
+ * Allow the formatter access to the raw structured data prior
+ * to restructuring. For example, the 'list' formatter may wish
+ * to display the row keys when provided table output. If this
+ * function returns a result that does not evaluate to 'false',
+ * then that result will be used as-is, and restructuring and
+ * validation will not occur.
+ *
+ * @param mixed $structuredOutput
+ * @param FormatterOptions $options
+ * @return mixed
+ */
+ public function overrideRestructure(FormatterInterface $formatter, $structuredOutput, FormatterOptions $options)
+ {
+ if ($formatter instanceof OverrideRestructureInterface) {
+ return $formatter->overrideRestructure($structuredOutput, $options);
+ }
+ }
+
+ /**
+ * Allow the formatter to mess with the configuration options before any
+ * transformations et. al. get underway.
+ * @param FormatterInterface $formatter
+ * @param mixed $structuredOutput
+ * @param FormatterOptions $options
+ * @return FormatterOptions
+ */
+ public function overrideOptions(FormatterInterface $formatter, $structuredOutput, FormatterOptions $options)
+ {
+ if ($formatter instanceof OverrideOptionsInterface) {
+ return $formatter->overrideOptions($structuredOutput, $options);
+ }
+ return $options;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/CsvFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/CsvFormatter.php
new file mode 100644
index 00000000..d39c27b4
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/CsvFormatter.php
@@ -0,0 +1,107 @@
+validDataTypes()
+ );
+ }
+ // If the data was provided to us as a single array, then
+ // convert it to a single row.
+ if (is_array($structuredData) && !empty($structuredData)) {
+ $firstRow = reset($structuredData);
+ if (!is_array($firstRow)) {
+ return [$structuredData];
+ }
+ }
+ return $structuredData;
+ }
+
+ /**
+ * Return default values for formatter options
+ * @return array
+ */
+ protected function getDefaultFormatterOptions()
+ {
+ return [
+ FormatterOptions::INCLUDE_FIELD_LABELS => true,
+ FormatterOptions::DELIMITER => ',',
+ ];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write(OutputInterface $output, $data, FormatterOptions $options)
+ {
+ $defaults = $this->getDefaultFormatterOptions();
+
+ $includeFieldLabels = $options->get(FormatterOptions::INCLUDE_FIELD_LABELS, $defaults);
+ if ($includeFieldLabels && ($data instanceof TableTransformation)) {
+ $headers = $data->getHeaders();
+ $this->writeOneLine($output, $headers, $options);
+ }
+
+ foreach ($data as $line) {
+ $this->writeOneLine($output, $line, $options);
+ }
+ }
+
+ protected function writeOneLine(OutputInterface $output, $data, $options)
+ {
+ $defaults = $this->getDefaultFormatterOptions();
+ $delimiter = $options->get(FormatterOptions::DELIMITER, $defaults);
+
+ $output->write($this->csvEscape($data, $delimiter));
+ }
+
+ protected function csvEscape($data, $delimiter = ',')
+ {
+ $buffer = fopen('php://temp', 'r+');
+ fputcsv($buffer, $data, $delimiter);
+ rewind($buffer);
+ $csv = fgets($buffer);
+ fclose($buffer);
+ return $csv;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/FormatterInterface.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/FormatterInterface.php
new file mode 100644
index 00000000..c0ad0823
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/FormatterInterface.php
@@ -0,0 +1,18 @@
+writeln(json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/ListFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/ListFormatter.php
new file mode 100644
index 00000000..01fce524
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/ListFormatter.php
@@ -0,0 +1,59 @@
+writeln(implode("\n", $data));
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function overrideRestructure($structuredOutput, FormatterOptions $options)
+ {
+ // If the structured data implements ListDataInterface,
+ // then we will render whatever data its 'getListData'
+ // method provides.
+ if ($structuredOutput instanceof ListDataInterface) {
+ return $this->renderData($structuredOutput, $structuredOutput->getListData($options), $options);
+ }
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function renderData($originalData, $restructuredData, FormatterOptions $options)
+ {
+ if ($originalData instanceof RenderCellInterface) {
+ return $this->renderEachCell($originalData, $restructuredData, $options);
+ }
+ return $restructuredData;
+ }
+
+ protected function renderEachCell($originalData, $restructuredData, FormatterOptions $options)
+ {
+ foreach ($restructuredData as $key => $cellData) {
+ $restructuredData[$key] = $originalData->renderCell($key, $cellData, $options, $restructuredData);
+ }
+ return $restructuredData;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/PrintRFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/PrintRFormatter.php
new file mode 100644
index 00000000..57dce768
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/PrintRFormatter.php
@@ -0,0 +1,21 @@
+writeln(print_r($data, true));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/RenderDataInterface.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/RenderDataInterface.php
new file mode 100644
index 00000000..a4da8e0e
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/RenderDataInterface.php
@@ -0,0 +1,19 @@
+renderEachCell($originalData, $restructuredData, $options);
+ }
+ return $restructuredData;
+ }
+
+ protected function renderEachCell($originalData, $restructuredData, FormatterOptions $options)
+ {
+ foreach ($restructuredData as $id => $row) {
+ foreach ($row as $key => $cellData) {
+ $restructuredData[$id][$key] = $originalData->renderCell($key, $cellData, $options, $row);
+ }
+ }
+ return $restructuredData;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/SectionsFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/SectionsFormatter.php
new file mode 100644
index 00000000..89ed2707
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/SectionsFormatter.php
@@ -0,0 +1,72 @@
+validDataTypes()
+ );
+ }
+ return $structuredData;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write(OutputInterface $output, $tableTransformer, FormatterOptions $options)
+ {
+ $table = new Table($output);
+ $table->setStyle('compact');
+ foreach ($tableTransformer as $rowid => $row) {
+ $rowLabel = $tableTransformer->getRowLabel($rowid);
+ $output->writeln('');
+ $output->writeln($rowLabel);
+ $sectionData = new PropertyList($row);
+ $sectionOptions = new FormatterOptions([], $options->getOptions());
+ $sectionTableTransformer = $sectionData->restructure($sectionOptions);
+ $table->setRows($sectionTableTransformer->getTableData(true));
+ $table->render();
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/SerializeFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/SerializeFormatter.php
new file mode 100644
index 00000000..f8151373
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/SerializeFormatter.php
@@ -0,0 +1,21 @@
+writeln(serialize($data));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/StringFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/StringFormatter.php
new file mode 100644
index 00000000..142bee4c
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/StringFormatter.php
@@ -0,0 +1,81 @@
+writeln($data);
+ }
+ return $this->reduceToSigleFieldAndWrite($output, $data, $options);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function overrideOptions($structuredOutput, FormatterOptions $options)
+ {
+ $defaultField = $options->get(FormatterOptions::DEFAULT_STRING_FIELD, [], '');
+ $userFields = $options->get(FormatterOptions::FIELDS, [FormatterOptions::FIELDS => $options->get(FormatterOptions::FIELD)]);
+ $optionsOverride = $options->override([]);
+ if (empty($userFields) && !empty($defaultField)) {
+ $optionsOverride->setOption(FormatterOptions::FIELDS, $defaultField);
+ }
+ return $optionsOverride;
+ }
+
+ /**
+ * If the data provided to a 'string' formatter is a table, then try
+ * to emit it as a TSV value.
+ *
+ * @param OutputInterface $output
+ * @param mixed $data
+ * @param FormatterOptions $options
+ */
+ protected function reduceToSigleFieldAndWrite(OutputInterface $output, $data, FormatterOptions $options)
+ {
+ $alternateFormatter = new TsvFormatter();
+ try {
+ $data = $alternateFormatter->validate($data);
+ $alternateFormatter->write($output, $data, $options);
+ } catch (\Exception $e) {
+ }
+ }
+
+ /**
+ * Always validate any data, though. This format will never
+ * cause an error if it is selected for an incompatible data type; at
+ * worse, it simply does not print any data.
+ */
+ public function validate($structuredData)
+ {
+ return $structuredData;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/TableFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/TableFormatter.php
new file mode 100644
index 00000000..f7787c28
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/TableFormatter.php
@@ -0,0 +1,128 @@
+validDataTypes()
+ );
+ }
+ return $structuredData;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write(OutputInterface $output, $tableTransformer, FormatterOptions $options)
+ {
+ $headers = [];
+ $defaults = [
+ FormatterOptions::TABLE_STYLE => 'consolidation',
+ FormatterOptions::INCLUDE_FIELD_LABELS => true,
+ ];
+
+ $table = new Table($output);
+
+ static::addCustomTableStyles($table);
+
+ $table->setStyle($options->get(FormatterOptions::TABLE_STYLE, $defaults));
+ $isList = $tableTransformer->isList();
+ $includeHeaders = $options->get(FormatterOptions::INCLUDE_FIELD_LABELS, $defaults);
+ if ($includeHeaders && !$isList) {
+ $headers = $tableTransformer->getHeaders();
+ $table->setHeaders($headers);
+ }
+ $data = $tableTransformer->getTableData($includeHeaders && $isList);
+ $data = $this->wrap($headers, $data, $table->getStyle(), $options);
+ $table->setRows($data);
+ $table->render();
+ }
+
+ /**
+ * Wrap the table data
+ * @param array $data
+ * @param TableStyle $tableStyle
+ * @param FormatterOptions $options
+ * @return array
+ */
+ protected function wrap($headers, $data, TableStyle $tableStyle, FormatterOptions $options)
+ {
+ $wrapper = new WordWrapper($options->get(FormatterOptions::TERMINAL_WIDTH));
+ $wrapper->setPaddingFromStyle($tableStyle);
+ if (!empty($headers)) {
+ $headerLengths = array_map(function ($item) {
+ return strlen($item);
+ }, $headers);
+ $wrapper->setMinimumWidths($headerLengths);
+ }
+ return $wrapper->wrap($data);
+ }
+
+ /**
+ * Add our custom table style(s) to the table.
+ */
+ protected static function addCustomTableStyles($table)
+ {
+ // The 'consolidation' style is the same as the 'symfony-style-guide'
+ // style, except it maintains the colored headers used in 'default'.
+ $consolidationStyle = new TableStyle();
+ $consolidationStyle
+ ->setHorizontalBorderChar('-')
+ ->setVerticalBorderChar(' ')
+ ->setCrossingChar(' ')
+ ;
+ $table->setStyleDefinition('consolidation', $consolidationStyle);
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/TsvFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/TsvFormatter.php
new file mode 100644
index 00000000..8a827424
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/TsvFormatter.php
@@ -0,0 +1,40 @@
+ false,
+ ];
+ }
+
+ protected function writeOneLine(OutputInterface $output, $data, $options)
+ {
+ $output->writeln($this->tsvEscape($data));
+ }
+
+ protected function tsvEscape($data)
+ {
+ return implode("\t", array_map(
+ function ($item) {
+ return str_replace(["\t", "\n"], ['\t', '\n'], $item);
+ },
+ $data
+ ));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/VarExportFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/VarExportFormatter.php
new file mode 100644
index 00000000..0303ba48
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/VarExportFormatter.php
@@ -0,0 +1,21 @@
+writeln(var_export($data, true));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/XmlFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/XmlFormatter.php
new file mode 100644
index 00000000..05533f22
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/XmlFormatter.php
@@ -0,0 +1,76 @@
+getDomData();
+ }
+ if (!is_array($structuredData)) {
+ throw new IncompatibleDataException(
+ $this,
+ $structuredData,
+ $this->validDataTypes()
+ );
+ }
+ return $structuredData;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function write(OutputInterface $output, $dom, FormatterOptions $options)
+ {
+ if (is_array($dom)) {
+ $schema = $options->getXmlSchema();
+ $dom = $schema->arrayToXML($dom);
+ }
+ $dom->formatOutput = true;
+ $output->writeln($dom->saveXML());
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Formatters/YamlFormatter.php b/src/composer/vendor/consolidation/output-formatters/src/Formatters/YamlFormatter.php
new file mode 100644
index 00000000..07a8f21d
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Formatters/YamlFormatter.php
@@ -0,0 +1,27 @@
+writeln(Yaml::dump($data, PHP_INT_MAX, $indent, false, true));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Options/FormatterOptions.php b/src/composer/vendor/consolidation/output-formatters/src/Options/FormatterOptions.php
new file mode 100644
index 00000000..1f71cb02
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Options/FormatterOptions.php
@@ -0,0 +1,372 @@
+configurationData = $configurationData;
+ $this->options = $options;
+ }
+
+ /**
+ * Create a new FormatterOptions object with new configuration data (provided),
+ * and the same options data as this instance.
+ *
+ * @param array $configurationData
+ * @return FormatterOptions
+ */
+ public function override($configurationData)
+ {
+ $override = new self();
+ $override
+ ->setConfigurationData($configurationData + $this->getConfigurationData())
+ ->setOptions($this->getOptions());
+ return $override;
+ }
+
+ public function setTableStyle($style)
+ {
+ return $this->setConfigurationValue(self::TABLE_STYLE, $style);
+ }
+
+ public function setIncludeFieldLables($includFieldLables)
+ {
+ return $this->setConfigurationValue(self::INCLUDE_FIELD_LABELS, $includFieldLables);
+ }
+
+ public function setListOrientation($listOrientation)
+ {
+ return $this->setConfigurationValue(self::LIST_ORIENTATION, $listOrientation);
+ }
+
+ public function setRowLabels($rowLabels)
+ {
+ return $this->setConfigurationValue(self::ROW_LABELS, $rowLabels);
+ }
+
+ public function setDefaultFields($fields)
+ {
+ return $this->setConfigurationValue(self::DEFAULT_FIELDS, $fields);
+ }
+
+ public function setFieldLabels($fieldLabels)
+ {
+ return $this->setConfigurationValue(self::FIELD_LABELS, $fieldLabels);
+ }
+
+ public function setDefaultStringField($defaultStringField)
+ {
+ return $this->setConfigurationValue(self::DEFAULT_STRING_FIELD, $defaultStringField);
+ }
+
+ public function setWidth($width)
+ {
+ return $this->setConfigurationValue(self::TERMINAL_WIDTH, $width);
+ }
+
+ /**
+ * Get a formatter option
+ *
+ * @param string $key
+ * @param array $defaults
+ * @param mixed $default
+ * @return mixed
+ */
+ public function get($key, $defaults = [], $default = false)
+ {
+ $value = $this->fetch($key, $defaults, $default);
+ return $this->parse($key, $value);
+ }
+
+ /**
+ * Return the XmlSchema to use with --format=xml for data types that support
+ * that. This is used when an array needs to be converted into xml.
+ *
+ * @return XmlSchema
+ */
+ public function getXmlSchema()
+ {
+ return new XmlSchema();
+ }
+
+ /**
+ * Determine the format that was requested by the caller.
+ *
+ * @param array $defaults
+ * @return string
+ */
+ public function getFormat($defaults = [])
+ {
+ return $this->get(self::FORMAT, [], $this->get(self::DEFAULT_FORMAT, $defaults, ''));
+ }
+
+ /**
+ * Look up a key, and return its raw value.
+ *
+ * @param string $key
+ * @param array $defaults
+ * @param mixed $default
+ * @return mixed
+ */
+ protected function fetch($key, $defaults = [], $default = false)
+ {
+ $defaults = $this->defaultsForKey($key, $defaults, $default);
+ $values = $this->fetchRawValues($defaults);
+ return $values[$key];
+ }
+
+ /**
+ * Reduce provided defaults to the single item identified by '$key',
+ * if it exists, or an empty array otherwise.
+ *
+ * @param string $key
+ * @param array $defaults
+ * @return array
+ */
+ protected function defaultsForKey($key, $defaults, $default = false)
+ {
+ if (array_key_exists($key, $defaults)) {
+ return [$key => $defaults[$key]];
+ }
+ return [$key => $default];
+ }
+
+ /**
+ * Look up all of the items associated with the provided defaults.
+ *
+ * @param array $defaults
+ * @return array
+ */
+ protected function fetchRawValues($defaults = [])
+ {
+ return array_merge(
+ $defaults,
+ $this->getConfigurationData(),
+ $this->getOptions(),
+ $this->getInputOptions($defaults)
+ );
+ }
+
+ /**
+ * Given the raw value for a specific key, do any type conversion
+ * (e.g. from a textual list to an array) needed for the data.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return mixed
+ */
+ protected function parse($key, $value)
+ {
+ $optionFormat = $this->getOptionFormat($key);
+ if (!empty($optionFormat) && is_string($value)) {
+ return $this->$optionFormat($value);
+ }
+ return $value;
+ }
+
+ /**
+ * Convert from a textual list to an array
+ *
+ * @param string $value
+ * @return array
+ */
+ public function parsePropertyList($value)
+ {
+ return PropertyParser::parse($value);
+ }
+
+ /**
+ * Given a specific key, return the class method name of the
+ * parsing method for data stored under this key.
+ *
+ * @param string $key
+ * @return string
+ */
+ protected function getOptionFormat($key)
+ {
+ $propertyFormats = [
+ self::ROW_LABELS => 'PropertyList',
+ self::FIELD_LABELS => 'PropertyList',
+ ];
+ if (array_key_exists($key, $propertyFormats)) {
+ return "parse{$propertyFormats[$key]}";
+ }
+ return '';
+ }
+
+ /**
+ * Change the configuration data for this formatter options object.
+ *
+ * @param array $configurationData
+ * @return FormatterOptions
+ */
+ public function setConfigurationData($configurationData)
+ {
+ $this->configurationData = $configurationData;
+ return $this;
+ }
+
+ /**
+ * Change one configuration value for this formatter option.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return FormetterOptions
+ */
+ protected function setConfigurationValue($key, $value)
+ {
+ $this->configurationData[$key] = $value;
+ return $this;
+ }
+
+ /**
+ * Change one configuration value for this formatter option, but only
+ * if it does not already have a value set.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return FormetterOptions
+ */
+ public function setConfigurationDefault($key, $value)
+ {
+ if (!array_key_exists($key, $this->configurationData)) {
+ return $this->setConfigurationValue($key, $value);
+ }
+ return $this;
+ }
+
+ /**
+ * Return a reference to the configuration data for this object.
+ *
+ * @return array
+ */
+ public function getConfigurationData()
+ {
+ return $this->configurationData;
+ }
+
+ /**
+ * Set all of the options that were specified by the user for this request.
+ *
+ * @param array $options
+ * @return FormatterOptions
+ */
+ public function setOptions($options)
+ {
+ $this->options = $options;
+ return $this;
+ }
+
+ /**
+ * Change one option value specified by the user for this request.
+ *
+ * @param string $key
+ * @param mixed $value
+ * @return FormatterOptions
+ */
+ public function setOption($key, $value)
+ {
+ $this->options[$key] = $value;
+ return $this;
+ }
+
+ /**
+ * Return a reference to the user-specified options for this request.
+ *
+ * @return array
+ */
+ public function getOptions()
+ {
+ return $this->options;
+ }
+
+ /**
+ * Provide a Symfony Console InputInterface containing the user-specified
+ * options for this request.
+ *
+ * @param InputInterface $input
+ * @return type
+ */
+ public function setInput(InputInterface $input)
+ {
+ $this->input = $input;
+ }
+
+ /**
+ * Return all of the options from the provided $defaults array that
+ * exist in our InputInterface object.
+ *
+ * @param array $defaults
+ * @return array
+ */
+ public function getInputOptions($defaults)
+ {
+ if (!isset($this->input)) {
+ return [];
+ }
+ $options = [];
+ foreach ($defaults as $key => $value) {
+ if ($this->input->hasOption($key)) {
+ $result = $this->input->getOption($key);
+ if (isset($result)) {
+ $options[$key] = $this->input->getOption($key);
+ }
+ }
+ }
+ return $options;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Options/OverrideOptionsInterface.php b/src/composer/vendor/consolidation/output-formatters/src/Options/OverrideOptionsInterface.php
new file mode 100644
index 00000000..04a09e96
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Options/OverrideOptionsInterface.php
@@ -0,0 +1,17 @@
+defaultOptions();
+ $fieldLabels = $this->getReorderedFieldLabels($data, $options, $defaults);
+
+ $tableTransformer = $this->instantiateTableTransformation($data, $fieldLabels, $options->get(FormatterOptions::ROW_LABELS, $defaults));
+ if ($options->get(FormatterOptions::LIST_ORIENTATION, $defaults)) {
+ $tableTransformer->setLayout(TableTransformation::LIST_LAYOUT);
+ }
+
+ return $tableTransformer;
+ }
+
+ protected function instantiateTableTransformation($data, $fieldLabels, $rowLabels)
+ {
+ return new TableTransformation($data, $fieldLabels, $rowLabels);
+ }
+
+ protected function getReorderedFieldLabels($data, $options, $defaults)
+ {
+ $reorderer = new ReorderFields();
+ $fieldLabels = $reorderer->reorder(
+ $this->getFields($options, $defaults),
+ $options->get(FormatterOptions::FIELD_LABELS, $defaults),
+ $data
+ );
+ return $fieldLabels;
+ }
+
+ protected function getFields($options, $defaults)
+ {
+ $fieldShortcut = $options->get(FormatterOptions::FIELD);
+ if (!empty($fieldShortcut)) {
+ return [$fieldShortcut];
+ }
+ $result = $options->get(FormatterOptions::FIELDS, $defaults);
+ if (!empty($result)) {
+ return $result;
+ }
+ return $options->get(FormatterOptions::DEFAULT_FIELDS, $defaults);
+ }
+
+ /**
+ * A structured list may provide its own set of default options. These
+ * will be used in place of the command's default options (from the
+ * annotations) in instances where the user does not provide the options
+ * explicitly (on the commandline) or implicitly (via a configuration file).
+ *
+ * @return array
+ */
+ protected function defaultOptions()
+ {
+ return [
+ FormatterOptions::FIELDS => [],
+ FormatterOptions::FIELD_LABELS => [],
+ FormatterOptions::ROW_LABELS => [],
+ FormatterOptions::DEFAULT_FIELDS => [],
+ ];
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/StructuredData/AssociativeList.php b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/AssociativeList.php
new file mode 100644
index 00000000..2a8b327b
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/AssociativeList.php
@@ -0,0 +1,12 @@
+renderFunction = $renderFunction;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function renderCell($key, $cellData, FormatterOptions $options, $rowData)
+ {
+ return call_user_func($this->renderFunction, $key, $cellData, $options, $rowData);
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/StructuredData/ListDataInterface.php b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/ListDataInterface.php
new file mode 100644
index 00000000..829d7753
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/ListDataInterface.php
@@ -0,0 +1,16 @@
+getArrayCopy()];
+ $options->setConfigurationDefault('list-orientation', true);
+ $tableTransformer = $this->createTableTransformation($data, $options);
+ return $tableTransformer;
+ }
+
+ public function getListData(FormatterOptions $options)
+ {
+ $data = $this->getArrayCopy();
+
+ $defaults = $this->defaultOptions();
+ $fieldLabels = $this->getReorderedFieldLabels([$data], $options, $defaults);
+
+ $result = [];
+ foreach ($fieldLabels as $id => $label) {
+ $result[$id] = $data[$id];
+ }
+ return $result;
+ }
+
+ protected function defaultOptions()
+ {
+ return [
+ FormatterOptions::LIST_ORIENTATION => true,
+ ] + parent::defaultOptions();
+ }
+
+ protected function instantiateTableTransformation($data, $fieldLabels, $rowLabels)
+ {
+ return new PropertyListTableTransformation($data, $fieldLabels, $rowLabels);
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/StructuredData/RenderCellCollectionInterface.php b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/RenderCellCollectionInterface.php
new file mode 100644
index 00000000..8e80aff4
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/RenderCellCollectionInterface.php
@@ -0,0 +1,16 @@
+ [],
+ RenderCellCollectionInterface::PRIORITY_NORMAL => [],
+ RenderCellCollectionInterface::PRIORITY_FALLBACK => [],
+ ];
+
+ /**
+ * Add a renderer
+ *
+ * @return $this
+ */
+ public function addRenderer(RenderCellInterface $renderer, $priority = RenderCellCollectionInterface::PRIORITY_NORMAL)
+ {
+ $this->rendererList[$priority][] = $renderer;
+ return $this;
+ }
+
+ /**
+ * Add a callable as a renderer
+ *
+ * @return $this
+ */
+ public function addRendererFunction(callable $rendererFn, $priority = RenderCellCollectionInterface::PRIORITY_NORMAL)
+ {
+ $renderer = new CallableRenderer($rendererFn);
+ return $this->addRenderer($renderer, $priority);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function renderCell($key, $cellData, FormatterOptions $options, $rowData)
+ {
+ $flattenedRendererList = array_reduce(
+ $this->rendererList,
+ function ($carry, $item) {
+ return array_merge($carry, $item);
+ },
+ []
+ );
+
+ foreach ($flattenedRendererList as $renderer) {
+ $cellData = $renderer->renderCell($key, $cellData, $options, $rowData);
+ if (is_string($cellData)) {
+ return $cellData;
+ }
+ }
+ return $cellData;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/StructuredData/RenderCellInterface.php b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/RenderCellInterface.php
new file mode 100644
index 00000000..ff200846
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/RenderCellInterface.php
@@ -0,0 +1,22 @@
+getArrayCopy();
+ return $this->createTableTransformation($data, $options);
+ }
+
+ public function getListData(FormatterOptions $options)
+ {
+ return array_keys($this->getArrayCopy());
+ }
+
+ protected function defaultOptions()
+ {
+ return [
+ FormatterOptions::LIST_ORIENTATION => false,
+ ] + parent::defaultOptions();
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/StructuredData/TableDataInterface.php b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/TableDataInterface.php
new file mode 100644
index 00000000..341b822c
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/TableDataInterface.php
@@ -0,0 +1,22 @@
+ ['description'],
+ ];
+ $this->elementList = array_merge_recursive($elementList, $defaultElementList);
+ }
+
+ public function arrayToXML($structuredData)
+ {
+ $dom = new \DOMDocument('1.0', 'UTF-8');
+ $topLevelElement = $this->getTopLevelElementName($structuredData);
+ $this->addXmlData($dom, $dom, $topLevelElement, $structuredData);
+ return $dom;
+ }
+
+ protected function addXmlData(\DOMDocument $dom, $xmlParent, $elementName, $structuredData)
+ {
+ $element = $dom->createElement($elementName);
+ $xmlParent->appendChild($element);
+ if (is_string($structuredData)) {
+ $element->appendChild($dom->createTextNode($structuredData));
+ return;
+ }
+ $this->addXmlChildren($dom, $element, $elementName, $structuredData);
+ }
+
+ protected function addXmlChildren(\DOMDocument $dom, $xmlParent, $elementName, $structuredData)
+ {
+ foreach ($structuredData as $key => $value) {
+ $this->addXmlDataOrAttribute($dom, $xmlParent, $elementName, $key, $value);
+ }
+ }
+
+ protected function addXmlDataOrAttribute(\DOMDocument $dom, $xmlParent, $elementName, $key, $value)
+ {
+ $childElementName = $this->getDefaultElementName($elementName);
+ $elementName = is_numeric($key) ? $childElementName : $key;
+ if (($elementName != $childElementName) && $this->isAttribute($elementName, $key, $value)) {
+ $xmlParent->setAttribute($key, $value);
+ return;
+ }
+ $this->addXmlData($dom, $xmlParent, $elementName, $value);
+ }
+
+ protected function getTopLevelElementName($structuredData)
+ {
+ return 'document';
+ }
+
+ protected function getDefaultElementName($parentElementName)
+ {
+ $singularName = $this->singularForm($parentElementName);
+ if (isset($singularName)) {
+ return $singularName;
+ }
+ return 'item';
+ }
+
+ protected function isAttribute($parentElementName, $elementName, $value)
+ {
+ if (!is_string($value)) {
+ return false;
+ }
+ return !$this->inElementList($parentElementName, $elementName) && !$this->inElementList('*', $elementName);
+ }
+
+ protected function inElementList($parentElementName, $elementName)
+ {
+ if (!array_key_exists($parentElementName, $this->elementList)) {
+ return false;
+ }
+ return in_array($elementName, $this->elementList[$parentElementName]);
+ }
+
+ protected function singularForm($name)
+ {
+ if (substr($name, strlen($name) - 1) == "s") {
+ return substr($name, 0, strlen($name) - 1);
+ }
+ }
+
+ protected function isAssoc($data)
+ {
+ return array_keys($data) == range(0, count($data));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/StructuredData/Xml/XmlSchemaInterface.php b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/Xml/XmlSchemaInterface.php
new file mode 100644
index 00000000..a1fad662
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/StructuredData/Xml/XmlSchemaInterface.php
@@ -0,0 +1,73 @@
+
+ *
+ *
+ * blah
+ *
+ *
+ * a
+ * b
+ * c
+ *
+ *
+ *
+ *
+ *
+ *
+ * This could be:
+ *
+ * [
+ * 'id' => 1,
+ * 'name' => 'doc',
+ * 'foobars' =>
+ * [
+ * [
+ * 'id' => '123',
+ * 'name' => 'blah',
+ * 'widgets' =>
+ * [
+ * [
+ * 'foo' => 'a',
+ * 'bar' => 'b',
+ * 'baz' => 'c',
+ * ]
+ * ],
+ * ],
+ * ]
+ * ]
+ *
+ * The challenge is more in going from an array back to the more
+ * structured xml format. Note that any given key => string mapping
+ * could represent either an attribute, or a simple XML element
+ * containing only a string value. In general, we do *not* want to add
+ * extra layers of nesting in the data structure to disambiguate between
+ * these kinds of data, as we want the source data to render cleanly
+ * into other formats, e.g. yaml, json, et. al., and we do not want to
+ * force every data provider to have to consider the optimal xml schema
+ * for their data.
+ *
+ * Our strategy, therefore, is to expect clients that wish to provide
+ * a very specific xml representation to return a DOMDocument, and,
+ * for other data structures where xml is a secondary concern, then we
+ * will use some default heuristics to convert from arrays to xml.
+ */
+interface XmlSchemaInterface
+{
+ /**
+ * Convert data to a format suitable for use in a list.
+ * By default, the array values will be used. Implement
+ * ListDataInterface to use some other criteria (e.g. array keys).
+ *
+ * @return \DOMDocument
+ */
+ public function arrayToXml($structuredData);
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Transformations/DomToArraySimplifier.php b/src/composer/vendor/consolidation/output-formatters/src/Transformations/DomToArraySimplifier.php
new file mode 100644
index 00000000..a9e28cfb
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Transformations/DomToArraySimplifier.php
@@ -0,0 +1,212 @@
+isSubclassOf('\Consolidation\OutputFormatters\StructuredData\Xml\DomDataInterface') ||
+ $dataType->isSubclassOf('DOMDocument') ||
+ ($dataType->getName() == 'DOMDocument');
+ }
+
+ public function simplifyToArray($structuredData, FormatterOptions $options)
+ {
+ if ($structuredData instanceof DomDataInterface) {
+ $structuredData = $structuredData->getDomData();
+ }
+ if ($structuredData instanceof \DOMDocument) {
+ // $schema = $options->getXmlSchema();
+ $simplified = $this->elementToArray($structuredData);
+ $structuredData = array_shift($simplified);
+ }
+ return $structuredData;
+ }
+
+ /**
+ * Recursively convert the provided DOM element into a php array.
+ *
+ * @param \DOMNode $element
+ * @return array
+ */
+ protected function elementToArray(\DOMNode $element)
+ {
+ if ($element->nodeType == XML_TEXT_NODE) {
+ return $element->nodeValue;
+ }
+ $attributes = $this->getNodeAttributes($element);
+ $children = $this->getNodeChildren($element);
+
+ return array_merge($attributes, $children);
+ }
+
+ /**
+ * Get all of the attributes of the provided element.
+ *
+ * @param \DOMNode $element
+ * @return array
+ */
+ protected function getNodeAttributes($element)
+ {
+ if (empty($element->attributes)) {
+ return [];
+ }
+ $attributes = [];
+ foreach ($element->attributes as $key => $attribute) {
+ $attributes[$key] = $attribute->nodeValue;
+ }
+ return $attributes;
+ }
+
+ /**
+ * Get all of the children of the provided element, with simplification.
+ *
+ * @param \DOMNode $element
+ * @return array
+ */
+ protected function getNodeChildren($element)
+ {
+ if (empty($element->childNodes)) {
+ return [];
+ }
+ $uniformChildrenName = $this->hasUniformChildren($element);
+ if ("{$uniformChildrenName}s" == $element->nodeName) {
+ $result = $this->getUniformChildren($element->nodeName, $element);
+ } else {
+ $result = $this->getUniqueChildren($element->nodeName, $element);
+ }
+ return $result;
+ }
+
+ /**
+ * Get the data from the children of the provided node in preliminary
+ * form.
+ *
+ * @param \DOMNode $element
+ * @return array
+ */
+ protected function getNodeChildrenData($element)
+ {
+ $children = [];
+ foreach ($element->childNodes as $key => $value) {
+ $children[$key] = $this->elementToArray($value);
+ }
+ return $children;
+ }
+
+ /**
+ * Determine whether the children of the provided element are uniform.
+ * @see getUniformChildren(), below.
+ *
+ * @param \DOMNode $element
+ * @return boolean
+ */
+ protected function hasUniformChildren($element)
+ {
+ $last = false;
+ foreach ($element->childNodes as $key => $value) {
+ $name = $value->nodeName;
+ if (!$name) {
+ return false;
+ }
+ if ($last && ($name != $last)) {
+ return false;
+ }
+ $last = $name;
+ }
+ return $last;
+ }
+
+ /**
+ * Convert the children of the provided DOM element into an array.
+ * Here, 'uniform' means that all of the element names of the children
+ * are identical, and further, the element name of the parent is the
+ * plural form of the child names. When the children are uniform in
+ * this way, then the parent element name will be used as the key to
+ * store the children in, and the child list will be returned as a
+ * simple list with their (duplicate) element names omitted.
+ *
+ * @param string $parentKey
+ * @param \DOMNode $element
+ * @return array
+ */
+ protected function getUniformChildren($parentKey, $element)
+ {
+ $children = $this->getNodeChildrenData($element);
+ $simplifiedChildren = [];
+ foreach ($children as $key => $value) {
+ if ($this->valueCanBeSimplified($value)) {
+ $value = array_shift($value);
+ }
+ $simplifiedChildren[$parentKey][] = $value;
+ }
+ return $simplifiedChildren;
+ }
+
+ /**
+ * Determine whether the provided value has additional unnecessary
+ * nesting. {"color": "red"} is converted to "red". No other
+ * simplification is done.
+ *
+ * @param \DOMNode $value
+ * @return boolean
+ */
+ protected function valueCanBeSimplified($value)
+ {
+ if (!is_array($value)) {
+ return false;
+ }
+ if (count($value) != 1) {
+ return false;
+ }
+ $data = array_shift($value);
+ return is_string($data);
+ }
+
+ /**
+ * Convert the children of the provided DOM element into an array.
+ * Here, 'unique' means that all of the element names of the children are
+ * different. Since the element names will become the key of the
+ * associative array that is returned, so duplicates are not supported.
+ * If there are any duplicates, then an exception will be thrown.
+ *
+ * @param string $parentKey
+ * @param \DOMNode $element
+ * @return array
+ */
+ protected function getUniqueChildren($parentKey, $element)
+ {
+ $children = $this->getNodeChildrenData($element);
+ if ((count($children) == 1) && (is_string($children[0]))) {
+ return [$element->nodeName => $children[0]];
+ }
+ $simplifiedChildren = [];
+ foreach ($children as $key => $value) {
+ if (is_numeric($key) && is_array($value) && (count($value) == 1)) {
+ $valueKeys = array_keys($value);
+ $key = $valueKeys[0];
+ $value = array_shift($value);
+ }
+ if (array_key_exists($key, $simplifiedChildren)) {
+ throw new \Exception("Cannot convert data from a DOM document to an array, because <$key> appears more than once, and is not wrapped in a <{$key}s> element.");
+ }
+ $simplifiedChildren[$key] = $value;
+ }
+ return $simplifiedChildren;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Transformations/OverrideRestructureInterface.php b/src/composer/vendor/consolidation/output-formatters/src/Transformations/OverrideRestructureInterface.php
new file mode 100644
index 00000000..51a6ea87
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Transformations/OverrideRestructureInterface.php
@@ -0,0 +1,17 @@
+getArrayCopy();
+ return $data[0];
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Transformations/PropertyParser.php b/src/composer/vendor/consolidation/output-formatters/src/Transformations/PropertyParser.php
new file mode 100644
index 00000000..18b982ea
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Transformations/PropertyParser.php
@@ -0,0 +1,36 @@
+ 'red',
+ * 'two' => 'white',
+ * 'three' => 'blue',
+ * ]
+ */
+class PropertyParser
+{
+ public static function parse($data)
+ {
+ if (!is_string($data)) {
+ return $data;
+ }
+ $result = [];
+ $lines = explode("\n", $data);
+ foreach ($lines as $line) {
+ list($key, $value) = explode(':', trim($line), 2) + ['', ''];
+ $result[$key] = trim($value);
+ }
+ return $result;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Transformations/ReorderFields.php b/src/composer/vendor/consolidation/output-formatters/src/Transformations/ReorderFields.php
new file mode 100644
index 00000000..9e764dc3
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Transformations/ReorderFields.php
@@ -0,0 +1,123 @@
+getSelectedFieldKeys($fields, $fieldLabels);
+ if (empty($fields)) {
+ return array_intersect_key($fieldLabels, $firstRow);
+ }
+ return $this->reorderFieldLabels($fields, $fieldLabels, $data);
+ }
+
+ protected function reorderFieldLabels($fields, $fieldLabels, $data)
+ {
+ $result = [];
+ $firstRow = reset($data);
+ foreach ($fields as $field) {
+ if (array_key_exists($field, $firstRow)) {
+ if (array_key_exists($field, $fieldLabels)) {
+ $result[$field] = $fieldLabels[$field];
+ }
+ }
+ }
+ return $result;
+ }
+
+ protected function getSelectedFieldKeys($fields, $fieldLabels)
+ {
+ if (is_string($fields)) {
+ $fields = explode(',', $fields);
+ }
+ $selectedFields = [];
+ foreach ($fields as $field) {
+ $matchedFields = $this->matchFieldInLabelMap($field, $fieldLabels);
+ if (empty($matchedFields)) {
+ throw new UnknownFieldException($field);
+ }
+ $selectedFields = array_merge($selectedFields, $matchedFields);
+ }
+ return $selectedFields;
+ }
+
+ protected function matchFieldInLabelMap($field, $fieldLabels)
+ {
+ $fieldRegex = $this->convertToRegex($field);
+ return
+ array_filter(
+ array_keys($fieldLabels),
+ function ($key) use ($fieldRegex, $fieldLabels) {
+ $value = $fieldLabels[$key];
+ return preg_match($fieldRegex, $value) || preg_match($fieldRegex, $key);
+ }
+ );
+ }
+
+ /**
+ * Convert the provided string into a regex suitable for use in
+ * preg_match.
+ *
+ * Matching occurs in the same way as the Symfony Finder component:
+ * http://symfony.com/doc/current/components/finder.html#file-name
+ */
+ protected function convertToRegex($str)
+ {
+ return $this->isRegex($str) ? $str : Glob::toRegex($str);
+ }
+
+ /**
+ * Checks whether the string is a regex. This function is copied from
+ * MultiplePcreFilterIterator in the Symfony Finder component.
+ *
+ * @param string $str
+ *
+ * @return bool Whether the given string is a regex
+ */
+ protected function isRegex($str)
+ {
+ if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) {
+ $start = substr($m[1], 0, 1);
+ $end = substr($m[1], -1);
+
+ if ($start === $end) {
+ return !preg_match('/[*?[:alnum:] \\\\]/', $start);
+ }
+
+ foreach (array(array('{', '}'), array('(', ')'), array('[', ']'), array('<', '>')) as $delimiters) {
+ if ($start === $delimiters[0] && $end === $delimiters[1]) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Transformations/SimplifyToArrayInterface.php b/src/composer/vendor/consolidation/output-formatters/src/Transformations/SimplifyToArrayInterface.php
new file mode 100644
index 00000000..7b088ae8
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Transformations/SimplifyToArrayInterface.php
@@ -0,0 +1,26 @@
+headers = $fieldLabels;
+ $this->rowLabels = $rowLabels;
+ $rows = static::transformRows($data, $fieldLabels);
+ $this->layout = self::TABLE_LAYOUT;
+ parent::__construct($rows);
+ }
+
+ public function setLayout($layout)
+ {
+ $this->layout = $layout;
+ }
+
+ public function getLayout()
+ {
+ return $this->layout;
+ }
+
+ public function isList()
+ {
+ return $this->layout == self::LIST_LAYOUT;
+ }
+
+ protected static function transformRows($data, $fieldLabels)
+ {
+ $rows = [];
+ foreach ($data as $rowid => $row) {
+ $rows[$rowid] = static::transformRow($row, $fieldLabels);
+ }
+ return $rows;
+ }
+
+ protected static function transformRow($row, $fieldLabels)
+ {
+ $result = [];
+ foreach ($fieldLabels as $key => $label) {
+ $result[$key] = array_key_exists($key, $row) ? $row[$key] : '';
+ }
+ return $result;
+ }
+
+ public function getHeaders()
+ {
+ return $this->headers;
+ }
+
+ public function getHeader($key)
+ {
+ if (array_key_exists($key, $this->headers)) {
+ return $this->headers[$key];
+ }
+ return $key;
+ }
+
+ public function getRowLabels()
+ {
+ return $this->rowLabels;
+ }
+
+ public function getRowLabel($rowid)
+ {
+ if (array_key_exists($rowid, $this->rowLabels)) {
+ return $this->rowLabels[$rowid];
+ }
+ return $rowid;
+ }
+
+ public function getOriginalData()
+ {
+ return $this->getArrayCopy();
+ }
+
+ public function getTableData($includeRowKey = false)
+ {
+ $data = $this->getArrayCopy();
+ if ($this->isList()) {
+ $data = $this->convertTableToList();
+ }
+ if ($includeRowKey) {
+ $data = $this->getRowDataWithKey($data);
+ }
+ return $data;
+ }
+
+ protected function convertTableToList()
+ {
+ $result = [];
+ foreach ($this as $row) {
+ foreach ($row as $key => $value) {
+ $result[$key][] = $value;
+ }
+ }
+ return $result;
+ }
+
+ protected function getRowDataWithKey($data)
+ {
+ $result = [];
+ $i = 0;
+ foreach ($data as $key => $row) {
+ array_unshift($row, $this->getHeader($key));
+ $i++;
+ $result[$key] = $row;
+ }
+ return $result;
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Transformations/WordWrapper.php b/src/composer/vendor/consolidation/output-formatters/src/Transformations/WordWrapper.php
new file mode 100644
index 00000000..18519d07
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Transformations/WordWrapper.php
@@ -0,0 +1,227 @@
+width = $width;
+ }
+
+ /**
+ * Calculate our padding widths from the specified table style.
+ * @param TableStyle $style
+ */
+ public function setPaddingFromStyle(TableStyle $style)
+ {
+ $verticalBorderLen = strlen(sprintf($style->getBorderFormat(), $style->getVerticalBorderChar()));
+ $paddingLen = strlen($style->getPaddingChar());
+
+ $this->extraPaddingAtBeginningOfLine = 0;
+ $this->extraPaddingAtEndOfLine = $verticalBorderLen;
+ $this->paddingInEachCell = $verticalBorderLen + $paddingLen + 1;
+ }
+
+ /**
+ * If columns have minimum widths, then set them here.
+ * @param array $minimumWidths
+ */
+ public function setMinimumWidths($minimumWidths)
+ {
+ $this->minimumWidths = $minimumWidths;
+ }
+
+ /**
+ * Wrap the cells in each part of the provided data table
+ * @param array $rows
+ * @return array
+ */
+ public function wrap($rows, $widths = [])
+ {
+ // If the width was not set, then disable wordwrap.
+ if (!$this->width) {
+ return $rows;
+ }
+
+ // Calculate the column widths to use based on the content.
+ $auto_widths = $this->columnAutowidth($rows, $widths);
+
+ // Do wordwrap on all cells.
+ $newrows = array();
+ foreach ($rows as $rowkey => $row) {
+ foreach ($row as $colkey => $cell) {
+ $newrows[$rowkey][$colkey] = $this->wrapCell($cell, $auto_widths[$colkey]);
+ }
+ }
+
+ return $newrows;
+ }
+
+ /**
+ * Wrap one cell. Guard against modifying non-strings and
+ * then call through to wordwrap().
+ *
+ * @param mixed $cell
+ * @param string $cellWidth
+ * @return mixed
+ */
+ protected function wrapCell($cell, $cellWidth)
+ {
+ if (!is_string($cell)) {
+ return $cell;
+ }
+ return wordwrap($cell, $cellWidth, "\n", true);
+ }
+
+ /**
+ * Determine the best fit for column widths. Ported from Drush.
+ *
+ * @param array $rows The rows to use for calculations.
+ * @param array $widths Manually specified widths of each column
+ * (in characters) - these will be left as is.
+ */
+ protected function columnAutowidth($rows, $widths)
+ {
+ $auto_widths = $widths;
+
+ // First we determine the distribution of row lengths in each column.
+ // This is an array of descending character length keys (i.e. starting at
+ // the rightmost character column), with the value indicating the number
+ // of rows where that character column is present.
+ $col_dist = [];
+ // We will also calculate the longest word in each column
+ $max_word_lens = [];
+ foreach ($rows as $rowkey => $row) {
+ foreach ($row as $col_id => $cell) {
+ $longest_word_len = static::longestWordLength($cell);
+ if ((!isset($max_word_lens[$col_id]) || ($max_word_lens[$col_id] < $longest_word_len))) {
+ $max_word_lens[$col_id] = $longest_word_len;
+ }
+ if (empty($widths[$col_id])) {
+ $length = strlen($cell);
+ if ($length == 0) {
+ $col_dist[$col_id][0] = 0;
+ }
+ while ($length > 0) {
+ if (!isset($col_dist[$col_id][$length])) {
+ $col_dist[$col_id][$length] = 0;
+ }
+ $col_dist[$col_id][$length]++;
+ $length--;
+ }
+ }
+ }
+ }
+
+ foreach ($col_dist as $col_id => $count) {
+ // Sort the distribution in decending key order.
+ krsort($col_dist[$col_id]);
+ // Initially we set all columns to their "ideal" longest width
+ // - i.e. the width of their longest column.
+ $auto_widths[$col_id] = max(array_keys($col_dist[$col_id]));
+ }
+
+ // We determine what width we have available to use, and what width the
+ // above "ideal" columns take up.
+ $available_width = $this->width - ($this->extraPaddingAtBeginningOfLine + $this->extraPaddingAtEndOfLine + (count($auto_widths) * $this->paddingInEachCell));
+ $auto_width_current = array_sum($auto_widths);
+
+ // If we cannot fit into the minimum width anyway, then just return
+ // the max word length of each column as the 'ideal'
+ $minimumIdealLength = array_sum($this->minimumWidths);
+ if ($minimumIdealLength && ($available_width < $minimumIdealLength)) {
+ return $max_word_lens;
+ }
+
+ // If we need to reduce a column so that we can fit the space we use this
+ // loop to figure out which column will cause the "least wrapping",
+ // (relative to the other columns) and reduce the width of that column.
+ while ($auto_width_current > $available_width) {
+ list($column, $width) = $this->selectColumnToReduce($col_dist, $auto_widths, $max_word_lens);
+
+ if (!$column || $width <= 1) {
+ // If we have reached a width of 1 then give up, so wordwrap can still progress.
+ break;
+ }
+ // Reduce the width of the selected column.
+ $auto_widths[$column]--;
+ // Reduce our overall table width counter.
+ $auto_width_current--;
+ // Remove the corresponding data from the disctribution, so next time
+ // around we use the data for the row to the left.
+ unset($col_dist[$column][$width]);
+ }
+ return $auto_widths;
+ }
+
+ protected function selectColumnToReduce($col_dist, $auto_widths, $max_word_lens)
+ {
+ $column = false;
+ $count = 0;
+ $width = 0;
+ foreach ($col_dist as $col_id => $counts) {
+ // Of the columns whose length is still > than the the lenght
+ // of their maximum word length
+ if ($auto_widths[$col_id] > $max_word_lens[$col_id]) {
+ if ($this->shouldSelectThisColumn($count, $counts, $width)) {
+ $column = $col_id;
+ $count = current($counts);
+ $width = key($counts);
+ }
+ }
+ }
+ if ($column !== false) {
+ return [$column, $width];
+ }
+ foreach ($col_dist as $col_id => $counts) {
+ if (empty($this->minimumWidths) || ($auto_widths[$col_id] > $this->minimumWidths[$col_id])) {
+ if ($this->shouldSelectThisColumn($count, $counts, $width)) {
+ $column = $col_id;
+ $count = current($counts);
+ $width = key($counts);
+ }
+ }
+ }
+ return [$column, $width];
+ }
+
+ protected function shouldSelectThisColumn($count, $counts, $width)
+ {
+ return
+ // If we are just starting out, select the first column.
+ ($count == 0) ||
+ // OR: if this column would cause less wrapping than the currently
+ // selected column, then select it.
+ (current($counts) < $count) ||
+ // OR: if this column would cause the same amount of wrapping, but is
+ // longer, then we choose to wrap the longer column (proportionally
+ // less wrapping, and helps avoid triple line wraps).
+ (current($counts) == $count && key($counts) > $width);
+ }
+
+ /**
+ * Return the length of the longest word in the string.
+ * @param string $str
+ * @return int
+ */
+ protected static function longestWordLength($str)
+ {
+ $words = preg_split('/[ -]/', $str);
+ $lengths = array_map(function ($s) {
+ return strlen($s);
+ }, $words);
+ return max($lengths);
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Validate/ValidDataTypesInterface.php b/src/composer/vendor/consolidation/output-formatters/src/Validate/ValidDataTypesInterface.php
new file mode 100644
index 00000000..88cce531
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Validate/ValidDataTypesInterface.php
@@ -0,0 +1,28 @@
+validDataTypes(),
+ function ($carry, $supportedType) use ($dataType) {
+ return
+ $carry ||
+ ($dataType->getName() == $supportedType->getName()) ||
+ ($dataType->isSubclassOf($supportedType->getName()));
+ },
+ false
+ );
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/src/Validate/ValidationInterface.php b/src/composer/vendor/consolidation/output-formatters/src/Validate/ValidationInterface.php
new file mode 100644
index 00000000..ad43626c
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/src/Validate/ValidationInterface.php
@@ -0,0 +1,28 @@
+markTestIncomplete(
+ 'API generation has slight variations when run on CI server. This test is therefore skipped on CI until we can make the test results consistent.'
+ );
+ }
+
+ $testDocs = tempnam(sys_get_temp_dir(), 'TestAPIDocs.md');
+ $currentDocs = getcwd() . '/docs/api.md';
+ passthru("vendor/bin/phpdoc-md generate src > $testDocs");
+
+ $testDocsContent = file_get_contents($testDocs);
+ $currentDocsContent = file_get_contents($currentDocs);
+
+ $testDocsContent = str_replace (array("\r\n", "\r"), "\n", $testDocsContent);
+ $currentDocsContent = str_replace (array("\r\n", "\r"), "\n", $currentDocsContent);
+
+ $this->assertEquals($testDocsContent, $currentDocsContent, "API docuementation out of date. Run 'composer api' to update.");
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/tests/testFormatterOptions.php b/src/composer/vendor/consolidation/output-formatters/tests/testFormatterOptions.php
new file mode 100644
index 00000000..eef7d21e
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/tests/testFormatterOptions.php
@@ -0,0 +1,112 @@
+bind($definition);
+ return $input;
+ }
+
+ protected function getFormat(FormatterOptions $options, $defaults = [])
+ {
+ return $options->get(FormatterOptions::FORMAT, [], $options->get(FormatterOptions::DEFAULT_FORMAT, $defaults, ''));
+ }
+
+ public function testFormatterOptions() {
+ $configurationData = [
+ FormatterOptions::DEFAULT_FORMAT => 'table',
+ 'test' => 'one',
+ 'try' => 'two',
+ ];
+ $userOptions = [
+ 'try' => 'three',
+ ];
+ $defaults = [
+ FormatterOptions::DEFAULT_FORMAT => 'var_export',
+ 'try' => 'four',
+ 'default-only' => 'defaulty',
+ ];
+
+ // Create a StringInput object and ensure that Symfony Console is working right.
+ $input = $this->createStringInput('test --format=yaml --include-field-labels');
+ $testValue = $input->getOption(FormatterOptions::INCLUDE_FIELD_LABELS);
+ $this->assertTrue($testValue);
+ $testValue = $input->getOption(FormatterOptions::FORMAT);
+ $this->assertEquals('yaml', $testValue);
+
+ // $options->get() only returns the default parameter is there is
+ // no matching key in configuration, userOptions or defaults.
+ $options = new FormatterOptions($configurationData, $userOptions);
+ $this->assertEquals('', $options->get('default-only'));
+ $this->assertEquals('defaulty', $options->get('default-only', $defaults));
+ $this->assertEquals('defaulty', $options->get('default-only', $defaults, 'irrelevant'));
+ $this->assertEquals('three', $options->get('try'));
+ $this->assertEquals('three', $options->get('try', $defaults));
+ $this->assertEquals('three', $options->get('try', $defaults, 'irrelevant'));
+ $this->assertFalse($options->get('no-such-key'));
+ $this->assertFalse($options->get('no-such-key', $defaults));
+ $this->assertEquals('last-chance', $options->get('no-such-key', $defaults, 'last-chance'));
+
+ // Change a user option
+ $options = new FormatterOptions($configurationData, $userOptions);
+ $options->setOption('try', 'changed');
+ $this->assertEquals('changed', $options->get('try'));
+ $this->assertEquals('changed', $options->get('try', $defaults));
+ $this->assertEquals('changed', $options->get('try', $defaults, 'irrelevant'));
+
+ // Configuration has higher priority than defaults
+ $options = new FormatterOptions($configurationData, $userOptions);
+ $this->assertEquals('table', $this->getFormat($options));
+ $this->assertEquals('table', $this->getFormat($options, $defaults));
+
+ // Override has higher priority than configuration and defaults
+ $options = new FormatterOptions($configurationData, $userOptions);
+ $newOptions = $options->override([FormatterOptions::DEFAULT_FORMAT => 'json']);
+ $this->assertEquals('json', $this->getFormat($newOptions));
+ $this->assertEquals('json', $this->getFormat($newOptions, $defaults));
+
+ $options = new FormatterOptions($configurationData, $userOptions);
+ $options->setConfigurationDefault(FormatterOptions::DEFAULT_FORMAT, 'php');
+ $this->assertEquals('table', $this->getFormat($options));
+
+ $options = new FormatterOptions($configurationData, $userOptions);
+ $options->setConfigurationData([]);
+ $this->assertEquals('', $this->getFormat($options));
+
+ // It is only possible to override options that appear in '$default'
+ // with $input; if there are no defaults, then the --format=yaml
+ // option will not be picked up.
+ $options = new FormatterOptions($configurationData, $userOptions);
+ $options->setInput($input);
+ $this->assertEquals('table', $options->get(FormatterOptions::DEFAULT_FORMAT));
+ $this->assertEquals('table', $options->get(FormatterOptions::DEFAULT_FORMAT, $defaults, 'irrelevant'));
+
+ // We won't see the default value unless the configuration value is empty.
+ $options = new FormatterOptions([], $userOptions);
+ $this->assertEquals('var_export', $options->get(FormatterOptions::DEFAULT_FORMAT, $defaults, 'irrelevant'));
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/tests/testFormatters.php b/src/composer/vendor/consolidation/output-formatters/tests/testFormatters.php
new file mode 100644
index 00000000..d9e8710f
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/tests/testFormatters.php
@@ -0,0 +1,1332 @@
+formatterManager = new FormatterManager();
+ }
+
+ function assertFormattedOutputMatches($expected, $format, $data, FormatterOptions $options = null, $userOptions = []) {
+ if (!$options) {
+ $options = new FormatterOptions();
+ }
+ $options->setOptions($userOptions);
+ $output = new BufferedOutput();
+ $this->formatterManager->write($output, $format, $data, $options);
+ $actual = preg_replace('#[ \t]*$#sm', '', $output->fetch());
+ $this->assertEquals(rtrim($expected), rtrim($actual));
+ }
+
+ function testSimpleYaml()
+ {
+ $data = [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ];
+
+ $expected = <<assertFormattedOutputMatches($expected, 'yaml', $data);
+ }
+
+ function testNestedYaml()
+ {
+ $data = [
+ 'one' => [
+ 'i' => ['a', 'b', 'c'],
+ ],
+ 'two' => [
+ 'ii' => ['q', 'r', 's'],
+ ],
+ 'three' => [
+ 'iii' => ['t', 'u', 'v'],
+ ],
+ ];
+
+ $expected = <<assertFormattedOutputMatches($expected, 'yaml', $data);
+ }
+
+ function testSimpleJson()
+ {
+ $data = [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ];
+
+ $expected = <<assertFormattedOutputMatches($expected, 'json', $data);
+ }
+
+ function testSerializeFormat()
+ {
+ $data = [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ];
+
+ $expected = 'a:3:{s:3:"one";s:1:"a";s:3:"two";s:1:"b";s:5:"three";s:1:"c";}';
+
+ $this->assertFormattedOutputMatches($expected, 'php', $data);
+ }
+
+ function testNestedJson()
+ {
+ $data = [
+ 'one' => [
+ 'i' => ['a', 'b', 'c'],
+ ],
+ 'two' => [
+ 'ii' => ['q', 'r', 's'],
+ ],
+ 'three' => [
+ 'iii' => ['t', 'u', 'v'],
+ ],
+ ];
+
+ $expected = <<assertFormattedOutputMatches($expected, 'json', $data);
+ }
+
+ function testSimplePrintR()
+ {
+ $data = [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ];
+
+ $expected = << a
+ [two] => b
+ [three] => c
+)
+EOT;
+
+ $this->assertFormattedOutputMatches($expected, 'print-r', $data);
+ }
+
+ function testNestedPrintR()
+ {
+ $data = [
+ 'one' => [
+ 'i' => ['a', 'b', 'c'],
+ ],
+ 'two' => [
+ 'ii' => ['q', 'r', 's'],
+ ],
+ 'three' => [
+ 'iii' => ['t', 'u', 'v'],
+ ],
+ ];
+
+ $expected = << Array
+ (
+ [i] => Array
+ (
+ [0] => a
+ [1] => b
+ [2] => c
+ )
+
+ )
+
+ [two] => Array
+ (
+ [ii] => Array
+ (
+ [0] => q
+ [1] => r
+ [2] => s
+ )
+
+ )
+
+ [three] => Array
+ (
+ [iii] => Array
+ (
+ [0] => t
+ [1] => u
+ [2] => v
+ )
+
+ )
+
+)
+EOT;
+
+ $this->assertFormattedOutputMatches($expected, 'print-r', $data);
+ }
+
+ function testSimpleVarExport()
+ {
+ $data = [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ];
+
+ $expected = << 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+)
+EOT;
+
+ $this->assertFormattedOutputMatches($expected, 'var_export', $data);
+ }
+
+ function testNestedVarExport()
+ {
+ $data = [
+ 'one' => [
+ 'i' => ['a', 'b', 'c'],
+ ],
+ 'two' => [
+ 'ii' => ['q', 'r', 's'],
+ ],
+ 'three' => [
+ 'iii' => ['t', 'u', 'v'],
+ ],
+ ];
+
+ $expected = <<
+ array (
+ 'i' =>
+ array (
+ 0 => 'a',
+ 1 => 'b',
+ 2 => 'c',
+ ),
+ ),
+ 'two' =>
+ array (
+ 'ii' =>
+ array (
+ 0 => 'q',
+ 1 => 'r',
+ 2 => 's',
+ ),
+ ),
+ 'three' =>
+ array (
+ 'iii' =>
+ array (
+ 0 => 't',
+ 1 => 'u',
+ 2 => 'v',
+ ),
+ ),
+)
+EOT;
+
+ $this->assertFormattedOutputMatches($expected, 'var_export', $data);
+ }
+
+ function testList()
+ {
+ $data = [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ];
+
+ $expected = <<assertFormattedOutputMatches($expected, 'list', $data);
+ }
+
+ /**
+ * @expectedException \Consolidation\OutputFormatters\Exception\UnknownFormatException
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage The requested format, 'no-such-format', is not available.
+ */
+ function testBadFormat()
+ {
+ $this->assertFormattedOutputMatches('Will fail, not return', 'no-such-format', ['a' => 'b']);
+ }
+
+ /**
+ * @expectedException \Consolidation\OutputFormatters\Exception\IncompatibleDataException
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage Data provided to Consolidation\OutputFormatters\Formatters\CsvFormatter must be one of an instance of Consolidation\OutputFormatters\StructuredData\RowsOfFields, an instance of Consolidation\OutputFormatters\StructuredData\PropertyList or an array. Instead, a string was provided.
+ */
+ function testBadDataTypeForCsv()
+ {
+ $this->assertFormattedOutputMatches('Will fail, not return', 'csv', 'String cannot be converted to csv');
+ }
+
+ /**
+ * @expectedException \Consolidation\OutputFormatters\Exception\IncompatibleDataException
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage Data provided to Consolidation\OutputFormatters\Formatters\JsonFormatter must be an array. Instead, a string was provided.
+ */
+ function testBadDataTypeForJson()
+ {
+ $this->assertFormattedOutputMatches('Will fail, not return', 'json', 'String cannot be converted to json');
+ }
+
+ function testNoFormatterSelected()
+ {
+ $data = 'Hello';
+ $expected = $data;
+ $this->assertFormattedOutputMatches($expected, '', $data);
+ }
+
+ function testRenderTableAsString()
+ {
+ $data = new RowsOfFields([['f1' => 'A', 'f2' => 'B', 'f3' => 'C'], ['f1' => 'x', 'f2' => 'y', 'f3' => 'z']]);
+ $expected = "A\tB\tC\nx\ty\tz";
+
+ $this->assertFormattedOutputMatches($expected, 'string', $data);
+ }
+
+ function testRenderTableAsStringWithSingleField()
+ {
+ $data = new RowsOfFields([['f1' => 'q', 'f2' => 'r', 'f3' => 's'], ['f1' => 'x', 'f2' => 'y', 'f3' => 'z']]);
+ $expected = "q\nx";
+
+ $options = new FormatterOptions([FormatterOptions::DEFAULT_STRING_FIELD => 'f1']);
+
+ $this->assertFormattedOutputMatches($expected, 'string', $data, $options);
+ }
+
+ function testRenderTableAsStringWithSingleFieldAndUserSelectedField()
+ {
+ $data = new RowsOfFields([['f1' => 'q', 'f2' => 'r', 'f3' => 's'], ['f1' => 'x', 'f2' => 'y', 'f3' => 'z']]);
+ $expected = "r\ny";
+
+ $options = new FormatterOptions([FormatterOptions::DEFAULT_STRING_FIELD => 'f1']);
+
+ $this->assertFormattedOutputMatches($expected, 'string', $data, $options, ['fields' => 'f2']);
+ }
+
+ function testSimpleCsv()
+ {
+ $data = ['a', 'b', 'c'];
+ $expected = "a,b,c";
+
+ $this->assertFormattedOutputMatches($expected, 'csv', $data);
+ }
+
+ function testLinesOfCsv()
+ {
+ $data = [['a', 'b', 'c'], ['x', 'y', 'z']];
+ $expected = "a,b,c\nx,y,z";
+
+ $this->assertFormattedOutputMatches($expected, 'csv', $data);
+ }
+
+ function testCsvWithEscapedValues()
+ {
+ $data = ["Red apple", "Yellow lemon"];
+ $expected = '"Red apple","Yellow lemon"';
+
+ $this->assertFormattedOutputMatches($expected, 'csv', $data);
+ }
+
+ function testCsvWithEmbeddedSingleQuote()
+ {
+ $data = ["John's book", "Mary's laptop"];
+ $expected = <<assertFormattedOutputMatches($expected, 'csv', $data);
+ }
+
+ function testCsvWithEmbeddedDoubleQuote()
+ {
+ $data = ['The "best" solution'];
+ $expected = <<assertFormattedOutputMatches($expected, 'csv', $data);
+ }
+
+ function testCsvBothKindsOfQuotes()
+ {
+ $data = ["John's \"new\" book", "Mary's \"modified\" laptop"];
+ $expected = <<assertFormattedOutputMatches($expected, 'csv', $data);
+ }
+
+ function testSimpleTsv()
+ {
+ $data = ['a', 'b', 'c'];
+ $expected = "a\tb\tc";
+
+ $this->assertFormattedOutputMatches($expected, 'tsv', $data);
+ }
+
+ function testLinesOfTsv()
+ {
+ $data = [['a', 'b', 'c'], ['x', 'y', 'z']];
+ $expected = "a\tb\tc\nx\ty\tz";
+
+ $this->assertFormattedOutputMatches($expected, 'tsv', $data);
+ }
+
+ function testTsvBothKindsOfQuotes()
+ {
+ $data = ["John's \"new\" book", "Mary's \"modified\" laptop"];
+ $expected = "John's \"new\" book\tMary's \"modified\" laptop";
+
+ $this->assertFormattedOutputMatches($expected, 'tsv', $data);
+ }
+
+ function testTsvWithEscapedValues()
+ {
+ $data = ["Red apple", "Yellow lemon", "Embedded\ttab"];
+ $expected = "Red apple\tYellow lemon\tEmbedded\\ttab";
+
+ $this->assertFormattedOutputMatches($expected, 'tsv', $data);
+ }
+
+ protected function missingCellTableExampleData()
+ {
+ $data = [
+ [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ],
+ [
+ 'one' => 'x',
+ 'three' => 'z',
+ ],
+ ];
+ return new RowsOfFields($data);
+ }
+
+ function testTableWithMissingCell()
+ {
+ $data = $this->missingCellTableExampleData();
+
+ $expected = <<assertFormattedOutputMatches($expected, 'table', $data);
+
+ $expectedCsv = <<assertFormattedOutputMatches($expectedCsv, 'csv', $data);
+
+ $expectedTsv = <<assertFormattedOutputMatches($expectedTsv, 'tsv', $data);
+
+ $expectedTsvWithHeaders = <<assertFormattedOutputMatches($expectedTsvWithHeaders, 'tsv', $data, new FormatterOptions(), ['include-field-labels' => true]);
+ }
+
+ function testTableWithWordWrapping()
+ {
+ $options = new FormatterOptions();
+ $options->setWidth(42);
+
+ $data = [
+ [
+ 'first' => 'This is a really long cell that contains a lot of data. When it is rendered, it should be wrapped across multiple lines.',
+ 'second' => 'This is the second column of the same table. It is also very long, and should be wrapped across multiple lines, just like the first column.',
+ ]
+ ];
+ $data = new RowsOfFields($data);
+
+ $expected = <<assertFormattedOutputMatches($expected, 'table', $data, $options);
+ }
+
+ protected function simpleTableExampleData()
+ {
+ $data = [
+ 'id-123' =>
+ [
+ 'one' => 'a',
+ 'two' => 'b',
+ 'three' => 'c',
+ ],
+ 'id-456' =>
+ [
+ 'one' => 'x',
+ 'two' => 'y',
+ 'three' => 'z',
+ ],
+ ];
+ return new RowsOfFields($data);
+ }
+
+ /**
+ * @expectedException \Consolidation\OutputFormatters\Exception\InvalidFormatException
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage The format table cannot be used with the data produced by this command, which was an array. Valid formats are: csv,json,list,php,print-r,string,tsv,var_export,xml,yaml
+ */
+ function testIncompatibleDataForTableFormatter()
+ {
+ $data = $this->simpleTableExampleData()->getArrayCopy();
+ $this->assertFormattedOutputMatches('Should throw an exception before comparing the table data', 'table', $data);
+ }
+
+ /**
+ * @expectedException \Consolidation\OutputFormatters\Exception\InvalidFormatException
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage The format sections cannot be used with the data produced by this command, which was an array. Valid formats are: csv,json,list,php,print-r,string,tsv,var_export,xml,yaml
+ */
+ function testIncompatibleDataForSectionsFormatter()
+ {
+ $data = $this->simpleTableExampleData()->getArrayCopy();
+ $this->assertFormattedOutputMatches('Should throw an exception before comparing the table data', 'sections', $data);
+ }
+
+ function testSimpleTable()
+ {
+ $data = $this->simpleTableExampleData();
+
+ $expected = <<assertFormattedOutputMatches($expected, 'table', $data);
+
+ $expectedBorderless = <<assertFormattedOutputMatches($expectedBorderless, 'table', $data, new FormatterOptions(['table-style' => 'borderless']));
+
+ $expectedJson = <<assertFormattedOutputMatches($expectedJson, 'json', $data);
+
+ $expectedCsv = <<assertFormattedOutputMatches($expectedCsv, 'csv', $data);
+
+ $expectedList = <<assertFormattedOutputMatches($expectedList, 'list', $data);
+ }
+
+ protected function tableWithAlternativesExampleData()
+ {
+ $data = [
+ 'id-123' =>
+ [
+ 'one' => 'a',
+ 'two' => ['this', 'that', 'the other thing'],
+ 'three' => 'c',
+ ],
+ 'id-456' =>
+ [
+ 'one' => 'x',
+ 'two' => 'y',
+ 'three' => ['apples', 'oranges'],
+ ],
+ ];
+ return new RowsOfFieldsWithAlternatives($data);
+ }
+
+ function testTableWithAlternatives()
+ {
+ $data = $this->tableWithAlternativesExampleData();
+
+ $expected = <<assertFormattedOutputMatches($expected, 'table', $data);
+
+ $expectedBorderless = <<assertFormattedOutputMatches($expectedBorderless, 'table', $data, new FormatterOptions(['table-style' => 'borderless']));
+
+ $expectedJson = <<assertFormattedOutputMatches($expectedJson, 'json', $data);
+
+ $expectedCsv = <<assertFormattedOutputMatches($expectedCsv, 'csv', $data);
+
+ $expectedList = <<assertFormattedOutputMatches($expectedList, 'list', $data);
+ }
+
+ function testSimpleTableWithFieldLabels()
+ {
+ $data = $this->simpleTableExampleData();
+ $configurationData = new FormatterOptions(
+ [
+ 'field-labels' => ['one' => 'Ichi', 'two' => 'Ni', 'three' => 'San'],
+ 'row-labels' => ['id-123' => 'Walrus', 'id-456' => 'Carpenter'],
+ ]
+ );
+ $configurationDataAnnotationFormat = new FormatterOptions(
+ [
+ 'field-labels' => "one: Uno\ntwo: Dos\nthree: Tres",
+ ]
+ );
+
+ $expected = <<assertFormattedOutputMatches($expected, 'table', $data, $configurationData);
+
+ $expectedSidewaysTable = <<assertFormattedOutputMatches($expectedSidewaysTable, 'table', $data, $configurationData->override(['list-orientation' => true]));
+
+ $expectedAnnotationFormatConfigData = <<assertFormattedOutputMatches($expectedAnnotationFormatConfigData, 'table', $data, $configurationDataAnnotationFormat);
+
+ $expectedWithNoFields = <<assertFormattedOutputMatches($expectedWithNoFields, 'table', $data, $configurationData, ['include-field-labels' => false]);
+
+ $expectedWithReorderedFields = <<assertFormattedOutputMatches($expectedWithReorderedFields, 'table', $data, $configurationData, ['fields' => ['three', 'one']]);
+ $this->assertFormattedOutputMatches($expectedWithReorderedFields, 'table', $data, $configurationData, ['fields' => ['San', 'Ichi']]);
+ $this->assertFormattedOutputMatches($expectedWithReorderedFields, 'table', $data, $configurationData, ['fields' => 'San,Ichi']);
+
+ $expectedWithRegexField = <<assertFormattedOutputMatches($expectedWithRegexField, 'table', $data, $configurationData, ['fields' => ['/e$/']]);
+ $this->assertFormattedOutputMatches($expectedWithRegexField, 'table', $data, $configurationData, ['fields' => ['*e']]);
+ $this->assertFormattedOutputMatches($expectedWithRegexField, 'table', $data, $configurationData, ['default-fields' => ['*e']]);
+
+ $expectedSections = <<assertFormattedOutputMatches($expectedSections, 'sections', $data, $configurationData);
+
+ $expectedJson = <<assertFormattedOutputMatches($expectedJson, 'json', $data, $configurationData, ['fields' => ['San', 'Ichi']]);
+
+ $expectedSingleField = <<assertFormattedOutputMatches($expectedSingleField, 'table', $data, $configurationData, ['field' => 'San']);
+ }
+
+ /**
+ * @expectedException \Consolidation\OutputFormatters\Exception\UnknownFieldException
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage The requested field, 'Shi', is not defined.
+ */
+ function testNoSuchFieldException()
+ {
+ $configurationData = new FormatterOptions(
+ [
+ 'field-labels' => ['one' => 'Ichi', 'two' => 'Ni', 'three' => 'San'],
+ 'row-labels' => ['id-123' => 'Walrus', 'id-456' => 'Carpenter'],
+ ]
+ );
+ $data = $this->simpleTableExampleData();
+ $this->assertFormattedOutputMatches('Will throw before comparing', 'table', $data, $configurationData, ['field' => 'Shi']);
+ }
+
+ protected function simpleListExampleData()
+ {
+ $data = [
+ 'one' => 'apple',
+ 'two' => 'banana',
+ 'three' => 'carrot',
+ ];
+ return new PropertyList($data);
+ }
+
+ // Test with the deprecated data structure
+ protected function simpleListExampleDataUsingAssociativeList()
+ {
+ $data = [
+ 'one' => 'apple',
+ 'two' => 'banana',
+ 'three' => 'carrot',
+ ];
+ return new AssociativeList($data);
+ }
+
+ /**
+ * @expectedException \Consolidation\OutputFormatters\Exception\InvalidFormatException
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage The format table cannot be used with the data produced by this command, which was an array. Valid formats are: csv,json,list,php,print-r,string,tsv,var_export,xml,yaml
+ */
+ function testIncompatibleListDataForTableFormatter()
+ {
+ $data = $this->simpleListExampleData();
+ $this->assertFormattedOutputMatches('Should throw an exception before comparing the table data', 'table', $data->getArrayCopy());
+ }
+
+ function testEmptyList()
+ {
+ $data = new RowsOfFields([]);
+
+ $expected = <<setFieldLabels(['one' => 'I', 'two' => 'II', 'three' => 'III']);
+ $this->assertFormattedOutputMatches($expected, 'table', $data, $formatterOptionsWithFieldLables);
+ }
+
+ function testSimpleList()
+ {
+
+ $expected = <<simpleListExampleDataUsingAssociativeList();
+
+ $this->assertFormattedOutputMatches($expected, 'table', $data);
+
+ $data = $this->simpleListExampleData();
+
+ $this->assertFormattedOutputMatches($expected, 'table', $data);
+
+ $expected = <<setFieldLabels(['one' => 'I', 'two' => 'II', 'three' => 'III']);
+ $this->assertFormattedOutputMatches($expected, 'table', $data, $formatterOptionsWithFieldLables);
+
+ // Adding an extra field that does not exist in the data set should not change the output
+ $formatterOptionsWithExtraFieldLables = new FormatterOptions();
+ $formatterOptionsWithExtraFieldLables
+ ->setFieldLabels(['one' => 'I', 'two' => 'II', 'three' => 'III', 'four' => 'IV']);
+ $this->assertFormattedOutputMatches($expected, 'table', $data, $formatterOptionsWithExtraFieldLables);
+
+ $expectedRotated = <<assertFormattedOutputMatches($expectedRotated, 'table', $data, new FormatterOptions(['list-orientation' => false]));
+
+ $expectedList = <<< EOT
+apple
+banana
+carrot
+EOT;
+ $this->assertFormattedOutputMatches($expectedList, 'list', $data);
+
+ $expectedReorderedList = <<< EOT
+carrot
+apple
+EOT;
+ $options = new FormatterOptions([FormatterOptions::FIELDS => 'three,one']);
+ $this->assertFormattedOutputMatches($expectedReorderedList, 'list', $data, $options);
+
+ $expectedCsv = <<< EOT
+One,Two,Three
+apple,banana,carrot
+EOT;
+ $this->assertFormattedOutputMatches($expectedCsv, 'csv', $data);
+
+ $expectedCsvNoHeaders = 'apple,banana,carrot';
+ $this->assertFormattedOutputMatches($expectedCsvNoHeaders, 'csv', $data, new FormatterOptions(), ['include-field-labels' => false]);
+
+ // Next, configure the formatter options with 'include-field-labels',
+ // but set --include-field-labels to turn the option back on again.
+ $options = new FormatterOptions(['include-field-labels' => false]);
+ $input = new StringInput('test --include-field-labels');
+ $optionDefinitions = [
+ new InputArgument('unused', InputArgument::REQUIRED),
+ new InputOption('include-field-labels', null, InputOption::VALUE_NONE),
+ ];
+ $definition = new InputDefinition($optionDefinitions);
+ $input->bind($definition);
+ $testValue = $input->getOption('include-field-labels');
+ $this->assertTrue($testValue);
+ $hasFieldLabels = $input->hasOption('include-field-labels');
+ $this->assertTrue($hasFieldLabels);
+
+ $this->assertFormattedOutputMatches($expectedCsvNoHeaders, 'csv', $data, $options);
+ $options->setInput($input);
+ $this->assertFormattedOutputMatches($expectedCsv, 'csv', $data, $options);
+ }
+
+ protected function associativeListWithRenderer()
+ {
+ $data = [
+ 'one' => 'apple',
+ 'two' => ['banana', 'plantain'],
+ 'three' => 'carrot',
+ 'four' => ['peaches', 'pumpkin pie'],
+ ];
+ $list = new PropertyList($data);
+
+ $list->addRendererFunction(
+ function ($key, $cellData, FormatterOptions $options)
+ {
+ if (is_array($cellData)) {
+ return implode(',', $cellData);
+ }
+ return $cellData;
+ }
+ );
+
+ return $list;
+ }
+
+ protected function associativeListWithCsvCells()
+ {
+ $data = [
+ 'one' => 'apple',
+ 'two' => ['banana', 'plantain'],
+ 'three' => 'carrot',
+ 'four' => ['peaches', 'pumpkin pie'],
+ ];
+ return new PropertyListWithCsvCells($data);
+ }
+
+ function testPropertyListWithCsvCells()
+ {
+ $this->doPropertyListWithCsvCells($this->associativeListWithRenderer());
+ $this->doPropertyListWithCsvCells($this->associativeListWithCsvCells());
+ }
+
+ function doPropertyListWithCsvCells($data)
+ {
+ $expected = <<assertFormattedOutputMatches($expected, 'table', $data);
+
+ $expectedList = <<< EOT
+apple
+banana,plantain
+carrot
+peaches,pumpkin pie
+EOT;
+ $this->assertFormattedOutputMatches($expectedList, 'list', $data);
+
+ $expectedCsv = <<< EOT
+One,Two,Three,Four
+apple,"banana,plantain",carrot,"peaches,pumpkin pie"
+EOT;
+ $this->assertFormattedOutputMatches($expectedCsv, 'csv', $data);
+
+ $expectedCsvNoHeaders = 'apple,"banana,plantain",carrot,"peaches,pumpkin pie"';
+ $this->assertFormattedOutputMatches($expectedCsvNoHeaders, 'csv', $data, new FormatterOptions(), ['include-field-labels' => false]);
+
+ $expectedTsv = <<< EOT
+apple\tbanana,plantain\tcarrot\tpeaches,pumpkin pie
+EOT;
+ $this->assertFormattedOutputMatches($expectedTsv, 'tsv', $data);
+
+ }
+
+ function testSimpleListWithFieldLabels()
+ {
+ $data = $this->simpleListExampleData();
+ $configurationData = new FormatterOptions(
+ [
+ 'field-labels' => ['one' => 'Ichi', 'two' => 'Ni', 'three' => 'San'],
+ ]
+ );
+
+ $expected = <<assertFormattedOutputMatches($expected, 'table', $data, $configurationData);
+
+ $expectedWithReorderedFields = <<assertFormattedOutputMatches($expectedWithReorderedFields, 'table', $data, $configurationData, ['fields' => ['three', 'one']]);
+ $this->assertFormattedOutputMatches($expectedWithReorderedFields, 'table', $data, $configurationData, ['fields' => ['San', 'Ichi']]);
+
+ $expectedJson = <<assertFormattedOutputMatches($expectedJson, 'json', $data, $configurationData, ['fields' => ['San', 'Ichi']]);
+ }
+
+ function testSimpleXml()
+ {
+ $data = [
+ 'name' => 'primary',
+ 'description' => 'The primary colors of the color wheel.',
+ 'colors' =>
+ [
+ 'red',
+ 'yellow',
+ 'blue',
+ ],
+ ];
+
+ $expected = <<
+
+ The primary colors of the color wheel.
+
+ red
+ yellow
+ blue
+
+
+EOT;
+
+ $this->assertFormattedOutputMatches($expected, 'xml', $data);
+ }
+
+ function domDocumentData()
+ {
+ $dom = new \DOMDocument('1.0', 'UTF-8');
+
+ $document = $dom->createElement('document');
+ $dom->appendChild($document);
+
+ $document->setAttribute('name', 'primary');
+ $description = $dom->createElement('description');
+ $document->appendChild($description);
+ $description->appendChild($dom->createTextNode('The primary colors of the color wheel.'));
+
+ $this->domCreateElements($dom, $document, 'color', ['red', 'yellow', 'blue']);
+
+ return $dom;
+ }
+
+ function domCreateElements($dom, $element, $name, $data)
+ {
+ $container = $dom->createElement("{$name}s");
+ $element->appendChild($container);
+ foreach ($data as $value) {
+ $child = $dom->createElement($name);
+ $container->appendChild($child);
+ $child->appendChild($dom->createTextNode($value));
+ }
+ }
+
+ function complexDomDocumentData()
+ {
+ $dom = new \DOMDocument('1.0', 'UTF-8');
+
+ $document = $dom->createElement('document');
+ $dom->appendChild($document);
+
+ $document->setAttribute('name', 'widget-collection');
+ $description = $dom->createElement('description');
+ $document->appendChild($description);
+ $description->appendChild($dom->createTextNode('A couple of widgets.'));
+
+ $widgets = $dom->createElement('widgets');
+ $document->appendChild($widgets);
+
+ $widget = $dom->createElement('widget');
+ $widgets->appendChild($widget);
+ $widget->setAttribute('name', 'usual');
+ $this->domCreateElements($dom, $widget, 'color', ['red', 'yellow', 'blue']);
+ $this->domCreateElements($dom, $widget, 'shape', ['square', 'circle', 'triangle']);
+
+ $widget = $dom->createElement('widget');
+ $widgets->appendChild($widget);
+ $widget->setAttribute('name', 'unusual');
+ $this->domCreateElements($dom, $widget, 'color', ['muave', 'puce', 'umber']);
+ $this->domCreateElements($dom, $widget, 'shape', ['elipse', 'rhombus', 'trapazoid']);
+
+ return $dom;
+ }
+
+ function domDocumentTestValues()
+ {
+
+ $expectedXml = <<
+
+ The primary colors of the color wheel.
+
+ red
+ yellow
+ blue
+
+
+EOT;
+
+ $expectedJson = <<
+
+ A couple of widgets.
+
+
+
+ red
+ yellow
+ blue
+
+
+ square
+ circle
+ triangle
+
+
+
+
+ muave
+ puce
+ umber
+
+
+ elipse
+ rhombus
+ trapazoid
+
+
+
+
+EOT;
+
+ $expectedComplexJson = <<domDocumentData(),
+ $expectedXml,
+ $expectedJson,
+ ],
+ [
+ $this->complexDomDocumentData(),
+ $expectedComplexXml,
+ $expectedComplexJson,
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider domDocumentTestValues
+ */
+ function testDomData($data, $expectedXml, $expectedJson)
+ {
+ $this->assertFormattedOutputMatches($expectedXml, 'xml', $data);
+ $this->assertFormattedOutputMatches($expectedJson, 'json', $data);
+
+ // Check to see if we get the same xml data if we convert from
+ // DOM -> array -> DOM.
+ $expectedJsonAsArray = (array)json_decode($expectedJson);
+ $this->assertFormattedOutputMatches($expectedXml, 'xml', $expectedJsonAsArray);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionCode 1
+ * @expectedExceptionMessage Data provided to Consolidation\OutputFormatters\Formatters\XmlFormatter must be either an instance of DOMDocument or an array. Instead, a string was provided.
+ */
+ function testDataTypeForXmlFormatter()
+ {
+ $this->assertFormattedOutputMatches('Will fail, not return', 'xml', 'Strings cannot be converted to XML');
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/tests/testIncompatibleData.php b/src/composer/vendor/consolidation/output-formatters/tests/testIncompatibleData.php
new file mode 100644
index 00000000..d38f9620
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/tests/testIncompatibleData.php
@@ -0,0 +1,64 @@
+formatterManager = new FormatterManager();
+ }
+
+ protected function assertIncompatibleDataMessage($expected, $formatter, $data)
+ {
+ $e = new IncompatibleDataException($formatter, $data, $formatter->validDataTypes());
+ $this->assertEquals($expected, $e->getMessage());
+ }
+
+ public function testIncompatibleData()
+ {
+ $tableFormatter = $this->formatterManager->getFormatter('table');
+
+ $this->assertIncompatibleDataMessage('Data provided to Consolidation\OutputFormatters\Formatters\TableFormatter must be either an instance of Consolidation\OutputFormatters\StructuredData\RowsOfFields or an instance of Consolidation\OutputFormatters\StructuredData\PropertyList. Instead, a string was provided.', $tableFormatter, 'a string');
+ $this->assertIncompatibleDataMessage('Data provided to Consolidation\OutputFormatters\Formatters\TableFormatter must be either an instance of Consolidation\OutputFormatters\StructuredData\RowsOfFields or an instance of Consolidation\OutputFormatters\StructuredData\PropertyList. Instead, an instance of Consolidation\OutputFormatters\FormatterManager was provided.', $tableFormatter, $this->formatterManager);
+ $this->assertIncompatibleDataMessage('Data provided to Consolidation\OutputFormatters\Formatters\TableFormatter must be either an instance of Consolidation\OutputFormatters\StructuredData\RowsOfFields or an instance of Consolidation\OutputFormatters\StructuredData\PropertyList. Instead, an array was provided.', $tableFormatter, []);
+ $this->assertIncompatibleDataMessage('Data provided to Consolidation\OutputFormatters\Formatters\TableFormatter must be either an instance of Consolidation\OutputFormatters\StructuredData\RowsOfFields or an instance of Consolidation\OutputFormatters\StructuredData\PropertyList. Instead, an instance of Consolidation\OutputFormatters\StructuredData\PropertyList was provided.', $tableFormatter, new PropertyList([]));
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Undescribable data error: NULL
+ */
+ public function testUndescribableData()
+ {
+ $tableFormatter = $this->formatterManager->getFormatter('table');
+ $data = $tableFormatter->validate(null);
+ $this->assertEquals('Will throw before comparing.', $data);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Data provided to Consolidation\OutputFormatters\Formatters\TableFormatter must be either an instance of Consolidation\OutputFormatters\StructuredData\RowsOfFields or an instance of Consolidation\OutputFormatters\StructuredData\PropertyList. Instead, a string was provided.
+ */
+ public function testInvalidTableData()
+ {
+ $tableFormatter = $this->formatterManager->getFormatter('table');
+ $data = $tableFormatter->validate('bad data type');
+ $this->assertEquals('Will throw before comparing.', $data);
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Data provided to Consolidation\OutputFormatters\Formatters\SectionsFormatter must be an instance of Consolidation\OutputFormatters\StructuredData\RowsOfFields. Instead, a string was provided.
+ */
+ public function testInvalidSectionsData()
+ {
+ $tableFormatter = $this->formatterManager->getFormatter('sections');
+ $data = $tableFormatter->validate('bad data type');
+ $this->assertEquals('Will throw before comparing.', $data);
+ }
+}
diff --git a/src/composer/vendor/consolidation/output-formatters/tests/testValidFormats.php b/src/composer/vendor/consolidation/output-formatters/tests/testValidFormats.php
new file mode 100644
index 00000000..c02e5743
--- /dev/null
+++ b/src/composer/vendor/consolidation/output-formatters/tests/testValidFormats.php
@@ -0,0 +1,88 @@
+formatterManager = new FormatterManager();
+ $this->formatterManager->addDefaultFormatters();
+ $this->formatterManager->addDefaultSimplifiers();
+ }
+
+ function testValidFormats()
+ {
+ $arrayObjectRef = new \ReflectionClass('\ArrayObject');
+ $associativeListRef = new \ReflectionClass('\Consolidation\OutputFormatters\StructuredData\PropertyList');
+ $rowsOfFieldsRef = new \ReflectionClass('\Consolidation\OutputFormatters\StructuredData\RowsOfFields');
+ $notADataType = new \ReflectionClass('\Consolidation\OutputFormatters\FormatterManager');
+
+ $jsonFormatter = $this->formatterManager->getFormatter('json');
+ $isValid = $this->formatterManager->isValidFormat($jsonFormatter, $notADataType);
+ $this->assertFalse($isValid);
+ $isValid = $this->formatterManager->isValidFormat($jsonFormatter, new \ArrayObject());
+ $this->assertTrue($isValid);
+ $isValid = $this->formatterManager->isValidFormat($jsonFormatter, $arrayObjectRef);
+ $this->assertTrue($isValid);
+ $isValid = $this->formatterManager->isValidFormat($jsonFormatter, []);
+ $this->assertTrue($isValid);
+ $isValid = $this->formatterManager->isValidFormat($jsonFormatter, $associativeListRef);
+ $this->assertTrue($isValid);
+ $isValid = $this->formatterManager->isValidFormat($jsonFormatter, $rowsOfFieldsRef);
+ $this->assertTrue($isValid);
+
+ $sectionsFormatter = $this->formatterManager->getFormatter('sections');
+ $isValid = $this->formatterManager->isValidFormat($sectionsFormatter, $notADataType);
+ $this->assertFalse($isValid);
+ $isValid = $this->formatterManager->isValidFormat($sectionsFormatter, []);
+ $this->assertFalse($isValid);
+ $isValid = $this->formatterManager->isValidFormat($sectionsFormatter, $arrayObjectRef);
+ $this->assertFalse($isValid);
+ $isValid = $this->formatterManager->isValidFormat($sectionsFormatter, $rowsOfFieldsRef);
+ $this->assertTrue($isValid);
+ $isValid = $this->formatterManager->isValidFormat($sectionsFormatter, $associativeListRef);
+ $this->assertFalse($isValid);
+
+ // Check to see which formats can handle a simple array
+ $validFormats = $this->formatterManager->validFormats([]);
+ $this->assertEquals('csv,json,list,php,print-r,string,tsv,var_export,xml,yaml', implode(',', $validFormats));
+
+ // Check to see which formats can handle an PropertyList
+ $validFormats = $this->formatterManager->validFormats($associativeListRef);
+ $this->assertEquals('csv,json,list,php,print-r,string,table,tsv,var_export,xml,yaml', implode(',', $validFormats));
+
+ // Check to see which formats can handle an RowsOfFields
+ $validFormats = $this->formatterManager->validFormats($rowsOfFieldsRef);
+ $this->assertEquals('csv,json,list,php,print-r,sections,string,table,tsv,var_export,xml,yaml', implode(',', $validFormats));
+
+ // TODO: it woud be better if this returned an empty set instead of 'string'.
+ $validFormats = $this->formatterManager->validFormats($notADataType);
+ $this->assertEquals('string', implode(',', $validFormats));
+ }
+
+ function testAutomaticOptions()
+ {
+ $rowsOfFieldsRef = new \ReflectionClass('\Consolidation\OutputFormatters\StructuredData\RowsOfFields');
+ $formatterOptions = new FormatterOptions(
+ [
+ FormatterOptions::FIELD_LABELS => "name: Name\nphone_number: Phone Number",
+ ]
+ );
+ $inputOptions = $this->formatterManager->automaticOptions($formatterOptions, $rowsOfFieldsRef);
+ $this->assertInputOptionDescriptionsEquals("Format the result data. Available formats: csv,json,list,php,print-r,sections,string,table,tsv,var_export,xml,yaml [Default: 'table']\nAvailable fields: Name (name), Phone Number (phone_number) [Default: '']\nSelect just one field, and force format to 'string'. [Default: '']", $inputOptions);
+ }
+
+ function assertInputOptionDescriptionsEquals($expected, $inputOptions)
+ {
+ $descriptions = [];
+ foreach ($inputOptions as $inputOption) {
+ $descriptions[] = $inputOption->getDescription() . " [Default: '" . $inputOption->getDefault() . "']";
+ }
+ $this->assertEquals($expected, implode("\n", $descriptions));
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/.editorconfig b/src/composer/vendor/consolidation/robo/.editorconfig
new file mode 100644
index 00000000..095771e6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/.editorconfig
@@ -0,0 +1,15 @@
+# This file is for unifying the coding style for different editors and IDEs
+# editorconfig.org
+
+root = true
+
+[*]
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[**.php]
+indent_style = space
+indent_size = 4
+
diff --git a/src/composer/vendor/consolidation/robo/.github/issue_template.md b/src/composer/vendor/consolidation/robo/.github/issue_template.md
new file mode 100644
index 00000000..97335f49
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/.github/issue_template.md
@@ -0,0 +1,11 @@
+### Steps to reproduce
+What did you do?
+
+### Expected behavior
+Tell us what should happen
+
+### Actual behavior
+Tell us what happens instead
+
+### System Configuration
+Which O.S. and PHP version are you using?
diff --git a/src/composer/vendor/consolidation/robo/.github/pull_request_template.md b/src/composer/vendor/consolidation/robo/.github/pull_request_template.md
new file mode 100644
index 00000000..d39b1522
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/.github/pull_request_template.md
@@ -0,0 +1,13 @@
+### Overview
+This pull request:
+
+- [ ] Fixes a bug
+- [ ] Adds a feature
+- [ ] Breaks backwards compatibility
+- [ ] Needs tests
+
+### Summary
+Short overview of what changed.
+
+### Description
+Any additional information.
diff --git a/src/composer/vendor/consolidation/robo/.gitignore b/src/composer/vendor/consolidation/robo/.gitignore
new file mode 100644
index 00000000..bc900d2f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/.gitignore
@@ -0,0 +1,9 @@
+vendor/
+.idea/
+build
+site/
+robotheme/
+tests/_log/*
+tests/_helpers/_generated/*
+composer.phar
+robo.phar
diff --git a/src/composer/vendor/consolidation/robo/.scrutinizer.yml b/src/composer/vendor/consolidation/robo/.scrutinizer.yml
new file mode 100644
index 00000000..f84f59b4
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/.scrutinizer.yml
@@ -0,0 +1,3 @@
+filter:
+ excluded_paths:
+ - "RoboFile.php"
diff --git a/src/composer/vendor/consolidation/robo/.travis.yml b/src/composer/vendor/consolidation/robo/.travis.yml
new file mode 100644
index 00000000..b7361a49
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/.travis.yml
@@ -0,0 +1,47 @@
+language: php
+
+branches:
+ # Only test the master branch and SemVer tags.
+ only:
+ - master
+ - /^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+.*$/
+
+matrix:
+ include:
+ - php: 7.0
+ env: dependencies=highest
+ - php: 5.6
+ - php: 5.5
+ - php: 5.5
+ env: dependencies=lowest
+
+sudo: false
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+before_script:
+ - if [ -z "$dependencies" ]; then composer install --prefer-dist; fi;
+ - if [ "$dependencies" = "lowest" ]; then composer update --prefer-dist --prefer-lowest -n; fi;
+ - if [ "$dependencies" = "highest" ]; then composer update --prefer-dist -n; fi;
+
+script: "./robo test --coverage"
+
+after_success:
+ - travis_retry php vendor/bin/coveralls -v
+
+# Prior to a deploy, build a fresh robo.phar
+before_deploy:
+ - ./robo phar:build
+
+# Deploy instructions set up via `travis setup releases` per
+# https://docs.travis-ci.com/user/deployment/releases
+deploy:
+ provider: releases
+ api_key:
+ secure: EdmB1nW5gj5nggYfmHv20enSgvRIAl1PIWV5GKmkxAJwuummh3UqdI7z0ecTGdw2IBgJx9lizNvqhcWjXbpNhE9VaaT1sHFCKv4Zust6sLb9bneK3oLRdJk2wemfrrZQpdH900zA0o7b3CHVth8UhkrCB4FXVDjUW13K061EXG8=
+ file: robo.phar
+ skip_cleanup: true
+ on:
+ tags: true
diff --git a/src/composer/vendor/consolidation/robo/CHANGELOG.md b/src/composer/vendor/consolidation/robo/CHANGELOG.md
new file mode 100644
index 00000000..d00b18c9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/CHANGELOG.md
@@ -0,0 +1,240 @@
+# Changelog
+
+#### 1.0.4
+
+* Updated to latest changes in `master` branch. Phar and tag issues.
+
+#### 1.0.0
+
+* [Collection] Add tasks to a collection, and implement them as a group with rollback
+ * Tasks may be added to a collection via `$collection->add($task);`
+ * `$collection->run();` runs all tasks in the collection
+ * `$collection->addCode(function () { ... } );` to add arbitrary code to a collection
+ * `$collection->progressMessage(...);` will log a message
+ * `$collection->rollback($task);` and `$collection->rollbackCode($callable);` add a rollback function to clean up after a failed task
+ * `$collection->completion($task);` and `$collection->completionCode($callable);` add a function that is called once the collection completes or rolls back.
+ * `$collection->before();` and `$collection->after();` can be used to add a task or function that runs before or after (respectively) the specified named task. To use this feature, tasks must be given names via an optional `$taskName` parameter when they are added.
+ * Collections may be added to collections, if desired.
+* [CollectionBuilder] Create tasks and add them to a collection in a single operation.
+ * `$this->collectionBuilder()->taskExec('pwd')->taskExec('ls')->run()`
+* Add output formatters
+ * If a Robo command returns a string, or a `Result` object with a `$message`, then it will be printed
+ * Commands may be annotated to describe output formats that may be used
+ * Structured arrays returned from function results may be converted into different formats, such as a table, yml, json, etc.
+ * Tasks must `use TaskIO` for output methods. It is no longer possible to `use IO` from a task. For direct access use `Robo::output()` (not recommended).
+* Use league/container to do Dependency Injection
+ * *Breaking* Tasks' loadTasks traits must use `$this->task(TaskClass::class);` instead of `new TaskClass();`
+ * *Breaking* Tasks that use other tasks must use `$this->collectionBuilder()->taskName();` instead of `new TaskClass();` when creating task objects to call. Implement `Robo\Contract\BuilderAwareInterface` and use `Robo\Contract\BuilderAwareTrait` to add the `collectionBuilder()` method to your task class.
+* *Breaking* The `arg()`, `args()` and `option()` methods in CommandArguments now escape the values passed in to them. There is now a `rawArg()` method if you need to add just one argument that has already been escaped.
+* *Breaking* taskWrite is now called taskWriteToFile
+* [Extract] task added
+* [Pack] task added
+* [TmpDir], [WorkDir] and [TmpFile] tasks added
+* Support Robo scripts that allows scripts starting with `#!/usr/bin/env robo` to define multiple robo commands. Use `#!/usr/bin/env robo run` to define a single robo command implemented by the `run()` method.
+* Provide ProgresIndicatorAwareInterface and ProgressIndicatorAwareTrait that make it easy to add progress indicators to tasks
+* Add --simulate mode that causes tasks to print what they would have done, but make no changes
+* Add `robo generate:task` code-generator to make new stack-based task wrappers around existing classes
+* Add `robo sniff` by @dustinleblanc. Runs the PHP code sniffer followed by the code beautifier, if needed.
+* Implement ArrayInterface for Result class, so result data may be accessed like an array
+* Defer execution of operations in taskWriteToFile until the run() method
+* Add Write::textIfMatch() for taskWriteToFile
+* ResourceExistenceChecker used for error checking in DeleteDir, CopyDir, CleanDir and Concat tasks by @burzum
+* Provide ResultData base class for Result; ResultData may be used in instances where a specific `$task` instance is not available (e.g. in a Robo command)
+* ArgvInput now available via $this->getInput() in RoboFile by Thomas Spigel
+* Add optional message to git tag task by Tim Tegeler
+* Rename 'FileSystem' to 'Filesystem' wherever it occurs.
+* Current directory is changed with `chdir` only if specified via the `--load-from` option (RC2)
+
+#### 0.6.0
+
+* Added `--load-from` option to make Robo start RoboFiles from other directories. Use it like `robo --load-from /path/to/where/RobFile/located`.
+* Robo will not ask to create RoboFile if it does not exist, `init` command should be used.
+* [ImageMinify] task added by @gabor-udvari
+* [OpenBrowser] task added by @oscarotero
+* [FlattenDir] task added by @gabor-udvari
+* Robo Runner can easily extended for custom runner by passing RoboClass and RoboFile parameters to constructor. By @rdeutz See #232
+
+#### 0.5.4
+
+* [WriteToFile] Fixed by @gabor-udvari: always writing to file regardless whether any changes were made or not. This can bring the taskrunner into an inifinite loop if a replaced file is being watched.
+* [Scss] task added, requires `leafo/scssphp` library to compile by @gabor-udvari
+* [PhpSpec] TAP formatter added by @orls
+* [Less] Added ability to set import dir for less compilers by @MAXakaWIZARD
+* [Less] fixed passing closure as compiler by @pr0nbaer
+* [Sass] task added by *2015-08-31*
+
+#### 0.5.3
+
+ * [Rsync] Ability to use remote shell with identity file by @Mihailoff
+ * [Less] Task added by @burzum
+ * [PHPUnit] allow to test specific files with `files` parameter by @burzum.
+ * [GitStack] `tag` added by @SebSept
+ * [Concat] Fixing concat, it breaks some files if there is no new line. @burzum *2015-03-03-13*
+ * [Minify] BC fix to support Jsqueeze 1.x and 2.x @burzum *2015-03-12*
+ * [PHPUnit] Replace log-xml with log-junit @vkunz *2015-03-06*
+ * [Minify] Making it possible to pass options to the JS minification @burzum *2015-03-05*
+ * [CopyDir] Create destination recursively @boedah *2015-02-28*
+
+#### 0.5.2
+
+* [Phar] do not compress phar if more than 1000 files included (causes internal PHP error) *2015-02-24*
+* _copyDir and _mirrorDir shortcuts fixed by @boedah *2015-02-24*
+* [File\Write] methods replace() and regexReplace() added by @asterixcapri *2015-02-24*
+* [Codecept] Allow to set custom name of coverage file raw name by @raistlin *2015-02-24*
+* [Ssh] Added property `remoteDir` by @boedah *2015-02-24*
+* [PhpServer] fixed passing arguments to server *2015-02-24*
+
+
+#### 0.5.1
+
+* [Exec] fixed execution of background jobs, processes persist till the end of PHP script *2015-01-27*
+* [Ssh] Fixed SSH task by @Butochnikov *2015-01-27*
+* [CopyDir] fixed shortcut usage by @boedah *2015-01-27*
+* Added default value options for Configuration trait by @TamasBarta *2015-01-27*
+
+#### 0.5.0
+
+Refactored core
+
+* All traits moved to `Robo\Common` namespace
+* Interfaces moved to `Robo\Contract` namespace
+* All task extend `Robo\Task\BaseTask` to use common IO.
+* All classes follow PSR-4 standard
+* Tasks are loaded into RoboFile with `loadTasks` trait
+* One-line tasks are available as shortcuts loaded by `loadShortucts` and used like `$this->_exec('ls')`
+* Robo runner is less coupled. Output can be set by `\Robo\Config::setOutput`, `RoboFile` can be changed to any provided class.
+* Tasks can be used outside of Robo runner (inside a project)
+* Timer for long-running tasks added
+* Tasks can be globally configured (WIP) via `Robo\Config` class.
+* Updated to Symfony >= 2.5
+* IO methods added `askHidden`, `askDefault`, `confirm`
+* TaskIO methods added `printTaskError`, `printTaskSuccess` with different formatting.
+* [Docker] Tasks added
+* [Gulp] Task added by @schorsch3000
+
+#### 0.4.7
+
+* [Minify] Task added by @Rarst. Requires additional dependencies installed *2014-12-26*
+* [Help command is populated from annotation](https://github.com/consolidation-org/Robo/pull/71) by @jonsa *2014-12-26*
+* Allow empty values as defaults to optional options by @jonsa *2014-12-26*
+* `PHP_WINDOWS_VERSION_BUILD` constant is used to check for Windows in tasks by @boedah *2014-12-26*
+* [Copy][EmptyDir] Fixed infinite loop by @boedah *2014-12-26*
+* [ApiGen] Task added by @drobert *2014-12-26*
+* [FileSystem] Equalized `copy` and `chmod` argument to defaults by @Rarst (BC break) *2014-12-26*
+* [FileSystem] Added missing umask argument to chmod() method of FileSystemStack by @Rarst
+* [SemVer] Fixed file read and exit code
+* [Codeception] fixed codeception coverageHtml option by @gunfrank *2014-12-26*
+* [phpspec] Task added by @SebSept *2014-12-26*
+* Shortcut options: if option name is like foo|f, assign f as shortcut by @jschnare *2014-12-26*
+* [Rsync] Shell escape rsync exclude pattern by @boedah. Fixes #77 (BC break) *2014-12-26*
+* [Npm] Task added by @AAlakkad *2014-12-26*
+
+#### 0.4.6
+
+* [Exec] Output from buffer is not spoiled by special chars *2014-10-17*
+* [PHPUnit] detect PHPUnit on Windows or when is globally installed with Composer *2014-10-17*
+* Output: added methods askDefault and confirm by @bkawakami *2014-10-17*
+* [Svn] Task added by @anvi *2014-08-13*
+* [Stack] added dir and printed options *2014-08-12*
+* [ExecTask] now uses Executable trait with printed, dir, arg, option methods added *2014-08-12*
+
+
+#### 0.4.5
+
+* [Watch] bugfix: Watch only tracks last file if given array of files #46 *2014-08-05*
+* All executable tasks can configure working directory with `dir` option
+* If no value for an option is provided, assume it's a VALUE_NONE option. #47 by @pfaocle
+* [Changelog] changed style *2014-06-27*
+* [GenMarkDown] fixed formatting annotations *2014-06-27*
+
+#### 0.4.4 06/05/2014
+
+* Output can be disabled in all executable tasks by ->printed(false)
+* disabled timeouts by default in ParallelExec
+* better descriptions for Result output
+* changed ParallelTask to display failed process in list
+* Changed Output to be stored globally in Robo\Runner class
+* Added **SshTask** by @boedah
+* Added **RsyncTask** by @boedah
+* false option added to proceess* callbacks in GenMarkDownTask to skip processing
+
+
+#### 0.4.3 05/21/2014
+
+* added `SemVer` task by **@jadb**
+* `yell` output method added
+* task `FileSystemStack` added
+* `MirrorDirTask` added by **@devster**
+* switched to Symfony Filesystem component
+* options can be used to commands
+* array arguments can be used in commands
+
+#### 0.4.2 05/09/2014
+
+* ask can now hide answers
+* Trait Executable added to provide standard way for passing arguments and options
+* added ComposerDumpAutoload task by **@pmcjury**
+* added FileSystem task by **@jadb**
+* added CommonStack metatsk to have similar interface for all stacked tasks by **@jadb**
+* arguments and options can be passed into variable and used in exec task
+* passing options into commands
+
+
+#### 0.4.1 05/05/2014
+
+* [BC] `taskGit` task renamed to `taskGitStack` for compatibility
+* unit and functional tests added
+* all command tasks now use Symfony\Process to execute them
+* enabled Bower and Concat tasks
+* added `printed` param to Exec task
+* codeception `suite` method now returns `$this`
+* timeout options added to Exec task
+
+
+#### 0.4.0 04/27/2014
+
+* Codeception task added
+* PHPUnit task improved
+* Bower task added by @jadb
+* ParallelExec task added
+* Symfony Process component used for execution
+* Task descriptions taken from first line of annotations
+* `CommandInterface` added to use tasks as parameters
+
+#### 0.3.3 02/25/2014
+
+* PHPUnit basic task
+* fixed doc generation
+
+#### 0.3.5 02/21/2014
+
+* changed generated init template
+
+
+#### 0.3.4 02/21/2014
+
+* [PackPhar] ->executable command will remove hashbang when generated stub file
+* [Git][Exec] stopOnFail option for Git and Exec stack
+* [ExecStack] shortcut for executing bash commands in stack
+
+#### 0.3.2 02/20/2014
+
+* release process now includes phar
+* phar executable method added
+* git checkout added
+* phar pack created
+
+
+#### 0.3.0 02/11/2014
+
+* Dynamic configuration via magic methods
+* added WriteToFile task
+* Result class for managing exit codes and error messages
+
+#### 0.2.0 01/29/2014
+
+* Merged Tasks and Traits to same file
+* Added Watcher task
+* Added GitHubRelease task
+* Added Changelog task
+* Added ReplaceInFile task
diff --git a/src/composer/vendor/consolidation/robo/CONTRIBUTING.md b/src/composer/vendor/consolidation/robo/CONTRIBUTING.md
new file mode 100644
index 00000000..43868146
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/CONTRIBUTING.md
@@ -0,0 +1,15 @@
+# Contributing to Robo
+
+Thank you for your interest in contributing to Robo! Here are some of the guidelines you should follow to make the most of your efforts:
+
+## Code Style Guidelines
+
+Robo adheres to the [PSR-2 Coding Style Guide](http://www.php-fig.org/psr/psr-2/) for PHP code. An `.editorconfig` file is included with the repository to help you get up and running quickly. Most modern editors support this standard, but if yours does not or you would like to configure your editor manually, follow the guidelines in the document linked above.
+
+You can run the PHP Codesniffer on your work using a convenient command built into this project's own `RoboFile.php`:
+```
+robo sniff src/Foo.php --autofix
+```
+The above will run the PHP Codesniffer on the `src/Foo.php` file and automatically correct variances from the PSR-2 standard. Please ensure all contributions are compliant _before_ submitting a pull request.
+
+
diff --git a/src/composer/vendor/consolidation/robo/LICENSE b/src/composer/vendor/consolidation/robo/LICENSE
new file mode 100644
index 00000000..63e051a6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Codegyre Developers Team, Consolidation Team
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/composer/vendor/consolidation/robo/README.md b/src/composer/vendor/consolidation/robo/README.md
new file mode 100644
index 00000000..8c807591
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/README.md
@@ -0,0 +1,174 @@
+# RoboTask
+
+**Modern and simple PHP task runner** inspired by Gulp and Rake aimed to automate common tasks:
+
+[](https://gitter.im/consolidation-org/Robo?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[](https://packagist.org/packages/consolidation/robo)
+[](https://packagist.org/packages/consolidation/robo)
+[](https://packagist.org/packages/consolidation/robo)
+[](https://travis-ci.org/consolidation/Robo)
+[](https://www.versioneye.com/user/projects/57c4a6fe968d64004d97620a?child=57c4a6fe968d64004d97620a#tab-licenses)
+
+[](https://travis-ci.org/consolidation/Robo)
+[](https://scrutinizer-ci.com/g/consolidation/Robo/?branch=master)
+[](https://www.versioneye.com/user/projects/57c4a6fe968d64004d97620a)
+
+* writing cross-platform scripts
+* processing assets (less, sass, minification)
+* running tests
+* executing daemons (and workers)
+* watching filesystem changes
+* deployment with sftp/ssh/docker
+
+## Installing
+
+### Phar
+
+[Download robo.phar >](http://robo.li/robo.phar)
+
+```
+wget http://robo.li/robo.phar
+```
+
+To install globally put `robo.phar` in `/usr/bin`.
+
+```
+chmod +x robo.phar && sudo mv robo.phar /usr/bin/robo
+```
+
+Now you can use it just like `robo`.
+
+### Composer
+
+* Run `composer require consolidation/robo:~1`
+* Use `vendor/bin/robo` to execute Robo tasks.
+
+## Usage
+
+All tasks are defined as **public methods** in `RoboFile.php`. It can be created by running `robo`.
+All protected methods in traits that start with `task` prefix are tasks and can be configured and executed in your tasks.
+
+## Examples
+
+The best way to learn Robo by example is to take a look into [its own RoboFile](https://github.com/consolidation-org/Robo/blob/master/RoboFile.php)
+ or [RoboFile of Codeception project](https://github.com/Codeception/Codeception/blob/master/RoboFile.php). There are also some basic example commands in examples/RoboFile.php.
+
+Here are some snippets from them:
+
+---
+
+Run acceptance test with local server and selenium server started.
+
+
+``` php
+taskServer(8000)
+ ->background()
+ ->dir('web')
+ ->run();
+
+ // running Selenium server in background
+ $this->taskExec('java -jar ' . $seleniumPath)
+ ->background()
+ ->run();
+
+ // loading Symfony Command and running with passed argument
+ $this->taskSymfonyCommand(new \Codeception\Command\Run('run'))
+ ->arg('suite','acceptance')
+ ->run();
+ }
+}
+```
+
+If you execute `robo` you will see this task added to list of available task with name: `test:acceptance`.
+To execute it you shoud run `robo test:acceptance`. You may change path to selenium server by passing new path as a argument:
+
+```
+robo test:acceptance "C:\Downloads\selenium.jar"
+```
+
+Using `watch` task so you can use it for running tests or building assets.
+
+``` php
+taskWatch()->monitor('composer.json', function() {
+ $this->taskComposerUpdate()->run();
+ })->run();
+ }
+}
+```
+
+---
+
+Cleaning logs and cache
+
+``` php
+taskCleanDir([
+ 'app/cache',
+ 'app/logs'
+ ])->run();
+
+ $this->taskDeleteDir([
+ 'web/assets/tmp_uploads',
+ ])->run();
+ }
+}
+```
+
+This task cleans `app/cache` and `app/logs` dirs (ignoring .gitignore and .gitkeep files)
+Can be executed by running:
+
+```
+robo clean
+```
+
+----
+
+Creating Phar archive
+
+``` php
+function buildPhar()
+{
+ $files = Finder::create()->ignoreVCS(true)->files()->name('*.php')->in(__DIR__);
+ $packer = $this->taskPackPhar('robo.phar');
+ foreach ($files as $file) {
+ $packer->addFile($file->getRelativePathname(), $file->getRealPath());
+ }
+ $packer->addFile('robo','robo')
+ ->executable('robo')
+ ->run();
+}
+```
+
+---
+
+## We need more tasks!
+
+Create your own tasks and send them as Pull Requests or create packages prefixed with `robo-` on Packagist.
+
+## Credits
+
+Follow [@robo_php](http://twitter.com/robo_php) for updates.
+
+Brought to you by [Consolidation Team](https://github.com/orgs/consolidation/people) and our [awesome contributors](https://github.com/consolidation/Robo/graphs/contributors).
+
+## License
+
+[MIT](https://github.com/consolidation/Robo/blob/master/LICENSE)
diff --git a/src/composer/vendor/consolidation/robo/RoboFile.php b/src/composer/vendor/consolidation/robo/RoboFile.php
new file mode 100644
index 00000000..b9a2810d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/RoboFile.php
@@ -0,0 +1,377 @@
+ false,
+ 'coverage' => false
+ ])
+ {
+ $taskCodecept = $this->taskCodecept()
+ ->args($args);
+
+ if ($options['coverage']) {
+ $taskCodecept->coverageXml('../../build/logs/clover.xml');
+ }
+ if ($options['coverage-html']) {
+ $taskCodecept->coverageHtml('../../build/logs/coverage');
+ }
+
+ return $taskCodecept->run();
+ }
+
+ /**
+ * Code sniffer.
+ *
+ * Run the PHP Codesniffer on a file or directory.
+ *
+ * @param string $file
+ * A file or directory to analyze.
+ * @option $autofix Whether to run the automatic fixer or not.
+ * @option $strict Show warnings as well as errors.
+ * Default is to show only errors.
+ */
+ public function sniff(
+ $file = 'src/',
+ $options = [
+ 'autofix' => false,
+ 'strict' => false,
+ ]
+ ) {
+ $strict = $options['strict'] ? '' : '-n';
+ $result = $this->taskExec("./vendor/bin/phpcs --standard=PSR2 {$strict} {$file}")->run();
+ if (!$result->wasSuccessful()) {
+ if (!$options['autofix']) {
+ $options['autofix'] = $this->confirm('Would you like to run phpcbf to fix the reported errors?');
+ }
+ if ($options['autofix']) {
+ $result = $this->taskExec("./vendor/bin/phpcbf --standard=PSR2 {$file}")->run();
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Generate a new Robo task that wraps an existing utility class.
+ *
+ * @param $className The name of the existing utility class to wrap.
+ * @param $wrapperClassName The name of the wrapper class to create. Optional.
+ * @usage generate:task 'Symfony\Component\Filesystem\Filesystem' FilesystemStack
+ */
+ public function generateTask($className, $wrapperClassName = "")
+ {
+ return $this->taskGenTask($className, $wrapperClassName)->run();
+ }
+
+ /**
+ * Release Robo.
+ */
+ public function release($opts = ['beta' => false])
+ {
+ $this->yell("Releasing Robo");
+ $stable = true;
+ if ($opts['beta']) {
+ $stable = false;
+ $this->say('non-stable release');
+ }
+
+ $this->docs();
+ $this->taskGitStack()
+ ->add('-A')
+ ->commit("auto-update")
+ ->pull()
+ ->push()
+ ->run();
+
+ if ($stable) $this->pharPublish();
+ $this->publish();
+
+ $this->taskGitStack()
+ ->tag(\Robo\Robo::VERSION)
+ ->push('origin master --tags')
+ ->run();
+
+ if ($stable) $this->versionBump();
+ }
+
+ /**
+ * Update changelog.
+ *
+ * Add an entry to the Robo CHANGELOG.md file.
+ *
+ * @param string $addition The text to add to the change log.
+ */
+ public function changed($addition)
+ {
+ return $this->taskChangelog()
+ ->version(\Robo\Robo::VERSION)
+ ->change($addition)
+ ->run();
+ }
+
+ /**
+ * Update the version of Robo.
+ *
+ * @param string $version The new verison for Robo.
+ * Defaults to the next minor (bugfix) version after the current relelase.
+ */
+ public function versionBump($version = '')
+ {
+ if (empty($version)) {
+ $versionParts = explode('.', \Robo\Robo::VERSION);
+ $versionParts[count($versionParts)-1]++;
+ $version = implode('.', $versionParts);
+ }
+ return $this->taskReplaceInFile(__DIR__.'/src/Robo.php')
+ ->from("VERSION = '".\Robo\Robo::VERSION."'")
+ ->to("VERSION = '".$version."'")
+ ->run();
+ }
+
+ /**
+ * Generate the Robo documentation files.
+ */
+ public function docs()
+ {
+ $collection = $this->collectionBuilder();
+ $collection->progressMessage('Generate documentation from source code.');
+ $files = Finder::create()->files()->name('*.php')->in('src/Task');
+ $docs = [];
+ foreach ($files as $file) {
+ if ($file->getFileName() == 'loadTasks.php') {
+ continue;
+ }
+ if ($file->getFileName() == 'loadShortcuts.php') {
+ continue;
+ }
+ $ns = $file->getRelativePath();
+ if (!$ns) {
+ continue;
+ }
+ $class = basename(substr($file, 0, -4));
+ class_exists($class = "Robo\\Task\\$ns\\$class");
+ $docs[$ns][] = $class;
+ }
+ ksort($docs);
+
+ foreach ($docs as $ns => $tasks) {
+ $taskGenerator = $collection->taskGenDoc("docs/tasks/$ns.md");
+ $taskGenerator->filterClasses(function (\ReflectionClass $r) {
+ return !($r->isAbstract() || $r->isTrait()) && $r->implementsInterface('Robo\Contract\TaskInterface');
+ })->prepend("# $ns Tasks");
+ sort($tasks);
+ foreach ($tasks as $class) {
+ $taskGenerator->docClass($class);
+ }
+
+ $taskGenerator->filterMethods(
+ function (\ReflectionMethod $m) {
+ if ($m->isConstructor() || $m->isDestructor() || $m->isStatic()) {
+ return false;
+ }
+ $undocumentedMethods =
+ [
+ '',
+ 'run',
+ '__call',
+ 'inflect',
+ 'injectDependencies',
+ 'getCommand',
+ 'getPrinted',
+ 'getConfig',
+ 'setConfig',
+ 'logger',
+ 'setLogger',
+ 'setProgressIndicator',
+ 'progressIndicatorSteps',
+ 'setBuilder',
+ 'getBuilder',
+ 'collectionBuilder',
+ ];
+ return !in_array($m->name, $undocumentedMethods) && $m->isPublic(); // methods are not documented
+ }
+ )->processClassSignature(
+ function ($c) {
+ return "## " . preg_replace('~Task$~', '', $c->getShortName()) . "\n";
+ }
+ )->processClassDocBlock(
+ function (\ReflectionClass $c, $doc) {
+ $doc = preg_replace('~@method .*?(.*?)\)~', '* `$1)` ', $doc);
+ $doc = str_replace('\\'.$c->name, '', $doc);
+ return $doc;
+ }
+ )->processMethodSignature(
+ function (\ReflectionMethod $m, $text) {
+ return str_replace('#### *public* ', '* `', $text) . '`';
+ }
+ )->processMethodDocBlock(
+ function (\ReflectionMethod $m, $text) {
+
+ return $text ? ' ' . trim(strtok($text, "\n"), "\n") : '';
+ }
+ );
+ }
+ $collection->progressMessage('Documentation generation complete.');
+ return $collection->run();
+ }
+
+ /**
+ * Publish Robo.
+ *
+ * Builds a site in gh-pages branch. Uses mkdocs
+ */
+ public function publish()
+ {
+ $current_branch = exec('git rev-parse --abbrev-ref HEAD');
+
+ return $this->collectionBuilder()
+ ->taskGitStack()
+ ->checkout('site')
+ ->merge('master')
+ ->completion($this->taskGitStack()->checkout($current_branch))
+ ->taskFilesystemStack()
+ ->copy('CHANGELOG.md', 'docs/changelog.md')
+ ->completion($this->taskFilesystemStack()->remove('docs/changelog.md'))
+ ->taskExec('mkdocs gh-deploy')
+ ->run();
+ }
+
+ /**
+ * Build the Robo phar executable.
+ */
+ public function pharBuild()
+ {
+ // Create a collection builder to hold the temporary
+ // directory until the pack phar task runs.
+ $collection = $this->collectionBuilder();
+
+ $workDir = $collection->tmpDir();
+ $roboBuildDir = "$workDir/robo";
+
+ // Before we run `composer install`, we will remove the dev
+ // dependencies that we only use in the unit tests. Any dev dependency
+ // that is in the 'suggested' section is used by a core task;
+ // we will include all of those in the phar.
+ $devProjectsToRemove = $this->devDependenciesToRemoveFromPhar();
+
+ // We need to create our work dir and run `composer install`
+ // before we prepare the pack phar task, so create a separate
+ // collection builder to do this step in.
+ $prepTasks = $this->collectionBuilder();
+
+ $preparationResult = $prepTasks
+ ->taskFilesystemStack()
+ ->mkdir($workDir)
+ ->taskRsync()
+ ->fromPath(
+ [
+ __DIR__ . '/composer.json',
+ __DIR__ . '/scripts',
+ __DIR__ . '/src',
+ __DIR__ . '/data'
+ ]
+ )
+ ->toPath($roboBuildDir)
+ ->recursive()
+ ->progress()
+ ->stats()
+ ->taskComposerRemove()
+ ->dir($roboBuildDir)
+ ->dev()
+ ->noUpdate()
+ ->args($devProjectsToRemove)
+ ->taskComposerInstall()
+ ->dir($roboBuildDir)
+ ->printed(false)
+ ->run();
+
+ // Exit if the preparation step failed
+ if (!$preparationResult->wasSuccessful()) {
+ return $preparationResult;
+ }
+
+ // Decide which files we're going to pack
+ $files = Finder::create()->ignoreVCS(true)
+ ->files()
+ ->name('*.php')
+ ->name('*.exe') // for 1symfony/console/Resources/bin/hiddeninput.exe
+ ->name('GeneratedWrapper.tmpl')
+ ->path('src')
+ ->path('vendor')
+ ->notPath('docs')
+ ->notPath('/vendor\/.*\/[Tt]est/')
+ ->in(is_dir($roboBuildDir) ? $roboBuildDir : __DIR__);
+
+ // Build the phar
+ return $collection
+ ->taskPackPhar('robo.phar')
+ ->addFiles($files)
+ ->addFile('robo', 'robo')
+ ->executable('robo')
+ ->taskFilesystemStack()
+ ->chmod('robo.phar', 0777)
+ ->run();
+ }
+
+ /**
+ * The phar:build command removes the project requirements from the
+ * 'require-dev' section that are not in the 'suggest' section.
+ *
+ * @return array
+ */
+ protected function devDependenciesToRemoveFromPhar()
+ {
+ $composerInfo = (array) json_decode(file_get_contents(__DIR__ . '/composer.json'));
+
+ $devDependencies = array_keys((array)$composerInfo['require-dev']);
+ $suggestedProjects = array_keys((array)$composerInfo['suggest']);
+
+ return array_diff($devDependencies, $suggestedProjects);
+ }
+
+ /**
+ * Install Robo phar.
+ *
+ * Installs the Robo phar executable in /usr/bin. Uses 'sudo'.
+ */
+ public function pharInstall()
+ {
+ return $this->taskExec('sudo cp')
+ ->arg('robo.phar')
+ ->arg('/usr/bin/robo')
+ ->run();
+ }
+
+ /**
+ * Publish Robo phar.
+ *
+ * Commits the phar executable to Robo's GitHub pages site.
+ */
+ public function pharPublish()
+ {
+ $this->pharBuild();
+
+ $this->collectionBuilder()
+ ->taskFilesystemStack()
+ ->rename('robo.phar', 'robo-release.phar')
+ ->taskGitStack()
+ ->checkout('site')
+ ->pull('origin site')
+ ->taskFilesystemStack()
+ ->remove('robotheme/robo.phar')
+ ->rename('robo-release.phar', 'robotheme/robo.phar')
+ ->taskGitStack()
+ ->add('robotheme/robo.phar')
+ ->commit('Update robo.phar to ' . \Robo\Robo::VERSION)
+ ->push('origin site')
+ ->checkout('master')
+ ->run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/codeception.yml b/src/composer/vendor/consolidation/robo/codeception.yml
new file mode 100644
index 00000000..09763ea7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/codeception.yml
@@ -0,0 +1,21 @@
+actor: Guy
+paths:
+ tests: tests
+ log: tests/_log
+ data: tests/_data
+ helpers: tests/_helpers
+settings:
+ bootstrap: _bootstrap.php
+ colors: true
+ memory_limit: 1024M
+modules:
+ config:
+ Db:
+ dsn: ''
+ user: ''
+ password: ''
+ dump: tests/_data/dump.sql
+coverage:
+ enabled: true
+ include:
+ - src/*
diff --git a/src/composer/vendor/consolidation/robo/composer.json b/src/composer/vendor/consolidation/robo/composer.json
new file mode 100644
index 00000000..adc54130
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/composer.json
@@ -0,0 +1,70 @@
+{
+ "name": "consolidation/robo",
+ "description": "Modern task runner",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Davert",
+ "email": "davert.php@resend.cc"
+ }
+ ],
+ "autoload":{
+ "classmap": [
+ "scripts/composer/ScriptHandler.php"
+ ],
+ "psr-4":{
+ "Robo\\":"src"
+ }
+ },
+ "autoload-dev":{
+ "psr-4":{
+ "Robo\\":"tests/src"
+ }
+ },
+ "bin":["robo"],
+ "require": {
+ "php": ">=5.5.0",
+ "league/container": "^2.2",
+ "consolidation/log": "~1",
+ "consolidation/annotated-command": "^2.0.1",
+ "consolidation/output-formatters": "^2.1.2|~3",
+ "symfony/finder": "~2.5|~3.0",
+ "symfony/console": "~2.8|~3.0",
+ "symfony/process": "~2.5|~3.0",
+ "symfony/filesystem": "~2.5|~3.0",
+ "symfony/event-dispatcher": "~2.5|~3.0"
+ },
+ "require-dev": {
+ "patchwork/jsqueeze": "~2",
+ "henrikbjorn/lurker": "~1",
+ "natxet/CssMin": "~3",
+ "pear/archive_tar": "^1.4.2",
+ "codeception/base": "^2.2.6",
+ "codeception/verify": "^0.3.2",
+ "codeception/aspect-mock": "~1",
+ "satooshi/php-coveralls": "~1",
+ "squizlabs/php_codesniffer": "~2",
+ "phpunit/php-code-coverage": "~2|~4"
+ },
+ "scripts": {
+ "pre-install-cmd": [
+ "Robo\\composer\\ScriptHandler::checkDependencies"
+ ],
+ "cs": "/robo sniff",
+ "test": "./robo test"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "suggest": {
+ "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively.",
+ "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch",
+ "patchwork/jsqueeze": "For minifying JS files in taskMinify",
+ "natxet/CssMin": "For minifying JS files in taskMinify"
+ },
+ "replace": {
+ "codegyre/robo": "< 1.0"
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/composer.lock b/src/composer/vendor/consolidation/robo/composer.lock
new file mode 100644
index 00000000..d3f4b7e9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/composer.lock
@@ -0,0 +1,3518 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "01e04acee2b5eae505aa21f88465a6a4",
+ "content-hash": "ebfcda102135166d31ae314f4dfec7da",
+ "packages": [
+ {
+ "name": "consolidation/annotated-command",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/annotated-command.git",
+ "reference": "0bcb15e86b8bfbb1972fc6bc31b7d9c3fa40285d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/0bcb15e86b8bfbb1972fc6bc31b7d9c3fa40285d",
+ "reference": "0bcb15e86b8bfbb1972fc6bc31b7d9c3fa40285d",
+ "shasum": ""
+ },
+ "require": {
+ "consolidation/output-formatters": "~2|~3",
+ "php": ">=5.4.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "psr/log": "~1",
+ "symfony/console": "^2.8|~3",
+ "symfony/event-dispatcher": "^2.5|~3",
+ "symfony/finder": "^2.5|~3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "^2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\AnnotatedCommand\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Initialize Symfony Console commands from annotated command class methods.",
+ "time": "2016-11-14 23:51:12"
+ },
+ {
+ "name": "consolidation/log",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/log.git",
+ "reference": "74ba81b4edc585616747cc5c5309ce56fec41254"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/log/zipball/74ba81b4edc585616747cc5c5309ce56fec41254",
+ "reference": "74ba81b4edc585616747cc5c5309ce56fec41254",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "psr/log": "~1.0",
+ "symfony/console": "~2.5|~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.",
+ "time": "2016-03-23 23:46:42"
+ },
+ {
+ "name": "consolidation/output-formatters",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consolidation/output-formatters.git",
+ "reference": "31aac0f6ffd76833a70a12ba7fb3e428f78b55ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/31aac0f6ffd76833a70a12ba7fb3e428f78b55ef",
+ "reference": "31aac0f6ffd76833a70a12ba7fb3e428f78b55ef",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "symfony/console": "~2.5|~3.0",
+ "symfony/finder": "~2.5|~3.0",
+ "victorjonsson/markdowndocs": "^1.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "satooshi/php-coveralls": "^1.0",
+ "squizlabs/php_codesniffer": "2.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Consolidation\\OutputFormatters\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Greg Anderson",
+ "email": "greg.1.anderson@greenknowe.org"
+ }
+ ],
+ "description": "Format text by applying transformations provided by plug-in formatters.",
+ "time": "2016-11-14 18:44:33"
+ },
+ {
+ "name": "container-interop/container-interop",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/container-interop/container-interop.git",
+ "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "time": "2014-12-30 15:22:37"
+ },
+ {
+ "name": "league/container",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/container.git",
+ "reference": "c0e7d947b690891f700dc4967ead7bdb3d6708c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/container/zipball/c0e7d947b690891f700dc4967ead7bdb3d6708c1",
+ "reference": "c0e7d947b690891f700dc4967ead7bdb3d6708c1",
+ "shasum": ""
+ },
+ "require": {
+ "container-interop/container-interop": "^1.1",
+ "php": ">=5.4.0"
+ },
+ "provide": {
+ "container-interop/container-interop-implementation": "^1.1"
+ },
+ "replace": {
+ "orno/di": "~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Container\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Phil Bennett",
+ "email": "philipobenito@gmail.com",
+ "homepage": "http://www.philipobenito.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A fast and intuitive dependency injection container.",
+ "homepage": "https://github.com/thephpleague/container",
+ "keywords": [
+ "container",
+ "dependency",
+ "di",
+ "injection",
+ "league",
+ "provider",
+ "service"
+ ],
+ "time": "2016-03-17 11:07:59"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-12-27 11:43:31"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2016-09-30 07:12:33"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-06-10 07:14:17"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2016-10-10 12:19:37"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "reference": "c99da1119ae61e15de0e4829196b9fba6f73d065",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/debug": "~2.8|~3.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-06 01:44:51"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "reference": "e2b3f74a67fc928adc3c1b9027f73e1bc01190a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/class-loader": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-06 11:02:40"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/dependency-injection": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/stopwatch": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-13 06:28:43"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "reference": "0565b61bf098cb4dc09f4f103f033138ae4f42c6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-18 04:30:12"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "reference": "205b5ffbb518a98ba2ae60a52656c4a31ab00c6f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-28 00:11:12"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2016-11-14 01:06:16"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "66de154ae86b1a07001da9fbffd620206e4faf94"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/66de154ae86b1a07001da9fbffd620206e4faf94",
+ "reference": "66de154ae86b1a07001da9fbffd620206e4faf94",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-29 14:13:09"
+ },
+ {
+ "name": "victorjonsson/markdowndocs",
+ "version": "1.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator.git",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/victorjonsson/PHP-Markdown-Documentation-Generator/zipball/a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "reference": "a8244617cdce4804cd94ea508c82e8d7e29a273a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "symfony/console": ">=2.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.23"
+ },
+ "bin": [
+ "bin/phpdoc-md"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "PHPDocsMD": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Victor Jonsson",
+ "email": "kontakt@victorjonsson.se"
+ }
+ ],
+ "description": "Command line tool for generating markdown-formatted class documentation",
+ "homepage": "https://github.com/victorjonsson/PHP-Markdown-Documentation-Generator",
+ "time": "2016-10-11 21:10:19"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308",
+ "reference": "bb2d123231c095735130cc8f6d31385a44c7b308",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3|^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2016-08-09 15:02:57"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "andrewsville/php-token-reflection",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Andrewsville/PHP-Token-Reflection.git",
+ "reference": "e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Andrewsville/PHP-Token-Reflection/zipball/e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee",
+ "reference": "e6d0ac2baf66cdf154be34c3d2a2aa1bd4b426ee",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "TokenReflection": "./"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3"
+ ],
+ "authors": [
+ {
+ "name": "Ondřej Nešpor",
+ "homepage": "https://github.com/andrewsville"
+ },
+ {
+ "name": "Jaroslav Hanslík",
+ "homepage": "https://github.com/kukulich"
+ }
+ ],
+ "description": "Library emulating the PHP internal reflection using just the tokenized source code.",
+ "homepage": "http://andrewsville.github.com/PHP-Token-Reflection/",
+ "keywords": [
+ "library",
+ "reflection",
+ "tokenizer"
+ ],
+ "time": "2014-08-06 16:37:08"
+ },
+ {
+ "name": "behat/gherkin",
+ "version": "v4.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Gherkin.git",
+ "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74",
+ "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5|~5",
+ "symfony/phpunit-bridge": "~2.7|~3",
+ "symfony/yaml": "~2.3|~3"
+ },
+ "suggest": {
+ "symfony/yaml": "If you want to parse features, represented in YAML files"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Gherkin": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Gherkin DSL parser for PHP 5.3",
+ "homepage": "http://behat.org/",
+ "keywords": [
+ "BDD",
+ "Behat",
+ "Cucumber",
+ "DSL",
+ "gherkin",
+ "parser"
+ ],
+ "time": "2016-10-30 11:50:56"
+ },
+ {
+ "name": "codeception/aspect-mock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Codeception/AspectMock.git",
+ "reference": "666d0a80239eeda1e2a31219d83fce4f17529b7f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Codeception/AspectMock/zipball/666d0a80239eeda1e2a31219d83fce4f17529b7f",
+ "reference": "666d0a80239eeda1e2a31219d83fce4f17529b7f",
+ "shasum": ""
+ },
+ "require": {
+ "goaop/framework": "~1.0",
+ "php": ">=5.4.0",
+ "symfony/finder": "~2.4|~3.0"
+ },
+ "require-dev": {
+ "codeception/base": "~2.1",
+ "codeception/specify": "~0.3",
+ "codeception/verify": "~0.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "AspectMock": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Bodnarchuk",
+ "email": "davert.php@mailican.com"
+ }
+ ],
+ "description": "Experimental Mocking Framework powered by Aspects",
+ "time": "2016-03-14 20:52:23"
+ },
+ {
+ "name": "codeception/base",
+ "version": "2.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Codeception/base.git",
+ "reference": "f70c77fe9941c41f567fe62b1e96e1ed33235ac7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Codeception/base/zipball/f70c77fe9941c41f567fe62b1e96e1ed33235ac7",
+ "reference": "f70c77fe9941c41f567fe62b1e96e1ed33235ac7",
+ "shasum": ""
+ },
+ "require": {
+ "behat/gherkin": "~4.4.0",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "guzzlehttp/psr7": "~1.0",
+ "php": ">=5.4.0 <8.0",
+ "phpunit/php-code-coverage": ">=2.1.3 <5.0",
+ "phpunit/phpunit": ">4.8.20 <6.0",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "^1.4",
+ "symfony/browser-kit": ">=2.7 <4.0",
+ "symfony/console": ">=2.7 <4.0",
+ "symfony/css-selector": ">=2.7 <4.0",
+ "symfony/dom-crawler": ">=2.7 <4.0",
+ "symfony/event-dispatcher": ">=2.7 <4.0",
+ "symfony/finder": ">=2.7 <4.0",
+ "symfony/yaml": ">=2.7 <4.0"
+ },
+ "require-dev": {
+ "codeception/specify": "~0.3",
+ "facebook/graph-sdk": "~5.3",
+ "flow/jsonpath": "~0.2",
+ "league/factory-muffin": "^3.0",
+ "league/factory-muffin-faker": "^1.0",
+ "mongodb/mongodb": "^1.0",
+ "monolog/monolog": "~1.8",
+ "pda/pheanstalk": "~3.0",
+ "php-amqplib/php-amqplib": "~2.4",
+ "predis/predis": "^1.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "suggest": {
+ "codeception/specify": "BDD-style code blocks",
+ "codeception/verify": "BDD-style assertions",
+ "flow/jsonpath": "For using JSONPath in REST module",
+ "league/factory-muffin": "For DataFactory module",
+ "league/factory-muffin-faker": "For Faker support in DataFactory module",
+ "phpseclib/phpseclib": "for SFTP option in FTP Module",
+ "symfony/phpunit-bridge": "For phpunit-bridge support"
+ },
+ "bin": [
+ "codecept"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": []
+ },
+ "autoload": {
+ "psr-4": {
+ "Codeception\\": "src\\Codeception",
+ "Codeception\\Extension\\": "ext"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Bodnarchuk",
+ "email": "davert@mail.ua",
+ "homepage": "http://codegyre.com"
+ }
+ ],
+ "description": "BDD-style testing framework",
+ "homepage": "http://codeception.com/",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "acceptance testing",
+ "functional testing",
+ "unit testing"
+ ],
+ "time": "2016-10-27 00:07:01"
+ },
+ {
+ "name": "codeception/verify",
+ "version": "0.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Codeception/Verify.git",
+ "reference": "b06d706261d1fee0cc312bacc5c1b7c506e5213a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Codeception/Verify/zipball/b06d706261d1fee0cc312bacc5c1b7c506e5213a",
+ "reference": "b06d706261d1fee0cc312bacc5c1b7c506e5213a",
+ "shasum": ""
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/Codeception/function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Bodnarchuk",
+ "email": "davert.php@mailican.com"
+ }
+ ],
+ "description": "BDD assertion library for PHPUnit",
+ "time": "2016-08-29 22:49:25"
+ },
+ {
+ "name": "doctrine/annotations",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "30e07cf03edc3cd3ef579d0dd4dd8c58250799a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/30e07cf03edc3cd3ef579d0dd4dd8c58250799a5",
+ "reference": "30e07cf03edc3cd3ef579d0dd4dd8c58250799a5",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "1.*",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "doctrine/cache": "1.*",
+ "phpunit/phpunit": "^5.6.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "time": "2016-10-24 11:45:47"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14 21:17:01"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Lexer\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "lexer",
+ "parser"
+ ],
+ "time": "2014-09-09 13:34:57"
+ },
+ {
+ "name": "goaop/framework",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/goaop/framework.git",
+ "reference": "05b51a6ddc58ace85a31f9d2dc885a6550898fd5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/goaop/framework/zipball/05b51a6ddc58ace85a31f9d2dc885a6550898fd5",
+ "reference": "05b51a6ddc58ace85a31f9d2dc885a6550898fd5",
+ "shasum": ""
+ },
+ "require": {
+ "andrewsville/php-token-reflection": "~1.4",
+ "doctrine/annotations": "~1.0",
+ "jakubledl/dissect": "~1.0",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "symfony/console": "~2.1|~3.0"
+ },
+ "suggest": {
+ "symfony/console": "Enables the usage of the command-line tool."
+ },
+ "bin": [
+ "bin/warmup"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Go\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lisachenko Alexander",
+ "homepage": "https://github.com/lisachenko"
+ }
+ ],
+ "description": "Framework for aspect-oriented programming in PHP.",
+ "homepage": "http://go.aopphp.com/",
+ "keywords": [
+ "aop",
+ "aspect",
+ "library",
+ "php"
+ ],
+ "time": "2016-05-23 11:19:17"
+ },
+ {
+ "name": "guzzle/guzzle",
+ "version": "v3.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba",
+ "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": ">=5.3.3",
+ "symfony/event-dispatcher": ">=2.1"
+ },
+ "replace": {
+ "guzzle/batch": "self.version",
+ "guzzle/cache": "self.version",
+ "guzzle/common": "self.version",
+ "guzzle/http": "self.version",
+ "guzzle/inflection": "self.version",
+ "guzzle/iterator": "self.version",
+ "guzzle/log": "self.version",
+ "guzzle/parser": "self.version",
+ "guzzle/plugin": "self.version",
+ "guzzle/plugin-async": "self.version",
+ "guzzle/plugin-backoff": "self.version",
+ "guzzle/plugin-cache": "self.version",
+ "guzzle/plugin-cookie": "self.version",
+ "guzzle/plugin-curlauth": "self.version",
+ "guzzle/plugin-error-response": "self.version",
+ "guzzle/plugin-history": "self.version",
+ "guzzle/plugin-log": "self.version",
+ "guzzle/plugin-md5": "self.version",
+ "guzzle/plugin-mock": "self.version",
+ "guzzle/plugin-oauth": "self.version",
+ "guzzle/service": "self.version",
+ "guzzle/stream": "self.version"
+ },
+ "require-dev": {
+ "doctrine/cache": "*",
+ "monolog/monolog": "1.*",
+ "phpunit/phpunit": "3.7.*",
+ "psr/log": "1.0.*",
+ "symfony/class-loader": "*",
+ "zendframework/zend-cache": "<2.3",
+ "zendframework/zend-log": "<2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Guzzle": "src/",
+ "Guzzle\\Tests": "tests/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Guzzle Community",
+ "homepage": "https://github.com/guzzle/guzzle/contributors"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "abandoned": "guzzlehttp/guzzle",
+ "time": "2014-01-28 22:29:15"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
+ "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "PSR-7 message implementation",
+ "keywords": [
+ "http",
+ "message",
+ "stream",
+ "uri"
+ ],
+ "time": "2016-06-24 23:00:38"
+ },
+ {
+ "name": "henrikbjorn/lurker",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/flint/Lurker.git",
+ "reference": "712d3ef19bef161daa2ba0e0237c6b875587a089"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/flint/Lurker/zipball/712d3ef19bef161daa2ba0e0237c6b875587a089",
+ "reference": "712d3ef19bef161daa2ba0e0237c6b875587a089",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/config": "^2.2|^3.0",
+ "symfony/event-dispatcher": "^2.2|^3.0"
+ },
+ "suggest": {
+ "ext-inotify": ">=0.1.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Lurker": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Yaroslav Kiliba",
+ "email": "om.dattaya@gmail.com"
+ },
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com"
+ },
+ {
+ "name": "Henrik Bjrnskov",
+ "email": "henrik@bjrnskov.dk"
+ }
+ ],
+ "description": "Resource Watcher.",
+ "keywords": [
+ "filesystem",
+ "resource",
+ "watching"
+ ],
+ "time": "2016-03-16 15:22:20"
+ },
+ {
+ "name": "jakubledl/dissect",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jakubledl/dissect.git",
+ "reference": "d3a391de31e45a247e95cef6cf58a91c05af67c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jakubledl/dissect/zipball/d3a391de31e45a247e95cef6cf58a91c05af67c4",
+ "reference": "d3a391de31e45a247e95cef6cf58a91c05af67c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "symfony/console": "~2.1"
+ },
+ "suggest": {
+ "symfony/console": "for the command-line tool"
+ },
+ "bin": [
+ "bin/dissect.php",
+ "bin/dissect"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Dissect": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "unlicense"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Lédl",
+ "email": "jakubledl@gmail.com"
+ }
+ ],
+ "description": "Lexing and parsing in pure PHP",
+ "homepage": "https://github.com/jakubledl/dissect",
+ "keywords": [
+ "ast",
+ "lexing",
+ "parser",
+ "parsing"
+ ],
+ "time": "2013-01-29 21:29:14"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.5.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108",
+ "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2016-10-31 17:19:45"
+ },
+ {
+ "name": "natxet/CssMin",
+ "version": "v3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/natxet/CssMin.git",
+ "reference": "92de3fe3ccb4f8298d31952490ef7d5395855c39"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/natxet/CssMin/zipball/92de3fe3ccb4f8298d31952490ef7d5395855c39",
+ "reference": "92de3fe3ccb4f8298d31952490ef7d5395855c39",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joe Scylla",
+ "email": "joe.scylla@gmail.com",
+ "homepage": "https://profiles.google.com/joe.scylla"
+ }
+ ],
+ "description": "Minifying CSS",
+ "homepage": "http://code.google.com/p/cssmin/",
+ "keywords": [
+ "css",
+ "minify"
+ ],
+ "time": "2015-09-25 11:13:11"
+ },
+ {
+ "name": "patchwork/jsqueeze",
+ "version": "v2.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tchwork/jsqueeze.git",
+ "reference": "693d64850eab2ce6a7c8f7cf547e1ab46e69d542"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tchwork/jsqueeze/zipball/693d64850eab2ce6a7c8f7cf547e1ab46e69d542",
+ "reference": "693d64850eab2ce6a7c8f7cf547e1ab46e69d542",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Patchwork\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "(Apache-2.0 or GPL-2.0)"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ }
+ ],
+ "description": "Efficient JavaScript minification in PHP",
+ "homepage": "https://github.com/tchwork/jsqueeze",
+ "keywords": [
+ "compression",
+ "javascript",
+ "minification"
+ ],
+ "time": "2016-04-19 09:28:22"
+ },
+ {
+ "name": "pear/archive_tar",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pear/Archive_Tar.git",
+ "reference": "bdd47347df76dbaa89227c5e1afd6f6809985b4c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/bdd47347df76dbaa89227c5e1afd6f6809985b4c",
+ "reference": "bdd47347df76dbaa89227c5e1afd6f6809985b4c",
+ "shasum": ""
+ },
+ "require": {
+ "pear/pear-core-minimal": "^1.10.0alpha2",
+ "php": ">=5.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "suggest": {
+ "ext-bz2": "bz2 compression support.",
+ "ext-xz": "lzma2 compression support.",
+ "ext-zlib": "Gzip compression support."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Archive_Tar": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ "./"
+ ],
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Vincent Blavet",
+ "email": "vincent@phpconcept.net"
+ },
+ {
+ "name": "Greg Beaver",
+ "email": "greg@chiaraquartet.net"
+ },
+ {
+ "name": "Michiel Rook",
+ "email": "mrook@php.net"
+ }
+ ],
+ "description": "Tar file management class",
+ "homepage": "https://github.com/pear/Archive_Tar",
+ "keywords": [
+ "archive",
+ "tar"
+ ],
+ "time": "2016-02-25 10:30:39"
+ },
+ {
+ "name": "pear/console_getopt",
+ "version": "v1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pear/Console_Getopt.git",
+ "reference": "82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pear/Console_Getopt/zipball/82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f",
+ "reference": "82f05cd1aa3edf34e19aa7c8ca312ce13a6a577f",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Console": "./"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ "./"
+ ],
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Beaver",
+ "email": "cellog@php.net",
+ "role": "Helper"
+ },
+ {
+ "name": "Andrei Zmievski",
+ "email": "andrei@php.net",
+ "role": "Lead"
+ },
+ {
+ "name": "Stig Bakken",
+ "email": "stig@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "More info available on: http://pear.php.net/package/Console_Getopt",
+ "time": "2015-07-20 20:28:12"
+ },
+ {
+ "name": "pear/pear-core-minimal",
+ "version": "v1.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pear/pear-core-minimal.git",
+ "reference": "cae0f1ce0cb5bddb611b0a652d322905a65a5896"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/cae0f1ce0cb5bddb611b0a652d322905a65a5896",
+ "reference": "cae0f1ce0cb5bddb611b0a652d322905a65a5896",
+ "shasum": ""
+ },
+ "require": {
+ "pear/console_getopt": "~1.3",
+ "pear/pear_exception": "~1.0"
+ },
+ "replace": {
+ "rsky/pear-core-min": "self.version"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ "src/"
+ ],
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Christian Weiske",
+ "email": "cweiske@php.net",
+ "role": "Lead"
+ }
+ ],
+ "description": "Minimal set of PEAR core files to be used as composer dependency",
+ "time": "2015-10-17 11:41:19"
+ },
+ {
+ "name": "pear/pear_exception",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pear/PEAR_Exception.git",
+ "reference": "8c18719fdae000b690e3912be401c76e406dd13b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/8c18719fdae000b690e3912be401c76e406dd13b",
+ "reference": "8c18719fdae000b690e3912be401c76e406dd13b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=4.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "type": "class",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "PEAR": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ "."
+ ],
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Helgi Thormar",
+ "email": "dufuz@php.net"
+ },
+ {
+ "name": "Greg Beaver",
+ "email": "cellog@php.net"
+ }
+ ],
+ "description": "The PEAR Exception base class.",
+ "homepage": "https://github.com/pear/PEAR_Exception",
+ "keywords": [
+ "exception"
+ ],
+ "time": "2015-02-10 20:07:52"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2016-06-07 08:13:47"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "4.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "6cba06ff75a1a63a71033e1a01b89056f3af1e8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6cba06ff75a1a63a71033e1a01b89056f3af1e8d",
+ "reference": "6cba06ff75a1a63a71033e1a01b89056f3af1e8d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "^1.4.2",
+ "sebastian/code-unit-reverse-lookup": "~1.0",
+ "sebastian/environment": "^1.3.2 || ^2.0",
+ "sebastian/version": "~1.0|~2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.4.0",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2016-11-01 05:06:24"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2015-06-21 13:08:43"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21 13:50:34"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2016-05-12 18:03:57"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2015-09-15 10:49:45"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "5.6.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "a9de0dbafeb6b1391b391fbb034734cb0af9f67c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a9de0dbafeb6b1391b391fbb034734cb0af9f67c",
+ "reference": "a9de0dbafeb6b1391b391fbb034734cb0af9f67c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "~1.3",
+ "php": "^5.6 || ^7.0",
+ "phpspec/prophecy": "^1.3.1",
+ "phpunit/php-code-coverage": "^4.0.1",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^3.2",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "^1.3 || ^2.0",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/object-enumerator": "~1.0",
+ "sebastian/resource-operations": "~1.0",
+ "sebastian/version": "~1.0|~2.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.6.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2016-11-14 06:39:40"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "238d7a2723bce689c79eeac9c7d5e1d623bb9dc2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/238d7a2723bce689c79eeac9c7d5e1d623bb9dc2",
+ "reference": "238d7a2723bce689c79eeac9c7d5e1d623bb9dc2",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.6 || ^7.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^1.2"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2016-10-09 07:01:45"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06 14:39:51"
+ },
+ {
+ "name": "satooshi/php-coveralls",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/satooshi/php-coveralls.git",
+ "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/da51d304fe8622bf9a6da39a8446e7afd432115c",
+ "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-simplexml": "*",
+ "guzzle/guzzle": "^2.8|^3.0",
+ "php": ">=5.3.3",
+ "psr/log": "^1.0",
+ "symfony/config": "^2.1|^3.0",
+ "symfony/console": "^2.1|^3.0",
+ "symfony/stopwatch": "^2.0|^3.0",
+ "symfony/yaml": "^2.0|^3.0"
+ },
+ "suggest": {
+ "symfony/http-kernel": "Allows Symfony integration"
+ },
+ "bin": [
+ "bin/coveralls"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Satooshi\\": "src/Satooshi/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kitamura Satoshi",
+ "email": "with.no.parachute@gmail.com",
+ "homepage": "https://www.facebook.com/satooshi.jp"
+ }
+ ],
+ "description": "PHP client library for Coveralls API",
+ "homepage": "https://github.com/satooshi/php-coveralls",
+ "keywords": [
+ "ci",
+ "coverage",
+ "github",
+ "test"
+ ],
+ "time": "2016-01-20 17:35:46"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2016-02-13 06:45:14"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2015-07-26 15:48:44"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08 07:14:41"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-08-18 05:49:44"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2016-06-17 09:04:28"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12 03:26:01"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "d4ca2fb70344987502567bc50081c03e6192fb26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26",
+ "reference": "d4ca2fb70344987502567bc50081c03e6192fb26",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2016-01-28 13:25:10"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "79860854756415e1cec8d186c9cf261cafd87dfc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/79860854756415e1cec8d186c9cf261cafd87dfc",
+ "reference": "79860854756415e1cec8d186c9cf261cafd87dfc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2016-11-14 15:54:23"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2015-07-28 20:34:47"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
+ "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-02-04 12:56:52"
+ },
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "reference": "571e27b6348e5b3a637b2abc82ac0d01e6d7bbed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/571e27b6348e5b3a637b2abc82ac0d01e6d7bbed",
+ "reference": "571e27b6348e5b3a637b2abc82ac0d01e6d7bbed",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "bin": [
+ "scripts/phpcs",
+ "scripts/phpcbf"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "CodeSniffer.php",
+ "CodeSniffer/CLI.php",
+ "CodeSniffer/Exception.php",
+ "CodeSniffer/File.php",
+ "CodeSniffer/Fixer.php",
+ "CodeSniffer/Report.php",
+ "CodeSniffer/Reporting.php",
+ "CodeSniffer/Sniff.php",
+ "CodeSniffer/Tokens.php",
+ "CodeSniffer/Reports/",
+ "CodeSniffer/Tokenizers/",
+ "CodeSniffer/DocGenerators/",
+ "CodeSniffer/Standards/AbstractPatternSniff.php",
+ "CodeSniffer/Standards/AbstractScopeSniff.php",
+ "CodeSniffer/Standards/AbstractVariableSniff.php",
+ "CodeSniffer/Standards/IncorrectPatternException.php",
+ "CodeSniffer/Standards/Generic/Sniffs/",
+ "CodeSniffer/Standards/MySource/Sniffs/",
+ "CodeSniffer/Standards/PEAR/Sniffs/",
+ "CodeSniffer/Standards/PSR1/Sniffs/",
+ "CodeSniffer/Standards/PSR2/Sniffs/",
+ "CodeSniffer/Standards/Squiz/Sniffs/",
+ "CodeSniffer/Standards/Zend/Sniffs/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Sherwood",
+ "role": "lead"
+ }
+ ],
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+ "homepage": "http://www.squizlabs.com/php-codesniffer",
+ "keywords": [
+ "phpcs",
+ "standards"
+ ],
+ "time": "2016-09-01 23:53:02"
+ },
+ {
+ "name": "symfony/browser-kit",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/browser-kit.git",
+ "reference": "901319a31c9b3cee7857b4aeeb81b5d64dfa34fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/901319a31c9b3cee7857b4aeeb81b5d64dfa34fc",
+ "reference": "901319a31c9b3cee7857b4aeeb81b5d64dfa34fc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/dom-crawler": "~2.8|~3.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\BrowserKit\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony BrowserKit Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-06 11:02:40"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "949e7e846743a7f9e46dc50eb639d5fde1f53341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/949e7e846743a7f9e46dc50eb639d5fde1f53341",
+ "reference": "949e7e846743a7f9e46dc50eb639d5fde1f53341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/filesystem": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Config Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-25 08:27:07"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "ca809c64072e0fe61c1c7fb3c76cdc32265042ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/ca809c64072e0fe61c1c7fb3c76cdc32265042ac",
+ "reference": "ca809c64072e0fe61c1c7fb3c76cdc32265042ac",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-09-06 11:02:40"
+ },
+ {
+ "name": "symfony/dom-crawler",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dom-crawler.git",
+ "reference": "59eee3c76eb89f21857798620ebdad7a05ad14f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/59eee3c76eb89f21857798620ebdad7a05ad14f4",
+ "reference": "59eee3c76eb89f21857798620ebdad7a05ad14f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/css-selector": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DomCrawler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DomCrawler Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-18 15:46:07"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "bb42806b12c5f89db4ebf64af6741afe6d8457e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/bb42806b12c5f89db4ebf64af6741afe6d8457e1",
+ "reference": "bb42806b12c5f89db4ebf64af6741afe6d8457e1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Stopwatch Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-06-29 05:41:56"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "reference": "7ff51b06c6c3d5cc6686df69004a42c69df09e27",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-10-24 18:41:13"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.5.0"
+ },
+ "platform-dev": []
+}
diff --git a/src/composer/vendor/consolidation/robo/data/Task/Development/GeneratedWrapper.tmpl b/src/composer/vendor/consolidation/robo/data/Task/Development/GeneratedWrapper.tmpl
new file mode 100644
index 00000000..6682748f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/data/Task/Development/GeneratedWrapper.tmpl
@@ -0,0 +1,39 @@
+task{wrapperClassName}()
+ * ...
+ * ->run();
+ *
+ * // one line
+ * ...
+ *
+ * ?>
+ * ```
+ *
+{methodList}
+ */
+class {wrapperClassName} extends StackBasedTask
+{
+ protected $delegate;
+
+ public function __construct()
+ {
+ $this->delegate = new {delegate}();
+ }
+
+ protected function getDelegate()
+ {
+ return $this->delegate;
+ }{immediateMethods}{methodImplementations}
+}
diff --git a/src/composer/vendor/consolidation/robo/docs/collections.md b/src/composer/vendor/consolidation/robo/docs/collections.md
new file mode 100644
index 00000000..fc027daa
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/collections.md
@@ -0,0 +1,250 @@
+# Collection Builders
+
+Robo provides task collections as a means of making error detection and recovery easier. When Robo tasks are added to a collection, their execution is deferred until the `$collection->run()` method is called. If one of the tasks fail, then the operation will be aborted; rollback tasks may also be defined to restore the system to its original condition.
+
+When using collections, a Robo script will go through three phases:
+
+1. Determine which tasks will need to be run, and create a task builder.
+ - Assign values to variables.
+ - Do not alter the state of the system.
+2. Create the necessary tasks via the task builder.
+ - Use variables calculated in the first phase in task parameters.
+3. Run the tasks via the `run()` method.
+ - Check and report errors once after `run()` returns.
+
+Following this pattern will keep your code linear and easy to understand.
+
+## Collections API
+
+Collections are made up of a combination of tasks and/or `callable` functions / method pointers, such as:
+
+ - A task (implements TaskInterface)
+ - A function name (string)
+ - A closure (inline function)
+ - A method reference (array with object and method name)
+
+Examples of adding different kinds of tasks to a collection are provided below.
+
+### TaskInterface Objects
+
+```php
+add(
+ $this->taskExec('ls')
+ );
+?>
+```
+
+### Functions
+
+```php
+addCode('mytaskfunction');
+?>
+```
+
+### Closures
+
+```php
+addCode(
+ function() use ($work)
+ {
+ // do something with $work
+ });
+?>
+```
+
+### Methods
+
+```php
+addCode([$myobject, 'mymethod']);
+?>
+```
+
+## Using a Collection Builder
+
+To manage a collection of tasks, a collection builder. Collection builders allow tasks to be created via chained methods. All of the tasks created by the same builder are added to a collection; when the `run()` method is called, all of the tasks in the collection run.
+
+The 'publish' command from Robo's own RoboFile is shown below. It uses a collection builder to run some git and filesystem operations. The "completion" tasks are run after all other tasks complete, or during rollback processing when an operation fails.
+
+``` php
+collectionBuilder();
+ $collection->taskGitStack()
+ ->checkout('site')
+ ->merge('master')
+ ->completion($this->taskGitStack()->checkout($current_branch))
+ ->taskFilesystemStack()
+ ->copy('CHANGELOG.md', 'docs/changelog.md')
+ ->completion($this->taskFilesystemStack()->remove('docs/changelog.md'))
+ ->taskExec('mkdocs gh-deploy');
+
+ return $collection;
+ }
+}
+?>
+```
+
+The example above also adds a couple of tasks as "completions"; these are run when the collection completes execution, as explained below.
+
+## Rollbacks and Completions
+
+Robo also provides rollbacks and completions, special tasks that are eligible to run only if all of the tasks added to the collection before them succeed. The section below explains the circumstances under which these tasks will run.
+
+### Completion Tasks
+
+Completions run whenever their collection completes or fails, but only if all of the tasks that come before it succeed. An example of this is shown in the first example above. A filesystem stack task copies CHANDELOG.md to docs/changelog.md; after this task is added to the collection, another filesystem stack task is added as a completion to delete docs/changelog.md. This is done because docs/changelog.md is only intended to exist long enough to be used by the `mkdocs` task, which is added later.
+
+### Rollback Tasks
+
+In addition to completions, Robo also supports rollbacks. Rollback tasks can be used to clean up after failures, so the state of the system does not change when execution is interrupted by an error. A rollback task is executed if all of the tasks that come before it succeed, and at least one of the tasks that come after it fails. If all tasks succeed, then no rollback tasks are executed.
+
+### Rollback and Completion Methods
+
+Any task may also implement \Robo\Contract\RollbackInterface; if this is done, then its `rollback()` method will be called if the task is `run()` on a collection that later fails.
+
+Use `addAsCompletion($collection)` in place of `addAsRollback($collection)`, or implement \Robo\Contract\CompletionInterface. Completions otherwise work exactly like rollbacks.
+
+## Temporary Objects
+
+Since the concept of temporary objects that are cleaned up on failure is a common pattern, Robo provides built-in support for them. Temporary directories and files are provided out of the box; other kinds of temporary objects can be easily created using the Temporary global collection.
+
+### Temporary Directories
+
+It is recommended that operations that perform multiple filesystem operations should, whenever possible, do most of their work in a temporary directory. Temporary directories are created by `$this->taskTmpDir()`, and are automatically be removed when the collection completes or rolls back. As an added convenience, the CollectionBuilder class has a `tmpDir()` method that creates a temporary directory via `taskTmpDir()`, and then returns the path to the temporary directory.
+
+``` php
+collectionBuilder();
+
+ // Create a temporary directory, and fetch its path.
+ $work = $collection->tmpDir();
+
+ $collection
+ ->taskWriteToFile("$work/README.md")
+ ->line('-----')
+ ->line(date('Y-m-d').' Generated file: do not edit.')
+ ->line('----');
+
+ // If all of the preceding tasks succeed, then rename the temporary
+ // directory to its final name.
+ $collection->taskFilesystemStack()
+ ->rename($work, 'destination');
+
+ return $collection->run();
+ }
+}
+?>
+```
+
+In the previous example, the path to the temporary directory is stored in the variable `$work`, and is passed as needed to the parameters of the other tasks as they are added to the collection. After the task collection is run, the temporary directory will be automatically deleted. In the example above, the temporary directory is renamed by the last task in the collection. This allows the working directory to persist; the collection will still attempt to remove the working directory, but no errors will be thrown if it no longer exists in its original location. Following this pattern allows Robo scripts to easily and safely do work that cleans up after itself on failure, without introducing a lot of branching or additional error recovery code. This paradigm is common enough to warrant a shortcut method of accomplishing the same thing. The example below is identical to the one above, save for the fact that it uses the `workDir()` method instead of `tmpDir()`. `workDir()` renames the temporary directory to its final name if the collection completes; any directory that exists in the same location will be overwritten at that time, but will persist if the collection roles back.
+
+``` php
+collectionBuilder();
+
+ // Create a temporary directory, and fetch its path.
+ // If all of the tasks succeed, then rename the temporary directory
+ // to its final name.
+ $work = $collection->workDir('destination');
+
+ $collection
+ ->taskWriteToFile("$work/README.md")
+ ->line('-----')
+ ->line(date('Y-m-d').' Generated file: do not edit.')
+ ->line('----');
+
+ return $collection->run();
+ }
+}
+?>
+```
+
+Temporary directories may also be created via the shortcut `$this->_tmpDir();`. Temporary directories created in this way are deleted when the script terminates.
+
+### Temporary Files
+
+Robo also provides an API for creating temporary files. They may be created via `$this->taskTmpFile()`; they are used exactly like `$this->taskWrite()`, except they are given a random name on creation, and are deleted when their collection completes. If they are not added to a collection, then they are deleted when the script terminates.
+
+### The Temporary Global Collection
+
+Robo maintains a special collection called the Temporary global collection. This collection is used to keep track of temporary objects that are not part of any collection. For example, Robo temporary directories and temporary files are managed by the Temporary global collection. These temporary objects are cleaned up automatically when the script terminates.
+
+It is easy to create your own temporary tasks that behave in the same way as the provided temporary directory and temporary file tasks. There are two steps required:
+
+- Implement \Robo\Contract\CompletionInterface
+- Wrap the task via Temporary::wrap()
+
+For example, the implementation of taskTmpFile() looks like this:
+
+``` php
+
+```
+
+The `complete()` method of the task will be called once the Collection the temporary object is attached to finishes running. If the temporary is not added to a collection, then its `complete()` method will be called when the script terminates.
+
+## Named Tasks
+
+It is also possible to provide names for the tasks added to a collection. This has two primary benefits:
+
+1. Any result data returned from a named task is stored in the Result object under the task name.
+2. It is possible for other code to add more tasks before or after any named task.
+
+This feature is useful if you have functions that create task collections, and return them as a function results. The original caller can then use the `$collection->before()` or `$collection->after()` to insert sequenced tasks into the set of operations to be performed. One reason this might be done would be to define a base set of operations to perform (e.g. in a deploy), and then apply modifications for other environments (e.g. dev or stage).
+
+```php
+addCode(
+ function() use ($work)
+ {
+ // do something with $work
+ },
+ "taskname");
+?>
+```
+
+Given a collection with named tasks, it is possible to insert more tasks before or after a task of a given name.
+
+```php
+after("taskname",
+ function() use ($work)
+ {
+ // do something with $work after "taskname" executes, if it succeeds.
+ });
+?>
+```
+
+```php
+before("taskname",
+ function() use ($work)
+ {
+ // do something with $work before "taskname" executes.
+ });
+?>
+```
+
+It is recommended that named tasks be avoided unless specifically needed.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/extending.md b/src/composer/vendor/consolidation/robo/docs/extending.md
new file mode 100644
index 00000000..c71b7bc8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/extending.md
@@ -0,0 +1,191 @@
+# Extending
+
+Robo tasks can be added to your Robo application by using Composer to suppliment the set of built-in tasks that Robo provides by default. To find existing Robo task extensions, search in Packagist for projects of type [robo-tasks](https://packagist.org/search/?type=robo-tasks).
+
+The convention used to add new tasks for use in your RoboFiles is to create a wrapper trait named `loadTasks` that instantiates the implementation class for each task. Each task method in the trait should start with the prefix `task`, and should use **chained method calls** for configuration. Task execution should be triggered by the method `run`.
+
+To include additional tasks in your RoboFile, you must `use` the appropriate `loadTasks` in your RoboFile. See the section [Including Additional Tasks](#including-additional-tasks) below. To create your own Robo extension that provides tasks for use in RoboFiles, then you must write your own class that implements TaskInterface, and create a `loadTasks` trait for it as described in the section [Creating a Robo Extension](#creating-a-robo-extension).
+
+## Including Additional Tasks
+
+Additional tasks may be installed into projects that have included Robo via Composer. For example:
+```
+$ cd myproject
+$ composer require boedah/robo-drush
+```
+If any of the tasks you include require external Composer projects themselves, then you must `composer require` these as well. See the `suggests` section of Robo's composer.json file for a list of some projects you might need to require.
+
+Once the extension you wish to use has been added to your vendor directory, you may then include it from your RoboFile:
+``` php
+class RoboFile extends \Robo\Tasks
+{
+ use \Boedah\Robo\Task\Drush\loadTasks;
+
+ public function test()
+ {
+ // ...
+ }
+}
+```
+Once you have done this, all of the tasks defined in the extension you selected will be available for use in your commands.
+
+Note that at the moment, it is not possible to extend Robo when using the robo.phar. This capability may be added in the future via [embedded composer](https://github.com/dflydev/dflydev-embedded-composer).
+
+## Creating a Robo Extension
+
+A Robo tasks extension is created by advertising a Composer package of type `robo-tasks` on [Packagist](https://packagist.org/). For an overview on how this is done, see the article [Creating your very own Composer Package](https://knpuniversity.com/screencast/question-answer-day/create-composer-package). Specific instructions for creating Robo task extensions are provided below.
+
+### Create your composer.json File
+
+Your composer.json file should look something like the example below:
+```
+{
+ "name": "boedah/robo-drush",
+ "description": "Drush CommandStack for Robo Task Runner",
+ "type": "robo-tasks",
+ "autoload": {
+ "psr-4": {
+ "Boedah\\Robo\\Task\\Drush\\": "src"
+ }
+ },
+ "require": {
+ "php": ">=5.5.0",
+ "consolidation/robo": "~1"
+ }
+}
+```
+Customize the name and autoload paths as necessary, and add any additional required projects needed by the tasks that your extensions will provide. The type of your project should always be `robo-tasks`. Robo only supports php >= 5.5.0; you may require a higher version of php if necessary.
+
+### Create the loadTasks.php Trait
+
+It is recommended to place your trait-loading task in a `loadTasks` file in the same namespace as the task implementation.
+```
+namespace Boedah\Robo\Task\Drush;
+
+use Robo\Container\SimpleServiceProvider;
+
+trait loadTasks
+{
+ /**
+ * @param string $pathToDrush
+ * @return DrushStack
+ */
+ protected function taskDrushStack($pathToDrush = 'drush')
+ {
+ return $this->task(__FUNCTION__, $pathToDrush);
+ }
+}
+```
+Note that the name of the service for a given task must start with the word "task", and must have the same name as the function used to call the task. `$this->task()` looks up the service by name; using the PHP built-in constant __FUNCTION__ for this parameter ensures that the names of these items remain in alignment.
+
+### Task implementation
+
+The implementation of each task class should extend \Robo\Task\BaseTask, or some class that extends the same, and should used chained initializer methods and defer all operations that alter the state of the system until its `run()` method. If you follow these patterns, then your task extensions will be usable via Robo collection builders, as explained in the [collections](collections.md) documentation.
+
+There are many examples of task implementations in the Robo\Task namespace. A very basic task example is provided below. The namespace is `MyAssetTasks`, and the example task is `CompileAssets`. To customize to your purposes, choose an appropriate namespace, and then define as many tasks as you need.
+
+``` php
+task(CompileAssets::class, $path);
+ }
+}
+
+class CompileAssets implements \Robo\Contract\TaskInterface
+{
+ // configuration params
+ protected $path;
+ protected $to;
+ function __construct($path)
+ {
+ $this->path = $path;
+ }
+
+ function to($filename)
+ {
+ $this->to = $filename;
+ // must return $this
+ return $this;
+ }
+
+ // must implement Run
+ function run()
+ {
+ //....
+ }
+}
+?>
+```
+
+To use the tasks you define in a RoboFile, use its `loadTasks` trait as explained in the section [Including Additional Tasks](#including-additional-tasks), above.
+
+### TaskIO
+
+To allow tasks access IO, use the `Robo\Common\TaskIO` trait, or inherit your task class from `Robo\Task\BaseTask` (recommended).
+
+Inside tasks you should print process details with `printTaskInfo`, `printTaskSuccess`, and `printTaskError`.
+```
+$this->printTaskInfo('Processing...');
+```
+The Task IO methods send all output through a PSR-3 logger. Tasks should use task IO exclusively; methods such as 'say' and 'ask' should reside in the command method. This allows tasks to be usable in any context that has a PSR-3 logger, including background or server processes where it is not possible to directly query the user.
+
+### Tasks That Use Tasks
+
+If one task implementation needs to use other tasks while it is running, it should do so via a `CollectionBuilder` object, as explained in the [Collections](collections.md) documentation.
+
+To obtain access to a `CollectionBuilder`, a task should implement `BuilderAwareInterface` and use `BuilderAwareTrait`. It will then have access to a collection builder via the `$this->collectionBuilder()` method.
+
+### Testing Extensions
+
+If you wish to use the `task()` methods from your `loadTasks` trait in your unit tests, it is necessary to also use the Robo `TaskAccessor` trait, and define a `collectionBuilder()` method to provide a builder. Collection builders are used to initialize all Robo tasks. The easiest way to get a usable collection builder in your tests is to initialize Robo's default dependency injection container, and use it to request a new builder.
+
+An example of how to do this in a PHPUnit test is shown below.
+```
+use League\Container\ContainerAwareInterface;
+use League\Container\ContainerAwareTrait;
+use Symfony\Component\Console\Output\NullOutput;
+use Robo\TaskAccessor;
+use Robo\Robo;
+
+class DrushStackTest extends \PHPUnit_Framework_TestCase implements ContainerAwareInterface
+{
+ use \Boedah\Robo\Task\Drush\loadTasks;
+ use TaskAccessor;
+ use ContainerAwareTrait;
+
+ // Set up the Robo container so that we can create tasks in our tests.
+ function setup()
+ {
+ $container = Robo::createDefaultContainer(null, new NullOutput());
+ $this->setContainer($container);
+ }
+
+ // Scaffold the collection builder
+ public function collectionBuilder()
+ {
+ $emptyRobofile = new \Robo\Tasks;
+ return $this->getContainer()->get('collectionBuilder', [$emptyRobofile]);
+ }
+
+ public function testYesIsAssumed()
+ {
+ $command = $this->taskDrushStack()
+ ->drush('command')
+ ->getCommand();
+ $this->assertEquals('drush command -y', $command);
+ }
+}
+```
+To assert that the output of a command contains some value, use a `Symfony\Component\Console\Output\BufferedOutput` in place of null output when calling Robo::createDefaultContainer().
diff --git a/src/composer/vendor/consolidation/robo/docs/framework.md b/src/composer/vendor/consolidation/robo/docs/framework.md
new file mode 100644
index 00000000..d0ae942f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/framework.md
@@ -0,0 +1,89 @@
+# Robo as a Framework
+
+There are multiple ways to use and package Robo scripts; a few of the alternatives are presented below.
+
+## Creating a Standalone Phar with Robo
+
+It is possible to create a standalone phar that is implemented with Robo; doing this does not require the RoboFile to be located in the current working directory, or any particular location within your project. To achieve this, first set up your project as shown in the section [Implementing Composer Scripts with Robo](getting-started.md#implementing-composer-scripts-with-robo). Use of the "scripts" section is optional.
+
+Next, add an "autoload" section to your composer.json to provide a namespace for your Robo commands:
+```
+{
+ "name": "myorg/myproject",
+ "require": {
+ "consolidation/Robo": "~1"
+ },
+ "autoload":{
+ "psr-4":{
+ "MyProject\\":"src"
+ }
+ }
+}
+```
+Create a new file for your Robo commands, e.g. `class RoboFile` in `namespace MyProject\Commands;` in the file `src\Commands\RoboFile.php`. Optionally, add more task libraries as described in the [extending](extending.md) document.
+
+Create a startup script similar to the one below, and add it to the root of your project, or some other location of your choosing:
+
+``` php
+#!/usr/bin/env php
+setSearchPattern('*Command.php');
+$commandClasses = $discovery->discover('php/MyProject/Commands', '\MyProject\Commands');
+```
+Pass the resulting `$commandClasses` to the `Runner()` constructor as shown above. See the annotated-commands project for more information about the different options that the discovery command takes.
+
+## Using Your Own Dependency Injection Container with Robo (Advanced)
+
+It is also possible to completely replace the Robo application with your own. To do this, set up your project as described in the sections above, but replace the Robo runner with your own main event loop.
+
+Create the Robo dependency injection container:
+```
+use League\Container\Container;
+
+$input = new \Symfony\Component\Console\Input\ArgvInput($argv);
+$output = new \Symfony\Component\Console\Output\ConsoleOutput();
+$conf = new \Robo\Config(); \\ or use your own subclass
+$app = new \My\Application();
+$container = \Robo\Robo::createDefaultContainer($input, $output, $app, $conf);
+```
+If you are using League\Container (recommended), then you may simply add and share your own classes to the same container. If you are using some other DI container, then you should use [delegate lookup](https://github.com/container-interop/fig-standards/blob/master/proposed/container.md#14-additional-feature-delegate-lookup) to combine them.
diff --git a/src/composer/vendor/consolidation/robo/docs/getting-started.md b/src/composer/vendor/consolidation/robo/docs/getting-started.md
new file mode 100644
index 00000000..673f688d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/getting-started.md
@@ -0,0 +1,418 @@
+# Getting Started
+
+To begin you need to create a RoboFile. Just run `robo init` in your project directory:
+
+```
+cd myproject
+robo init
+```
+
+Your project directory may start out empty; Robo will create a new `RoboFile.php` for you. There will be RoboFile class which extends `\Robo\Tasks`, which includes all bundled tasks of Robo.
+
+``` php
+
+```
+
+## Commands
+
+All public methods of the RoboFile class will be treated as **commands**. You can run them from the CLI and pass arguments.
+
+``` php
+say("Hello, $world");
+ }
+}
+?>
+```
+
+When we run:
+
+```
+robo hello davert
+➜ Hello, davert
+```
+
+Method names should be camelCased. In CLI `camelCased` method will be available as `camel:cased` command.
+`longCamelCased` method will be transformed to `long:camel-cased` command.
+
+**Note:** This assumes you have installed Robo by downloading the [robo.phar](http://robo.li/robo.phar) file and copied it to a directory in your $PATH. For example, `cp robo.phar ~/bin/robo`.
+
+### Arguments
+
+All method parameters without default values are treated as required arguments. In our example command `hello` requires one argument.
+If you pass a default value to parameter the argument becomes optional:
+
+``` php
+say("Hello, $world");
+ }
+?>
+```
+
+```
+robo hello
+➜ Hello, world
+```
+
+To accept multiple, variable arguments, define a parameter as an `array`; Robo will then pass all CLI arguments in this variable:
+
+``` php
+say("Hello, " . implode(', ', $world));
+ }
+?>
+```
+
+```
+robo hello davert jon bill bob
+➜ Hello, davert, jon, bill, bob
+```
+
+### Options
+
+To define command options you should define the last method parameter as an associative array where the keys define the option names and the values provide each option's default values:
+
+``` php
+ false])
+ {
+ if (!$opts['silent']) $this->say("Hello, world");
+ }
+?>
+```
+
+```
+robo hello
+➜ Hello, world
+
+robo hello --silent
+```
+
+A one-character shortcut can be specified for option:
+
+``` php
+ false])
+ {
+ if (!$opts['silent']) $this->say("Hello, world");
+ }
+?>
+```
+
+Now command can be executed with '-s' to run in silent mode:
+
+```
+robo hello -s
+```
+
+### Load From Other Directories
+
+Robo can execute commands from a RoboFile located in different directory.
+You can specify the path to another RoboFile by including the `--load-from` option:
+
+```
+robo run --load-from /path/to/my/other/project
+```
+
+### Pass-Through Arguments
+
+Sometimes you need to pass arguments from your command into a task. A command line after the `--` characters is treated as one argument.
+Any special character like `-` will be passed into without change.
+
+``` php
+taskExec('ls')->args($args)->run();
+ }
+?>
+```
+
+```
+robo ls -- Robo -c --all
+ [Robo\Task\ExecTask] running ls Robo -c --all
+ . .. CHANGELOG.md codeception.yml composer.json composer.lock docs .git .gitignore .idea LICENSE README.md robo RoboFile.php robo.phar src tests .travis.yml vendor
+```
+
+### Help
+
+The help text for a command in a RoboFile may be provided in Doc-Block comments. An example help Doc-Block comment is shown below:
+
+``` php
+ false])
+{
+}
+?>
+```
+
+The corresponding help text produced is:
+
+```
+robo fibonacci --help
+Usage:
+ fibonacci [--graphic] start steps
+
+Arguments:
+ start Number to start from
+ steps Number of steps to perform
+
+Options:
+ --graphic Display the sequence graphically using cube representation
+
+Help:
+ Graphic output will look like
+ +----+---+-------------+
+ | | | |
+ | |-+-| |
+ |----+-+-+ |
+ | | |
+ | | |
+ | | |
+ +--------+-------------+
+```
+
+Arguments and options are populated from annotations.
+
+Initially added with [PR by @jonsa](https://github.com/consolidation/Robo/pull/71); now provided by the [consolidation/annotated-command](https://github.com/consolidation/annotated-command) project, which was factored out from Robo.
+
+### Ignored methods
+
+Robo ignores any method of your RoboFile that begins with `get` or `set`. These methods are presumed to be data accessors, not commands. To implement a command whose name contains `get` or `set`, use the `@command` annotation.
+
+``` php
+
+```
+
+## Tasks
+
+Robo commands typically divide the work they need to accomplish into **tasks**. The command first determines what needs to be done, inspecting current state if necessary, and then sets up and executes one or more tasks that make the actual changes needed by the command. (See also the documentation on [Collections](collections.md), which allow you to combine groups of tasks which can provide rollback functions to recover from failure situations.)
+
+For details on how to add custom tasks to Robo, see the [extending](extending.md) document.
+
+### Shortcuts
+
+Some tasks may have shortcuts. If a task does not require multi-step configuration, it can be executed with a single line:
+
+```php
+_exec('ps aux');
+$this->_copy('config/env.example.yml','config/env.yml');
+?>
+```
+
+### Result
+
+Each task must return an instance of `Robo\Result`. A Robo Result contains the task instance, exit code, message, and any variable data that the task may wish to return.
+
+The `run` method of `CompileAssets` class may look like this:
+
+```
+return new Robo\Result($this, $exitCode, "Assets compiled");
+```
+
+or
+
+```
+return Robo\Result::success($this, "Assets compiled");
+return Robo\Result::error($this, "Failed to compile assets");
+```
+
+You can use this results to check if execution was successful, either using the `wasSuccessful()` method, or via the `invoke` shortcut. We will use the `Exec` task in next example to illustrate this:
+
+``` php
+_exec('phpunit tests/integration');
+ $res2 = $this->_exec('phpunit tests/unit');
+
+ // print message when tests passed
+ if ($res1->wasSuccessful() and $res2->wasSuccessful()) $this->say("All tests passed");
+ }
+}
+?>
+```
+When making multi-step commands that call one task after another, it is best to use a collection to group the tasks together. The collection will handle error detection and rollback, and will return a single Result object when done. For more information, see the [Collections](collections.md) documentation.
+
+Some tasks may also attach data to the Result object. If this is done, the data may be accessed as an array; for example, `$result['path'];`. This is not common.
+
+Commands should return a Result object obtained from a task; this will ensure that the command exit code is set correctly. If a command does not have a Result object available, then it may use a ResultData object. ResultData objects are just like Result objects, except the do not contain a reference to a task.
+
+return new Robo\ResultData($exitcode, 'Error message.');
+
+If the command returns a TaskInterface instead of a result, then the task will be executed, and the result from that task will be used as the final result of the command. See also `Formatters`, below.
+
+### Stack
+
+Some tasks contain `Stack` in their name. These are called "stack" tasks, and they execute similar tasks one after the other. Each of the primary methods in a stack class executes an operation.
+
+Stack tasks also contain a `stopOnFail` method which can be used to stop task execution if one of its commands was unsuccessful.
+
+### Global StopOnFail
+
+There is a global `stopOnFail` method as well, that can be used to stop a command on first failure of a task.
+
+```
+$this->stopOnFail(true);
+```
+
+### IO
+
+As you noticed, you can print text via the `say` method, which is taken from the `Robo\Output` trait.
+
+```
+$this->say("Hello");
+```
+
+Also, you can ask for input from console:
+
+```
+$name = $this->ask("What is your name?");
+```
+
+There are also `askDefault`, `askHidden`, and `confirm` methods.
+
+In addition, Robo makes all of the methods of Symfony Style available throgh the `io()` method:
+
+$this->io()->title("Build all site assets");
+
+This allows Robo scripts to follow the [Symfony Console Style Guide](http://symfony.com/blog/new-in-symfony-2-8-console-style-guide) if desired.
+
+### Formatters
+
+It is preferable for commands that look up and display information should avoid doing IO directly, and should instead return the data they wish to display as an array. This data can then be converted into different data formats, such as "table" and "json". The user may select which formatter to use via the --format option. For details on formatters, see the [consolidation/output-formatters](https://github.com/consolidation/output-formatters) project.
+
+### Progress
+
+Robo supports progress indicators via the Symfony ProgressBar class. Long-running tasks that wish to display the progress indicator may do so via four simple steps:
+
+- Override the `progressIndicatorSteps()` method and return the number of "steps" in the operation.
+- Call `$this->startProgressIndicator()` to begin the progress indicator running.
+- Call `$this->advanceProgressIndicator()` a number of times equal to the result returned by `progressIndicatorSteps()`
+- Call `$this->stopProgressIndicator()` when the operation is completed.
+
+An example of this is shown below:
+
+``` php
+steps;
+ }
+
+ public function run()
+ {
+ $exitCode = 0;
+ $errorMessage = "";
+
+ $this->startProgressIndicator();
+ for ($i = 0; $i < $this->steps; ++$i) {
+ $this->advanceProgressIndicator();
+ }
+ $this->stopProgressIndicator();
+
+ return new Result($this, $exitCode, $errorMessage, ['time' => $this->getExecutionTime()]);
+ }
+}
+?>
+```
+Tasks should not attempt to use a specific progress indicator (e.g. the Symfony ProgressBar class) directly, as the ProgressIndicatorAwareTrait allows for an appropriate progress indicator to be used (or omitted) as best suits the application.
+
+Note that when using [Collections](collections.md), the progress bar will automatically be shown if the collection takes longer than two seconds to run. Each task in the collection will count for one "step"; if the task supports progress indicators as shown above, then it will add an additional number of steps as indicated by its `progressIndicatorSteps()` method.
+
+## Working with Composer
+
+### Adding a RoboFile to your Project
+
+Robo is designed to work well with Composer. To use Robo scripts in your Composer-based project, simply add `robo` to your composer.json file:
+```
+$ cd myproject
+$ composer require consolidation/Robo:~1
+$ ./vendor/bin/robo mycommand
+```
+If you do not want to type the whole path to Robo, you may add `./vendor/bin` to your $PATH (relative paths work), or use `composer exec` to find and run Robo:
+```
+$ composer exec robo mycommand
+```
+
+### Implementing Composer Scripts with Robo
+
+When using Robo in your project, it is convenient to define Composer scripts that call your Robo commands. Simply add the following to your composer.json file:
+```
+{
+ "name": "myorg/myproject",
+ "require": {
+ "consolidation/Robo": "~1"
+ },
+ "scripts": {
+ "test": "composer robo test",
+ "phar": "composer robo phar:build",
+ "robo": "robo --ansi --load-from $(pwd)/scripts/BuildCommands.php"
+ }
+}
+```
+*Note*: When you include Robo as a library like this, some external projects used by certain core Robo tasks are not automatically included in your project. See the `"suggest":` section of Robo's composer.json for a list of external projects you might also want to require in your project.
+
+Once you have set up your composer.json file (and ran `composer update` if you manually changed the `require` or `require-dev` sections), Composer will ensure that your project-local copy of Robo in the `vendor/bin` dir is in your $PATH when you run the additional Composer scripts that you declared:
+```
+$ cd myproject
+$ composer test
+$ composer phar
+```
+This will call the public methods `test()` and `phar()` in your RoboFile.php when using `composer test` and `composer phar`, respectively.
+
+Advertising your build commands as Composer scripts is a useful way to provide the key commands used for testing, building or packaging your application. Also, if your application should happen to provide a commandline tool to perform the operations of the application itself, then defining your build commands in their own RoboFile provides desirable separation, keeping your build commands out of the help and list commands of your primary script.
+
+If you would like to simplify the output of your script (e.g. when running on a CI service), replace the `--ansi` option in the example above with `--no-ansi`, and colored terminal output and progress bars will be disabled.
+
+## Robo as a Framework
+
+For an overview on how to turn your Robo scripts into standalone tools, see the example [robo.script](https://github.com/consolidation/Robo/blob/master/examples/robo.script), and the section [Robo as a Framework](framework.md).
diff --git a/src/composer/vendor/consolidation/robo/docs/index.md b/src/composer/vendor/consolidation/robo/docs/index.md
new file mode 100644
index 00000000..cdb6d099
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/index.md
@@ -0,0 +1,24 @@
+# Robo Documentation
+
+* [Getting Started](getting-started.md)
+* [Collections](collections.md)
+* [Extending](extending.md)
+* [Robo as a Framework](framework.md)
+
+## Tasks
+
+* [ApiGen](tasks/ApiGen.md)
+* [Archive](tasks/Archive.md)
+* [Assets](tasks/Assets.md)
+* [Base](tasks/Base.md)
+* [Bower](tasks/Bower.md)
+* [Composer](tasks/Composer.md)
+* [Development](tasks/Development.md)
+* [Docker](tasks/Docker.md)
+* [File](tasks/File.md)
+* [Filesystem](tasks/Filesystem.md)
+* [Gulp](tasks/Gulp.md)
+* [Npm](tasks/Npm.md)
+* [Remote](tasks/Remote.md)
+* [Testing](tasks/Testing.md)
+* [Vcs](tasks/Vcs.md)
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/ApiGen.md b/src/composer/vendor/consolidation/robo/docs/tasks/ApiGen.md
new file mode 100644
index 00000000..255404b8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/ApiGen.md
@@ -0,0 +1,56 @@
+# ApiGen Tasks
+## ApiGen
+
+
+Executes ApiGen command to generate documentation
+
+``` php
+taskApiGen('./apigen.neon')
+ ->templateConfig('vendor/apigen/apigen/templates/bootstrap/config.neon')
+ ->wipeout(true)
+ ->run();
+?>
+```
+
+* `config($config)` * `param string` $config
+* `source($src)` * `param array|string|Traversable` $src one or more source values
+* `destination($dest)` * `param string` $dest
+* `extensions($exts)` * `param array|string` $exts one or more extensions
+* `exclude($exclude)` * `param array|string` $exclude one or more exclusions
+* `skipDocPath($path)` * `param array|string|Traversable` $path one or more skip-doc-path values
+* `skipDocPrefix($prefix)` * `param array|string|Traversable` $prefix one or more skip-doc-prefix values
+* `charset($charset)` * `param array|string` $charset one or more charsets
+* `mainProjectNamePrefix($name)` * `param string` $name
+* `title($title)` * `param string` $title
+* `baseUrl($baseUrl)` * `param string` $baseUrl
+* `googleCseId($id)` * `param string` $id
+* `googleAnalytics($trackingCode)` * `param string` $trackingCode
+* `templateConfig($templateConfig)` * `param mixed` $templateConfig
+* `allowedHtml($tags)` * `param array|string` $tags one or more supported html tags
+* `groups($groups)` * `param string` $groups
+* `autocomplete($types)` * `param array|string` $types or more supported autocomplete types
+* `accessLevels($levels)` * `param array|string` $levels one or more access levels
+* `internal($internal)` * `param boolean|string` $internal 'yes' or true if internal, 'no' or false if not
+* `php($php)` * `param boolean|string` $php 'yes' or true to generate documentation for internal php classes,
+* `tree($tree)` * `param bool|string` $tree 'yes' or true to generate a tree view of classes, 'no' or false otherwise
+* `deprecated($dep)` * `param bool|string` $dep 'yes' or true to generate documentation for deprecated classes, 'no' or false otherwise
+* `todo($todo)` * `param bool|string` $todo 'yes' or true to document tasks, 'no' or false otherwise
+* `sourceCode($src)` * `param bool|string` $src 'yes' or true to generate highlighted source code, 'no' or false otherwise
+* `download($zipped)` * `param bool|string` $zipped 'yes' or true to generate downloadable documentation, 'no' or false otherwise
+* `report($path)`
+* `wipeout($wipeout)` * `param bool|string` $wipeout 'yes' or true to clear out the destination directory, 'no' or false otherwise
+* `quiet($quiet)` * `param bool|string` $quiet 'yes' or true for quiet, 'no' or false otherwise
+* `progressbar($bar)` * `param bool|string` $bar 'yes' or true to display a progress bar, 'no' or false otherwise
+* `colors($colors)` * `param bool|string` $colors 'yes' or true colorize the output, 'no' or false otherwise
+* `updateCheck($check)` * `param bool|string` $check 'yes' or true to check for updates, 'no' or false otherwise
+* `debug($debug)` * `param bool|string` $debug 'yes' or true to enable debug mode, 'no' or false otherwise
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Archive.md b/src/composer/vendor/consolidation/robo/docs/tasks/Archive.md
new file mode 100644
index 00000000..103845d2
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Archive.md
@@ -0,0 +1,52 @@
+# Archive Tasks
+## Extract
+
+
+Extracts an archive.
+
+Note that often, distributions are packaged in tar or zip archives
+where the topmost folder may contain variable information, such as
+the release date, or the version of the package. This information
+is very useful when unpacking by hand, but arbitrarily-named directories
+are much less useful to scripts. Therefore, by default, Extract will
+remove the top-level directory, and instead store all extracted files
+into the directory specified by $archivePath.
+
+To keep the top-level directory when extracting, use
+`preserveTopDirectory(true)`.
+
+``` php
+taskExtract($archivePath)
+ ->to($destination)
+ ->preserveTopDirectory(false) // the default
+ ->run();
+?>
+```
+
+* `to(string)` location to store extracted files
+
+* `to($to)` Location to store extracted files.
+* `preserveTopDirectory($preserve = null)` * `param bool` $preserve
+
+## Pack
+
+
+Creates a zip or tar archive.
+
+``` php
+taskPack(
+)
+->add('README') // Puts file 'README' in archive at the root
+->add('project') // Puts entire contents of directory 'project' in archinve inside 'project'
+->addFile('dir/file.txt', 'file.txt') // Takes 'file.txt' from cwd and puts it in archive inside 'dir'.
+->run();
+?>
+```
+
+* `archiveFile($archiveFile)` * `param string` $archiveFile
+* `addFile($placementLocation, $filesystemLocation)` Add an item to the archive. Like file_exists(), the parameter
+* `addDir($placementLocation, $filesystemLocation)` Alias for addFile, in case anyone has angst about using
+* `add($item)` Add a file or directory, or list of same to the archive.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Assets.md b/src/composer/vendor/consolidation/robo/docs/tasks/Assets.md
new file mode 100644
index 00000000..54fc2110
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Assets.md
@@ -0,0 +1,163 @@
+# Assets Tasks
+
+## ImageMinify
+
+
+Minifies images. When the required minifier is not installed on the system
+the task will try to download it from the [imagemin](https://github.com/imagemin) repository.
+
+When the task is run without any specified minifier it will compress the images
+based on the extension.
+
+```php
+$this->taskImageMinify('assets/images/*')
+ ->to('dist/images/')
+ ->run();
+```
+
+This will use the following minifiers:
+
+- PNG: optipng
+- GIF: gifsicle
+- JPG, JPEG: jpegtran
+- SVG: svgo
+
+When the minifier is specified the task will use that for all the input files. In that case
+it is useful to filter the files with the extension:
+
+```php
+$this->taskImageMinify('assets/images/*.png')
+ ->to('dist/images/')
+ ->minifier('pngcrush');
+ ->run();
+```
+
+The task supports the following minifiers:
+
+- optipng
+- pngquant
+- advpng
+- pngout
+- zopflipng
+- pngcrush
+- gifsicle
+- jpegoptim
+- jpeg-recompress
+- jpegtran
+- svgo (only minification, no downloading)
+
+You can also specifiy extra options for the minifiers:
+
+```php
+$this->taskImageMinify('assets/images/*.jpg')
+ ->to('dist/images/')
+ ->minifier('jpegtran', ['-progressive' => null, '-copy' => 'none'])
+ ->run();
+```
+
+This will execute as:
+`jpegtran -copy none -progressive -optimize -outfile "dist/images/test.jpg" "/var/www/test/assets/images/test.jpg"`
+
+* `to($target)` Sets the target directory where the files will be copied to.
+* `minifier($minifier, array $options = Array ( ) )` Sets the minifier.
+
+## Less
+
+
+Compiles less files.
+
+```php
+taskLess([
+ 'less/default.less' => 'css/default.css'
+])
+->run();
+?>
+```
+
+Use one of both less compilers in your project:
+
+```
+"leafo/lessphp": "~0.5",
+"oyejorge/less.php": "~1.5"
+```
+
+Specify directory (string or array) for less imports lookup:
+
+```php
+taskLess([
+ 'less/default.less' => 'css/default.css'
+])
+->importDir('less')
+->compiler('lessphp')
+->run();
+?>
+```
+
+You can implement additional compilers by extending this task and adding a
+method named after them and overloading the lessCompilers() method to
+inject the name there.
+
+* `importDir($dirs)` Sets import directories
+* `addImportPath($dir)` Adds import directory
+* `setImportPaths($dirs)` Sets import directories
+* `setFormatter($formatterName)` * `param string` $formatterName
+* `compiler($compiler, array $options = Array ( ) )` Sets the compiler.
+
+## Minify
+
+
+Minifies asset file (CSS or JS).
+
+``` php
+taskMinify( 'web/assets/theme.css' )
+ ->run()
+?>
+```
+Please install additional dependencies to use:
+
+```
+"patchwork/jsqueeze": "~1.0",
+"natxet/CssMin": "~3.0"
+```
+
+* `to($dst)` Sets destination. Tries to guess type from it.
+* `type($type)` Sets type with validation.
+* `singleLine($singleLine)` Single line option for the JS minimisation.
+* `keepImportantComments($keepImportantComments)` keepImportantComments option for the JS minimisation.
+* `specialVarRx($specialVarRx)` specialVarRx option for the JS minimisation.
+* `__toString()` @return string
+
+## Scss
+
+
+Compiles scss files.
+
+```php
+taskScss([
+ 'scss/default.scss' => 'css/default.css'
+])
+->importDir('assets/styles')
+->run();
+?>
+```
+
+Use the following scss compiler in your project:
+
+```
+"leafo/scssphp": "~0.1",
+```
+
+You can implement additional compilers by extending this task and adding a
+method named after them and overloading the scssCompilers() method to
+inject the name there.
+
+* `setFormatter($formatterName)` Sets the formatter for scssphp
+* `importDir($dirs)` Sets import directories
+* `addImportPath($dir)` Adds import directory
+* `setImportPaths($dirs)` Sets import directories
+* `compiler($compiler, array $options = Array ( ) )` Sets the compiler.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Base.md b/src/composer/vendor/consolidation/robo/docs/tasks/Base.md
new file mode 100644
index 00000000..3dc5fcd8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Base.md
@@ -0,0 +1,126 @@
+# Base Tasks
+## Exec
+
+
+Executes shell script. Closes it when running in background mode.
+
+``` php
+taskExec('compass')->arg('watch')->run();
+// or use shortcut
+$this->_exec('compass watch');
+
+$this->taskExec('compass watch')->background()->run();
+
+if ($this->taskExec('phpunit .')->run()->wasSuccessful()) {
+ $this->say('tests passed');
+}
+
+?>
+```
+
+* `background()` Executes command in background mode (asynchronously)
+* `timeout($timeout)` Stop command if it runs longer then $timeout in seconds
+* `idleTimeout($timeout)` Stops command if it does not output something for a while
+* `env(array $env)` Sets the environment variables for the command
+* `simulate($context)` {@inheritdoc}
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## ExecStack
+
+
+Execute commands one by one in stack.
+Stack can be stopped on first fail if you call `stopOnFail()`.
+
+```php
+taskExecStack()
+ ->stopOnFail()
+ ->exec('mkdir site')
+ ->exec('cd site')
+ ->run();
+
+?>
+```
+
+* `$this stopOnFail()`
+
+* `executable($executable)` * `param string` $executable
+* `exec($command)` * `param string|string[]` $command
+* `stopOnFail($stopOnFail = null)` * `param bool` $stopOnFail
+* `result($result)`
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+
+## ParallelExec
+
+
+Class ParallelExecTask
+
+``` php
+taskParallelExec()
+ ->process('php ~/demos/script.php hey')
+ ->process('php ~/demos/script.php hoy')
+ ->process('php ~/demos/script.php gou')
+ ->run();
+?>
+```
+
+
+* ` timeout(int $timeout)` stops process if it runs longer then `$timeout` (seconds)
+* ` idleTimeout(int $timeout)` stops process if it does not output for time longer then `$timeout` (seconds)
+
+* `printed($isPrinted = null)` * `param bool` $isPrinted
+* `process($command)` * `param string|\Robo\Contract\CommandInterface` $command
+* `timeout($timeout)` * `param int` $timeout
+* `idleTimeout($idleTimeout)` * `param int` $idleTimeout
+
+## SymfonyCommand
+
+
+Executes Symfony Command
+
+``` php
+taskSymfonyCommand(new \Codeception\Command\Run('run'))
+ ->arg('suite','acceptance')
+ ->opt('debug')
+ ->run();
+
+// Artisan Command
+$this->taskSymfonyCommand(new ModelGeneratorCommand())
+ ->arg('name', 'User')
+ ->run();
+?>
+```
+
+* `arg($arg, $value)` * `param string` $arg
+* `opt($option, $value = null)`
+
+## Watch
+
+
+Runs task when specified file or dir was changed.
+Uses Lurker library.
+
+``` php
+taskWatch()
+ ->monitor('composer.json', function() {
+ $this->taskComposerUpdate()->run();
+})->monitor('src', function() {
+ $this->taskExec('phpunit')->run();
+})->run();
+?>
+```
+
+* `monitor($paths, $callable)` * `param string|string[]` $paths
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Bower.md b/src/composer/vendor/consolidation/robo/docs/tasks/Bower.md
new file mode 100644
index 00000000..c54d6015
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Bower.md
@@ -0,0 +1,60 @@
+# Bower Tasks
+
+## Install
+
+
+Bower Install
+
+``` php
+taskBowerInstall()->run();
+
+// prefer dist with custom path
+$this->taskBowerInstall('path/to/my/bower')
+ ->noDev()
+ ->run();
+?>
+```
+
+* `allowRoot()` adds `allow-root` option to bower
+* `forceLatest()` adds `force-latest` option to bower
+* `noDev()` adds `production` option to bower
+* `offline()` adds `offline` option to bower
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Update
+
+
+Bower Update
+
+``` php
+taskBowerUpdate->run();
+
+// prefer dist with custom path
+$this->taskBowerUpdate('path/to/my/bower')
+ ->noDev()
+ ->run();
+?>
+```
+
+* `allowRoot()` adds `allow-root` option to bower
+* `forceLatest()` adds `force-latest` option to bower
+* `noDev()` adds `production` option to bower
+* `offline()` adds `offline` option to bower
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Composer.md b/src/composer/vendor/consolidation/robo/docs/tasks/Composer.md
new file mode 100644
index 00000000..310c3ef3
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Composer.md
@@ -0,0 +1,179 @@
+# Composer Tasks
+
+## DumpAutoload
+
+
+Composer Dump Autoload
+
+``` php
+taskComposerDumpAutoload()->run();
+
+// dump auto loader with custom path
+$this->taskComposerDumpAutoload('path/to/my/composer.phar')
+ ->preferDist()
+ ->run();
+
+// optimize autoloader dump with custom path
+$this->taskComposerDumpAutoload('path/to/my/composer.phar')
+ ->optimize()
+ ->run();
+
+// optimize autoloader dump with custom path and no dev
+$this->taskComposerDumpAutoload('path/to/my/composer.phar')
+ ->optimize()
+ ->noDev()
+ ->run();
+?>
+```
+
+* `optimize()` * `return` $this
+* `preferDist()` adds `prefer-dist` option to composer
+* `preferSource()` adds `prefer-source` option to composer
+* `noDev()` adds `no-dev` option to composer
+* `noAnsi()` adds `no-ansi` option to composer
+* `ansi()` adds `ansi` option to composer
+* `optimizeAutoloader()` adds `optimize-autoloader` option to composer
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Install
+
+
+Composer Install
+
+``` php
+taskComposerInstall()->run();
+
+// prefer dist with custom path
+$this->taskComposerInstall('path/to/my/composer.phar')
+ ->preferDist()
+ ->run();
+
+// optimize autoloader with custom path
+$this->taskComposerInstall('path/to/my/composer.phar')
+ ->optimizeAutoloader()
+ ->run();
+?>
+```
+
+* `preferDist()` adds `prefer-dist` option to composer
+* `preferSource()` adds `prefer-source` option to composer
+* `noDev()` adds `no-dev` option to composer
+* `noAnsi()` adds `no-ansi` option to composer
+* `ansi()` adds `ansi` option to composer
+* `optimizeAutoloader()` adds `optimize-autoloader` option to composer
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Remove
+
+
+Composer Validate
+
+``` php
+taskComposerValidate()->run();
+?>
+```
+
+* `dev()` * `return` $this
+* `noProgress()` * `return` $this
+* `noUpdate()` * `return` $this
+* `updateNoDev()` * `return` $this
+* `noUpdateWithDependencies()` * `return` $this
+* `preferDist()` adds `prefer-dist` option to composer
+* `preferSource()` adds `prefer-source` option to composer
+* `noDev()` adds `no-dev` option to composer
+* `noAnsi()` adds `no-ansi` option to composer
+* `ansi()` adds `ansi` option to composer
+* `optimizeAutoloader()` adds `optimize-autoloader` option to composer
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Update
+
+
+Composer Update
+
+``` php
+taskComposerUpdate()->run();
+
+// prefer dist with custom path
+$this->taskComposerUpdate('path/to/my/composer.phar')
+ ->preferDist()
+ ->run();
+
+// optimize autoloader with custom path
+$this->taskComposerUpdate('path/to/my/composer.phar')
+ ->optimizeAutoloader()
+ ->run();
+?>
+```
+
+* `preferDist()` adds `prefer-dist` option to composer
+* `preferSource()` adds `prefer-source` option to composer
+* `noDev()` adds `no-dev` option to composer
+* `noAnsi()` adds `no-ansi` option to composer
+* `ansi()` adds `ansi` option to composer
+* `optimizeAutoloader()` adds `optimize-autoloader` option to composer
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Validate
+
+
+Composer Validate
+
+``` php
+taskComposerValidate()->run();
+?>
+```
+
+* `noCheckAll()` * `return` $this
+* `noCheckLock()` * `return` $this
+* `noCheckPublish()` * `return` $this
+* `withDependencies()` * `return` $this
+* `strict()` * `return` $this
+* `preferDist()` adds `prefer-dist` option to composer
+* `preferSource()` adds `prefer-source` option to composer
+* `noDev()` adds `no-dev` option to composer
+* `noAnsi()` adds `no-ansi` option to composer
+* `ansi()` adds `ansi` option to composer
+* `optimizeAutoloader()` adds `optimize-autoloader` option to composer
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Development.md b/src/composer/vendor/consolidation/robo/docs/tasks/Development.md
new file mode 100644
index 00000000..f5c71557
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Development.md
@@ -0,0 +1,282 @@
+# Development Tasks
+## Changelog
+
+
+Helps to manage changelog file.
+Creates or updates `changelog.md` file with recent changes in current version.
+
+``` php
+taskChangelog()
+ ->version($version)
+ ->change("released to github")
+ ->run();
+?>
+```
+
+Changes can be asked from Console
+
+``` php
+taskChangelog()
+ ->version($version)
+ ->askForChanges()
+ ->run();
+?>
+```
+
+* `Development\Changelog filename(string $filename)`
+* `Development\Changelog anchor(string $anchor)`
+* `Development\Changelog version(string $version)`
+
+* `filename($filename)` * `param string` $filename
+* `log($item)` * `param string` $item
+* `anchor($anchor)` * `param string` $anchor
+* `version($version)` * `param string` $version
+* `changes(array $data)` * `param array` $data
+* `change($change)` * `param string` $change
+* `getChanges()` @return array
+
+## GenerateMarkdownDoc
+
+
+Simple documentation generator from source files.
+Takes classes, properties and methods with their docblocks and writes down a markdown file.
+
+``` php
+taskGenDoc('models.md')
+ ->docClass('Model\User') // take class Model\User
+ ->docClass('Model\Post') // take class Model\Post
+ ->filterMethods(function(\ReflectionMethod $r) {
+ return $r->isPublic() or $r->isProtected(); // process public and protected methods
+ })->processClass(function(\ReflectionClass $r, $text) {
+ return "Class ".$r->getName()."\n\n$text\n\n###Methods\n";
+ })->run();
+```
+
+By default this task generates a documentation for each public method of a class.
+It combines method signature with a docblock. Both can be post-processed.
+
+``` php
+taskGenDoc('models.md')
+ ->docClass('Model\User')
+ ->processClassSignature(false) // false can be passed to not include class signature
+ ->processClassDocBlock(function(\ReflectionClass $r, $text) {
+ return "[This is part of application model]\n" . $text;
+ })->processMethodSignature(function(\ReflectionMethod $r, $text) {
+ return "#### {$r->name}()";
+ })->processMethodDocBlock(function(\ReflectionMethod $r, $text) {
+ return strpos($r->name, 'save')===0 ? "[Saves to the database]\n" . $text : $text;
+ })->run();
+```
+
+* ` docClass(string $classname)` put a class you want to be documented
+* ` filterMethods(\Closure $func)` using callback function filter out methods that won't be documented
+* ` filterClasses(\Closure $func)` using callback function filter out classes that won't be documented
+* ` filterProperties(\Closure $func)` using callback function filter out properties that won't be documented
+* ` processClass(\Closure $func)` post-process class documentation
+* ` processClassSignature(\Closure $func)` post-process class signature. Provide *false* to skip.
+* ` processClassDocBlock(\Closure $func)` post-process class docblock contents. Provide *false* to skip.
+* ` processMethod(\Closure $func)` post-process method documentation. Provide *false* to skip.
+* ` processMethodSignature(\Closure $func)` post-process method signature. Provide *false* to skip.
+* ` processMethodDocBlock(\Closure $func)` post-process method docblock contents. Provide *false* to skip.
+* ` processProperty(\Closure $func)` post-process property documentation. Provide *false* to skip.
+* ` processPropertySignature(\Closure $func)` post-process property signature. Provide *false* to skip.
+* ` processPropertyDocBlock(\Closure $func)` post-process property docblock contents. Provide *false* to skip.
+* ` reorder(\Closure $func)` use a function to reorder classes
+* ` reorderMethods(\Closure $func)` use a function to reorder methods in class
+* ` prepend($text)` inserts text into beginning of markdown file
+* ` append($text)` inserts text in the end of markdown file
+
+* `docClass($item)` * `param string` $item
+* `filterMethods($filterMethods)` * `param callable` $filterMethods
+* `filterClasses($filterClasses)` * `param callable` $filterClasses
+* `filterProperties($filterProperties)` * `param callable` $filterProperties
+* `processClass($processClass)` * `param callable` $processClass
+* `processClassSignature($processClassSignature)` * `param callable|false` $processClassSignature
+* `processClassDocBlock($processClassDocBlock)` * `param callable|false` $processClassDocBlock
+* `processMethod($processMethod)` * `param callable|false` $processMethod
+* `processMethodSignature($processMethodSignature)` * `param callable|false` $processMethodSignature
+* `processMethodDocBlock($processMethodDocBlock)` * `param callable|false` $processMethodDocBlock
+* `processProperty($processProperty)` * `param callable|false` $processProperty
+* `processPropertySignature($processPropertySignature)` * `param callable|false` $processPropertySignature
+* `processPropertyDocBlock($processPropertyDocBlock)` * `param callable|false` $processPropertyDocBlock
+* `reorder($reorder)` * `param callable` $reorder
+* `reorderMethods($reorderMethods)` * `param callable` $reorderMethods
+* `reorderProperties($reorderProperties)` * `param callable` $reorderProperties
+* `filename($filename)` * `param string` $filename
+* `prepend($prepend)` * `param string` $prepend
+* `append($append)` * `param string` $append
+* `text($text)` * `param string` $text
+* `textForClass($item)` * `param string` $item
+
+## Generate
+
+
+Generate a Robo Task that is a wrapper around an existing class.
+
+``` php
+taskGenerateTask('Symfony\Component\Filesystem\Filesystem', 'FilesystemStack')
+ ->run();
+```
+
+
+
+
+## GitHubRelease
+
+
+Publishes new GitHub release.
+
+``` php
+taskGitHubRelease('0.1.0')
+ ->uri('consolidation-org/Robo')
+ ->description('Add stuff people need.')
+ ->change('Fix #123')
+ ->change('Add frobulation method to all widgets')
+ ->run();
+?>
+```
+
+* `tag($tag)` * `param string` $tag
+* `draft($draft)` * `param bool` $draft
+* `name($name)` * `param string` $name
+* `description($description)` * `param string` $description
+* `prerelease($prerelease)` * `param bool` $prerelease
+* `comittish($comittish)` * `param string` $comittish
+* `appendDescription($description)` * `param string` $description
+* `changes(array $changes)`
+* `change($change)` * `param string` $change
+* `repo($repo)` * `param string` $repo
+* `owner($owner)` * `param string` $owner
+* `uri($uri)` * `param string` $uri
+* `user($user)` * `param string` $user
+* `password($password)` * `param` $password
+
+## OpenBrowser
+
+
+Opens the default's user browser
+code inspired from openBrowser() function in https://github.com/composer/composer/blob/master/src/Composer/Command/HomeCommand.php
+
+``` php
+taskOpenBrowser('http://localhost')
+ ->run();
+
+// open two browser windows
+$this->taskOpenBrowser([
+ 'http://localhost/mysite',
+ 'http://localhost/mysite2'
+ ])
+ ->run();
+```
+
+
+
+## PackPhar
+
+
+Creates Phar.
+
+``` php
+taskPackPhar('package/codecept.phar')
+ ->compress()
+ ->stub('package/stub.php');
+
+ $finder = Finder::create()
+ ->name('*.php')
+ ->in('src');
+
+ foreach ($finder as $file) {
+ $pharTask->addFile('src/'.$file->getRelativePathname(), $file->getRealPath());
+ }
+
+ $finder = Finder::create()->files()
+ ->name('*.php')
+ ->in('vendor');
+
+ foreach ($finder as $file) {
+ $pharTask->addStripped('vendor/'.$file->getRelativePathname(), $file->getRealPath());
+ }
+ $pharTask->run();
+
+ // verify Phar is packed correctly
+ $code = $this->_exec('php package/codecept.phar');
+?>
+```
+
+* `compress($compress = null)` * `param bool` $compress
+* `stub($stub)` * `param string` $stub
+* `addStripped($path, $file)` * `param string` $path
+* `addFile($path, $file)` * `param string` $path
+* `addFiles($files)` * `param \Symfony\Component\Finder\SplFileInfo[]` $files
+* `executable($file)` * `param string` $file
+
+## PhpServer
+
+
+Runs PHP server and stops it when task finishes.
+
+``` php
+taskServer(8000)
+ ->dir('public')
+ ->run();
+
+// run with IP 0.0.0.0
+$this->taskServer(8000)
+ ->host('0.0.0.0')
+ ->run();
+
+// execute server in background
+$this->taskServer(8000)
+ ->background()
+ ->run();
+?>
+```
+
+* `host($host)` * `param string` $host
+* `dir($path)` * `param string` $path
+* `background()` Executes command in background mode (asynchronously)
+* `timeout($timeout)` Stop command if it runs longer then $timeout in seconds
+* `idleTimeout($timeout)` Stops command if it does not output something for a while
+* `env(array $env)` Sets the environment variables for the command
+* `simulate($context)` {@inheritdoc}
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## SemVer
+
+
+Helps to maintain `.semver` file.
+
+```php
+taskSemVer('.semver')
+ ->increment()
+ ->run();
+?>
+```
+
+
+* `__toString()` @return string
+* `setFormat($format)` * `param string` $format
+* `setMetadataSeparator($separator)` * `param string` $separator
+* `setPrereleaseSeparator($separator)` * `param string` $separator
+* `increment($what = null)` * `param string` $what
+* `prerelease($tag = null)` * `param string` $tag
+* `metadata($data)` * `param array|string` $data
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Docker.md b/src/composer/vendor/consolidation/robo/docs/tasks/Docker.md
new file mode 100644
index 00000000..712b236e
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Docker.md
@@ -0,0 +1,249 @@
+# Docker Tasks
+
+## Build
+
+
+Builds Docker image
+
+```php
+taskDockerBuild()->run();
+
+$this->taskDockerBuild('path/to/dir')
+ ->tag('database')
+ ->run();
+
+?>
+
+```
+
+Class Build
+@package Robo\Task\Docker
+
+* `tag($tag)` * `param string` $tag
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Commit
+
+
+Commits docker container to an image
+
+```
+$this->taskDockerCommit($containerId)
+ ->name('my/database')
+ ->run();
+
+// alternatively you can take the result from DockerRun task:
+
+$result = $this->taskDockerRun('db')
+ ->exec('./prepare_database.sh')
+ ->run();
+
+$task->dockerCommit($result)
+ ->name('my/database')
+ ->run();
+```
+
+* `name($name)` * `param` $name
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Exec
+
+
+Executes command inside running Docker container
+
+```php
+taskDockerRun('test_env')
+ ->detached()
+ ->run();
+
+$this->taskDockerExec($test)
+ ->interactive()
+ ->exec('./runtests')
+ ->run();
+
+// alternatively use commands from other tasks
+
+$this->taskDockerExec($test)
+ ->interactive()
+ ->exec($this->taskCodecept()->suite('acceptance'))
+ ->run();
+?>
+```
+
+
+* `detached()` * `return` $this
+* `interactive()` * `return` $this
+* `exec($command)` * `param string|\Robo\Contract\CommandInterface` $command
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Pull
+
+
+Pulls an image from DockerHub
+
+```php
+taskDockerPull('wordpress')
+ ->run();
+
+?>
+```
+
+
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Remove
+
+
+Remove docker container
+
+```php
+taskDockerRemove($container)
+ ->run();
+?>
+```
+
+
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+
+## Run
+
+
+Performs `docker run` on a container.
+
+```php
+taskDockerRun('mysql')->run();
+
+$result = $this->taskDockerRun('my_db_image')
+ ->env('DB', 'database_name')
+ ->volume('/path/to/data', '/data')
+ ->detached()
+ ->publish(3306)
+ ->name('my_mysql')
+ ->run();
+
+// retrieve container's cid:
+$this->say("Running container ".$result->getCid());
+
+// execute script inside container
+$result = $this->taskDockerRun('db')
+ ->exec('prepare_test_data.sh')
+ ->run();
+
+$this->taskDockerCommit($result)
+ ->name('test_db')
+ ->run();
+
+// link containers
+$mysql = $this->taskDockerRun('mysql')
+ ->name('wp_db') // important to set name for linked container
+ ->env('MYSQL_ROOT_PASSWORD', '123456')
+ ->run();
+
+$this->taskDockerRun('wordpress')
+ ->link($mysql)
+ ->publish(80, 8080)
+ ->detached()
+ ->run();
+
+?>
+```
+
+
+* `detached()` * `return` $this
+* `interactive()` * `return` $this
+* `exec($run)` * `param string|\Robo\Contract\CommandInterface` $run
+* `volume($from, $to = null)` * `param string` $from
+* `env($variable, $value = null)` * `param string` $variable
+* `publish($port = null, $portTo = null)` * `param null|int` $port
+* `containerWorkdir($dir)` * `param string` $dir
+* `user($user)` * `param string` $user
+* `privileged()` * `return` $this
+* `name($name)` * `param string` $name
+* `link($name, $alias)` * `param string|\Robo\Task\Docker\Result` $name
+* `tmpDir($dir)` * `param string` $dir
+* `getTmpDir()` @return string
+* `getUniqId()` @return string
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Start
+
+
+Starts Docker container
+
+```php
+taskDockerStart($cidOrResult)
+ ->run();
+?>
+```
+
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Stop
+
+
+Stops Docker container
+
+```php
+taskDockerStop($cidOrResult)
+ ->run();
+?>
+```
+
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/File.md b/src/composer/vendor/consolidation/robo/docs/tasks/File.md
new file mode 100644
index 00000000..7cb86a3a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/File.md
@@ -0,0 +1,129 @@
+# File Tasks
+## Concat
+
+
+Merges files into one. Used for preparing assets.
+
+``` php
+taskConcat([
+ 'web/assets/screen.css',
+ 'web/assets/print.css',
+ 'web/assets/theme.css'
+ ])
+ ->to('web/assets/style.css')
+ ->run()
+?>
+```
+
+* `to($dst)` set the destination file
+
+## Replace
+
+
+Performs search and replace inside a files.
+
+``` php
+taskReplaceInFile('VERSION')
+ ->from('0.2.0')
+ ->to('0.3.0')
+ ->run();
+
+$this->taskReplaceInFile('README.md')
+ ->from(date('Y')-1)
+ ->to(date('Y'))
+ ->run();
+
+$this->taskReplaceInFile('config.yml')
+ ->regex('~^service:~')
+ ->to('services:')
+ ->run();
+
+$this->taskReplaceInFile('box/robo.txt')
+ ->from(array('##dbname##', '##dbhost##'))
+ ->to(array('robo', 'localhost'))
+ ->run();
+?>
+```
+
+* `regex(string)` regex to match string to be replaced
+* `from(string|array)` string(s) to be replaced
+* `to(string|array)` value(s) to be set as a replacement
+
+* `filename($filename)` * `param string` $filename
+* `from($from)` * `param string` $from
+* `to($to)` * `param string` $to
+* `regex($regex)` * `param string` $regex
+
+## TmpFile
+
+
+Create a temporary file that is automatically cleaned up
+once the task collection is is part of completes. When created,
+it is given a random filename.
+
+This temporary file may be manipulated exacatly like taskWrite().
+It is deleted as soon as the collection it is a part of completes
+or rolls back.
+
+``` php
+collectionBuilder();
+$tmpFilePath = $collection->taskTmpFile()
+ ->line('-----')
+ ->line(date('Y-m-d').' '.$title)
+ ->line('----')
+ ->getPath();
+$collection->run();
+?>
+```
+
+* `complete()` Delete this file when our collection completes.
+* `filename($filename)` * `param string` $filename
+* `append($append = null)` * `param bool` $append
+* `line($line)` add a line.
+* `lines(array $lines)` add more lines.
+* `text($text)` add a text.
+* `textFromFile($filename)` add a text from a file.
+* `place($name, $val)` substitute a placeholder with value, placeholder must be enclosed by `{}`.
+* `replace($string, $replacement)` replace any string with value.
+* `regexReplace($pattern, $replacement)` replace any string with value using regular expression.
+* `appendIfMatches($pattern, $text)` Append the provided text to the end of the buffer if the provided
+* `appendUnlessMatches($pattern, $text)` Append the provided text to the end of the buffer unless the provided
+* `originalContents()` @return string
+* `wouldChange()` @return bool
+* `getPath()` @return string
+
+## Write
+
+
+Writes to file.
+
+``` php
+taskWriteToFile('blogpost.md')
+ ->line('-----')
+ ->line(date('Y-m-d').' '.$title)
+ ->line('----')
+ ->run();
+?>
+```
+
+* `append()`
+
+* `filename($filename)` * `param string` $filename
+* `append($append = null)` * `param bool` $append
+* `line($line)` add a line.
+* `lines(array $lines)` add more lines.
+* `text($text)` add a text.
+* `textFromFile($filename)` add a text from a file.
+* `place($name, $val)` substitute a placeholder with value, placeholder must be enclosed by `{}`.
+* `replace($string, $replacement)` replace any string with value.
+* `regexReplace($pattern, $replacement)` replace any string with value using regular expression.
+* `appendIfMatches($pattern, $text)` Append the provided text to the end of the buffer if the provided
+* `appendUnlessMatches($pattern, $text)` Append the provided text to the end of the buffer unless the provided
+* `originalContents()` @return string
+* `wouldChange()` @return bool
+* `getPath()` @return string
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Filesystem.md b/src/composer/vendor/consolidation/robo/docs/tasks/Filesystem.md
new file mode 100644
index 00000000..20bc0170
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Filesystem.md
@@ -0,0 +1,217 @@
+# Filesystem Tasks
+
+## CleanDir
+
+
+Deletes all files from specified dir, ignoring git files.
+
+``` php
+taskCleanDir(['tmp','logs'])->run();
+// as shortcut
+$this->_cleanDir('app/cache');
+?>
+```
+
+
+
+## CopyDir
+
+
+Copies one dir into another
+
+``` php
+taskCopyDir(['dist/config' => 'config'])->run();
+// as shortcut
+$this->_copyDir('dist/config', 'config');
+?>
+```
+
+* `dirPermissions($value)` Sets the default folder permissions for the destination if it doesn't exist
+* `exclude($exclude = null)` List files to exclude.
+
+## DeleteDir
+
+
+Deletes dir
+
+``` php
+taskDeleteDir('tmp')->run();
+// as shortcut
+$this->_deleteDir(['tmp', 'log']);
+?>
+```
+
+
+
+## FilesystemStack
+
+
+Wrapper for [Symfony Filesystem](http://symfony.com/doc/current/components/filesystem.html) Component.
+Comands are executed in stack and can be stopped on first fail with `stopOnFail` option.
+
+``` php
+taskFilesystemStack()
+ ->mkdir('logs')
+ ->touch('logs/.gitignore')
+ ->chgrp('www', 'www-data')
+ ->symlink('/var/log/nginx/error.log', 'logs/error.log')
+ ->run();
+
+// one line
+$this->_touch('.gitignore');
+$this->_mkdir('logs');
+
+?>
+```
+
+* `$this mkdir($dir)`
+* `$this touch($file)`
+* `$this copy($from, $to, $force = null)`
+* `$this chmod($file, $permissions, $umask = null, $recursive = null)`
+* `$this chgrp($file, $group, $recursive = null)`
+* `$this chown($file, $user, $recursive = null)`
+* `$this remove($file)`
+* `$this rename($from, $to)`
+* `$this symlink($from, $to)`
+* `$this mirror($from, $to)`
+
+* `stopOnFail($stop = null)` * `param bool` $stop
+
+## FlattenDir
+
+
+Searches for files in a nested directory structure and copies them to
+a target directory with or without the parent directories. The task was
+inspired by [gulp-flatten](https://www.npmjs.com/package/gulp-flatten).
+
+Example directory structure:
+
+```
+└── assets
+ ├── asset-library1
+ │ ├── README.md
+ │ └── asset-library1.min.js
+ └── asset-library2
+ ├── README.md
+ └── asset-library2.min.js
+```
+
+The following code will search the `*.min.js` files and copy them
+inside a new `dist` folder:
+
+``` php
+taskFlattenDir(['assets/*.min.js' => 'dist'])->run();
+// or use shortcut
+$this->_flattenDir('assets/*.min.js', 'dist');
+?>
+```
+
+You can also define the target directory with an additional method, instead of
+key/value pairs. More similar to the gulp-flatten syntax:
+
+``` php
+taskFlattenDir(['assets/*.min.js'])
+ ->to('dist')
+ ->run();
+?>
+```
+
+You can also append parts of the parent directories to the target path. If you give
+the value `1` to the `includeParents()` method, then the top parent will be appended
+to the target directory resulting in a path such as `dist/assets/asset-library1.min.js`.
+
+If you give a negative number, such as `-1` (the same as specifying `array(0, 1)` then
+the bottom parent will be appended, resulting in a path such as
+`dist/asset-library1/asset-library1.min.js`.
+
+The top parent directory will always be starting from the relative path to the current
+directory. You can override that with the `parentDir()` method. If in the above example
+you would specify `assets`, then the top parent directory would be `asset-library1`.
+
+``` php
+taskFlattenDir(['assets/*.min.js' => 'dist'])
+ ->parentDir('assets')
+ ->includeParents(1)
+ ->run();
+?>
+```
+
+* `dirPermissions($permission)` Sets the default folder permissions for the destination if it does not exist.
+* `includeParents($parents)` Sets the value from which direction and how much parent dirs should be included.
+* `parentDir($dir)` Sets the parent directory from which the relative parent directories will be calculated.
+* `to($target)` Sets the target directory where the files will be copied to.
+
+## MirrorDir
+
+
+Mirrors a directory to another
+
+``` php
+taskMirrorDir(['dist/config/' => 'config/'])->run();
+// or use shortcut
+$this->_mirrorDir('dist/config/', 'config/');
+
+?>
+```
+
+
+
+## TmpDir
+
+
+Create a temporary directory that is automatically cleaned up
+once the task collection is is part of completes.
+
+Use WorkDir if you do not want the directory to be deleted.
+
+``` php
+run().
+$collection = $this->collectionBuilder();
+$tmpPath = $collection->tmpDir()->getPath();
+$collection->taskFilesystemStack()
+ ->mkdir("$tmpPath/log")
+ ->touch("$tmpPath/log/error.txt");
+$collection->run();
+// as shortcut (deleted when program exits)
+$tmpPath = $this->_tmpDir();
+?>
+```
+
+* `cwd($shouldChangeWorkingDirectory = null)` Flag that we should cwd to the temporary directory when it is
+* `complete()` Delete this directory when our collection completes.
+* `getPath()` Get a reference to the path to the temporary directory, so that
+
+## WorkDir
+
+
+Create a temporary working directory that is automatically renamed to its
+final desired location if all of the tasks in the collection succeed. If
+there is a rollback, then the working directory is deleted.
+
+``` php
+collectionBuilder();
+$workingPath = $collection->workDir("build")->getPath();
+$collection->taskFilesystemStack()
+ ->mkdir("$workingPath/log")
+ ->touch("$workingPath/log/error.txt");
+$collection->run();
+?>
+```
+
+* `complete()` Move our working directory into its final destination once the
+* `rollback()` Delete our working directory
+* `getPath()` Get a reference to the path to the temporary directory, so that
+* `cwd($shouldChangeWorkingDirectory = null)` Flag that we should cwd to the temporary directory when it is
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Gulp.md b/src/composer/vendor/consolidation/robo/docs/tasks/Gulp.md
new file mode 100644
index 00000000..fd387cc4
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Gulp.md
@@ -0,0 +1,31 @@
+# Gulp Tasks
+
+## Run
+
+
+Gulp Run
+
+``` php
+taskGulpRun()->run();
+
+// run task 'clean' with --silent option
+$this->taskGulpRun('clean')
+ ->silent()
+ ->run();
+?>
+```
+
+* `silent()` adds `silent` option to gulp
+* `noColor()` adds `--no-color` option to gulp
+* `color()` adds `--color` option to gulp
+* `simple()` adds `--tasks-simple` option to gulp
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Npm.md b/src/composer/vendor/consolidation/robo/docs/tasks/Npm.md
new file mode 100644
index 00000000..2a60f2af
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Npm.md
@@ -0,0 +1,54 @@
+# Npm Tasks
+
+## Install
+
+
+Npm Install
+
+``` php
+taskNpmInstall()->run();
+
+// prefer dist with custom path
+$this->taskNpmInstall('path/to/my/npm')
+ ->noDev()
+ ->run();
+?>
+```
+
+* `noDev()` adds `production` option to npm
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Update
+
+
+Npm Update
+
+```php
+taskNpmUpdate()->run();
+
+// prefer dist with custom path
+$this->taskNpmUpdate('path/to/my/npm')
+ ->noDev()
+ ->run();
+?>
+```
+
+* `noDev()` adds `production` option to npm
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Remote.md b/src/composer/vendor/consolidation/robo/docs/tasks/Remote.md
new file mode 100644
index 00000000..7121b7c8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Remote.md
@@ -0,0 +1,143 @@
+# Remote Tasks
+## Rsync
+
+
+Executes rsync in a flexible manner.
+
+``` php
+$this->taskRsync()
+ ->fromPath('src/')
+ ->toHost('localhost')
+ ->toUser('dev')
+ ->toPath('/var/www/html/app/')
+ ->remoteShell('ssh -i public_key')
+ ->recursive()
+ ->excludeVcs()
+ ->checksum()
+ ->wholeFile()
+ ->verbose()
+ ->progress()
+ ->humanReadable()
+ ->stats()
+ ->run();
+```
+
+You could also clone the task and do a dry-run first:
+
+``` php
+$rsync = $this->taskRsync()
+ ->fromPath('src/')
+ ->toPath('example.com:/var/www/html/app/')
+ ->archive()
+ ->excludeVcs()
+ ->progress()
+ ->stats();
+
+$dryRun = clone $rsync;
+$dryRun->dryRun()->run();
+if ('y' === $this->ask('Do you want to run (y/n)')) {
+ $rsync->run();
+}
+```
+
+* ` fromUser(string $user)`
+* ` fromHost(string $hostname)`
+* ` toUser(string $user)`
+* ` toHost(string $hostname)`
+
+* `fromPath($path)` This can either be a full rsync path spec (user@host:path) or just a path.
+* `toPath($path)` This can either be a full rsync path spec (user@host:path) or just a path.
+* `fromUser($fromUser)` * `param string` $fromUser
+* `fromHost($fromHost)` * `param string` $fromHost
+* `toUser($toUser)` * `param string` $toUser
+* `toHost($toHost)` * `param string` $toHost
+* `progress()` * `return` $this
+* `stats()` * `return` $this
+* `recursive()` * `return` $this
+* `verbose()` * `return` $this
+* `checksum()` * `return` $this
+* `archive()` * `return` $this
+* `compress()` * `return` $this
+* `owner()` * `return` $this
+* `group()` * `return` $this
+* `times()` * `return` $this
+* `delete()` * `return` $this
+* `timeout($seconds)` * `param int` $seconds
+* `humanReadable()` * `return` $this
+* `wholeFile()` * `return` $this
+* `dryRun()` * `return` $this
+* `itemizeChanges()` * `return` $this
+* `excludeVcs()` Excludes .git, .svn and .hg items at any depth.
+* `exclude($pattern)` * `param array|string` $pattern
+* `excludeFrom($file)` * `param string` $file
+* `includeFilter($pattern)` * `param array|string` $pattern
+* `filter($pattern)` * `param array|string` $pattern
+* `filesFrom($file)` * `param string` $file
+* `remoteShell($command)` * `param string` $command
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Ssh
+
+
+Runs multiple commands on a remote server.
+Per default, commands are combined with &&, unless stopOnFail is false.
+
+```php
+taskSshExec('remote.example.com', 'user')
+ ->remoteDir('/var/www/html')
+ ->exec('ls -la')
+ ->exec('chmod g+x logs')
+ ->run();
+
+```
+
+You can even exec other tasks (which implement CommandInterface):
+
+```php
+$gitTask = $this->taskGitStack()
+ ->checkout('master')
+ ->pull();
+
+$this->taskSshExec('remote.example.com')
+ ->remoteDir('/var/www/html/site')
+ ->exec($gitTask)
+ ->run();
+```
+
+You can configure the remote directory for all future calls:
+
+```php
+::configure('remoteDir', '/some-dir');
+```
+
+* `$this stopOnFail(bool $stopOnFail)` Whether or not to chain commands together with &&
+ and stop the chain if one command fails
+* `$this remoteDir(string $remoteWorkingDirectory)` Changes to the given directory before running commands
+
+* `hostname($hostname)` * `param string` $hostname
+* `user($user)` * `param string` $user
+* `stopOnFail($stopOnFail = null)` * `param bool` $stopOnFail
+* `remoteDir($remoteDir)` * `param string` $remoteDir
+* `identityFile($filename)` * `param string` $filename
+* `port($port)` * `param int` $port
+* `forcePseudoTty()` * `return` $this
+* `quiet()` * `return` $this
+* `verbose()` * `return` $this
+* `exec($command)` * `param string|string[]|CommandInterface` $command
+* `simulate($context)` {@inheritdoc}
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Testing.md b/src/composer/vendor/consolidation/robo/docs/tasks/Testing.md
new file mode 100644
index 00000000..c9fd5196
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Testing.md
@@ -0,0 +1,171 @@
+# Testing Tasks
+## Atoum
+
+
+Runs [atoum](http://atoum.org/) tests
+
+``` php
+taskAtoum()
+ ->files('path/to/test.php')
+ ->configFile('config/dev.php')
+ ->run()
+
+?>
+```
+
+* `tags($tags)` Tag or Tags to filter.
+* `lightReport()` Display result using the light reporter.
+* `tap()` Display result using the tap reporter.
+* `bootstrap($file)` Path to the bootstrap file.
+* `configFile($file)` Path to the config file.
+* `debug()` Use atoum's debug mode.
+* `files($files)` Test file or test files to run.
+* `directories($directories)` Test directory or directories to run.
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Behat
+
+
+Executes Behat tests
+
+``` php
+taskBehat()
+ ->format('pretty')
+ ->noInteraction()
+ ->run();
+?>
+```
+
+
+* `stopOnFail()` * `return` $this
+* `noInteraction()` * `return` $this
+* `config($config_file)` * `param` $config_file
+* `colors()` * `return` $this
+* `noColors()` * `return` $this
+* `suite($suite)` * `param string` $suite
+* `verbose($level = null)` * `param string` $level
+* `format($formater)` * `param string` $formater
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Codecept
+
+
+Executes Codeception tests
+
+``` php
+taskCodecept()
+ ->suite('acceptance')
+ ->env('chrome')
+ ->group('admin')
+ ->xml()
+ ->html()
+ ->run();
+
+?>
+```
+
+
+* `suite($suite)` * `param string` $suite
+* `test($testName)` * `param string` $testName
+* `group($group)` set group option. Can be called multiple times
+* `excludeGroup($group)` * `param string` $group
+* `json($file = null)` generate json report
+* `xml($file = null)` generate xml JUnit report
+* `html($dir = null)` Generate html report
+* `tap($file = null)` generate tap report
+* `configFile($file)` provides config file other then default `codeception.yml` with `-c` option
+* `coverage($cov = null)` collect codecoverage in raw format. You may pass name of cov file to save results
+* `silent()` execute in silent mode
+* `coverageXml($xml = null)` collect code coverage in xml format. You may pass name of xml file to save results
+* `coverageHtml($html = null)` collect code coverage and generate html report. You may pass
+* `env($env)` * `param string` $env
+* `debug()` * `return` $this
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## PHPUnit
+
+
+Runs PHPUnit tests
+
+``` php
+taskPHPUnit()
+ ->group('core')
+ ->bootstrap('test/bootstrap.php')
+ ->run()
+
+?>
+```
+
+* `filter($filter)` * `param string` $filter
+* `group($group)` * `param string` $group
+* `excludeGroup($group)` * `param string` $group
+* `json($file = null)` adds `log-json` option to runner
+* `xml($file = null)` adds `log-junit` option
+* `tap($file = null)` * `param string` $file
+* `bootstrap($file)` * `param string` $file
+* `configFile($file)` * `param string` $file
+* `debug()` * `return` $this
+* `files($files)` Directory of test files or single test file to run.
+* `file($file)` Test the provided file.
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
+## Phpspec
+
+
+Executes Phpspec tests
+
+``` php
+taskPhpspec()
+ ->format('pretty')
+ ->noInteraction()
+ ->run();
+?>
+```
+
+
+* `stopOnFail()`
+* `noCodeGeneration()`
+* `quiet()`
+* `verbose($level = null)`
+* `noAnsi()`
+* `noInteraction()`
+* `config($config_file)`
+* `format($formater)`
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+* `arg($arg)` Pass argument to executable. Its value will be automatically escaped.
+* `args($args)` Pass methods parameters as arguments to executable. Argument values
+* `rawArg($arg)` Pass the provided string in its raw (as provided) form as an argument to executable.
+* `option($option, $value = null)` Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+* `optionList($option, $value = null)` Pass multiple options to executable. Value can be a string or array.
+
diff --git a/src/composer/vendor/consolidation/robo/docs/tasks/Vcs.md b/src/composer/vendor/consolidation/robo/docs/tasks/Vcs.md
new file mode 100644
index 00000000..69465c0d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/docs/tasks/Vcs.md
@@ -0,0 +1,108 @@
+# Vcs Tasks
+## GitStack
+
+
+Runs Git commands in stack. You can use `stopOnFail()` to point that stack should be terminated on first fail.
+
+``` php
+taskGitStack()
+ ->stopOnFail()
+ ->add('-A')
+ ->commit('adding everything')
+ ->push('origin','master')
+ ->tag('0.6.0')
+ ->push('origin','0.6.0')
+ ->run()
+
+$this->taskGitStack()
+ ->stopOnFail()
+ ->add('doc/*')
+ ->commit('doc updated')
+ ->push()
+ ->run();
+?>
+```
+
+* `cloneRepo($repo, $to = null)` Executes `git clone`
+* `add($pattern)` Executes `git add` command with files to add pattern
+* `commit($message, $options = null)` Executes `git commit` command with a message
+* `pull($origin = null, $branch = null)` Executes `git pull` command.
+* `push($origin = null, $branch = null)` Executes `git push` command
+* `merge($branch)` Performs git merge
+* `checkout($branch)` Executes `git checkout` command
+* `tag($tag_name, $message = null)` Executes `git tag` command
+* `executable($executable)` * `param string` $executable
+* `exec($command)` * `param string|string[]` $command
+* `stopOnFail($stopOnFail = null)` * `param bool` $stopOnFail
+* `result($result)`
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+
+## HgStack
+
+
+Runs hg commands in stack. You can use `stopOnFail()` to point that stack should be terminated on first fail.
+
+``` php
+hgStack
+ ->cloneRepo('https://bitbucket.org/durin42/hgsubversion')
+ ->pull()
+ ->add()
+ ->commit('changed')
+ ->push()
+ ->tag('0.6.0')
+ ->push('0.6.0')
+ ->run();
+?>
+```
+
+* `cloneRepo($repo, $to = null)` Executes `hg clone`
+* `add($include = null, $exclude = null)` Executes `hg add` command with files to add by pattern
+* `commit($message, $options = null)` Executes `hg commit` command with a message
+* `pull($branch = null)` Executes `hg pull` command.
+* `push($branch = null)` Executes `hg push` command
+* `merge($revision = null)` Performs hg merge
+* `tag($tag_name, $message = null)` Executes `hg tag` command
+* `executable($executable)` * `param string` $executable
+* `exec($command)` * `param string|string[]` $command
+* `stopOnFail($stopOnFail = null)` * `param bool` $stopOnFail
+* `result($result)`
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+
+## SvnStack
+
+
+Runs Svn commands in stack. You can use `stopOnFail()` to point that stack should be terminated on first fail.
+
+``` php
+taskSvnStack()
+ ->checkout('http://svn.collab.net/repos/svn/trunk')
+ ->run()
+
+// alternatively
+$this->_svnCheckout('http://svn.collab.net/repos/svn/trunk');
+
+$this->taskSvnStack('username', 'password')
+ ->stopOnFail()
+ ->update()
+ ->add('doc/*')
+ ->commit('doc updated')
+ ->run();
+?>
+```
+
+* `update($path = null)` Updates `svn update` command
+* `add($pattern = null)` Executes `svn add` command with files to add pattern
+* `commit($message, $options = null)` Executes `svn commit` command with a message
+* `checkout($branch)` Executes `svn checkout` command
+* `executable($executable)` * `param string` $executable
+* `exec($command)` * `param string|string[]` $command
+* `stopOnFail($stopOnFail = null)` * `param bool` $stopOnFail
+* `result($result)`
+* `dir($dir)` Changes working directory of command
+* `printed($arg)` Should command output be printed
+
diff --git a/src/composer/vendor/consolidation/robo/examples/RoboFile.php b/src/composer/vendor/consolidation/robo/examples/RoboFile.php
new file mode 100644
index 00000000..8e057f6f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/examples/RoboFile.php
@@ -0,0 +1,425 @@
+taskWatch()->monitor(['composer.json', 'composer.lock'], function () {
+ $this->taskComposerUpdate()->run();
+ })->run();
+ }
+
+ /**
+ * Demonstrates Robo input APIs.
+ */
+ public function tryInput()
+ {
+ $answer = $this->ask('how are you?');
+ $this->say('You are '.$answer);
+ $yes = $this->confirm('Do you want one more question?');
+ if (!$yes) {
+ return Result::cancelled();
+ }
+ $lang = $this->askDefault('what is your favorite scripting language?', 'PHP');
+ $this->say($lang);
+ $pin = $this->askHidden('Ok, now tell your PIN code (it is hidden)');
+ $this->yell('Ha-ha, your pin code is: '.$pin);
+ $this->say('Bye!');
+ }
+
+ /**
+ * Demonstrates parallel execution.
+ *
+ * @option $printed Print the output of each process.
+ * @option $error Include an extra process that fails.
+ */
+ public function tryPara($options = ['printed' => false, 'error' => false])
+ {
+ $dir = __DIR__;
+ $para = $this->taskParallelExec()
+ ->printed($options['printed'])
+ ->process("php $dir/tests/_data/parascript.php hey 4")
+ ->process("php $dir/tests/_data/parascript.php hoy 3")
+ ->process("php $dir/tests/_data/parascript.php gou 2")
+ ->process("php $dir/tests/_data/parascript.php die 1");
+ if ($options['error']) {
+ $para->process("ls $dir/tests/_data/filenotfound");
+ }
+ return $para->run();
+ }
+
+ /**
+ * Demonstrates Robo argument passing.
+ *
+ * @param string $a The first parameter. Required.
+ * @param string $b The second parameter. Optional.
+ */
+ public function tryArgs($a, $b = 'default')
+ {
+ $this->say("The parameter a is $a and b is $b");
+ }
+
+ /**
+ * Demonstrate Robo variable argument passing.
+ *
+ * @param $a A list of commandline parameters.
+ */
+ public function tryArrayArgs(array $a)
+ {
+ $this->say("The parameters passed are:\n" . var_export($a, true));
+ }
+
+ /**
+ * Demonstrate Robo boolean options.
+ *
+ * @param $opts The options.
+ * @option boolean $silent Supress output.
+ */
+ public function tryOptbool($opts = ['silent|s' => false])
+ {
+ if (!$opts['silent']) {
+ $this->say("Hello, world");
+ }
+ }
+
+ /**
+ * Demonstrate the use of the PHP built-in webserver.
+ */
+ public function tryServer()
+ {
+ return $this->taskServer(8000)
+ ->dir('site')
+ ->arg('site/index.php')
+ ->run();
+ }
+
+ /**
+ * Demonstrate the use of the Robo open-browser task.
+ */
+ public function tryOpenBrowser()
+ {
+ return $this->taskOpenBrowser([
+ 'http://robo.li',
+ 'https://github.com/consolidation-org/Robo'
+ ])->run();
+ }
+
+ /**
+ * Demonstrate Robo error output and command failure.
+ */
+ public function tryError()
+ {
+ return $this->taskExec('ls xyzzy' . date('U'))->dir('/tmp')->run();
+ }
+
+ /**
+ * Demonstrate Robo standard output and command success.
+ */
+ public function trySuccess()
+ {
+ return $this->_exec('pwd');
+ }
+
+ /**
+ * @field-labels
+ * name: Name
+ * species: Species
+ * legs: Legs
+ * food: Favorite Food
+ * id: Id
+ * @return PropertyList
+ */
+ public function tryInfo()
+ {
+ $outputData = [
+ 'name' => 'fluffy',
+ 'species' => 'cat',
+ 'legs' => 4,
+ 'food' => 'salmon',
+ 'id' => 389245032,
+ ];
+
+ $data = new PropertyList($outputData);
+
+ // Add a render function to transform cell data when the output
+ // format is a table, or similar. This allows us to add color
+ // information to the output without modifying the data cells when
+ // using yaml or json output formats.
+ $data->addRendererFunction(
+ // n.b. There is a fourth parameter $rowData that may be added here.
+ function ($key, $cellData, FormatterOptions $options) {
+ if ($key == 'name') {
+ return "$cellData>";
+ }
+ return $cellData;
+ }
+ );
+
+ return $data;
+ }
+
+ /**
+ * Demonstrate Robo formatters. Default format is 'table'.
+ *
+ * @field-labels
+ * first: I
+ * second: II
+ * third: III
+ * @default-string-field second
+ * @usage try:formatters --format=yaml
+ * @usage try:formatters --format=csv
+ * @usage try:formatters --fields=first,third
+ * @usage try:formatters --fields=III,II
+ * @aliases tf
+ *
+ * @return \Consolidation\OutputFormatters\StructuredData\RowsOfFields
+ */
+ public function tryFormatters($somthing = 'default', $options = ['format' => 'table', 'fields' => ''])
+ {
+ $outputData = [
+ 'en' => [ 'first' => 'One', 'second' => 'Two', 'third' => 'Three' ],
+ 'de' => [ 'first' => 'Eins', 'second' => 'Zwei', 'third' => 'Drei' ],
+ 'jp' => [ 'first' => 'Ichi', 'second' => 'Ni', 'third' => 'San' ],
+ 'es' => [ 'first' => 'Uno', 'second' => 'Dos', 'third' => 'Tres' ],
+ ];
+ return new RowsOfFields($outputData);
+ }
+
+ /**
+ * Demonstrate an alter hook with an option
+ *
+ * @hook alter try:formatters
+ * @option $french Add a row with French numbers.
+ * @usage try:formatters --french
+ */
+ public function alterFormatters($result, CommandData $commandData)
+ {
+ if ($commandData->input()->getOption('french')) {
+ $result['fr'] = [ 'first' => 'Un', 'second' => 'Deux', 'third' => 'Trois' ];
+ }
+
+ return $result;
+ }
+
+ /**
+ * Demonstrate what happens when a command or a task
+ * throws an exception. Note that typically, Robo commands
+ * should return Result objects rather than throw exceptions.
+ */
+ public function tryException($options = ['task' => false])
+ {
+ if (!$options['task']) {
+ throw new RuntimeException('Command failed with an exception.');
+ }
+ return new ExceptionTask('Task failed with an exception.');
+ }
+
+ /**
+ * Demonstrate deprecated task behavior.
+ *
+ * Demonstrate what happens when using a task that is created via
+ * direct instantiation, which omits initialization done by the
+ * container. Emits a warning message.
+ */
+ public function tryDeprecated()
+ {
+ // Calling 'new' directly without manually setting
+ // up dependencies will result in a deprecation warning.
+ // @see RoboFile::trySuccess()
+ return (new \Robo\Task\Base\Exec('pwd'))->run();
+ }
+
+ /**
+ * Demonstrate the use of a collection builder to chain multiple tasks
+ * together into a collection, which is executed once constructed.
+ *
+ * For demonstration purposes only; this could, of course, be done
+ * with a single FilesystemStack.
+ */
+ public function tryBuilder()
+ {
+ return $this->collectionBuilder()
+ ->taskFilesystemStack()
+ ->mkdir('a')
+ ->touch('a/a.txt')
+ ->taskFilesystemStack()
+ ->mkdir('a/b')
+ ->touch('a/b/b.txt')
+ ->taskFilesystemStack()
+ ->mkdir('a/b/c')
+ ->touch('a/b/c/c.txt')
+ ->run();
+ }
+
+ public function tryBuilderRollback()
+ {
+ // This example will create two builders, and add
+ // the first one as a child of the second in order
+ // to demonstrate nested rollbacks.
+ $collection = $this->collectionBuilder()
+ ->taskFilesystemStack()
+ ->mkdir('g')
+ ->touch('g/g.txt')
+ ->rollback(
+ $this->taskDeleteDir('g')
+ )
+ ->taskFilesystemStack()
+ ->mkdir('g/h')
+ ->touch('g/h/h.txt')
+ ->taskFilesystemStack()
+ ->mkdir('g/h/i/c')
+ ->touch('g/h/i/i.txt');
+
+ return $this->collectionBuilder()
+ ->progressMessage('Start recursive collection')
+ ->addTask($collection)
+ ->progressMessage('Done with recursive collection')
+ ->taskExec('ls xyzzy' . date('U'))
+ ->dir('/tmp')
+ ->run();
+ }
+
+ public function tryWorkdir()
+ {
+ // This example works like tryBuilderRollback,
+ // but does equivalent operations using a working
+ // directory. The working directory is deleted on rollback
+ $collection = $this->collectionBuilder();
+
+ $workdir = $collection->workDir('w');
+
+ $collection
+ ->taskFilesystemStack()
+ ->touch("$workdir/g.txt")
+ ->taskFilesystemStack()
+ ->mkdir("$workdir/h")
+ ->touch("$workdir/h/h.txt")
+ ->taskFilesystemStack()
+ ->mkdir("$workdir/h/i/c")
+ ->touch("$workdir/h/i/i.txt");
+
+ return $this->collectionBuilder()
+ ->progressMessage('Start recursive collection')
+ ->addTask($collection)
+ ->progressMessage('Done with recursive collection')
+ ->taskExec('ls xyzzy' . date('U'))
+ ->dir('/tmp')
+ ->run();
+ }
+
+ /**
+ * Demonstrates Robo temporary directory usage.
+ */
+ public function tryTmpDir()
+ {
+ // Set up a collection to add tasks to
+ $collection = $this->collectionBuilder();
+
+ // Get a temporary directory to work in. Note that we get a path
+ // back, but the directory is not created until the task runs.
+ $tmpPath = $collection->tmpDir();
+
+ $result = $collection
+ ->taskWriteToFile("$tmpPath/file.txt")
+ ->line('Example file')
+ ->run();
+
+ if (is_dir($tmpPath)) {
+ $this->say("The temporary directory at $tmpPath was not cleaned up after the collection completed.");
+ } else {
+ $this->say("The temporary directory at $tmpPath was automatically deleted.");
+ }
+
+ return $result;
+ }
+
+ /**
+ * Description
+ * @param $options
+ * @option delay Miliseconds delay
+ * @return type
+ */
+ public function tryProgress($options = ['delay' => 500])
+ {
+ $delay = $options['delay'];
+ $delayUntilProgressStart = \Robo\Robo::config()->get(\Robo\Config::PROGRESS_BAR_AUTO_DISPLAY_INTERVAL);
+ $this->say("Progress bar will display after $delayUntilProgressStart seconds of activity.");
+
+ $processList = range(1, 10);
+ return $this->collectionBuilder()
+ ->taskForEach($processList)
+ ->iterationMessage('Processing {value}')
+ ->call(
+ function ($value) use($delay) {
+ // TaskForEach::call should only be used to do
+ // non-Robo operations. To use Robo tasks in an
+ // iterator, @see TaskForEach::withBuilder.
+ usleep($delay * 1000); // delay units: msec, usleep units: usec
+ }
+ )
+ ->run();
+ }
+
+ public function tryIter()
+ {
+ $workdir = 'build/iter-example';
+ $this->say("Creating sample direcories in $workdir.");
+
+ $processList = ['cats', 'dogs', 'sheep', 'fish', 'horses', 'cows'];
+ return $this->collectionBuilder()
+ ->taskFilesystemStack()
+ ->mkdir($workdir)
+ ->taskCleanDir($workdir)
+ ->taskForEach($processList)
+ ->withBuilder(
+ function ($builder, $key, $value) use ($workdir) {
+ return $builder
+ ->taskFilesystemStack()
+ ->mkdir("$workdir/$value");
+ }
+ )
+ ->run();
+ }
+}
+
+class ExceptionTask extends \Robo\Task\BaseTask
+{
+ protected $message;
+
+ public function __construct($message)
+ {
+ $this->message = $message;
+ }
+
+ public function run()
+ {
+ throw new RuntimeException($this->message);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/examples/robo.script b/src/composer/vendor/consolidation/robo/examples/robo.script
new file mode 100755
index 00000000..bfec26a9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/examples/robo.script
@@ -0,0 +1,44 @@
+#!/usr/bin/env robo
+say("This is a Robo script, $name");
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/robo b/src/composer/vendor/consolidation/robo/robo
new file mode 100755
index 00000000..ce4d9dfa
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/robo
@@ -0,0 +1,21 @@
+#!/usr/bin/env php
+execute($_SERVER['argv']);
+exit($statusCode);
diff --git a/src/composer/vendor/consolidation/robo/scripts/composer/ScriptHandler.php b/src/composer/vendor/consolidation/robo/scripts/composer/ScriptHandler.php
new file mode 100644
index 00000000..ddf1111f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/scripts/composer/ScriptHandler.php
@@ -0,0 +1,58 @@
+exists('composer.lock')) {
+ return;
+ }
+
+ $composerLockContents = file_get_contents('composer.lock');
+ if (preg_match('#"php":.*(5\.6)#', $composerLockContents)) {
+ static::fixDependenciesFor55();
+ }
+ }
+
+ protected static function fixDependenciesFor55()
+ {
+ $fs = new Filesystem();
+ $status = 0;
+
+ $fs->remove('composer.lock');
+
+ // Composer has already read our composer.json file, so we will
+ // need to run in a new process to fix things up.
+ passthru('composer install --ansi', $status);
+
+ // Don't continue with the initial 'composer install' command
+ exit($status);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Application.php b/src/composer/vendor/consolidation/robo/src/Application.php
new file mode 100644
index 00000000..e6664b5d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Application.php
@@ -0,0 +1,56 @@
+getDefinition()
+ ->addOption(
+ new InputOption('--simulate', null, InputOption::VALUE_NONE, 'Run in simulated mode (show what would have happened).')
+ );
+ $this->getDefinition()
+ ->addOption(
+ new InputOption('--progress-delay', null, InputOption::VALUE_REQUIRED, 'Number of seconds before progress bar is displayed in long-running task collections. Default: 2s.', Config::DEFAULT_PROGRESS_DELAY)
+ );
+ }
+
+ /**
+ * @param string $roboFile
+ * @param string $roboClass
+ */
+ public function addInitRoboFileCommand($roboFile, $roboClass)
+ {
+ $createRoboFile = new Command('init');
+ $createRoboFile->setDescription("Intitalizes basic RoboFile in current dir");
+ $createRoboFile->setCode(function () use ($roboClass, $roboFile) {
+ $output = Robo::output();
+ $output->writeln(" ~~~ Welcome to Robo! ~~~~ ");
+ $output->writeln(" ". basename($roboFile) ." will be created in the current directory ");
+ file_put_contents(
+ $roboFile,
+ 'writeln(" Edit this file to add your commands! ");
+ });
+ $this->add($createRoboFile);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/CallableTask.php b/src/composer/vendor/consolidation/robo/src/Collection/CallableTask.php
new file mode 100644
index 00000000..8ae3a330
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/CallableTask.php
@@ -0,0 +1,53 @@
+fn = $fn;
+ $this->reference = $reference;
+ }
+
+ /**
+ * @return \Robo\Result
+ */
+ public function run()
+ {
+ $result = call_user_func($this->fn);
+ // If the function returns no result, then count it
+ // as a success.
+ if (!isset($result)) {
+ $result = Result::success($this->reference);
+ }
+ // If the function returns a result, it must either return
+ // a \Robo\Result or an exit code. In the later case, we
+ // convert it to a \Robo\Result.
+ if (!$result instanceof Result) {
+ $result = new Result($this->reference, $result);
+ }
+
+ return $result;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/Collection.php b/src/composer/vendor/consolidation/robo/src/Collection/Collection.php
new file mode 100644
index 00000000..5458c8a5
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/Collection.php
@@ -0,0 +1,683 @@
+progressIndicator) {
+ return;
+ }
+ return $this->progressIndicator->setProgressBarAutoDisplayInterval($interval);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function add(TaskInterface $task, $name = self::UNNAMEDTASK)
+ {
+ $task = new CompletionWrapper($this, $task);
+ $this->addToTaskList($name, $task);
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addCode(callable $code, $name = self::UNNAMEDTASK)
+ {
+ return $this->add(new CallableTask($code, $this), $name);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addIterable($iterable, callable $code)
+ {
+ $callbackTask = (new IterationTask($iterable, $code, $this))->inflect($this);
+ return $this->add($callbackTask);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function rollback(TaskInterface $rollbackTask)
+ {
+ // Rollback tasks always try as hard as they can, and never report failures.
+ $rollbackTask = $this->ignoreErrorsTaskWrapper($rollbackTask);
+ return $this->wrapAndRegisterRollback($rollbackTask);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function rollbackCode(callable $rollbackCode)
+ {
+ // Rollback tasks always try as hard as they can, and never report failures.
+ $rollbackTask = $this->ignoreErrorsCodeWrapper($rollbackCode);
+ return $this->wrapAndRegisterRollback($rollbackTask);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function completion(TaskInterface $completionTask)
+ {
+ $collection = $this;
+ $completionRegistrationTask = new CallableTask(
+ function () use ($collection, $completionTask) {
+
+ $collection->registerCompletion($completionTask);
+ },
+ $this
+ );
+ $this->addToTaskList(self::UNNAMEDTASK, $completionRegistrationTask);
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function completionCode(callable $completionTask)
+ {
+ $completionTask = new CallableTask($completionTask, $this);
+ return $this->completion($completionTask);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function before($name, $task, $nameOfTaskToAdd = self::UNNAMEDTASK)
+ {
+ return $this->addBeforeOrAfter(__FUNCTION__, $name, $task, $nameOfTaskToAdd);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function after($name, $task, $nameOfTaskToAdd = self::UNNAMEDTASK)
+ {
+ return $this->addBeforeOrAfter(__FUNCTION__, $name, $task, $nameOfTaskToAdd);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function progressMessage($text, $context = [], $level = LogLevel::NOTICE)
+ {
+ $context += ['name' => 'Progress'];
+ $context += TaskInfo::getTaskContext($this);
+ return $this->addCode(
+ function () use ($level, $text, $context) {
+ $this->printTaskOutput($level, $text, $context);
+ }
+ );
+ }
+
+ /**
+ * @param \Robo\Contract\TaskInterface $rollbackTask
+ *
+ * @return $this
+ */
+ protected function wrapAndRegisterRollback(TaskInterface $rollbackTask)
+ {
+ $collection = $this;
+ $rollbackRegistrationTask = new CallableTask(
+ function () use ($collection, $rollbackTask) {
+ $collection->registerRollback($rollbackTask);
+ },
+ $this
+ );
+ $this->addToTaskList(self::UNNAMEDTASK, $rollbackRegistrationTask);
+ return $this;
+ }
+
+ /**
+ * Add either a 'before' or 'after' function or task.
+ *
+ * @param string $method
+ * @param string $name
+ * @param callable|TaskInterface $task
+ * @param string $nameOfTaskToAdd
+ *
+ * @return $this
+ */
+ protected function addBeforeOrAfter($method, $name, $task, $nameOfTaskToAdd)
+ {
+ if (is_callable($task)) {
+ $task = new CallableTask($task, $this);
+ }
+ $existingTask = $this->namedTask($name);
+ $fn = [$existingTask, $method];
+ call_user_func($fn, $task, $nameOfTaskToAdd);
+ return $this;
+ }
+
+ /**
+ * Wrap the provided task in a wrapper that will ignore
+ * any errors or exceptions that may be produced. This
+ * is useful, for example, in adding optional cleanup tasks
+ * at the beginning of a task collection, to remove previous
+ * results which may or may not exist.
+ *
+ * TODO: Provide some way to specify which sort of errors
+ * are ignored, so that 'file not found' may be ignored,
+ * but 'permission denied' reported?
+ *
+ * @param \Robo\Contract\TaskInterface $task
+ *
+ * @return \Robo\Collection\CallableTask
+ */
+ public function ignoreErrorsTaskWrapper(TaskInterface $task)
+ {
+ // If the task is a stack-based task, then tell it
+ // to try to run all of its operations, even if some
+ // of them fail.
+ if ($task instanceof StackBasedTask) {
+ $task->stopOnFail(false);
+ }
+ $ignoreErrorsInTask = function () use ($task) {
+ $data = [];
+ try {
+ $result = $this->runSubtask($task);
+ $message = $result->getMessage();
+ $data = $result->getData();
+ $data['exitcode'] = $result->getExitCode();
+ } catch (\Exception $e) {
+ $message = $e->getMessage();
+ }
+
+ return Result::success($task, $message, $data);
+ };
+ // Wrap our ignore errors callable in a task.
+ return new CallableTask($ignoreErrorsInTask, $this);
+ }
+
+ /**
+ * @param callable $task
+ *
+ * @return \Robo\Collection\CallableTask
+ */
+ public function ignoreErrorsCodeWrapper(callable $task)
+ {
+ return $this->ignoreErrorsTaskWrapper(new CallableTask($task, $this));
+ }
+
+ /**
+ * Return the list of task names added to this collection.
+ *
+ * @return array
+ */
+ public function taskNames()
+ {
+ return array_keys($this->taskList);
+ }
+
+ /**
+ * Test to see if a specified task name exists.
+ * n.b. before() and after() require that the named
+ * task exist; use this function to test first, if
+ * unsure.
+ *
+ * @param string $name
+ *
+ * @return bool
+ */
+ public function hasTask($name)
+ {
+ return array_key_exists($name, $this->taskList);
+ }
+
+ /**
+ * Find an existing named task.
+ *
+ * @param string $name
+ * The name of the task to insert before. The named task MUST exist.
+ *
+ * @return Element
+ * The task group for the named task. Generally this is only
+ * used to call 'before()' and 'after()'.
+ */
+ protected function namedTask($name)
+ {
+ if (!$this->hasTask($name)) {
+ throw new \RuntimeException("Could not find task named $name");
+ }
+ return $this->taskList[$name];
+ }
+
+ /**
+ * Add a list of tasks to our task collection.
+ *
+ * @param TaskInterface[] $tasks
+ * An array of tasks to run with rollback protection
+ *
+ * @return $this
+ */
+ public function addTaskList(array $tasks)
+ {
+ foreach ($tasks as $name => $task) {
+ $this->add($task, $name);
+ }
+ return $this;
+ }
+
+ /**
+ * Add the provided task to our task list.
+ *
+ * @param string $name
+ * @param \Robo\Contract\TaskInterface $task
+ *
+ * @return \Robo\Collection\Collection
+ */
+ protected function addToTaskList($name, TaskInterface $task)
+ {
+ // All tasks are stored in a task group so that we have a place
+ // to hang 'before' and 'after' tasks.
+ $taskGroup = new Element($task);
+ return $this->addCollectionElementToTaskList($name, $taskGroup);
+ }
+
+ /**
+ * @param int|string $name
+ * @param \Robo\Collection\Element $taskGroup
+ *
+ * @return $this
+ */
+ protected function addCollectionElementToTaskList($name, Element $taskGroup)
+ {
+ // If a task name is not provided, then we'll let php pick
+ // the array index.
+ if (Result::isUnnamed($name)) {
+ $this->taskList[] = $taskGroup;
+ return $this;
+ }
+ // If we are replacing an existing task with the
+ // same name, ensure that our new task is added to
+ // the end.
+ $this->taskList[$name] = $taskGroup;
+ return $this;
+ }
+
+ /**
+ * Set the parent collection. This is necessary so that nested
+ * collections' rollback and completion tasks can be added to the
+ * top-level collection, ensuring that the rollbacks for a collection
+ * will run if any later task fails.
+ *
+ * @param \Robo\Collection\NestedCollectionInterface $parentCollection
+ *
+ * @return $this
+ */
+ public function setParentCollection(NestedCollectionInterface $parentCollection)
+ {
+ $this->parentCollection = $parentCollection;
+ return $this;
+ }
+
+ /**
+ * Get the appropriate parent collection to use
+ *
+ * @return CollectionInterface
+ */
+ public function getParentCollection()
+ {
+ return $this->parentCollection ? $this->parentCollection : $this;
+ }
+
+ /**
+ * Register a rollback task to run if there is any failure.
+ *
+ * Clients are free to add tasks to the rollback stack as
+ * desired; however, usually it is preferable to call
+ * Collection::rollback() instead. With that function,
+ * the rollback function will only be called if all of the
+ * tasks added before it complete successfully, AND some later
+ * task fails.
+ *
+ * One example of a good use-case for registering a callback
+ * function directly is to add a task that sends notification
+ * when a task fails.
+ *
+ * @param TaskInterface $rollbackTask
+ * The rollback task to run on failure.
+ */
+ public function registerRollback(TaskInterface $rollbackTask)
+ {
+ if ($this->parentCollection) {
+ return $this->parentCollection->registerRollback($rollbackTask);
+ }
+ if ($rollbackTask) {
+ $this->rollbackStack[] = $rollbackTask;
+ }
+ }
+
+ /**
+ * Register a completion task to run once all other tasks finish.
+ * Completion tasks run whether or not a rollback operation was
+ * triggered. They do not trigger rollbacks if they fail.
+ *
+ * The typical use-case for a completion function is to clean up
+ * temporary objects (e.g. temporary folders). The preferred
+ * way to do that, though, is to use Temporary::wrap().
+ *
+ * On failures, completion tasks will run after all rollback tasks.
+ * If one task collection is nested inside another task collection,
+ * then the nested collection's completion tasks will run as soon as
+ * the nested task completes; they are not deferred to the end of
+ * the containing collection's execution.
+ *
+ * @param TaskInterface $completionTask
+ * The completion task to run at the end of all other operations.
+ */
+ public function registerCompletion(TaskInterface $completionTask)
+ {
+ if ($this->parentCollection) {
+ return $this->parentCollection->registerCompletion($completionTask);
+ }
+ if ($completionTask) {
+ // Completion tasks always try as hard as they can, and never report failures.
+ $completionTask = $this->ignoreErrorsTaskWrapper($completionTask);
+ $this->completionStack[] = $completionTask;
+ }
+ }
+
+ /**
+ * Return the count of steps in this collection
+ *
+ * @return int
+ */
+ public function progressIndicatorSteps()
+ {
+ $steps = 0;
+ foreach ($this->taskList as $name => $taskGroup) {
+ $steps += $taskGroup->progressIndicatorSteps();
+ }
+ return $steps;
+ }
+
+ /**
+ * A Collection of tasks can provide a command via `getCommand()`
+ * if it contains a single task, and that task implements CommandInterface.
+ *
+ * @return string
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function getCommand()
+ {
+ if (empty($this->taskList)) {
+ return '';
+ }
+
+ if (count($this->taskList) > 1) {
+ // TODO: We could potentially iterate over the items in the collection
+ // and concatenate the result of getCommand() from each one, and fail
+ // only if we encounter a command that is not a CommandInterface.
+ throw new TaskException($this, "getCommand() does not work on arbitrary collections of tasks.");
+ }
+
+ $taskElement = reset($this->taskList);
+ $task = $taskElement->getTask();
+ $task = ($task instanceof WrappedTaskInterface) ? $task->original() : $task;
+ if ($task instanceof CommandInterface) {
+ return $task->getCommand();
+ }
+
+ throw new TaskException($task, get_class($task) . " does not implement CommandInterface, so can't be used to provide a command");
+ }
+
+ /**
+ * Run our tasks, and roll back if necessary.
+ *
+ * @return \Robo\Result
+ */
+ public function run()
+ {
+ $result = $this->runWithoutCompletion();
+ $this->complete();
+ return $result;
+ }
+
+ /**
+ * @return \Robo\Result
+ */
+ private function runWithoutCompletion()
+ {
+ $result = Result::success($this);
+
+ if (empty($this->taskList)) {
+ return $result;
+ }
+
+ $this->startProgressIndicator();
+ if ($result->wasSuccessful()) {
+ foreach ($this->taskList as $name => $taskGroup) {
+ $taskList = $taskGroup->getTaskList();
+ $result = $this->runTaskList($name, $taskList, $result);
+ if (!$result->wasSuccessful()) {
+ $this->fail();
+ return $result;
+ }
+ }
+ $this->taskList = [];
+ }
+ $this->stopProgressIndicator();
+ $result['time'] = $this->getExecutionTime();
+
+ return $result;
+ }
+
+ /**
+ * Run every task in a list, but only up to the first failure.
+ * Return the failing result, or success if all tasks run.
+ *
+ * @param string $name
+ * @param TaskInterface[] $taskList
+ * @param \Robo\Result $result
+ *
+ * @return \Robo\Result
+ *
+ * @throws \Robo\Exception\TaskExitException
+ */
+ private function runTaskList($name, array $taskList, Result $result)
+ {
+ try {
+ foreach ($taskList as $taskName => $task) {
+ $taskResult = $this->runSubtask($task);
+ $this->advanceProgressIndicator();
+ // If the current task returns an error code, then stop
+ // execution and signal a rollback.
+ if (!$taskResult->wasSuccessful()) {
+ return $taskResult;
+ }
+ // We accumulate our results into a field so that tasks that
+ // have a reference to the collection may examine and modify
+ // the incremental results, if they wish.
+ $key = Result::isUnnamed($taskName) ? $name : $taskName;
+ $result->accumulate($key, $taskResult);
+ }
+ } catch (TaskExitException $exitException) {
+ $this->fail();
+ throw $exitException;
+ } catch (\Exception $e) {
+ // Tasks typically should not throw, but if one does, we will
+ // convert it into an error and roll back.
+ return Result::fromException($task, $e, $result->getData());
+ }
+ return $result;
+ }
+
+ /**
+ * Force the rollback functions to run
+ *
+ * @return $this
+ */
+ public function fail()
+ {
+ $this->disableProgressIndicator();
+ $this->runRollbackTasks();
+ $this->complete();
+ return $this;
+ }
+
+ /**
+ * Force the completion functions to run
+ *
+ * @return $this
+ */
+ public function complete()
+ {
+ $this->detatchProgressIndicator();
+ $this->runTaskListIgnoringFailures($this->completionStack);
+ $this->reset();
+ return $this;
+ }
+
+ /**
+ * Reset this collection, removing all tasks.
+ *
+ * @return $this
+ */
+ public function reset()
+ {
+ $this->taskList = [];
+ $this->completionStack = [];
+ $this->rollbackStack = [];
+ return $this;
+ }
+
+ /**
+ * Run all of our rollback tasks.
+ *
+ * Note that Collection does not implement RollbackInterface, but
+ * it may still be used as a task inside another task collection
+ * (i.e. you can nest task collections, if desired).
+ */
+ protected function runRollbackTasks()
+ {
+ $this->runTaskListIgnoringFailures($this->rollbackStack);
+ // Erase our rollback stack once we have finished rolling
+ // everything back. This will allow us to potentially use
+ // a command collection more than once (e.g. to retry a
+ // failed operation after doing some error recovery).
+ $this->rollbackStack = [];
+ }
+
+ /**
+ * @param TaskInterface|NestedCollectionInterface|WrappedTaskInterface $task
+ *
+ * @return \Robo\Result
+ */
+ protected function runSubtask($task)
+ {
+ $original = ($task instanceof WrappedTaskInterface) ? $task->original() : $task;
+ $this->setParentCollectionForTask($original, $this->getParentCollection());
+ if ($original instanceof InflectionInterface) {
+ $original->inflect($this);
+ }
+ $taskResult = $task->run();
+ return $taskResult;
+ }
+
+ /**
+ * @param TaskInterface|NestedCollectionInterface|WrappedTaskInterface $task
+ * @param $parentCollection
+ */
+ protected function setParentCollectionForTask($task, $parentCollection)
+ {
+ if ($task instanceof NestedCollectionInterface) {
+ $task->setParentCollection($parentCollection);
+ }
+ }
+
+ /**
+ * Run all of the tasks in a provided list, ignoring failures.
+ * This is used to roll back or complete.
+ *
+ * @param TaskInterface[] $taskList
+ */
+ protected function runTaskListIgnoringFailures(array $taskList)
+ {
+ foreach ($taskList as $task) {
+ try {
+ $this->runSubtask($task);
+ } catch (\Exception $e) {
+ // Ignore rollback failures.
+ }
+ }
+ }
+
+ /**
+ * Give all of our tasks to the provided collection builder.
+ *
+ * @param CollectionBuilder $builder
+ */
+ public function transferTasks($builder)
+ {
+ foreach ($this->taskList as $name => $taskGroup) {
+ // TODO: We are abandoning all of our before and after tasks here.
+ // At the moment, transferTasks is only called under conditions where
+ // there will be none of these, but care should be taken if that changes.
+ $task = $taskGroup->getTask();
+ $builder->addTaskToCollection($task);
+ }
+ $this->reset();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/CollectionBuilder.php b/src/composer/vendor/consolidation/robo/src/Collection/CollectionBuilder.php
new file mode 100644
index 00000000..9b4d5180
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/CollectionBuilder.php
@@ -0,0 +1,475 @@
+collectionBuilder()
+ * ->taskFilesystemStack()
+ * ->mkdir('g')
+ * ->touch('g/g.txt')
+ * ->rollback(
+ * $this->taskDeleteDir('g')
+ * )
+ * ->taskFilesystemStack()
+ * ->mkdir('g/h')
+ * ->touch('g/h/h.txt')
+ * ->taskFilesystemStack()
+ * ->mkdir('g/h/i/c')
+ * ->touch('g/h/i/i.txt')
+ * ->run()
+ * ?>
+ *
+ * In the example above, the `taskDeleteDir` will be called if
+ * ```
+ */
+class CollectionBuilder extends BaseTask implements NestedCollectionInterface, WrappedTaskInterface, CommandInterface
+{
+ /**
+ * @var \Robo\Tasks
+ */
+ protected $commandFile;
+
+ /**
+ * @var CollectionInterface
+ */
+ protected $collection;
+
+ /**
+ * @var TaskInterface
+ */
+ protected $currentTask;
+
+ /**
+ * @var bool
+ */
+ protected $simulated;
+
+ /**
+ * @param \Robo\Tasks $commandFile
+ */
+ public function __construct($commandFile)
+ {
+ $this->commandFile = $commandFile;
+ }
+
+ /**
+ * @param bool $simulated
+ *
+ * @return $this
+ */
+ public function simulated($simulated = true)
+ {
+ $this->simulated = $simulated;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isSimulated()
+ {
+ if (!isset($this->simulated)) {
+ $this->simulated = $this->getConfig()->get(Config::SIMULATE);
+ }
+ return $this->simulated;
+ }
+
+ /**
+ * Create a temporary directory to work in. When the collection
+ * completes or rolls back, the temporary directory will be deleted.
+ * Returns the path to the location where the directory will be
+ * created.
+ *
+ * @param string $prefix
+ * @param string $base
+ * @param bool $includeRandomPart
+ *
+ * @return string
+ */
+ public function tmpDir($prefix = 'tmp', $base = '', $includeRandomPart = true)
+ {
+ // n.b. Any task that the builder is asked to create is
+ // automatically added to the builder's collection, and
+ // wrapped in the builder object. Therefore, the result
+ // of any call to `taskFoo()` from within the builder will
+ // always be `$this`.
+ return $this->taskTmpDir($prefix, $base, $includeRandomPart)->getPath();
+ }
+
+ /**
+ * Create a working directory to hold results. A temporary directory
+ * is first created to hold the intermediate results. After the
+ * builder finishes, the work directory is moved into its final location;
+ * any results already in place will be moved out of the way and
+ * then deleted.
+ *
+ * @param string $finalDestination The path where the working directory
+ * will be moved once the task collection completes.
+ *
+ * @return string
+ */
+ public function workDir($finalDestination)
+ {
+ // Creating the work dir task in this context adds it to our task collection.
+ return $this->taskWorkDir($finalDestination)->getPath();
+ }
+
+ public function addTask(TaskInterface $task)
+ {
+ $this->getCollection()->add($task);
+ return $this;
+ }
+
+ public function addCode(callable $code)
+ {
+ $this->getCollection()->addCode($code);
+ return $this;
+ }
+
+ /**
+ * Add a list of tasks to our task collection.
+ *
+ * @param TaskInterface[] $tasks
+ * An array of tasks to run with rollback protection
+ *
+ * @return $this
+ */
+ public function addTaskList(array $tasks)
+ {
+ $this->getCollection()->addTaskList($tasks);
+ return $this;
+ }
+
+ public function rollback(TaskInterface $task)
+ {
+ // Ensure that we have a collection if we are going to add
+ // a rollback function.
+ $this->getCollection()->rollback($task);
+ return $this;
+ }
+
+ public function rollbackCode(callable $rollbackCode)
+ {
+ $this->getCollection()->rollbackCode($rollbackCode);
+ return $this;
+ }
+
+ public function completion(TaskInterface $task)
+ {
+ $this->getCollection()->completion($task);
+ return $this;
+ }
+
+ public function completionCode(callable $completionCode)
+ {
+ $this->getCollection()->completionCode($completionCode);
+ return $this;
+ }
+
+ /**
+ * @param string $text
+ * @param array $context
+ * @param string $level
+ *
+ * @return $this
+ */
+ public function progressMessage($text, $context = [], $level = LogLevel::NOTICE)
+ {
+ $this->getCollection()->progressMessage($text, $context, $level);
+ return $this;
+ }
+
+ /**
+ * @param \Robo\Collection\NestedCollectionInterface $parentCollection
+ *
+ * @return $this
+ */
+ public function setParentCollection(NestedCollectionInterface $parentCollection)
+ {
+ $this->getCollection()->setParentCollection($parentCollection);
+ return $this;
+ }
+
+ /**
+ * Called by the factory method of each task; adds the current
+ * task to the task builder.
+ *
+ * TODO: protected
+ *
+ * @param TaskInterface $task
+ *
+ * @return $this
+ */
+ public function addTaskToCollection($task)
+ {
+ // Postpone creation of the collection until the second time
+ // we are called. At that time, $this->currentTask will already
+ // be populated. We call 'getCollection()' so that it will
+ // create the collection and add the current task to it.
+ // Note, however, that if our only tasks implements NestedCollectionInterface,
+ // then we should force this builder to use a collection.
+ if (!$this->collection && (isset($this->currentTask) || ($task instanceof NestedCollectionInterface))) {
+ $this->getCollection();
+ }
+ $this->currentTask = $task;
+ if ($this->collection) {
+ $this->collection->add($task);
+ }
+ return $this;
+ }
+
+ /**
+ * Return the current task for this collection builder.
+ * TODO: Not needed?
+ *
+ * @return \Robo\Contract\TaskInterface
+ */
+ public function getCollectionBuilderCurrentTask()
+ {
+ return $this->currentTask;
+ }
+
+ /**
+ * Create a new builder with its own task collection
+ *
+ * @return CollectionBuilder
+ */
+ public function newBuilder()
+ {
+ $collectionBuilder = new self($this->commandFile);
+ $collectionBuilder->inflect($this);
+ $collectionBuilder->simulated($this->isSimulated());
+ return $collectionBuilder;
+ }
+
+ /**
+ * Calling the task builder with methods of the current
+ * task calls through to that method of the task.
+ *
+ * There is extra complexity in this function that could be
+ * simplified if we attached the 'LoadAllTasks' and custom tasks
+ * to the collection builder instead of the RoboFile. While that
+ * change would be a better design overall, it would require that
+ * the user do a lot more work to set up and use custom tasks.
+ * We therefore take on some additional complexity here in order
+ * to allow users to maintain their tasks in their RoboFile, which
+ * is much more convenient.
+ *
+ * Calls to $this->collectionBuilder()->taskFoo() cannot be made
+ * directly because all of the task methods are protected. These
+ * calls will therefore end up here. If the method name begins
+ * with 'task', then it is eligible to be used with the builder.
+ *
+ * When we call getBuiltTask, below, it will use the builder attached
+ * to the commandfile to build the task. However, this is not what we
+ * want: the task needs to be built from THIS collection builder, so that
+ * it will be affected by whatever state is active in this builder.
+ * To do this, we have two choices: 1) save and restore the builder
+ * in the commandfile, or 2) clone the commandfile and set this builder
+ * on the copy. 1) is vulnerable to failure in multithreaded environments
+ * (currently not supported), while 2) might cause confusion if there
+ * is shared state maintained in the commandfile, which is in the
+ * domain of the user.
+ *
+ * Note that even though we are setting up the commandFile to
+ * use this builder, getBuiltTask always creates a new builder
+ * (which is constructed using all of the settings from the
+ * commandFile's builder), and the new task is added to that.
+ * We therefore need to transfer the newly built task into this
+ * builder. The temporary builder is discarded.
+ *
+ * @param string $fn
+ * @param array $args
+ *
+ * @return $this|mixed
+ */
+ public function __call($fn, $args)
+ {
+ if (preg_match('#^task[A-Z]#', $fn) && (method_exists($this->commandFile, 'getBuiltTask'))) {
+ $saveBuilder = $this->commandFile->getBuilder();
+ $this->commandFile->setBuilder($this);
+ $temporaryBuilder = $this->commandFile->getBuiltTask($fn, $args);
+ $this->commandFile->setBuilder($saveBuilder);
+ if (!$temporaryBuilder) {
+ throw new \BadMethodCallException("No such method $fn: task does not exist in " . get_class($this->commandFile));
+ }
+ $temporaryBuilder->getCollection()->transferTasks($this);
+ return $this;
+ }
+ if (!isset($this->currentTask)) {
+ throw new \BadMethodCallException("No such method $fn: current task undefined in collection builder.");
+ }
+ // If the method called is a method of the current task,
+ // then call through to the current task's setter method.
+ $result = call_user_func_array([$this->currentTask, $fn], $args);
+
+ // If something other than a setter method is called, then return its result.
+ $currentTask = ($this->currentTask instanceof WrappedTaskInterface) ? $this->currentTask->original() : $this->currentTask;
+ if (isset($result) && ($result !== $currentTask)) {
+ return $result;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Construct the desired task and add it to this builder.
+ *
+ * @param string|object $name
+ * @param array $args
+ *
+ * @return \Robo\Collection\CollectionBuilder
+ */
+ public function build($name, $args)
+ {
+ $reflection = new ReflectionClass($name);
+ $task = $reflection->newInstanceArgs($args);
+ if (!$task) {
+ throw new RuntimeException("Can not construct task $name");
+ }
+ $task = $this->fixTask($task, $args);
+ return $this->addTaskToCollection($task);
+ }
+
+ /**
+ * @param InflectionInterface $task
+ * @param array $args
+ *
+ * @return \Robo\Collection\CompletionWrapper|\Robo\Task\Simulator
+ */
+ protected function fixTask($task, $args)
+ {
+ $task->inflect($this);
+ if ($task instanceof BuilderAwareInterface) {
+ $task->setBuilder($this);
+ }
+
+ // Do not wrap our wrappers.
+ if ($task instanceof CompletionWrapper || $task instanceof Simulator) {
+ return $task;
+ }
+
+ // Remember whether or not this is a task before
+ // it gets wrapped in any decorator.
+ $isTask = $task instanceof TaskInterface;
+ $isCollection = $task instanceof NestedCollectionInterface;
+
+ // If the task implements CompletionInterface, ensure
+ // that its 'complete' method is called when the application
+ // terminates -- but only if its 'run' method is called
+ // first. If the task is added to a collection, then the
+ // task will be unwrapped via its `original` method, and
+ // it will be re-wrapped with a new completion wrapper for
+ // its new collection.
+ if ($task instanceof CompletionInterface) {
+ $task = new CompletionWrapper(Temporary::getCollection(), $task);
+ }
+
+ // If we are in simulated mode, then wrap any task in
+ // a TaskSimulator.
+ if ($isTask && !$isCollection && ($this->isSimulated())) {
+ $task = new \Robo\Task\Simulator($task, $args);
+ $task->inflect($this);
+ }
+
+ return $task;
+ }
+
+ /**
+ * When we run the collection builder, run everything in the collection.
+ *
+ * @return \Robo\Result
+ */
+ public function run()
+ {
+ $this->startTimer();
+ $result = $this->runTasks();
+ $this->stopTimer();
+ $result['time'] = $this->getExecutionTime();
+ return $result;
+ }
+
+ /**
+ * If there is a single task, run it; if there is a collection, run
+ * all of its tasks.
+ *
+ * @return \Robo\Result
+ */
+ protected function runTasks()
+ {
+ if (!$this->collection && $this->currentTask) {
+ return $this->currentTask->run();
+ }
+ return $this->getCollection()->run();
+ }
+
+ /**
+ * @return string
+ */
+ public function getCommand()
+ {
+ if (!$this->collection && $this->currentTask) {
+ $task = $this->currentTask;
+ $task = ($task instanceof WrappedTaskInterface) ? $task->original() : $task;
+ if ($task instanceof CommandInterface) {
+ return $task->getCommand();
+ }
+ }
+
+ return $this->getCollection()->getCommand();
+ }
+
+ /**
+ * @return \Robo\Collection\Collection
+ */
+ public function original()
+ {
+ return $this->getCollection();
+ }
+
+ /**
+ * Return the collection of tasks associated with this builder.
+ *
+ * @return CollectionInterface
+ */
+ public function getCollection()
+ {
+ if (!isset($this->collection)) {
+ $this->collection = new Collection();
+ $this->collection->inflect($this);
+ $this->collection->setProgressBarAutoDisplayInterval($this->getConfig()->get(Config::PROGRESS_BAR_AUTO_DISPLAY_INTERVAL));
+
+ if (isset($this->currentTask)) {
+ $this->collection->add($this->currentTask);
+ }
+ }
+ return $this->collection;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/CollectionInterface.php b/src/composer/vendor/consolidation/robo/src/Collection/CollectionInterface.php
new file mode 100644
index 00000000..b3a34f4e
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/CollectionInterface.php
@@ -0,0 +1,150 @@
+run();
+ } catch (\Exception $e) {
+ return Result::fromException($result, $e);
+ }
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/CompletionWrapper.php b/src/composer/vendor/consolidation/robo/src/Collection/CompletionWrapper.php
new file mode 100644
index 00000000..3e81bd91
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/CompletionWrapper.php
@@ -0,0 +1,106 @@
+collection = $collection;
+ $this->task = ($task instanceof WrappedTaskInterface) ? $task->original() : $task;
+ $this->rollbackTask = $rollbackTask;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function original()
+ {
+ return $this->task;
+ }
+
+ /**
+ * Before running this task, register its rollback and completion
+ * handlers on its collection. The reason this class exists is to
+ * defer registration of rollback and completion tasks until 'run()' time.
+ *
+ * @return \Robo\Result
+ */
+ public function run()
+ {
+ if ($this->rollbackTask) {
+ $this->collection->registerRollback($this->rollbackTask);
+ }
+ if ($this->task instanceof RollbackInterface) {
+ $this->collection->registerRollback(new CallableTask([$this->task, 'rollback'], $this->task));
+ }
+ if ($this->task instanceof CompletionInterface) {
+ $this->collection->registerCompletion(new CallableTask([$this->task, 'complete'], $this->task));
+ }
+
+ return $this->task->run();
+ }
+
+ /**
+ * Make this wrapper object act like the class it wraps.
+ *
+ * @param string $function
+ * @param array $args
+ *
+ * @return mixed
+ */
+ public function __call($function, $args)
+ {
+ return call_user_func_array(array($this->task, $function), $args);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/Element.php b/src/composer/vendor/consolidation/robo/src/Collection/Element.php
new file mode 100644
index 00000000..b67b56bb
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/Element.php
@@ -0,0 +1,116 @@
+task = $task;
+ }
+
+ /**
+ * @param mixed $before
+ * @param string $name
+ */
+ public function before($before, $name)
+ {
+ if ($name) {
+ $this->before[$name] = $before;
+ } else {
+ $this->before[] = $before;
+ }
+ }
+
+ /**
+ * @param mixed $after
+ * @param string $name
+ */
+ public function after($after, $name)
+ {
+ if ($name) {
+ $this->after[$name] = $after;
+ } else {
+ $this->after[] = $after;
+ }
+ }
+
+ /**
+ * @return array
+ */
+ public function getBefore()
+ {
+ return $this->before;
+ }
+
+ /**
+ * @return array
+ */
+ public function getAfter()
+ {
+ return $this->after;
+ }
+
+ /**
+ * @return \Robo\Contract\TaskInterface
+ */
+ public function getTask()
+ {
+ return $this->task;
+ }
+
+ /**
+ * @return array
+ */
+ public function getTaskList()
+ {
+ return array_merge($this->getBefore(), [$this->getTask()], $this->getAfter());
+ }
+
+ /**
+ * @return int
+ */
+ public function progressIndicatorSteps()
+ {
+ $steps = 0;
+ foreach ($this->getTaskList() as $task) {
+ if ($task instanceof WrappedTaskInterface) {
+ $task = $task->original();
+ }
+ // If the task is a ProgressIndicatorAwareInterface, then it
+ // will advance the progress indicator a number of times.
+ if ($task instanceof ProgressIndicatorAwareInterface) {
+ $steps += $task->progressIndicatorSteps();
+ }
+ // We also advance the progress indicator once regardless
+ // of whether it is progress-indicator aware or not.
+ $steps++;
+ }
+ return $steps;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/NestedCollectionInterface.php b/src/composer/vendor/consolidation/robo/src/Collection/NestedCollectionInterface.php
new file mode 100644
index 00000000..73d26282
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/NestedCollectionInterface.php
@@ -0,0 +1,15 @@
+iterable = $iterable;
+ }
+
+ /**
+ * @param string $message
+ * @param array $context
+ *
+ * @return $this
+ */
+ public function iterationMessage($message, $context = [])
+ {
+ $this->message = $message;
+ $this->context = $context + ['name' => 'Progress'];
+ return $this;
+ }
+
+ /**
+ * @param int|string $key
+ * @param mixed $value
+ */
+ protected function showIterationMessage($key, $value)
+ {
+ if ($this->message) {
+ $context = ['key' => $key, 'value' => $value];
+ $context += $this->context;
+ $context += TaskInfo::getTaskContext($this);
+ $this->printTaskInfo($this->message, $context);
+ }
+ }
+
+ /**
+ * @param callable $fn
+ *
+ * @return $this
+ */
+ public function withEachKeyValueCall(callable $fn)
+ {
+ $this->functionStack[] = $fn;
+ return $this;
+ }
+
+ /**
+ * @param callable $fn
+ *
+ * @return \Robo\Collection\TaskForEach
+ */
+ public function call(callable $fn)
+ {
+ return $this->withEachKeyValueCall(
+ function ($key, $value) use ($fn) {
+ return call_user_func($fn, $value);
+ }
+ );
+ }
+
+ /**
+ * @param callable $fn
+ *
+ * @return \Robo\Collection\TaskForEach
+ */
+ public function withBuilder(callable $fn)
+ {
+ $this->countingStack[] =
+ function ($key, $value) use ($fn) {
+ // Create a new builder for every iteration
+ $builder = $this->collectionBuilder();
+ // The user function should build task operations using
+ // the $key / $value parameters; we will call run() on
+ // the builder thus constructed.
+ call_user_func($fn, $builder, $key, $value);
+ return $builder->getCollection()->progressIndicatorSteps();
+ };
+ return $this->withEachKeyValueCall(
+ function ($key, $value) use ($fn) {
+ // Create a new builder for every iteration
+ $builder = $this->collectionBuilder()
+ ->setParentCollection($this->parentCollection);
+ // The user function should build task operations using
+ // the $key / $value parameters; we will call run() on
+ // the builder thus constructed.
+ call_user_func($fn, $builder, $key, $value);
+ return $builder->run();
+ }
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setParentCollection(NestedCollectionInterface $parentCollection)
+ {
+ $this->parentCollection = $parentCollection;
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function progressIndicatorSteps()
+ {
+ $multiplier = count($this->functionStack);
+ if (!empty($this->countingStack)) {
+ $value = reset($this->iterable);
+ $key = key($this->iterable);
+ foreach ($this->countingStack as $fn) {
+ $multiplier += call_user_func($fn, $key, $value);
+ }
+ }
+ return count($this->iterable) * $multiplier;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $finalResult = Result::success($this);
+ $this->startProgressIndicator();
+ foreach ($this->iterable as $key => $value) {
+ $this->showIterationMessage($key, $value);
+ try {
+ foreach ($this->functionStack as $fn) {
+ $result = call_user_func($fn, $key, $value);
+ $this->advanceProgressIndicator();
+ if (!isset($result)) {
+ $result = Result::success($this);
+ }
+ // If the function returns a result, it must either return
+ // a \Robo\Result or an exit code. In the later case, we
+ // convert it to a \Robo\Result.
+ if (!$result instanceof Result) {
+ $result = new Result($this, $result);
+ }
+ if (!$result->wasSuccessful()) {
+ return $result;
+ }
+ $finalResult = $result->merge($finalResult);
+ }
+ } catch (\Exception $e) {
+ return Result::fromException($result, $e);
+ }
+ }
+ $this->stopProgressIndicator();
+ return $finalResult;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/Temporary.php b/src/composer/vendor/consolidation/robo/src/Collection/Temporary.php
new file mode 100644
index 00000000..b179acab
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/Temporary.php
@@ -0,0 +1,59 @@
+get('collection');
+ register_shutdown_function(function () {
+ static::complete();
+ });
+ }
+
+ return static::$collection;
+ }
+
+ /**
+ * Call the complete method of all of the registered objects.
+ */
+ public static function complete()
+ {
+ // Run the collection of tasks. This will also run the
+ // completion tasks.
+ $collection = static::getCollection();
+ $collection->run();
+ // Make sure that our completion functions do not run twice.
+ $collection->reset();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Collection/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Collection/loadTasks.php
new file mode 100644
index 00000000..03f68823
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Collection/loadTasks.php
@@ -0,0 +1,17 @@
+task(TaskForEach::class, $collection);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/BuilderAwareTrait.php b/src/composer/vendor/consolidation/robo/src/Common/BuilderAwareTrait.php
new file mode 100644
index 00000000..5a7b6533
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/BuilderAwareTrait.php
@@ -0,0 +1,46 @@
+builder = $builder;
+
+ return $this;
+ }
+
+ /**
+ * @see \Robo\Contract\BuilderAwareInterface::getBuilder()
+ *
+ * @return \Robo\Collection\CollectionBuilder
+ */
+ public function getBuilder()
+ {
+ return $this->builder;
+ }
+
+ /**
+ * @return \Robo\Collection\CollectionBuilder
+ */
+ protected function collectionBuilder()
+ {
+ return $this->getBuilder()->newBuilder();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/CommandArguments.php b/src/composer/vendor/consolidation/robo/src/Common/CommandArguments.php
new file mode 100644
index 00000000..2ed2bc91
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/CommandArguments.php
@@ -0,0 +1,111 @@
+args($arg);
+ }
+
+ /**
+ * Pass methods parameters as arguments to executable. Argument values
+ * are automatically escaped.
+ *
+ * @param string|string[] $args
+ *
+ * @return $this
+ */
+ public function args($args)
+ {
+ if (!is_array($args)) {
+ $args = func_get_args();
+ }
+ $this->arguments .= ' ' . implode(' ', array_map('static::escape', $args));
+ return $this;
+ }
+
+ /**
+ * Pass the provided string in its raw (as provided) form as an argument to executable.
+ *
+ * @param string $arg
+ */
+ public function rawArg($arg)
+ {
+ $this->arguments .= " $arg";
+ }
+
+ /**
+ * Escape the provided value, unless it contains only alphanumeric
+ * plus a few other basic characters.
+ *
+ * @param string $value
+ *
+ * @return string
+ */
+ public static function escape($value)
+ {
+ if (preg_match('/^[a-zA-Z0-9\/\.@~_-]+$/', $value)) {
+ return $value;
+ }
+ return ProcessUtils::escapeArgument($value);
+ }
+
+ /**
+ * Pass option to executable. Options are prefixed with `--` , value can be provided in second parameter.
+ * Option values are automatically escaped.
+ *
+ * @param string $option
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function option($option, $value = null)
+ {
+ if ($option !== null and strpos($option, '-') !== 0) {
+ $option = "--$option";
+ }
+ $this->arguments .= null == $option ? '' : " " . $option;
+ $this->arguments .= null == $value ? '' : " " . static::escape($value);
+ return $this;
+ }
+
+ /**
+ * Pass multiple options to executable. Value can be a string or array.
+ * Option values are automatically escaped.
+ *
+ * @param string $option
+ * @param string|array $value
+ *
+ * @return $this
+ */
+ public function optionList($option, $value = array())
+ {
+ if (is_array($value)) {
+ foreach ($value as $item) {
+ $this->optionList($option, $item);
+ }
+ } else {
+ $this->option($option, $value);
+ }
+
+ return $this;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/CommandReceiver.php b/src/composer/vendor/consolidation/robo/src/Common/CommandReceiver.php
new file mode 100644
index 00000000..03b20fce
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/CommandReceiver.php
@@ -0,0 +1,30 @@
+getCommand();
+ } else {
+ throw new TaskException($this, get_class($command) . " does not implement CommandInterface, so can't be passed into this task");
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/ConfigAwareTrait.php b/src/composer/vendor/consolidation/robo/src/Common/ConfigAwareTrait.php
new file mode 100644
index 00000000..8f8ba48c
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/ConfigAwareTrait.php
@@ -0,0 +1,77 @@
+config = $config;
+
+ return $this;
+ }
+
+ /**
+ * Get the config management object.
+ *
+ * @return \Robo\Config
+ *
+ * @see \Robo\Contract\ConfigAwareInterface::getConfig()
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * @param string $key
+ *
+ * @return string
+ */
+ private static function getClassKey($key)
+ {
+ return sprintf('%s.%s', get_called_class(), $key);
+ }
+
+ /**
+ * @param string $key
+ * @param mixed $value
+ *
+ * @deprecated
+ */
+ public static function configure($key, $value)
+ {
+ Robo::config()->set(static::getClassKey($key), $value);
+ }
+
+ /**
+ * @param string $key
+ * @param mixed|null $default
+ *
+ * @return mixed|null
+ */
+ protected function getConfigValue($key, $default = null)
+ {
+ if (!$this->getConfig()) {
+ return $default;
+ }
+ return $this->getConfig()->get(static::getClassKey($key), $default);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/DynamicParams.php b/src/composer/vendor/consolidation/robo/src/Common/DynamicParams.php
new file mode 100644
index 00000000..28a1d150
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/DynamicParams.php
@@ -0,0 +1,45 @@
+$property))) {
+ $this->$property = !$this->$property;
+ return $this;
+ }
+
+ // append item to array
+ if (is_array($this->$property)) {
+ if (is_array($args[0])) {
+ $this->$property = $args[0];
+ } else {
+ array_push($this->$property, $args[0]);
+ }
+ return $this;
+ }
+
+ $this->$property = $args[0];
+ return $this;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/ExecCommand.php b/src/composer/vendor/consolidation/robo/src/Common/ExecCommand.php
new file mode 100644
index 00000000..ad4c4093
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/ExecCommand.php
@@ -0,0 +1,197 @@
+execTimer)) {
+ $this->execTimer = new TimeKeeper();
+ }
+ return $this->execTimer;
+ }
+
+ /**
+ * Is command printing its output to screen
+ *
+ * @return bool
+ */
+ public function getPrinted()
+ {
+ return $this->isPrinted;
+ }
+
+ /**
+ * Changes working directory of command
+ *
+ * @param string $dir
+ *
+ * @return $this
+ */
+ public function dir($dir)
+ {
+ $this->workingDirectory = $dir;
+ return $this;
+ }
+
+
+ /**
+ * Should command output be printed
+ *
+ * @param bool $arg
+ *
+ * @return $this
+ */
+ public function printed($arg)
+ {
+ if (is_bool($arg)) {
+ $this->isPrinted = $arg;
+ }
+ return $this;
+ }
+
+ /**
+ * Look for a "{$cmd}.phar" in the current working
+ * directory; return a string to exec it if it is
+ * found. Otherwise, look for an executable command
+ * of the same name via findExecutable.
+ *
+ * @param string $cmd
+ *
+ * @return bool|string
+ */
+ protected function findExecutablePhar($cmd)
+ {
+ if (file_exists("{$cmd}.phar")) {
+ return "php {$cmd}.phar";
+ }
+ return $this->findExecutable($cmd);
+ }
+
+ /**
+ * Return the best path to the executable program
+ * with the provided name. Favor vendor/bin in the
+ * current project. If not found there, use
+ * whatever is on the $PATH.
+ *
+ * @param string $cmd
+ *
+ * @return bool|string
+ */
+ protected function findExecutable($cmd)
+ {
+ $pathToCmd = $this->searchForExecutable($cmd);
+ if ($pathToCmd) {
+ return $this->useCallOnWindows($pathToCmd);
+ }
+ return false;
+ }
+
+ /**
+ * @param string $cmd
+ *
+ * @return string
+ */
+ private function searchForExecutable($cmd)
+ {
+ $projectBin = $this->findProjectBin();
+
+ $localComposerInstallation = $projectBin . DIRECTORY_SEPARATOR . $cmd;
+ if (file_exists($localComposerInstallation)) {
+ return $localComposerInstallation;
+ }
+ $finder = new ExecutableFinder();
+ return $finder->find($cmd, null, []);
+ }
+
+ /**
+ * @return bool|string
+ */
+ protected function findProjectBin()
+ {
+ $candidates = [ __DIR__ . '/../../vendor/bin', __DIR__ . '/../../bin' ];
+
+ // If this project is inside a vendor directory, give highest priority
+ // to that directory.
+ $vendorDirContainingUs = realpath(__DIR__ . '/../../../..');
+ if (is_dir($vendorDirContainingUs) && (basename($vendorDirContainingUs) == 'vendor')) {
+ array_unshift($candidates, $vendorDirContainingUs . '/bin');
+ }
+
+ foreach ($candidates as $dir) {
+ if (is_dir("$dir")) {
+ return realpath($dir);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Wrap Windows executables in 'call' per 7a88757d
+ *
+ * @param string $cmd
+ *
+ * @return string
+ */
+ protected function useCallOnWindows($cmd)
+ {
+ if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+ if (file_exists("{$cmd}.bat")) {
+ $cmd = "{$cmd}.bat";
+ }
+ return "call $cmd";
+ }
+ return $cmd;
+ }
+
+ /**
+ * @param string $command
+ *
+ * @return \Robo\Result
+ */
+ protected function executeCommand($command)
+ {
+ $process = new Process($command);
+ $process->setTimeout(null);
+ if ($this->workingDirectory) {
+ $process->setWorkingDirectory($this->workingDirectory);
+ }
+ $this->getExecTimer()->start();
+ if ($this->isPrinted) {
+ $process->run(function ($type, $buffer) {
+ print $buffer;
+ });
+ } else {
+ $process->run();
+ }
+ $this->getExecTimer()->stop();
+
+ return new Result($this, $process->getExitCode(), $process->getOutput(), ['time' => $this->getExecTimer()->elapsed()]);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/ExecOneCommand.php b/src/composer/vendor/consolidation/robo/src/Common/ExecOneCommand.php
new file mode 100644
index 00000000..60137514
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/ExecOneCommand.php
@@ -0,0 +1,12 @@
+io) {
+ $this->io = new SymfonyStyle($this->input(), $this->output());
+ }
+ return $this->io;
+ }
+
+ /**
+ * @param string $nonDecorated
+ * @param string $decorated
+ *
+ * @return string
+ */
+ protected function decorationCharacter($nonDecorated, $decorated)
+ {
+ if (!$this->output()->isDecorated() || (strncasecmp(PHP_OS, 'WIN', 3) == 0)) {
+ return $nonDecorated;
+ }
+ return $decorated;
+ }
+
+ /**
+ * @param string $text
+ */
+ protected function say($text)
+ {
+ $char = $this->decorationCharacter('>', '➜');
+ $this->writeln("$char $text");
+ }
+
+ /**
+ * @param string $text
+ * @param int $length
+ * @param string $color
+ */
+ protected function yell($text, $length = 40, $color = 'green')
+ {
+ $char = $this->decorationCharacter(' ', '➜');
+ $format = "$char %s";
+ $this->formattedOutput($text, $length, $format);
+ }
+
+ /**
+ * @param string $text
+ * @param int $length
+ * @param string $format
+ */
+ private function formattedOutput($text, $length, $format)
+ {
+ $lines = explode("\n", trim($text, "\n"));
+ $maxLineLength = array_reduce(array_map('strlen', $lines), 'max');
+ $length = max($length, $maxLineLength);
+ $len = $length + 2;
+ $space = str_repeat(' ', $len);
+ $this->writeln(sprintf($format, $space));
+ foreach ($lines as $line) {
+ $line = str_pad($line, $length, ' ', STR_PAD_BOTH);
+ $this->writeln(sprintf($format, " $line "));
+ }
+ $this->writeln(sprintf($format, $space));
+ }
+
+ /**
+ * @param string $question
+ * @param bool $hideAnswer
+ *
+ * @return string
+ */
+ protected function ask($question, $hideAnswer = false)
+ {
+ if ($hideAnswer) {
+ return $this->askHidden($question);
+ }
+ return $this->doAsk(new Question($this->formatQuestion($question)));
+ }
+
+ /**
+ * @param string $question
+ *
+ * @return string
+ */
+ protected function askHidden($question)
+ {
+ $question = new Question($this->formatQuestion($question));
+ $question->setHidden(true);
+ return $this->doAsk($question);
+ }
+
+ /**
+ * @param string $question
+ * @param string $default
+ *
+ * @return string
+ */
+ protected function askDefault($question, $default)
+ {
+ return $this->doAsk(new Question($this->formatQuestion("$question [$default]"), $default));
+ }
+
+ /**
+ * @param string $question
+ *
+ * @return string
+ */
+ protected function confirm($question)
+ {
+ return $this->doAsk(new ConfirmationQuestion($this->formatQuestion($question . ' (y/n)'), false));
+ }
+
+ /**
+ * @param \Symfony\Component\Console\Question\Question $question
+ *
+ * @return string
+ */
+ private function doAsk(Question $question)
+ {
+ return $this->getDialog()->ask($this->input(), $this->output(), $question);
+ }
+
+ /**
+ * @param string $message
+ *
+ * @return string
+ */
+ private function formatQuestion($message)
+ {
+ return "? $message ";
+ }
+
+ /**
+ * @return \Symfony\Component\Console\Helper\QuestionHelper
+ */
+ protected function getDialog()
+ {
+ return new QuestionHelper();
+ }
+
+ /**
+ * @param $text
+ */
+ private function writeln($text)
+ {
+ $this->output()->writeln($text);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/InflectionTrait.php b/src/composer/vendor/consolidation/robo/src/Common/InflectionTrait.php
new file mode 100644
index 00000000..8bc4e831
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/InflectionTrait.php
@@ -0,0 +1,21 @@
+injectDependencies($this);
+ return $this;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/InputAwareTrait.php b/src/composer/vendor/consolidation/robo/src/Common/InputAwareTrait.php
new file mode 100644
index 00000000..bae58c17
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/InputAwareTrait.php
@@ -0,0 +1,51 @@
+input = $input;
+
+ return $this;
+ }
+
+ /**
+ * @return \Symfony\Component\Console\Input\InputInterface
+ */
+ protected function input()
+ {
+ if (!isset($this->input)) {
+ $this->setInput(new ArgvInput());
+ }
+ return $this->input;
+ }
+
+ /**
+ * Backwards compatibility.
+ *
+ * @return \Symfony\Component\Console\Input\InputInterface
+ *
+ * @deprecated
+ */
+ protected function getInput()
+ {
+ return $this->input();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/OutputAwareTrait.php b/src/composer/vendor/consolidation/robo/src/Common/OutputAwareTrait.php
new file mode 100644
index 00000000..48082cb3
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/OutputAwareTrait.php
@@ -0,0 +1,51 @@
+output = $output;
+
+ return $this;
+ }
+
+ /**
+ * @return \Symfony\Component\Console\Output\OutputInterface
+ */
+ protected function output()
+ {
+ if (!isset($this->output)) {
+ $this->setOutput(new NullOutput());
+ }
+ return $this->output;
+ }
+
+ /**
+ * Backwards compatibility
+ *
+ * @return \Symfony\Component\Console\Output\OutputInterface
+ *
+ * @deprecated
+ */
+ protected function getOutput()
+ {
+ return $this->output();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/ProgressIndicator.php b/src/composer/vendor/consolidation/robo/src/Common/ProgressIndicator.php
new file mode 100644
index 00000000..050250e5
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/ProgressIndicator.php
@@ -0,0 +1,201 @@
+progressBar = $progressBar;
+ $this->output = $output;
+ }
+
+ /**
+ * @param int $interval
+ */
+ public function setProgressBarAutoDisplayInterval($interval)
+ {
+ if ($this->progressIndicatorRunning) {
+ return;
+ }
+ $this->autoDisplayInterval = $interval;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hideProgressIndicator()
+ {
+ $result = $this->progressBarDisplayed;
+ if ($this->progressIndicatorRunning && $this->progressBarDisplayed) {
+ $this->progressBar->clear();
+ // Hack: progress indicator does not reset cursor to beginning of line on 'clear'
+ $this->output->write("\x0D");
+ $this->progressBarDisplayed = false;
+ }
+ return $result;
+ }
+
+ public function showProgressIndicator()
+ {
+ if ($this->progressIndicatorRunning && !$this->progressBarDisplayed && isset($this->progressBar)) {
+ $this->progressBar->display();
+ $this->progressBarDisplayed = true;
+ $this->advanceProgressIndicatorCachedSteps();
+ }
+ }
+
+ /**
+ * @param bool $visible
+ */
+ public function restoreProgressIndicator($visible)
+ {
+ if ($visible) {
+ $this->showProgressIndicator();
+ }
+ }
+
+ /**
+ * @param int $totalSteps
+ * @param \Robo\Contract\TaskInterface $owner
+ */
+ public function startProgressIndicator($totalSteps, $owner)
+ {
+ if (!isset($this->progressBar)) {
+ return;
+ }
+
+ $this->progressIndicatorRunning = true;
+ if (!isset($this->owner)) {
+ $this->owner = $owner;
+ $this->startTimer();
+ $this->totalSteps = $totalSteps;
+ $this->autoShowProgressIndicator();
+ }
+ }
+
+ public function autoShowProgressIndicator()
+ {
+ if (($this->autoDisplayInterval < 0) || !isset($this->progressBar) || !$this->output->isDecorated()) {
+ return;
+ }
+ if ($this->autoDisplayInterval <= $this->getExecutionTime()) {
+ $this->autoDisplayInterval = -1;
+ $this->progressBar->start($this->totalSteps);
+ $this->showProgressIndicator();
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ public function inProgress()
+ {
+ return $this->progressIndicatorRunning;
+ }
+
+ /**
+ * @param \Robo\Contract\TaskInterface $owner
+ */
+ public function stopProgressIndicator($owner)
+ {
+ if ($this->progressIndicatorRunning && ($this->owner === $owner)) {
+ $this->cleanup();
+ }
+ }
+
+ protected function cleanup()
+ {
+ $this->progressIndicatorRunning = false;
+ $this->owner = null;
+ if ($this->progressBarDisplayed) {
+ $this->progressBar->finish();
+ // Hack: progress indicator does not always finish cleanly
+ $this->output->writeln('');
+ $this->progressBarDisplayed = false;
+ }
+ $this->stopTimer();
+ }
+
+ /**
+ * Erase progress indicator and ensure it never returns. Used
+ * only during error handlers.
+ */
+ public function disableProgressIndicator()
+ {
+ $this->cleanup();
+ // ProgressIndicator is shared, so this permanently removes
+ // the program's ability to display progress bars.
+ $this->progressBar = null;
+ }
+
+ /**
+ * @param int $steps
+ */
+ public function advanceProgressIndicator($steps = 1)
+ {
+ $this->cachedSteps += $steps;
+ if ($this->progressIndicatorRunning) {
+ $this->autoShowProgressIndicator();
+ // We only want to call `advance` if the progress bar is visible,
+ // because it always displays itself when it is advanced.
+ if ($this->progressBarDisplayed) {
+ return $this->advanceProgressIndicatorCachedSteps();
+ }
+ }
+ }
+
+ protected function advanceProgressIndicatorCachedSteps()
+ {
+ $this->progressBar->advance($this->cachedSteps);
+ $this->cachedSteps = 0;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/ProgressIndicatorAwareTrait.php b/src/composer/vendor/consolidation/robo/src/Common/ProgressIndicatorAwareTrait.php
new file mode 100644
index 00000000..5d33e6d0
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/ProgressIndicatorAwareTrait.php
@@ -0,0 +1,124 @@
+progressIndicator = $progressIndicator;
+ }
+
+ /**
+ * @return null|bool
+ */
+ protected function hideProgressIndicator()
+ {
+ if (!$this->progressIndicator) {
+ return;
+ }
+ return $this->progressIndicator->hideProgressIndicator();
+ }
+
+ protected function showProgressIndicator()
+ {
+ if (!$this->progressIndicator) {
+ return;
+ }
+ $this->progressIndicator->showProgressIndicator();
+ }
+
+ /**
+ * @param bool $visible
+ */
+ protected function restoreProgressIndicator($visible)
+ {
+ if (!$this->progressIndicator) {
+ return;
+ }
+ $this->progressIndicator->restoreProgressIndicator($visible);
+ }
+
+ /**
+ * @return int
+ */
+ protected function getTotalExecutionTime()
+ {
+ if (!$this->progressIndicator) {
+ return 0;
+ }
+ return $this->progressIndicator->getExecutionTime();
+ }
+
+ protected function startProgressIndicator()
+ {
+ $this->startTimer();
+ if (!$this->progressIndicator) {
+ return;
+ }
+ $totalSteps = $this->progressIndicatorSteps();
+ $this->progressIndicator->startProgressIndicator($totalSteps, $this);
+ }
+
+ /**
+ * @return bool
+ */
+ protected function inProgress()
+ {
+ if (!$this->progressIndicator) {
+ return false;
+ }
+ return $this->progressIndicator->inProgress();
+ }
+
+ protected function stopProgressIndicator()
+ {
+ $this->stopTimer();
+ if (!$this->progressIndicator) {
+ return;
+ }
+ $this->progressIndicator->stopProgressIndicator($this);
+ }
+
+ protected function disableProgressIndicator()
+ {
+ $this->stopTimer();
+ if (!$this->progressIndicator) {
+ return;
+ }
+ $this->progressIndicator->disableProgressIndicator();
+ }
+
+ protected function detatchProgressIndicator()
+ {
+ $this->setProgressIndicator(null);
+ }
+
+ /**
+ * @param int $steps
+ */
+ protected function advanceProgressIndicator($steps = 1)
+ {
+ if (!$this->progressIndicator) {
+ return;
+ }
+ $this->progressIndicator->advanceProgressIndicator($steps);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/ResourceExistenceChecker.php b/src/composer/vendor/consolidation/robo/src/Common/ResourceExistenceChecker.php
new file mode 100644
index 00000000..233f90a9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/ResourceExistenceChecker.php
@@ -0,0 +1,116 @@
+printTaskError(sprintf('Invalid glob "%s"!', $resource), $this);
+ $success = false;
+ continue;
+ }
+ foreach ($glob as $resource) {
+ if (!$this->checkResource($resource, $type)) {
+ $success = false;
+ }
+ }
+ }
+ return $success;
+ }
+
+ /**
+ * Checks a single resource, file or directory.
+ *
+ * It will print an error as well on the console.
+ *
+ * @param string $resource File or folder.
+ * @param string $type "file", "dir", "fileAndDir"
+ *
+ * @return bool
+ */
+ protected function checkResource($resource, $type)
+ {
+ switch ($type) {
+ case 'file':
+ if (!$this->isFile($resource)) {
+ $this->printTaskError(sprintf('File "%s" does not exist!', $resource), $this);
+ return false;
+ }
+ return true;
+ case 'dir':
+ if (!$this->isDir($resource)) {
+ $this->printTaskError(sprintf('Directory "%s" does not exist!', $resource), $this);
+ return false;
+ }
+ return true;
+ case 'fileAndDir':
+ if (!$this->isDir($resource) && !$this->isFile($resource)) {
+ $this->printTaskError(sprintf('File or directory "%s" does not exist!', $resource), $this);
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Convenience method to check the often uses "source => target" file / folder arrays.
+ *
+ * @param string|array $resources
+ */
+ protected function checkSourceAndTargetResource($resources)
+ {
+ if (is_string($resources)) {
+ $resources = [$resources];
+ }
+ $sources = [];
+ $targets = [];
+ foreach ($resources as $source => $target) {
+ $sources[] = $source;
+ $target[] = $target;
+ }
+ $this->checkResources($sources);
+ $this->checkResources($targets);
+ }
+
+ /**
+ * Wrapper method around phps is_dir()
+ *
+ * @param string $directory
+ *
+ * @return bool
+ */
+ protected function isDir($directory)
+ {
+ return is_dir($directory);
+ }
+
+ /**
+ * Wrapper method around phps file_exists()
+ *
+ * @param string $file
+ *
+ * @return bool
+ */
+ protected function isFile($file)
+ {
+ return file_exists($file);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/TaskIO.php b/src/composer/vendor/consolidation/robo/src/Common/TaskIO.php
new file mode 100644
index 00000000..57ebb6fe
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/TaskIO.php
@@ -0,0 +1,235 @@
+logger should always be set in Robo core tasks.
+ if ($this->logger) {
+ return $this->logger;
+ }
+
+ // TODO: Remove call to Robo::logger() once maintaining backwards
+ // compatibility with legacy external Robo tasks is no longer desired.
+ if (!Robo::logger()) {
+ return null;
+ }
+
+ static $gaveDeprecationWarning = false;
+ if (!$gaveDeprecationWarning) {
+ trigger_error('No logger set for ' . get_class($this) . '. Use $this->task(Foo::class) rather than new Foo() in loadTasks to ensure the builder can initialize task the task, or use $this->collectionBuilder()->taskFoo() if creating one task from within another.', E_USER_DEPRECATED);
+ $gaveDeprecationWarning = true;
+ }
+ return Robo::logger();
+ }
+
+ /**
+ * Print information about a task in progress.
+ *
+ * With the Symfony Console logger, NOTICE is displayed at VERBOSITY_VERBOSE
+ * and INFO is displayed at VERBOSITY_VERY_VERBOSE.
+ *
+ * Robo overrides the default such that NOTICE is displayed at
+ * VERBOSITY_NORMAL and INFO is displayed at VERBOSITY_VERBOSE.
+ *
+ * n.b. We should probably have printTaskNotice for our ordinary
+ * output, and use printTaskInfo for less interesting messages.
+ *
+ * @param string $text
+ * @param null|array $context
+ */
+ protected function printTaskInfo($text, $context = null)
+ {
+ // The 'note' style is used for both 'notice' and 'info' log levels;
+ // However, 'notice' is printed at VERBOSITY_NORMAL, whereas 'info'
+ // is only printed at VERBOSITY_VERBOSE.
+ $this->printTaskOutput(LogLevel::NOTICE, $text, $this->getTaskContext($context));
+ }
+
+ /**
+ * Provide notification that some part of the task succeeded.
+ *
+ * With the Symfony Console logger, success messages are remapped to NOTICE,
+ * and displayed in VERBOSITY_VERBOSE. When used with the Robo logger,
+ * success messages are displayed at VERBOSITY_NORMAL.
+ *
+ * @param string $text
+ * @param null|array $context
+ */
+ protected function printTaskSuccess($text, $context = null)
+ {
+ // Not all loggers will recognize ConsoleLogLevel::SUCCESS.
+ // We therefore log as LogLevel::NOTICE, and apply a '_level'
+ // override in the context so that this message will be
+ // logged as SUCCESS if that log level is recognized.
+ $context['_level'] = ConsoleLogLevel::SUCCESS;
+ $this->printTaskOutput(LogLevel::NOTICE, $text, $this->getTaskContext($context));
+ }
+
+ /**
+ * Provide notification that there is something wrong, but
+ * execution can continue.
+ *
+ * Warning messages are displayed at VERBOSITY_NORMAL.
+ *
+ * @param string $text
+ * @param null|array $context
+ */
+ protected function printTaskWarning($text, $context = null)
+ {
+ $this->printTaskOutput(LogLevel::WARNING, $text, $this->getTaskContext($context));
+ }
+
+ /**
+ * Provide notification that some operation in the task failed,
+ * and the task cannot continue.
+ *
+ * Error messages are displayed at VERBOSITY_NORMAL.
+ *
+ * @param string $text
+ * @param null|array $context
+ */
+ protected function printTaskError($text, $context = null)
+ {
+ $this->printTaskOutput(LogLevel::ERROR, $text, $this->getTaskContext($context));
+ }
+
+ /**
+ * Provide debugging notification. These messages are only
+ * displayed if the log level is VERBOSITY_DEBUG.
+ *
+ * @param string$text
+ * @param null|array $context
+ */
+ protected function printTaskDebug($text, $context = null)
+ {
+ $this->printTaskOutput(LogLevel::DEBUG, $text, $this->getTaskContext($context));
+ }
+
+ /**
+ * @param string $level
+ * One of the \Psr\Log\LogLevel constant
+ * @param string $text
+ * @param null|array $context
+ */
+ protected function printTaskOutput($level, $text, $context)
+ {
+ $logger = $this->logger();
+ if (!$logger) {
+ return;
+ }
+ // Hide the progress indicator, if it is visible.
+ $inProgress = $this->hideTaskProgress();
+ $logger->log($level, $text, $this->getTaskContext($context));
+ // After we have printed our log message, redraw the progress indicator.
+ $this->showTaskProgress($inProgress);
+ }
+
+ /**
+ * @return bool
+ */
+ protected function hideTaskProgress()
+ {
+ $inProgress = false;
+ if ($this instanceof ProgressIndicatorAwareInterface) {
+ $inProgress = $this->inProgress();
+ }
+
+ // If a progress indicator is running on this task, then we mush
+ // hide it before we print anything, or its display will be overwritten.
+ if ($inProgress) {
+ $inProgress = $this->hideProgressIndicator();
+ }
+ return $inProgress;
+ }
+
+ /**
+ * @param $inProgress
+ */
+ protected function showTaskProgress($inProgress)
+ {
+ if ($inProgress) {
+ $this->restoreProgressIndicator($inProgress);
+ }
+ }
+
+ /**
+ * Format a quantity of bytes.
+ *
+ * @param int $size
+ * @param int $precision
+ *
+ * @return string
+ */
+ protected function formatBytes($size, $precision = 2)
+ {
+ if ($size === 0) {
+ return 0;
+ }
+ $base = log($size, 1024);
+ $suffixes = array('', 'k', 'M', 'G', 'T');
+ return round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)];
+ }
+
+ /**
+ * Get the formatted task name for use in task output.
+ * This is placed in the task context under 'name', and
+ * used as the log label by Robo\Common\RoboLogStyle,
+ * which is inserted at the head of log messages by
+ * Robo\Common\CustomLogStyle::formatMessage().
+ *
+ * @param null|object $task
+ *
+ * @return string
+ */
+ protected function getPrintedTaskName($task = null)
+ {
+ if (!$task) {
+ $task = $this;
+ }
+ return TaskInfo::formatTaskName($task);
+ }
+
+ /**
+ * @param null|array $context
+ *
+ * @return array with context information
+ */
+ protected function getTaskContext($context = null)
+ {
+ if (!$context) {
+ $context = [];
+ }
+ if (!is_array($context)) {
+ $context = ['task' => $context];
+ }
+ if (!array_key_exists('task', $context)) {
+ $context['task'] = $this;
+ }
+
+ return $context + TaskInfo::getTaskContext($context['task']);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/TimeKeeper.php b/src/composer/vendor/consolidation/robo/src/Common/TimeKeeper.php
new file mode 100644
index 00000000..1cd3e334
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/TimeKeeper.php
@@ -0,0 +1,69 @@
+startedAt) {
+ return;
+ }
+ // Get time in seconds as a float, accurate to the microsecond.
+ $this->startedAt = microtime(true);
+ }
+
+ public function stop()
+ {
+ $this->finishedAt = microtime(true);
+ }
+
+ /**
+ * @return float|null
+ */
+ public function elapsed()
+ {
+ $finished = $this->finishedAt ? $this->finishedAt : microtime(true);
+ if ($finished - $this->startedAt <= 0) {
+ return null;
+ }
+ return $finished - $this->startedAt;
+ }
+
+ /**
+ * Format a duration into a human-readable time
+ *
+ * @param float $duration Duration in seconds, with fractional component
+ *
+ * @return string
+ */
+ public static function formatDuration($duration)
+ {
+ if ($duration >= self::DAY * 2) {
+ return gmdate('z \d\a\y\s H:i:s', $duration);
+ }
+ if ($duration > self::DAY) {
+ return gmdate('\1 \d\a\y H:i:s', $duration);
+ }
+ if ($duration > self::HOUR) {
+ return gmdate("H:i:s", $duration);
+ }
+ if ($duration > self::MINUTE) {
+ return gmdate("i:s", $duration);
+ }
+ return round($duration, 3).'s';
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Common/Timer.php b/src/composer/vendor/consolidation/robo/src/Common/Timer.php
new file mode 100644
index 00000000..955eb5bb
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Common/Timer.php
@@ -0,0 +1,37 @@
+timer)) {
+ $this->timer = new TimeKeeper();
+ }
+ $this->timer->start();
+ }
+
+ protected function stopTimer()
+ {
+ if (!isset($this->timer)) {
+ return;
+ }
+ $this->timer->stop();
+ }
+
+ /**
+ * @return float|null
+ */
+ protected function getExecutionTime()
+ {
+ if (!isset($this->timer)) {
+ return null;
+ }
+ return $this->timer->elapsed();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Config.php b/src/composer/vendor/consolidation/robo/src/Config.php
new file mode 100644
index 00000000..10e29eff
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Config.php
@@ -0,0 +1,122 @@
+config[$key])) {
+ return $this->config[$key];
+ }
+ return $this->getDefault($key, $defaultOverride);
+ }
+
+ /**
+ * Set a config value
+ *
+ * @param string $key
+ * @param mixed $value
+ *
+ * @return $this
+ */
+ public function set($key, $value)
+ {
+ $this->config[$key] = $value;
+ return $this;
+ }
+
+ /**
+ * Return an associative array containing all of the global configuration
+ * options and their default values.
+ *
+ * @return array
+ */
+ public function getGlobalOptionDefaultValues()
+ {
+ $globalOptions =
+ [
+ self::PROGRESS_BAR_AUTO_DISPLAY_INTERVAL => self::DEFAULT_PROGRESS_DELAY,
+ self::SIMULATE => false,
+ ];
+
+ return $globalOptions;
+ }
+
+ /**
+ * Return the default value for a given configuration item.
+ *
+ * @param string $key
+ * @param mixed $defaultOverride
+ *
+ * @return mixed
+ */
+ public function getDefault($key, $defaultOverride = null)
+ {
+ $globalOptions = $this->getGlobalOptionDefaultValues();
+ return isset($globalOptions[$key]) ? $globalOptions[$key] : $defaultOverride;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isSimulated()
+ {
+ return $this->get(self::SIMULATE);
+ }
+
+ /**
+ * @param bool $simulated
+ *
+ * @return $this
+ */
+ public function setSimulated($simulated = true)
+ {
+ return $this->set(self::SIMULATE, $simulated);
+ }
+
+ /**
+ * @return bool
+ */
+ public function isDecorated()
+ {
+ return $this->get(self::DECORATED);
+ }
+
+ /**
+ * @param bool $decorated
+ *
+ * @return $this
+ */
+ public function setDecorated($decorated = true)
+ {
+ return $this->set(self::DECORATED, $decorated);
+ }
+
+ /**
+ * @param int $interval
+ *
+ * @return $this
+ */
+ public function setProgressBarAutoDisplayInterval($interval)
+ {
+ return $this->set(self::PROGRESS_BAR_AUTO_DISPLAY_INTERVAL, $interval);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Contract/BuilderAwareInterface.php b/src/composer/vendor/consolidation/robo/src/Contract/BuilderAwareInterface.php
new file mode 100644
index 00000000..d67796fe
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Contract/BuilderAwareInterface.php
@@ -0,0 +1,22 @@
+inflect($this)
+ * ->initializer()
+ * ->...
+ *
+ * Instead of:
+ *
+ * (new SomeTask($args))
+ * ->setLogger($this->logger)
+ * ->initializer()
+ * ->...
+ *
+ * The reason `inflect` is better than the more explicit alternative is
+ * that subclasses of BaseTask that implement a new FooAwareInterface
+ * can override injectDependencies() as explained below, and add more
+ * dependencies that can be injected as needed.
+ *
+ * @param \Robo\Contract\InflectionInterface $parent
+ */
+ public function inflect(InflectionInterface $parent);
+
+ /**
+ * Take all dependencies availble to this task and inject any that are
+ * needed into the provided task. The general pattern is that, for every
+ * FooAwareInterface that this class implements, it should test to see
+ * if the child also implements the same interface, and if so, should call
+ * $child->setFoo($this->foo).
+ *
+ * The benefits of this are pretty large. Any time an object that implements
+ * InflectionInterface is created, just call `$child->inflect($this)`, and
+ * any available optional dependencies will be hooked up via setter injection.
+ *
+ * The required dependencies of an object should be provided via constructor
+ * injection, not inflection.
+ *
+ * @param InflectionInterface $child An object created by this class that
+ * should have its dependencies injected.
+ *
+ * @see https://mwop.net/blog/2016-04-26-on-locators.html
+ */
+ public function injectDependencies(InflectionInterface $child);
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Contract/OutputAwareInterface.php b/src/composer/vendor/consolidation/robo/src/Contract/OutputAwareInterface.php
new file mode 100644
index 00000000..570afed2
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Contract/OutputAwareInterface.php
@@ -0,0 +1,19 @@
+ 'setGlobalOptions'];
+ }
+
+ /**
+ * Before a Console command runs, examine the global
+ * commandline options from the event Input, and set
+ * configuration values as appropriate.
+ *
+ * @param \Symfony\Component\Console\Event\ConsoleCommandEvent $event
+ */
+ public function setGlobalOptions(ConsoleCommandEvent $event)
+ {
+ $config = $this->getConfig();
+ $input = $event->getInput();
+ $globalOptions = $config->getGlobalOptionDefaultValues();
+
+ foreach ($globalOptions as $option => $default) {
+ $value = $input->hasOption($option) ? $input->getOption($option) : null;
+ // Unfortunately, the `?:` operator does not differentate between `0` and `null`
+ if (!isset($value)) {
+ $value = $default;
+ }
+ $config->set($option, $value);
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/LoadAllTasks.php b/src/composer/vendor/consolidation/robo/src/LoadAllTasks.php
new file mode 100644
index 00000000..3183d5b6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/LoadAllTasks.php
@@ -0,0 +1,39 @@
+wasSuccessful()) {
+ return $this->printError($result);
+ } else {
+ return $this->printSuccess($result);
+ }
+ }
+
+ /**
+ * Log that we are about to abort due to an error being encountered
+ * in 'stop on fail' mode.
+ *
+ * @param \Robo\Result $result
+ */
+ public function printStopOnFail($result)
+ {
+ $this->printMessage(LogLevel::NOTICE, 'Stopping on fail. Exiting....');
+ $this->printMessage(LogLevel::ERROR, 'Exit Code: {code}', ['code' => $result->getExitCode()]);
+ }
+
+ /**
+ * Log the result of a Robo task that returned an error.
+ *
+ * @param \Robo\Result $result
+ *
+ * @return bool
+ */
+ protected function printError(Result $result)
+ {
+ $task = $result->getTask();
+ $context = $result->getContext() + ['timer-label' => 'Time', '_style' => []];
+ $context['_style']['message'] = '';
+
+ $printOutput = true;
+ if ($task instanceof PrintedInterface) {
+ $printOutput = !$task->getPrinted();
+ }
+ if ($printOutput) {
+ $this->printMessage(LogLevel::ERROR, "{message}", $context);
+ }
+ $this->printMessage(LogLevel::ERROR, 'Exit code {code}', $context);
+ return true;
+ }
+
+ /**
+ * Log the result of a Robo task that was successful.
+ *
+ * @param \Robo\Result $result
+ *
+ * @return bool
+ */
+ protected function printSuccess(Result $result)
+ {
+ $task = $result->getTask();
+ $context = $result->getContext() + ['timer-label' => 'in'];
+ $time = $result->getExecutionTime();
+ if ($time) {
+ $this->printMessage(ConsoleLogLevel::SUCCESS, 'Done', $context);
+ }
+ return false;
+ }
+
+ /**
+ * @param string $level
+ * @param string $message
+ * @param array $context
+ */
+ protected function printMessage($level, $message, $context = [])
+ {
+ $inProgress = $this->hideProgressIndicator();
+ $this->logger->log($level, $message, $context);
+ if ($inProgress) {
+ $this->restoreProgressIndicator($inProgress);
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Log/RoboLogLevel.php b/src/composer/vendor/consolidation/robo/src/Log/RoboLogLevel.php
new file mode 100644
index 00000000..d7d5eb0a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Log/RoboLogLevel.php
@@ -0,0 +1,11 @@
+labelStyles += [
+ RoboLogLevel::SIMULATED_ACTION => self::TASK_STYLE_SIMULATED,
+ ];
+ $this->messageStyles += [
+ RoboLogLevel::SIMULATED_ACTION => '',
+ ];
+ }
+
+ /**
+ * Log style customization for Robo: replace the log level with
+ * the task name.
+ *
+ * @param string $level
+ * @param string $message
+ * @param array $context
+ *
+ * @return string
+ */
+ protected function formatMessageByLevel($level, $message, $context)
+ {
+ $label = $level;
+ if (array_key_exists('name', $context)) {
+ $label = $context['name'];
+ }
+ return $this->formatMessage($label, $message, $context, $this->labelStyles[$level], $this->messageStyles[$level]);
+ }
+
+ /**
+ * Log style customization for Robo: add the time indicator to the
+ * end of the log message if it exists in the context.
+ *
+ * @param string $label
+ * @param string $message
+ * @param array $context
+ * @param string $taskNameStyle
+ * @param string $messageStyle
+ *
+ * @return string
+ */
+ protected function formatMessage($label, $message, $context, $taskNameStyle, $messageStyle = '')
+ {
+ $message = parent::formatMessage($label, $message, $context, $taskNameStyle, $messageStyle);
+
+ if (array_key_exists('time', $context) && !empty($context['time']) && array_key_exists('timer-label', $context)) {
+ $duration = TimeKeeper::formatDuration($context['time']);
+ $message .= ' ' . $context['timer-label'] . ' ' . $this->wrapFormatString($duration, 'fg=yellow');
+ }
+
+ return $message;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Log/RoboLogger.php b/src/composer/vendor/consolidation/robo/src/Log/RoboLogger.php
new file mode 100644
index 00000000..c3e223fd
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Log/RoboLogger.php
@@ -0,0 +1,36 @@
+ OutputInterface::VERBOSITY_NORMAL, // Default is "verbose"
+ LogLevel::NOTICE => OutputInterface::VERBOSITY_NORMAL, // Default is "verbose"
+ LogLevel::INFO => OutputInterface::VERBOSITY_VERBOSE, // Default is "very verbose"
+ ];
+ parent::__construct($output, $roboVerbosityOverrides);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Result.php b/src/composer/vendor/consolidation/robo/src/Result.php
new file mode 100644
index 00000000..7032a90d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Result.php
@@ -0,0 +1,234 @@
+task = $task;
+ $this->printResult();
+
+ if (self::$stopOnFail) {
+ $this->stopOnFail();
+ }
+ }
+
+ protected function printResult()
+ {
+ // For historic reasons, the Result constructor is responsible
+ // for printing task results.
+ // TODO: Make IO the responsibility of some other class. Maintaining
+ // existing behavior for backwards compatibility. This is undesirable
+ // in the long run, though, as it can result in unwanted repeated input
+ // in task collections et. al.
+ $resultPrinter = Robo::resultPrinter();
+ if ($resultPrinter) {
+ if ($resultPrinter->printResult($this)) {
+ $this->data['already-printed'] = true;
+ }
+ }
+ }
+
+ /**
+ * @param \Robo\Contract\TaskInterface $task
+ * @param string $extension
+ * @param string $service
+ *
+ * @return \Robo\Result
+ */
+ public static function errorMissingExtension(TaskInterface $task, $extension, $service)
+ {
+ $messageTpl = 'PHP extension required for %s. Please enable %s';
+ $message = sprintf($messageTpl, $service, $extension);
+
+ return self::error($task, $message);
+ }
+
+ /**
+ * @param \Robo\Contract\TaskInterface $task
+ * @param string $class
+ * @param string $package
+ *
+ * @return \Robo\Result
+ */
+ public static function errorMissingPackage(TaskInterface $task, $class, $package)
+ {
+ $messageTpl = 'Class %s not found. Please install %s Composer package';
+ $message = sprintf($messageTpl, $class, $package);
+
+ return self::error($task, $message);
+ }
+
+ /**
+ * @param \Robo\Contract\TaskInterface $task
+ * @param string $message
+ * @param array $data
+ *
+ * @return \Robo\Result
+ */
+ public static function error(TaskInterface $task, $message, $data = [])
+ {
+ return new self($task, self::EXITCODE_ERROR, $message, $data);
+ }
+
+ /**
+ * @param \Robo\Contract\TaskInterface $task
+ * @param \Exception $e
+ * @param array $data
+ *
+ * @return \Robo\Result
+ */
+ public static function fromException(TaskInterface $task, \Exception $e, $data = [])
+ {
+ $exitCode = $e->getCode();
+ if (!$exitCode) {
+ $exitCode = self::EXITCODE_ERROR;
+ }
+ return new self($task, $exitCode, $e->getMessage(), $data);
+ }
+
+ /**
+ * @param \Robo\Contract\TaskInterface $task
+ * @param string $message
+ * @param array $data
+ *
+ * @return \Robo\Result
+ */
+ public static function success(TaskInterface $task, $message = '', $data = [])
+ {
+ return new self($task, self::EXITCODE_OK, $message, $data);
+ }
+
+ /**
+ * Return a context useful for logging messages.
+ *
+ * @return array
+ */
+ public function getContext()
+ {
+ $task = $this->getTask();
+
+ return TaskInfo::getTaskContext($task) + [
+ 'code' => $this->getExitCode(),
+ 'data' => $this->getArrayCopy(),
+ 'time' => $this->getExecutionTime(),
+ 'message' => $this->getMessage(),
+ ];
+ }
+
+ /**
+ * Add the results from the most recent task to the accumulated
+ * results from all tasks that have run so far, merging data
+ * as necessary.
+ *
+ * @param int|string $key
+ * @param \Robo\Result $taskResult
+ */
+ public function accumulate($key, Result $taskResult)
+ {
+ // If the task is unnamed, then all of its data elements
+ // just get merged in at the top-level of the final Result object.
+ if (static::isUnnamed($key)) {
+ $this->merge($taskResult);
+ } elseif (isset($this[$key])) {
+ // There can only be one task with a given name; however, if
+ // there are tasks added 'before' or 'after' the named task,
+ // then the results from these will be stored under the same
+ // name unless they are given a name of their own when added.
+ $current = $this[$key];
+ $this[$key] = $taskResult->merge($current);
+ } else {
+ $this[$key] = $taskResult;
+ }
+ }
+
+ /**
+ * We assume that named values (e.g. for associative array keys)
+ * are non-numeric; numeric keys are presumed to simply be the
+ * index of an array, and therefore insignificant.
+ *
+ * @param int|string $key
+ *
+ * @return bool
+ */
+ public static function isUnnamed($key)
+ {
+ return is_numeric($key);
+ }
+
+ /**
+ * @return \Robo\Contract\TaskInterface
+ */
+ public function getTask()
+ {
+ return $this->task;
+ }
+
+ /**
+ * @return \Robo\Contract\TaskInterface
+ */
+ public function cloneTask()
+ {
+ $reflect = new \ReflectionClass(get_class($this->task));
+ return $reflect->newInstanceArgs(func_get_args());
+ }
+
+ /**
+ * @return bool
+ *
+ * @deprecated since 1.0.
+ *
+ * @see wasSuccessful()
+ */
+ public function __invoke()
+ {
+ trigger_error(__METHOD__ . ' is deprecated: use wasSuccessful() instead.', E_USER_DEPRECATED);
+ return $this->wasSuccessful();
+ }
+
+ /**
+ * @return $this
+ */
+ public function stopOnFail()
+ {
+ if (!$this->wasSuccessful()) {
+ $resultPrinter = Robo::resultPrinter();
+ if ($resultPrinter) {
+ $resultPrinter->printStopOnFail($this);
+ }
+ $this->exitEarly($this->getExitCode());
+ }
+ return $this;
+ }
+
+ /**
+ * @param int $status
+ *
+ * @throws \Robo\Exception\TaskExitException
+ */
+ private function exitEarly($status)
+ {
+ throw new TaskExitException($this->getTask(), $this->getMessage(), $status);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/ResultData.php b/src/composer/vendor/consolidation/robo/src/ResultData.php
new file mode 100644
index 00000000..be7b5c63
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/ResultData.php
@@ -0,0 +1,152 @@
+exitCode = $exitCode;
+ $this->message = $message;
+
+ parent::__construct($data);
+ }
+
+ /**
+ * @param string $message
+ * @param array $data
+ *
+ * @return \Robo\ResultData
+ */
+ public static function message($message, $data = [])
+ {
+ return new self(self::EXITCODE_OK, $message, $data);
+ }
+
+ /**
+ * @param string $message
+ * @param array $data
+ *
+ * @return \Robo\ResultData
+ */
+ public static function cancelled($message = '', $data = [])
+ {
+ return new ResultData(self::EXITCODE_USER_CANCEL, $message, $data);
+ }
+
+ /**
+ * @return array
+ */
+ public function getData()
+ {
+ return $this->getArrayCopy();
+ }
+
+ /**
+ * @return int
+ */
+ public function getExitCode()
+ {
+ return $this->exitCode;
+ }
+
+ /**
+ * @return null|string
+ */
+ public function getOutputData()
+ {
+ if (!empty($this->message) && !isset($this['already-printed'])) {
+ return $this->message;
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getMessage()
+ {
+ return $this->message;
+ }
+
+ /**
+ * @return bool
+ */
+ public function wasSuccessful()
+ {
+ return $this->exitCode === self::EXITCODE_OK;
+ }
+
+ /**
+ * @return bool
+ */
+ public function wasCancelled()
+ {
+ return $this->exitCode == self::EXITCODE_USER_CANCEL;
+ }
+
+ /**
+ * Merge another result into this result. Data already
+ * existing in this result takes precedence over the
+ * data in the Result being merged.
+ *
+ * @param \Robo\ResultData $result
+ *
+ * @return $this
+ */
+ public function merge(ResultData $result)
+ {
+ $mergedData = $this->getArrayCopy() + $result->getArrayCopy();
+ $this->exchangeArray($mergedData);
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasExecutionTime()
+ {
+ return isset($this['time']);
+ }
+
+ /**
+ * @return null|float
+ */
+ public function getExecutionTime()
+ {
+ if (!$this->hasExecutionTime()) {
+ return null;
+ }
+ return $this['time'];
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Robo.php b/src/composer/vendor/consolidation/robo/src/Robo.php
new file mode 100644
index 00000000..7c350db7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Robo.php
@@ -0,0 +1,337 @@
+execute($argv, $appName, $appVersion, $output);
+ return $statusCode;
+ }
+
+ /**
+ * Sets a new global container.
+ *
+ * @param ContainerInterface $container
+ * A new container instance to replace the current.
+ */
+ public static function setContainer(ContainerInterface $container)
+ {
+ static::$container = $container;
+ }
+
+ /**
+ * Unsets the global container.
+ */
+ public static function unsetContainer()
+ {
+ static::$container = null;
+ }
+
+ /**
+ * Returns the currently active global container.
+ *
+ * @return \League\Container\ContainerInterface
+ *
+ * @throws \RuntimeException
+ */
+ public static function getContainer()
+ {
+ if (static::$container === null) {
+ throw new \RuntimeException('container is not initialized yet. \Robo\Robo::setContainer() must be called with a real container.');
+ }
+ return static::$container;
+ }
+
+ /**
+ * Returns TRUE if the container has been initialized, FALSE otherwise.
+ *
+ * @return bool
+ */
+ public static function hasContainer()
+ {
+ return static::$container !== null;
+ }
+
+ /**
+ * Create a container and initiailze it. If you wish to *change*
+ * anything defined in the container, then you should call
+ * \Robo::configureContainer() instead of this function.
+ *
+ * @param null|\Symfony\Component\Console\Input\InputInterface $input
+ * @param null|\Symfony\Component\Console\Output\OutputInterface $output
+ * @param null|\Robo\Application $app
+ * @param null|\Robo\Config $config
+ *
+ * @return \League\Container\Container|\League\Container\ContainerInterface
+ */
+ public static function createDefaultContainer($input = null, $output = null, $app = null, $config = null)
+ {
+ // Do not allow this function to be called more than once.
+ if (static::hasContainer()) {
+ return static::getContainer();
+ }
+
+ if (!$app) {
+ $app = static::createDefaultApplication();
+ }
+
+ if (!$config) {
+ $config = new Config();
+ }
+
+ // Set up our dependency injection container.
+ $container = new Container();
+ static::configureContainer($container, $app, $config, $input, $output);
+
+ // Set the application dispatcher
+ $app->setDispatcher($container->get('eventDispatcher'));
+
+ return $container;
+ }
+
+ /**
+ * Initialize a container with all of the default Robo services.
+ * IMPORTANT: after calling this method, clients MUST call:
+ *
+ * $dispatcher = $container->get('eventDispatcher');
+ * $app->setDispatcher($dispatcher);
+ *
+ * Any modification to the container should be done prior to fetching
+ * objects from it.
+ *
+ * It is recommended to use \Robo::createDefaultContainer()
+ * instead, which does all required setup for the caller, but has
+ * the limitation that the container it creates can only be
+ * extended, not modified.
+ *
+ * @param \League\Container\ContainerInterface $container
+ * @param \Symfony\Component\Console\Application $app
+ * @param \Robo\Config $config
+ * @param null|\Symfony\Component\Console\Input\InputInterface $input
+ * @param null|\Symfony\Component\Console\Output\OutputInterface $output
+ */
+ public static function configureContainer(ContainerInterface $container, SymfonyApplication $app, Config $config, $input = null, $output = null)
+ {
+ // Self-referential container refernce for the inflector
+ $container->add('container', $container);
+ static::setContainer($container);
+
+ // Create default input and output objects if they were not provided
+ if (!$input) {
+ $input = new StringInput('');
+ }
+ if (!$output) {
+ $output = new \Symfony\Component\Console\Output\ConsoleOutput();
+ }
+ $config->setDecorated($output->isDecorated());
+
+ $container->share('application', $app);
+ $container->share('config', $config);
+ $container->share('input', $input);
+ $container->share('output', $output);
+
+ // Register logging and related services.
+ $container->share('logStyler', \Robo\Log\RoboLogStyle::class);
+ $container->share('logger', \Robo\Log\RoboLogger::class)
+ ->withArgument('output')
+ ->withMethodCall('setLogOutputStyler', ['logStyler']);
+ $container->add('progressBar', \Symfony\Component\Console\Helper\ProgressBar::class)
+ ->withArgument('output');
+ $container->share('progressIndicator', \Robo\Common\ProgressIndicator::class)
+ ->withArgument('progressBar')
+ ->withArgument('output');
+ $container->share('resultPrinter', \Robo\Log\ResultPrinter::class);
+ $container->add('simulator', \Robo\Task\Simulator::class);
+ $container->share('globalOptionsEventListener', \Robo\GlobalOptionsEventListener::class);
+ $container->share('collectionProcessHook', \Robo\Collection\CollectionProcessHook::class);
+ $container->share('hookManager', \Consolidation\AnnotatedCommand\Hooks\HookManager::class)
+ ->withMethodCall('addResultProcessor', ['collectionProcessHook', '*']);
+ $container->share('alterOptionsCommandEvent', \Consolidation\AnnotatedCommand\Options\AlterOptionsCommandEvent::class)
+ ->withArgument('application');
+ $container->share('eventDispatcher', \Symfony\Component\EventDispatcher\EventDispatcher::class)
+ ->withMethodCall('addSubscriber', ['globalOptionsEventListener'])
+ ->withMethodCall('addSubscriber', ['alterOptionsCommandEvent'])
+ ->withMethodCall('addSubscriber', ['hookManager']);
+ $container->share('formatterManager', \Consolidation\OutputFormatters\FormatterManager::class)
+ ->withMethodCall('addDefaultFormatters', [])
+ ->withMethodCall('addDefaultSimplifiers', []);
+ $container->share('commandProcessor', \Consolidation\AnnotatedCommand\CommandProcessor::class)
+ ->withArgument('hookManager')
+ ->withMethodCall('setFormatterManager', ['formatterManager'])
+ ->withMethodCall(
+ 'setDisplayErrorFunction',
+ [
+ function ($output, $message) use ($container) {
+ $logger = $container->get('logger');
+ $logger->error($message);
+ }
+ ]
+ );
+ $container->share('commandFactory', \Consolidation\AnnotatedCommand\AnnotatedCommandFactory::class)
+ ->withMethodCall('setCommandProcessor', ['commandProcessor']);
+ $container->add('collection', \Robo\Collection\Collection::class);
+ $container->add('collectionBuilder', \Robo\Collection\CollectionBuilder::class);
+ static::addInflectors($container);
+
+ // Make sure the application is appropriately initialized.
+ $app->setAutoExit(false);
+ }
+
+ /**
+ * @param null|string $appName
+ * @param null|string $appVersion
+ *
+ * @return \Robo\Application
+ */
+ public static function createDefaultApplication($appName = null, $appVersion = null)
+ {
+ $appName = $appName ?: self::APPLICATION_NAME;
+ $appVersion = $appVersion ?: self::VERSION;
+
+ $app = new \Robo\Application($appName, $appVersion);
+ $app->setAutoExit(false);
+ return $app;
+ }
+
+ /**
+ * Add the Robo League\Container inflectors to the container
+ *
+ * @param \League\Container\ContainerInterface $container
+ */
+ public static function addInflectors($container)
+ {
+ // Register our various inflectors.
+ $container->inflector(\Robo\Contract\ConfigAwareInterface::class)
+ ->invokeMethod('setConfig', ['config']);
+ $container->inflector(\Psr\Log\LoggerAwareInterface::class)
+ ->invokeMethod('setLogger', ['logger']);
+ $container->inflector(\League\Container\ContainerAwareInterface::class)
+ ->invokeMethod('setContainer', ['container']);
+ $container->inflector(\Symfony\Component\Console\Input\InputAwareInterface::class)
+ ->invokeMethod('setInput', ['input']);
+ $container->inflector(\Robo\Contract\OutputAwareInterface::class)
+ ->invokeMethod('setOutput', ['output']);
+ $container->inflector(\Robo\Contract\ProgressIndicatorAwareInterface::class)
+ ->invokeMethod('setProgressIndicator', ['progressIndicator']);
+ }
+
+ /**
+ * Retrieves a service from the container.
+ *
+ * Use this method if the desired service is not one of those with a dedicated
+ * accessor method below. If it is listed below, those methods are preferred
+ * as they can return useful type hints.
+ *
+ * @param string $id
+ * The ID of the service to retrieve.
+ *
+ * @return mixed
+ * The specified service.
+ */
+ public static function service($id)
+ {
+ return static::getContainer()->get($id);
+ }
+
+ /**
+ * Indicates if a service is defined in the container.
+ *
+ * @param string $id
+ * The ID of the service to check.
+ *
+ * @return bool
+ * TRUE if the specified service exists, FALSE otherwise.
+ */
+ public static function hasService($id)
+ {
+ // Check hasContainer() first in order to always return a Boolean.
+ return static::hasContainer() && static::getContainer()->has($id);
+ }
+
+ /**
+ * Return the result printer object.
+ *
+ * @return \Robo\Log\ResultPrinter
+ */
+ public static function resultPrinter()
+ {
+ return static::service('resultPrinter');
+ }
+
+ /**
+ * @return \Robo\Config
+ */
+ public static function config()
+ {
+ return static::service('config');
+ }
+
+ /**
+ * @return \Consolidation\Log\Logger
+ */
+ public static function logger()
+ {
+ return static::service('logger');
+ }
+
+ /**
+ * @return \Robo\Application
+ */
+ public static function application()
+ {
+ return static::service('application');
+ }
+
+ /**
+ * Return the output object.
+ *
+ * @return \Symfony\Component\Console\Output\OutputInterface
+ */
+ public static function output()
+ {
+ return static::service('output');
+ }
+
+ /**
+ * Return the input object.
+ *
+ * @return \Symfony\Component\Console\Input\InputInterface
+ */
+ public static function input()
+ {
+ return static::service('input');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Runner.php b/src/composer/vendor/consolidation/robo/src/Runner.php
new file mode 100644
index 00000000..06218ec1
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Runner.php
@@ -0,0 +1,419 @@
+roboClass = $roboClass ? $roboClass : self::ROBOCLASS ;
+ $this->roboFile = $roboFile ? $roboFile : self::ROBOFILE;
+ $this->dir = getcwd();
+ }
+
+ /**
+ * @param \Symfony\Component\Console\Output\OutputInterface $output
+ *
+ * @return bool
+ */
+ protected function loadRoboFile($output)
+ {
+ // If we have not been provided an output object, make a temporary one.
+ if (!$output) {
+ $output = new \Symfony\Component\Console\Output\ConsoleOutput();
+ }
+
+ // If $this->roboClass is a single class that has not already
+ // been loaded, then we will try to obtain it from $this->roboFile.
+ // If $this->roboClass is an array, we presume all classes requested
+ // are available via the autoloader.
+ if (is_array($this->roboClass) || class_exists($this->roboClass)) {
+ return true;
+ }
+ if (!file_exists($this->dir)) {
+ $output->writeln("Path `{$this->dir}` is invalid; please provide a valid absolute path to the Robofile to load.");
+ return false;
+ }
+
+ $realDir = realpath($this->dir);
+
+ $roboFilePath = $realDir . DIRECTORY_SEPARATOR . $this->roboFile;
+ if (!file_exists($roboFilePath)) {
+ $requestedRoboFilePath = $this->dir . DIRECTORY_SEPARATOR . $this->roboFile;
+ $output->writeln("Requested RoboFile `$requestedRoboFilePath` is invalid, please provide valid absolute path to load Robofile");
+ return false;
+ }
+ require_once $roboFilePath;
+
+ if (!class_exists($this->roboClass)) {
+ $output->writeln("Class ".$this->roboClass." was not loaded");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @param array $argv
+ * @param null|string $appName
+ * @param null|string $appVersion
+ * @param null|\Symfony\Component\Console\Output\OutputInterface $output
+ *
+ * @return int
+ */
+ public function execute($argv, $appName = null, $appVersion = null, $output = null)
+ {
+ $argv = $this->shebang($argv);
+ $argv = $this->processRoboOptions($argv);
+ $app = null;
+ if ($appName && $appVersion) {
+ $app = Robo::createDefaultApplication($appName, $appVersion);
+ }
+ $commandFiles = $this->getRoboFileCommands($output);
+ return $this->run($argv, $output, $app, $commandFiles);
+ }
+
+ /**
+ * @param null|\Symfony\Component\Console\Input\InputInterface $input
+ * @param null|\Symfony\Component\Console\Output\OutputInterface $output
+ * @param null|\Robo\Application $app
+ * @param array[] $commandFiles
+ *
+ * @return int
+ */
+ public function run($input = null, $output = null, $app = null, $commandFiles = [])
+ {
+ // Create default input and output objects if they were not provided
+ if (!$input) {
+ $input = new StringInput('');
+ }
+ if (is_array($input)) {
+ $input = new ArgvInput($input);
+ }
+ if (!$output) {
+ $output = new \Symfony\Component\Console\Output\ConsoleOutput();
+ }
+ $this->setInput($input);
+ $this->setOutput($output);
+
+ // If we were not provided a container, then create one
+ if (!$this->getContainer()) {
+ $container = Robo::createDefaultContainer($input, $output, $app);
+ $this->setContainer($container);
+ // Automatically register a shutdown function and
+ // an error handler when we provide the container.
+ $this->installRoboHandlers();
+ }
+
+ if (!$app) {
+ $app = Robo::application();
+ }
+ if (!isset($commandFiles)) {
+ $this->yell("Robo is not initialized here. Please run `robo init` to create a new RoboFile", 40, 'yellow');
+ $app->addInitRoboFileCommand($this->roboFile, $this->roboClass);
+ $commandFiles = [];
+ }
+ $this->registerCommandClasses($app, $commandFiles);
+
+ try {
+ $statusCode = $app->run($input, $output);
+ } catch (TaskExitException $e) {
+ $statusCode = $e->getCode() ?: 1;
+ }
+ return $statusCode;
+ }
+
+ /**
+ * @param \Symfony\Component\Console\Output\OutputInterface $output
+ *
+ * @return null|string
+ */
+ protected function getRoboFileCommands($output)
+ {
+ if (!$this->loadRoboFile($output)) {
+ return;
+ }
+ return $this->roboClass;
+ }
+
+ /**
+ * @param \Robo\Application $app
+ * @param array $commandClasses
+ */
+ public function registerCommandClasses($app, $commandClasses)
+ {
+ foreach ((array)$commandClasses as $commandClass) {
+ $this->registerCommandClass($app, $commandClass);
+ }
+ }
+
+ /**
+ * @param \Robo\Application $app
+ * @param string|BuilderAwareInterface|ContainerAwareInterface $commandClass
+ *
+ * @return mixed|void
+ */
+ public function registerCommandClass($app, $commandClass)
+ {
+ $container = Robo::getContainer();
+ $roboCommandFileInstance = $this->instantiateCommandClass($commandClass);
+ if (!$roboCommandFileInstance) {
+ return;
+ }
+
+ // Register commands for all of the public methods in the RoboFile.
+ $commandFactory = $container->get('commandFactory');
+ $commandList = $commandFactory->createCommandsFromClass($roboCommandFileInstance);
+ foreach ($commandList as $command) {
+ $app->add($command);
+ }
+ return $roboCommandFileInstance;
+ }
+
+ /**
+ * @param string|BuilderAwareInterface|ContainerAwareInterface $commandClass
+ *
+ * @return null|object
+ */
+ protected function instantiateCommandClass($commandClass)
+ {
+ $container = Robo::getContainer();
+
+ // Register the RoboFile with the container and then immediately
+ // fetch it; this ensures that all of the inflectors will run.
+ // If the command class is already an instantiated object, then
+ // just use it exactly as it was provided to us.
+ if (is_string($commandClass)) {
+ $reflectionClass = new \ReflectionClass($commandClass);
+ if ($reflectionClass->isAbstract()) {
+ return;
+ }
+
+ $commandFileName = "{$commandClass}Commands";
+ $container->share($commandFileName, $commandClass);
+ $commandClass = $container->get($commandFileName);
+ }
+ // If the command class is a Builder Aware Interface, then
+ // ensure that it has a builder. Every command class needs
+ // its own collection builder, as they have references to each other.
+ if ($commandClass instanceof BuilderAwareInterface) {
+ $builder = $container->get('collectionBuilder', [$commandClass]);
+ $commandClass->setBuilder($builder);
+ }
+ if ($commandClass instanceof ContainerAwareInterface) {
+ $commandClass->setContainer($container);
+ }
+ return $commandClass;
+ }
+
+ public function installRoboHandlers()
+ {
+ register_shutdown_function(array($this, 'shutdown'));
+ set_error_handler(array($this, 'handleError'));
+ }
+
+ /**
+ * Process a shebang script, if one was used to launch this Runner.
+ *
+ * @param array $args
+ *
+ * @return array $args with shebang script removed
+ */
+ protected function shebang($args)
+ {
+ // Option 1: Shebang line names Robo, but includes no parameters.
+ // #!/bin/env robo
+ // The robo class may contain multiple commands; the user may
+ // select which one to run, or even get a list of commands or
+ // run 'help' on any of the available commands as usual.
+ if ((count($args) > 1) && $this->isShebangFile($args[1])) {
+ return array_merge([$args[0]], array_slice($args, 2));
+ }
+ // Option 2: Shebang line stipulates which command to run.
+ // #!/bin/env robo mycommand
+ // The robo class must contain a public method named 'mycommand'.
+ // This command will be executed every time. Arguments and options
+ // may be provided on the commandline as usual.
+ if ((count($args) > 2) && $this->isShebangFile($args[2])) {
+ return array_merge([$args[0]], explode(' ', $args[1]), array_slice($args, 3));
+ }
+ return $args;
+ }
+
+ /**
+ * Determine if the specified argument is a path to a shebang script.
+ * If so, load it.
+ *
+ * @param string $filepath file to check
+ *
+ * @return bool Returns TRUE if shebang script was processed
+ */
+ protected function isShebangFile($filepath)
+ {
+ if (!is_file($filepath)) {
+ return false;
+ }
+ $fp = fopen($filepath, "r");
+ if ($fp === false) {
+ return false;
+ }
+ $line = fgets($fp);
+ $result = $this->isShebangLine($line);
+ if ($result) {
+ while ($line = fgets($fp)) {
+ $line = trim($line);
+ if ($line == 'roboClass = $matches[1];
+ eval($script);
+ $result = true;
+ }
+ }
+ }
+ }
+ fclose($fp);
+
+ return $result;
+ }
+
+ /**
+ * Test to see if the provided line is a robo 'shebang' line.
+ *
+ * @param string $line
+ *
+ * @return bool
+ */
+ protected function isShebangLine($line)
+ {
+ return ((substr($line, 0, 2) == '#!') && (strstr($line, 'robo') !== false));
+ }
+
+ /**
+ * Check for Robo-specific arguments such as --load-from, process them,
+ * and remove them from the array. We have to process --load-from before
+ * we set up Symfony Console.
+ *
+ * @param array $argv
+ *
+ * @return array
+ */
+ protected function processRoboOptions($argv)
+ {
+ // loading from other directory
+ $pos = $this->arraySearchBeginsWith('--load-from', $argv) ?: array_search('-f', $argv);
+ if ($pos === false) {
+ return $argv;
+ }
+
+ $passThru = array_search('--', $argv);
+ if (($passThru !== false) && ($passThru < $pos)) {
+ return $argv;
+ }
+
+ if (substr($argv[$pos], 0, 12) == '--load-from=') {
+ $this->dir = substr($argv[$pos], 12);
+ } elseif (isset($argv[$pos +1])) {
+ $this->dir = $argv[$pos +1];
+ unset($argv[$pos +1]);
+ }
+ unset($argv[$pos]);
+ // Make adjustments if '--load-from' points at a file.
+ if (is_file($this->dir) || (substr($this->dir, -4) == '.php')) {
+ $this->roboFile = basename($this->dir);
+ $this->dir = dirname($this->dir);
+ $className = basename($this->roboFile, '.php');
+ if ($className != $this->roboFile) {
+ $this->roboClass = $className;
+ }
+ }
+ // Convert directory to a real path, but only if the
+ // path exists. We do not want to lose the original
+ // directory if the user supplied a bad value.
+ $realDir = realpath($this->dir);
+ if ($realDir) {
+ chdir($realDir);
+ $this->dir = $realDir;
+ }
+
+ return $argv;
+ }
+
+ /**
+ * @param string $needle
+ * @param string[] $haystack
+ *
+ * @return bool|int
+ */
+ protected function arraySearchBeginsWith($needle, $haystack)
+ {
+ for ($i = 0; $i < count($haystack); ++$i) {
+ if (substr($haystack[$i], 0, strlen($needle)) == $needle) {
+ return $i;
+ }
+ }
+ return false;
+ }
+
+ public function shutdown()
+ {
+ $error = error_get_last();
+ if (!is_array($error)) {
+ return;
+ }
+ $this->writeln(sprintf("ERROR: %s \nin %s:%d\n", $error['message'], $error['file'], $error['line']));
+ }
+
+ /**
+ * This is just a proxy error handler that checks the current error_reporting level.
+ * In case error_reporting is disabled the error is marked as handled, otherwise
+ * the normal internal error handling resumes.
+ *
+ * @return bool
+ */
+ public function handleError()
+ {
+ if (error_reporting() === 0) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/ApiGen/ApiGen.php b/src/composer/vendor/consolidation/robo/src/Task/ApiGen/ApiGen.php
new file mode 100644
index 00000000..0d1b35a0
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/ApiGen/ApiGen.php
@@ -0,0 +1,482 @@
+taskApiGen('./apigen.neon')
+ * ->templateConfig('vendor/apigen/apigen/templates/bootstrap/config.neon')
+ * ->wipeout(true)
+ * ->run();
+ * ?>
+ * ```
+ */
+class ApiGen extends BaseTask implements CommandInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ const BOOL_NO = 'no';
+ const BOOL_YES = 'yes';
+
+ /**
+ * @var string
+ */
+ protected $command;
+
+ /**
+ * @param null|string $pathToApiGen
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToApiGen = null)
+ {
+ $this->command = $pathToApiGen;
+ if (!$this->command) {
+ $this->command = $this->findExecutablePhar('apigen');
+ }
+ if (!$this->command) {
+ throw new TaskException(__CLASS__, "No apigen installation found");
+ }
+ }
+
+ /**
+ * @param array|Traversable|string $arg a single object or something traversable
+ *
+ * @return array|Traversable the provided argument if it was already traversable, or the given
+ * argument returned as a one-element array
+ */
+ protected static function forceTraversable($arg)
+ {
+ $traversable = $arg;
+ if (!is_array($traversable) && !($traversable instanceof \Traversable)) {
+ $traversable = array($traversable);
+ }
+ return $traversable;
+ }
+
+ /**
+ * @param array|string $arg a single argument or an array of multiple string values
+ *
+ * @return string a comma-separated string of all of the provided arguments, suitable
+ * as a command-line "list" type argument for ApiGen
+ */
+ protected static function asList($arg)
+ {
+ $normalized = is_array($arg) ? $arg : array($arg);
+ return implode(',', $normalized);
+ }
+
+ /**
+ * @param bool|string $val an argument to be normalized
+ * @param string $default one of self::BOOL_YES or self::BOOK_NO if the provided
+ * value could not deterministically be converted to a
+ * yes or no value
+ *
+ * @return string the given value as a command-line "yes|no" type of argument for ApiGen,
+ * or the default value if none could be determined
+ */
+ protected static function asTextBool($val, $default)
+ {
+ if ($val === self::BOOL_YES || $val === self::BOOL_NO) {
+ return $val;
+ }
+ if (!$val) {
+ return self::BOOL_NO;
+ }
+ if ($val === true) {
+ return self::BOOL_YES;
+ }
+ if (is_numeric($val) && $val != 0) {
+ return self::BOOL_YES;
+ }
+ if (strcasecmp($val[0], 'y') === 0) {
+ return self::BOOL_YES;
+ }
+ if (strcasecmp($val[0], 'n') === 0) {
+ return self::BOOL_NO;
+ }
+ // meh, good enough, let apigen sort it out
+ return $default;
+ }
+
+ /**
+ * @param string $config
+ *
+ * @return $this
+ */
+ public function config($config)
+ {
+ $this->option('config', $config);
+ return $this;
+ }
+
+ /**
+ * @param array|string|Traversable $src one or more source values
+ *
+ * @return $this
+ */
+ public function source($src)
+ {
+ foreach (self::forceTraversable($src) as $source) {
+ $this->option('source', $source);
+ }
+ return $this;
+ }
+
+ /**
+ * @param string $dest
+ *
+ * @return $this
+ */
+ public function destination($dest)
+ {
+ $this->option('destination', $dest);
+ return $this;
+ }
+
+ /**
+ * @param array|string $exts one or more extensions
+ *
+ * @return $this
+ */
+ public function extensions($exts)
+ {
+ $this->option('extensions', self::asList($exts));
+ return $this;
+ }
+
+ /**
+ * @param array|string $exclude one or more exclusions
+ *
+ * @return $this
+ */
+ public function exclude($exclude)
+ {
+ foreach (self::forceTraversable($exclude) as $excl) {
+ $this->option('exclude', $excl);
+ }
+ return $this;
+ }
+
+ /**
+ * @param array|string|Traversable $path one or more skip-doc-path values
+ *
+ * @return $this
+ */
+ public function skipDocPath($path)
+ {
+ foreach (self::forceTraversable($path) as $skip) {
+ $this->option('skip-doc-path', $skip);
+ }
+ return $this;
+ }
+
+ /**
+ * @param array|string|Traversable $prefix one or more skip-doc-prefix values
+ *
+ * @return $this
+ */
+ public function skipDocPrefix($prefix)
+ {
+ foreach (self::forceTraversable($prefix) as $skip) {
+ $this->option('skip-doc-prefix', $skip);
+ }
+ return $this;
+ }
+
+ /**
+ * @param array|string $charset one or more charsets
+ *
+ * @return $this
+ */
+ public function charset($charset)
+ {
+ $this->option('charset', self::asList($charset));
+ return $this;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return $this
+ */
+ public function mainProjectNamePrefix($name)
+ {
+ $this->option('main', $name);
+ return $this;
+ }
+
+ /**
+ * @param string $title
+ *
+ * @return $this
+ */
+ public function title($title)
+ {
+ $this->option('title', $title);
+ return $this;
+ }
+
+ /**
+ * @param string $baseUrl
+ *
+ * @return $this
+ */
+ public function baseUrl($baseUrl)
+ {
+ $this->option('base-url', $baseUrl);
+ return $this;
+ }
+
+ /**
+ * @param string $id
+ *
+ * @return $this
+ */
+ public function googleCseId($id)
+ {
+ $this->option('google-cse-id', $id);
+ return $this;
+ }
+
+ /**
+ * @param string $trackingCode
+ *
+ * @return $this
+ */
+ public function googleAnalytics($trackingCode)
+ {
+ $this->option('google-analytics', $trackingCode);
+ return $this;
+ }
+
+ /**
+ * @param mixed $templateConfig
+ *
+ * @return $this
+ */
+ public function templateConfig($templateConfig)
+ {
+ $this->option('template-config', $templateConfig);
+ return $this;
+ }
+
+ /**
+ * @param array|string $tags one or more supported html tags
+ *
+ * @return $this
+ */
+ public function allowedHtml($tags)
+ {
+ $this->option('allowed-html', self::asList($tags));
+ return $this;
+ }
+
+ /**
+ * @param string $groups
+ *
+ * @return $this
+ */
+ public function groups($groups)
+ {
+ $this->option('groups', $groups);
+ return $this;
+ }
+
+ /**
+ * @param array|string $types or more supported autocomplete types
+ *
+ * @return $this
+ */
+ public function autocomplete($types)
+ {
+ $this->option('autocomplete', self::asList($types));
+ return $this;
+ }
+
+ /**
+ * @param array|string $levels one or more access levels
+ *
+ * @return $this
+ */
+ public function accessLevels($levels)
+ {
+ $this->option('access-levels', self::asList($levels));
+ return $this;
+ }
+
+ /**
+ * @param boolean|string $internal 'yes' or true if internal, 'no' or false if not
+ *
+ * @return $this
+ */
+ public function internal($internal)
+ {
+ $this->option('internal', self::asTextBool($internal, self::BOOL_NO));
+ return $this;
+ }
+
+ /**
+ * @param boolean|string $php 'yes' or true to generate documentation for internal php classes,
+ * 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function php($php)
+ {
+ $this->option('php', self::asTextBool($php, self::BOOL_YES));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $tree 'yes' or true to generate a tree view of classes, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function tree($tree)
+ {
+ $this->option('tree', self::asTextBool($tree, self::BOOL_YES));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $dep 'yes' or true to generate documentation for deprecated classes, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function deprecated($dep)
+ {
+ $this->option('deprecated', self::asTextBool($dep, self::BOOL_NO));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $todo 'yes' or true to document tasks, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function todo($todo)
+ {
+ $this->option('todo', self::asTextBool($todo, self::BOOL_NO));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $src 'yes' or true to generate highlighted source code, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function sourceCode($src)
+ {
+ $this->option('source-code', self::asTextBool($src, self::BOOL_YES));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $zipped 'yes' or true to generate downloadable documentation, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function download($zipped)
+ {
+ $this->option('download', self::asTextBool($zipped, self::BOOL_NO));
+ return $this;
+ }
+
+ public function report($path)
+ {
+ $this->option('report', $path);
+ return $this;
+ }
+
+ /**
+ * @param bool|string $wipeout 'yes' or true to clear out the destination directory, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function wipeout($wipeout)
+ {
+ $this->option('wipeout', self::asTextBool($wipeout, self::BOOL_YES));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $quiet 'yes' or true for quiet, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function quiet($quiet)
+ {
+ $this->option('quiet', self::asTextBool($quiet, self::BOOL_NO));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $bar 'yes' or true to display a progress bar, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function progressbar($bar)
+ {
+ $this->option('progressbar', self::asTextBool($bar, self::BOOL_YES));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $colors 'yes' or true colorize the output, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function colors($colors)
+ {
+ $this->option('colors', self::asTextBool($colors, self::BOOL_YES));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $check 'yes' or true to check for updates, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function updateCheck($check)
+ {
+ $this->option('update-check', self::asTextBool($check, self::BOOL_YES));
+ return $this;
+ }
+
+ /**
+ * @param bool|string $debug 'yes' or true to enable debug mode, 'no' or false otherwise
+ *
+ * @return $this
+ */
+ public function debug($debug)
+ {
+ $this->option('debug', self::asTextBool($debug, self::BOOL_NO));
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . $this->arguments;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Running ApiGen {args}', ['args' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/ApiGen/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/ApiGen/loadTasks.php
new file mode 100644
index 00000000..e8cd372a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/ApiGen/loadTasks.php
@@ -0,0 +1,15 @@
+task(ApiGen::class, $pathToApiGen);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Archive/Extract.php b/src/composer/vendor/consolidation/robo/src/Task/Archive/Extract.php
new file mode 100644
index 00000000..add5397f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Archive/Extract.php
@@ -0,0 +1,281 @@
+taskExtract($archivePath)
+ * ->to($destination)
+ * ->preserveTopDirectory(false) // the default
+ * ->run();
+ * ?>
+ * ```
+ *
+ * @method to(string) location to store extracted files
+ */
+class Extract extends BaseTask implements BuilderAwareInterface
+{
+ use BuilderAwareTrait;
+
+ /**
+ * @var string
+ */
+ protected $filename;
+
+ /**
+ * @var string
+ */
+ protected $to;
+
+ /**
+ * @var bool
+ */
+ private $preserveTopDirectory = false;
+
+ /**
+ * @param string $filename
+ */
+ public function __construct($filename)
+ {
+ $this->filename = $filename;
+ }
+
+ /**
+ * Location to store extracted files.
+ *
+ * @param string $to
+ *
+ * @return $this
+ */
+ public function to($to)
+ {
+ $this->to = $to;
+ return $this;
+ }
+
+ /**
+ * @param bool $preserve
+ *
+ * @return $this
+ */
+ public function preserveTopDirectory($preserve = true)
+ {
+ $this->preserveTopDirectory = $preserve;
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (!file_exists($this->filename)) {
+ $this->printTaskError("File {filename} does not exist", ['filename' => $this->filename]);
+
+ return false;
+ }
+ if (!($mimetype = static::archiveType($this->filename))) {
+ $this->printTaskError("Could not determine type of archive for {filename}", ['filename' => $this->filename]);
+
+ return false;
+ }
+
+ // We will first extract to $extractLocation and then move to $this->to
+ $extractLocation = static::getTmpDir();
+ @mkdir($extractLocation);
+ @mkdir(dirname($this->to));
+
+ $this->startTimer();
+
+ $this->printTaskInfo("Extracting {filename}", ['filename' => $this->filename]);
+
+ $result = $this->extractAppropriateType($mimetype, $extractLocation);
+ if ($result->wasSuccessful()) {
+ $this->printTaskInfo("{filename} extracted", ['filename' => $this->filename]);
+ // Now, we want to move the extracted files to $this->to. There
+ // are two possibilities that we must consider:
+ //
+ // (1) Archived files were encapsulated in a folder with an arbitrary name
+ // (2) There was no encapsulating folder, and all the files in the archive
+ // were extracted into $extractLocation
+ //
+ // In the case of (1), we want to move and rename the encapsulating folder
+ // to $this->to.
+ //
+ // In the case of (2), we will just move and rename $extractLocation.
+ $filesInExtractLocation = glob("$extractLocation/*");
+ $hasEncapsulatingFolder = ((count($filesInExtractLocation) == 1) && is_dir($filesInExtractLocation[0]));
+ if ($hasEncapsulatingFolder && !$this->preserveTopDirectory) {
+ $result = (new FilesystemStack())
+ ->inflect($this)
+ ->rename($filesInExtractLocation[0], $this->to)
+ ->run();
+ (new DeleteDir($extractLocation))
+ ->inflect($this)
+ ->run();
+ } else {
+ $result = (new FilesystemStack())
+ ->inflect($this)
+ ->rename($extractLocation, $this->to)
+ ->run();
+ }
+ }
+ $this->stopTimer();
+ $result['time'] = $this->getExecutionTime();
+
+ return $result;
+ }
+
+ /**
+ * @param string $mimetype
+ * @param string $extractLocation
+ *
+ * @return \Robo\Result
+ */
+ protected function extractAppropriateType($mimetype, $extractLocation)
+ {
+ // Perform the extraction of a zip file.
+ if (($mimetype == 'application/zip') || ($mimetype == 'application/x-zip')) {
+ return $this->extractZip($extractLocation);
+ }
+ return $this->extractTar($extractLocation);
+ }
+
+ /**
+ * @param string $extractLocation
+ *
+ * @return \Robo\Result
+ */
+ protected function extractZip($extractLocation)
+ {
+ if (!extension_loaded('zlib')) {
+ return Result::errorMissingExtension($this, 'zlib', 'zip extracting');
+ }
+
+ $zip = new \ZipArchive();
+ if (($status = $zip->open($this->filename)) !== true) {
+ return Result::error($this, "Could not open zip archive {$this->filename}");
+ }
+ if (!$zip->extractTo($extractLocation)) {
+ return Result::error($this, "Could not extract zip archive {$this->filename}");
+ }
+ $zip->close();
+
+ return Result::success($this);
+ }
+
+ /**
+ * @param string $extractLocation
+ *
+ * @return \Robo\Result
+ */
+ protected function extractTar($extractLocation)
+ {
+ if (!class_exists('Archive_Tar')) {
+ return Result::errorMissingPackage($this, 'Archive_Tar', 'pear/archive_tar');
+ }
+ $tar_object = new \Archive_Tar($this->filename);
+ if (!$tar_object->extract($extractLocation)) {
+ return Result::error($this, "Could not extract tar archive {$this->filename}");
+ }
+
+ return Result::success($this);
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return bool|string
+ */
+ protected static function archiveType($filename)
+ {
+ $content_type = false;
+ if (class_exists('finfo')) {
+ $finfo = new \finfo(FILEINFO_MIME_TYPE);
+ $content_type = $finfo->file($filename);
+ // If finfo cannot determine the content type, then we will try other methods
+ if ($content_type == 'application/octet-stream') {
+ $content_type = false;
+ }
+ }
+ // Examing the file's magic header bytes.
+ if (!$content_type) {
+ if ($file = fopen($filename, 'rb')) {
+ $first = fread($file, 2);
+ fclose($file);
+ if ($first !== false) {
+ // Interpret the two bytes as a little endian 16-bit unsigned int.
+ $data = unpack('v', $first);
+ switch ($data[1]) {
+ case 0x8b1f:
+ // First two bytes of gzip files are 0x1f, 0x8b (little-endian).
+ // See http://www.gzip.org/zlib/rfc-gzip.html#header-trailer
+ $content_type = 'application/x-gzip';
+ break;
+
+ case 0x4b50:
+ // First two bytes of zip files are 0x50, 0x4b ('PK') (little-endian).
+ // See http://en.wikipedia.org/wiki/Zip_(file_format)#File_headers
+ $content_type = 'application/zip';
+ break;
+
+ case 0x5a42:
+ // First two bytes of bzip2 files are 0x5a, 0x42 ('BZ') (big-endian).
+ // See http://en.wikipedia.org/wiki/Bzip2#File_format
+ $content_type = 'application/x-bzip2';
+ break;
+ }
+ }
+ }
+ }
+ // 3. Lastly if above methods didn't work, try to guess the mime type from
+ // the file extension. This is useful if the file has no identificable magic
+ // header bytes (for example tarballs).
+ if (!$content_type) {
+ // Remove querystring from the filename, if present.
+ $filename = basename(current(explode('?', $filename, 2)));
+ $extension_mimetype = array(
+ '.tar.gz' => 'application/x-gzip',
+ '.tgz' => 'application/x-gzip',
+ '.tar' => 'application/x-tar',
+ );
+ foreach ($extension_mimetype as $extension => $ct) {
+ if (substr($filename, -strlen($extension)) === $extension) {
+ $content_type = $ct;
+ break;
+ }
+ }
+ }
+
+ return $content_type;
+ }
+
+ /**
+ * @return string
+ */
+ protected static function getTmpDir()
+ {
+ return getcwd().'/tmp'.rand().time();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Archive/Pack.php b/src/composer/vendor/consolidation/robo/src/Task/Archive/Pack.php
new file mode 100644
index 00000000..0970f8e8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Archive/Pack.php
@@ -0,0 +1,257 @@
+taskPack(
+ * )
+ * ->add('README') // Puts file 'README' in archive at the root
+ * ->add('project') // Puts entire contents of directory 'project' in archinve inside 'project'
+ * ->addFile('dir/file.txt', 'file.txt') // Takes 'file.txt' from cwd and puts it in archive inside 'dir'.
+ * ->run();
+ * ?>
+ * ```
+ */
+class Pack extends BaseTask implements PrintedInterface
+{
+ /**
+ * The list of items to be packed into the archive.
+ *
+ * @var array
+ */
+ private $items = [];
+
+ /**
+ * The full path to the archive to be created.
+ *
+ * @var string
+ */
+ private $archiveFile;
+
+ /**
+ * Construct the class.
+ *
+ * @param string $archiveFile The full path and name of the archive file to create.
+ *
+ * @since 1.0
+ */
+ public function __construct($archiveFile)
+ {
+ $this->archiveFile = $archiveFile;
+ }
+
+ /**
+ * Satisfy the parent requirement.
+ *
+ * @return bool Always returns true.
+ *
+ * @since 1.0
+ */
+ public function getPrinted()
+ {
+ return true;
+ }
+
+ /**
+ * @param string $archiveFile
+ *
+ * @return $this
+ */
+ public function archiveFile($archiveFile)
+ {
+ $this->archiveFile = $archiveFile;
+ return $this;
+ }
+
+ /**
+ * Add an item to the archive. Like file_exists(), the parameter
+ * may be a file or a directory.
+ *
+ * @var string
+ * Relative path and name of item to store in archive
+ * @var string
+ * Absolute or relative path to file or directory's location in filesystem
+ *
+ * @return $this
+ */
+ public function addFile($placementLocation, $filesystemLocation)
+ {
+ $this->items[$placementLocation] = $filesystemLocation;
+
+ return $this;
+ }
+
+ /**
+ * Alias for addFile, in case anyone has angst about using
+ * addFile with a directory.
+ *
+ * @var string
+ * Relative path and name of directory to store in archive
+ * @var string
+ * Absolute or relative path to directory or directory's location in filesystem
+ *
+ * @return $this
+ */
+ public function addDir($placementLocation, $filesystemLocation)
+ {
+ $this->addFile($placementLocation, $filesystemLocation);
+
+ return $this;
+ }
+
+ /**
+ * Add a file or directory, or list of same to the archive.
+ *
+ * @var string|array
+ * If given a string, should contain the relative filesystem path to the
+ * the item to store in archive; this will also be used as the item's
+ * path in the archive, so absolute paths should not be used here.
+ * If given an array, the key of each item should be the path to store
+ * in the archive, and the value should be the filesystem path to the
+ * item to store.
+ * @return $this
+ */
+ public function add($item)
+ {
+ if (is_array($item)) {
+ $this->items = array_merge($this->items, $item);
+ } else {
+ $this->addFile($item, $item);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Create a zip archive for distribution.
+ *
+ * @return \Robo\Result
+ *
+ * @since 1.0
+ */
+ public function run()
+ {
+ $this->startTimer();
+
+ // Use the file extension to determine what kind of archive to create.
+ $fileInfo = new \SplFileInfo($this->archiveFile);
+ $extension = strtolower($fileInfo->getExtension());
+ if (empty($extension)) {
+ return Result::error($this, "Archive filename must use an extension (e.g. '.zip') to specify the kind of archive to create.");
+ }
+
+ try {
+ // Inform the user which archive we are creating
+ $this->printTaskInfo("Creating archive {filename}", ['filename' => $this->archiveFile]);
+ if ($extension == 'zip') {
+ $result = $this->archiveZip($this->archiveFile, $this->items);
+ } else {
+ $result = $this->archiveTar($this->archiveFile, $this->items);
+ }
+ $this->printTaskSuccess("{filename} created.", ['filename' => $this->archiveFile]);
+ } catch (\Exception $e) {
+ $this->printTaskError("Could not create {filename}. {exception}", ['filename' => $this->archiveFile, 'exception' => $e->getMessage(), '_style' => ['exception' => '']]);
+ $result = Result::error($this, sprintf('Could not create %s. %s', $this->archiveFile, $e->getMessage()));
+ }
+ $this->stopTimer();
+ $result['time'] = $this->getExecutionTime();
+
+ return $result;
+ }
+
+ /**
+ * @param string $archiveFile
+ * @param array $items
+ *
+ * @return \Robo\Result
+ */
+ protected function archiveTar($archiveFile, $items)
+ {
+ if (!class_exists('Archive_Tar')) {
+ return Result::errorMissingPackage($this, 'Archive_Tar', 'pear/archive_tar');
+ }
+
+ $tar_object = new \Archive_Tar($archiveFile);
+ foreach ($items as $placementLocation => $filesystemLocation) {
+ $p_remove_dir = $filesystemLocation;
+ $p_add_dir = $placementLocation;
+ if (is_file($filesystemLocation)) {
+ $p_remove_dir = dirname($filesystemLocation);
+ $p_add_dir = dirname($placementLocation);
+ if (basename($filesystemLocation) != basename($placementLocation)) {
+ return Result::error($this, "Tar archiver does not support renaming files during extraction; could not add $filesystemLocation as $placementLocation.");
+ }
+ }
+
+ if (!$tar_object->addModify([$filesystemLocation], $p_add_dir, $p_remove_dir)) {
+ return Result::error($this, "Could not add $filesystemLocation to the archive.");
+ }
+ }
+
+ return Result::success($this);
+ }
+
+ /**
+ * @param string $archiveFile
+ * @param array $items
+ *
+ * @return \Robo\Result
+ */
+ protected function archiveZip($archiveFile, $items)
+ {
+ if (!extension_loaded('zlib')) {
+ return Result::errorMissingExtension($this, 'zlib', 'zip packing');
+ }
+
+ $zip = new \ZipArchive($archiveFile, \ZipArchive::CREATE);
+ if (!$zip->open($archiveFile, \ZipArchive::CREATE)) {
+ return Result::error($this, "Could not create zip archive {$archiveFile}");
+ }
+ $result = $this->addItemsToZip($zip, $items);
+ $zip->close();
+
+ return $result;
+ }
+
+ /**
+ * @param \ZipArchive $zip
+ * @param array $items
+ *
+ * @return \Robo\Result
+ */
+ protected function addItemsToZip($zip, $items)
+ {
+ foreach ($items as $placementLocation => $filesystemLocation) {
+ if (is_dir($filesystemLocation)) {
+ $finder = new Finder();
+ $finder->files()->in($filesystemLocation)->ignoreDotFiles(false);
+
+ foreach ($finder as $file) {
+ // Replace Windows slashes or resulting zip will have issues on *nixes.
+ $relativePathname = str_replace('\\', '/', $file->getRelativePathname());
+
+ if (!$zip->addFile($file->getRealpath(), "{$placementLocation}/{$relativePathname}")) {
+ return Result::error($this, "Could not add directory $filesystemLocation to the archive; error adding {$file->getRealpath()}.");
+ }
+ }
+ } elseif (is_file($filesystemLocation)) {
+ if (!$zip->addFile($filesystemLocation, $placementLocation)) {
+ return Result::error($this, "Could not add file $filesystemLocation to the archive.");
+ }
+ } else {
+ return Result::error($this, "Could not find $filesystemLocation for the archive.");
+ }
+ }
+
+ return Result::success($this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Archive/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Archive/loadTasks.php
new file mode 100644
index 00000000..cf846fdf
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Archive/loadTasks.php
@@ -0,0 +1,25 @@
+task(Pack::class, $filename);
+ }
+
+ /**
+ * @param $filename
+ *
+ * @return Extract
+ */
+ protected function taskExtract($filename)
+ {
+ return $this->task(Extract::class, $filename);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Assets/CssPreprocessor.php b/src/composer/vendor/consolidation/robo/src/Task/Assets/CssPreprocessor.php
new file mode 100644
index 00000000..a15d2078
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Assets/CssPreprocessor.php
@@ -0,0 +1,214 @@
+files = $input;
+
+ $this->setDefaultCompiler();
+ }
+
+ protected function setDefaultCompiler()
+ {
+ if (isset($this->compilers[0])) {
+ //set first compiler as default
+ $this->compiler = $this->compilers[0];
+ }
+ }
+
+ /**
+ * Sets import directories
+ * Alias for setImportPaths
+ * @see CssPreprocessor::setImportPaths
+ *
+ * @param array|string $dirs
+ *
+ * @return $this
+ */
+ public function importDir($dirs)
+ {
+ return $this->setImportPaths($dirs);
+ }
+
+ /**
+ * Adds import directory
+ *
+ * @param string $dir
+ *
+ * @return $this
+ */
+ public function addImportPath($dir)
+ {
+ if (!isset($this->compilerOptions['importDirs'])) {
+ $this->compilerOptions['importDirs'] = [];
+ }
+
+ if (!in_array($dir, $this->compilerOptions['importDirs'], true)) {
+ $this->compilerOptions['importDirs'][] = $dir;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Sets import directories
+ *
+ * @param array|string $dirs
+ *
+ * @return $this
+ */
+ public function setImportPaths($dirs)
+ {
+ if (!is_array($dirs)) {
+ $dirs = [$dirs];
+ }
+
+ $this->compilerOptions['importDirs'] = $dirs;
+
+ return $this;
+ }
+
+ /**
+ * @param string $formatterName
+ *
+ * @return $this
+ */
+ public function setFormatter($formatterName)
+ {
+ $this->compilerOptions['formatter'] = $formatterName;
+
+ return $this;
+ }
+
+ /**
+ * Sets the compiler.
+ *
+ * @param string $compiler
+ * @param array $options
+ *
+ * @return $this
+ */
+ public function compiler($compiler, array $options = [])
+ {
+ $this->compiler = $compiler;
+ $this->compilerOptions = array_merge($this->compilerOptions, $options);
+
+ return $this;
+ }
+
+ /**
+ * Compiles file
+ *
+ * @param $file
+ *
+ * @return bool|mixed
+ */
+ protected function compile($file)
+ {
+ if (is_callable($this->compiler)) {
+ return call_user_func($this->compiler, $file, $this->compilerOptions);
+ }
+
+ if (method_exists($this, $this->compiler)) {
+ return $this->{$this->compiler}($file);
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (!in_array($this->compiler, $this->compilers, true)
+ && !is_callable($this->compiler)
+ ) {
+ $message = sprintf('Invalid ' . static::FORMAT_NAME . ' compiler %s!', $this->compiler);
+
+ return Result::error($this, $message);
+ }
+
+ foreach ($this->files as $in => $out) {
+ if (!file_exists($in)) {
+ $message = sprintf('File %s not found.', $in);
+
+ return Result::error($this, $message);
+ }
+ if (file_exists($out) && !is_writable($out)) {
+ return Result::error($this, 'Destination already exists and cannot be overwritten.');
+ }
+ }
+
+ foreach ($this->files as $in => $out) {
+ $css = $this->compile($in);
+
+ if ($css instanceof Result) {
+ return $css;
+ } elseif (false === $css) {
+ $message = sprintf(
+ ucfirst(static::FORMAT_NAME) . ' compilation failed for %s.',
+ $in
+ );
+
+ return Result::error($this, $message);
+ }
+
+ $dst = $out . '.part';
+ $write_result = file_put_contents($dst, $css);
+
+ if (false === $write_result) {
+ $message = sprintf('File write failed: %s', $out);
+
+ @unlink($dst);
+ return Result::error($this, $message);
+ }
+
+ // Cannot be cross-volume: should always succeed
+ @rename($dst, $out);
+
+ $this->printTaskSuccess('Wrote CSS to {filename}', ['filename' => $out]);
+ }
+
+ return Result::success($this, 'All ' . static::FORMAT_NAME . ' files compiled.');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Assets/ImageMinify.php b/src/composer/vendor/consolidation/robo/src/Task/Assets/ImageMinify.php
new file mode 100644
index 00000000..1aa62593
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Assets/ImageMinify.php
@@ -0,0 +1,716 @@
+taskImageMinify('assets/images/*')
+ * ->to('dist/images/')
+ * ->run();
+ * ```
+ *
+ * This will use the following minifiers:
+ *
+ * - PNG: optipng
+ * - GIF: gifsicle
+ * - JPG, JPEG: jpegtran
+ * - SVG: svgo
+ *
+ * When the minifier is specified the task will use that for all the input files. In that case
+ * it is useful to filter the files with the extension:
+ *
+ * ```php
+ * $this->taskImageMinify('assets/images/*.png')
+ * ->to('dist/images/')
+ * ->minifier('pngcrush');
+ * ->run();
+ * ```
+ *
+ * The task supports the following minifiers:
+ *
+ * - optipng
+ * - pngquant
+ * - advpng
+ * - pngout
+ * - zopflipng
+ * - pngcrush
+ * - gifsicle
+ * - jpegoptim
+ * - jpeg-recompress
+ * - jpegtran
+ * - svgo (only minification, no downloading)
+ *
+ * You can also specifiy extra options for the minifiers:
+ *
+ * ```php
+ * $this->taskImageMinify('assets/images/*.jpg')
+ * ->to('dist/images/')
+ * ->minifier('jpegtran', ['-progressive' => null, '-copy' => 'none'])
+ * ->run();
+ * ```
+ *
+ * This will execute as:
+ * `jpegtran -copy none -progressive -optimize -outfile "dist/images/test.jpg" "/var/www/test/assets/images/test.jpg"`
+ */
+class ImageMinify extends BaseTask
+{
+ /**
+ * Destination directory for the minified images.
+ *
+ * @var string
+ */
+ protected $to;
+
+ /**
+ * Array of the source files.
+ *
+ * @var array
+ */
+ protected $dirs = [];
+
+ /**
+ * Symfony 2 filesystem.
+ *
+ * @var sfFilesystem
+ */
+ protected $fs;
+
+ /**
+ * Target directory for the downloaded binary executables.
+ *
+ * @var string
+ */
+ protected $executableTargetDir;
+
+ /**
+ * Array for the downloaded binary executables.
+ *
+ * @var array
+ */
+ protected $executablePaths = [];
+
+ /**
+ * Array for the individual results of all the files.
+ *
+ * @var array
+ */
+ protected $results = [];
+
+ /**
+ * Default minifier to use.
+ *
+ * @var string
+ */
+ protected $minifier;
+
+ /**
+ * Array for minifier options.
+ *
+ * @var array
+ */
+ protected $minifierOptions = [];
+
+ /**
+ * Supported minifiers.
+ *
+ * @var array
+ */
+ protected $minifiers = [
+ // Default 4
+ 'optipng',
+ 'gifsicle',
+ 'jpegtran',
+ 'svgo',
+ // PNG
+ 'pngquant',
+ 'advpng',
+ 'pngout',
+ 'zopflipng',
+ 'pngcrush',
+ // JPG
+ 'jpegoptim',
+ 'jpeg-recompress',
+ ];
+
+ /**
+ * Binary repositories of Imagemin.
+ *
+ * @link https://github.com/imagemin
+ *
+ * @var array
+ */
+ protected $imageminRepos = [
+ // PNG
+ 'optipng' => 'https://github.com/imagemin/optipng-bin',
+ 'pngquant' => 'https://github.com/imagemin/pngquant-bin',
+ 'advpng' => 'https://github.com/imagemin/advpng-bin',
+ 'pngout' => 'https://github.com/imagemin/pngout-bin',
+ 'zopflipng' => 'https://github.com/imagemin/zopflipng-bin',
+ 'pngcrush' => 'https://github.com/imagemin/pngcrush-bin',
+ // Gif
+ 'gifsicle' => 'https://github.com/imagemin/gifsicle-bin',
+ // JPG
+ 'jpegtran' => 'https://github.com/imagemin/jpegtran-bin',
+ 'jpegoptim' => 'https://github.com/imagemin/jpegoptim-bin',
+ 'cjpeg' => 'https://github.com/imagemin/mozjpeg-bin', // note: we do not support this minifier because it creates JPG from non-JPG files
+ 'jpeg-recompress' => 'https://github.com/imagemin/jpeg-recompress-bin',
+ // WebP
+ 'cwebp' => 'https://github.com/imagemin/cwebp-bin', // note: we do not support this minifier because it creates WebP from non-WebP files
+ ];
+
+ public function __construct($dirs)
+ {
+ is_array($dirs)
+ ? $this->dirs = $dirs
+ : $this->dirs[] = $dirs;
+
+ $this->fs = new sfFilesystem();
+
+ // guess the best path for the executables based on __DIR__
+ if (($pos = strpos(__DIR__, 'consolidation/robo')) !== false) {
+ // the executables should be stored in vendor/bin
+ $this->executableTargetDir = substr(__DIR__, 0, $pos).'bin';
+ }
+
+ // check if the executables are already available
+ foreach ($this->imageminRepos as $exec => $url) {
+ $path = $this->executableTargetDir.'/'.$exec;
+ // if this is Windows add a .exe extension
+ if (substr($this->getOS(), 0, 3) == 'win') {
+ $path .= '.exe';
+ }
+ if (is_file($path)) {
+ $this->executablePaths[$exec] = $path;
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ // find the files
+ $files = $this->findFiles($this->dirs);
+
+ // minify the files
+ $result = $this->minify($files);
+ // check if there was an error
+ if ($result instanceof Result) {
+ return $result;
+ }
+
+ $amount = (count($files) == 1 ? 'image' : 'images');
+ $message = "Minified {filecount} out of {filetotal} $amount into {destination}";
+ $context = ['filecount' => count($this->results['success']), 'filetotal' => count($files), 'destination' => $this->to];
+
+ if (count($this->results['success']) == count($files)) {
+ $this->printTaskSuccess($message, $context);
+
+ return Result::success($this, $message, $context);
+ } else {
+ return Result::error($this, $message, $context);
+ }
+ }
+
+ /**
+ * Sets the target directory where the files will be copied to.
+ *
+ * @param string $target
+ *
+ * @return $this
+ */
+ public function to($target)
+ {
+ $this->to = rtrim($target, '/');
+
+ return $this;
+ }
+
+ /**
+ * Sets the minifier.
+ *
+ * @param string $minifier
+ * @param array $options
+ *
+ * @return $this
+ */
+ public function minifier($minifier, array $options = [])
+ {
+ $this->minifier = $minifier;
+ $this->minifierOptions = array_merge($this->minifierOptions, $options);
+
+ return $this;
+ }
+
+ /**
+ * @param array $dirs
+ *
+ * @return array|\Robo\Result
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ protected function findFiles($dirs)
+ {
+ $files = array();
+
+ // find the files
+ foreach ($dirs as $k => $v) {
+ // reset finder
+ $finder = new Finder();
+
+ $dir = $k;
+ $to = $v;
+ // check if target was given with the to() method instead of key/value pairs
+ if (is_int($k)) {
+ $dir = $v;
+ if (isset($this->to)) {
+ $to = $this->to;
+ } else {
+ throw new TaskException($this, 'target directory is not defined');
+ }
+ }
+
+ try {
+ $finder->files()->in($dir);
+ } catch (\InvalidArgumentException $e) {
+ // if finder cannot handle it, try with in()->name()
+ if (strpos($dir, '/') === false) {
+ $dir = './'.$dir;
+ }
+ $parts = explode('/', $dir);
+ $new_dir = implode('/', array_slice($parts, 0, -1));
+ try {
+ $finder->files()->in($new_dir)->name(array_pop($parts));
+ } catch (\InvalidArgumentException $e) {
+ return Result::fromException($this, $e);
+ }
+ }
+
+ foreach ($finder as $file) {
+ // store the absolute path as key and target as value in the files array
+ $files[$file->getRealpath()] = $this->getTarget($file->getRealPath(), $to);
+ }
+ $fileNoun = count($finder) == 1 ? ' file' : ' files';
+ $this->printTaskInfo("Found {filecount} $fileNoun in {dir}", ['filecount' => count($finder), 'dir' => $dir]);
+ }
+
+ return $files;
+ }
+
+ /**
+ * @param string $file
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function getTarget($file, $to)
+ {
+ $target = $to.'/'.basename($file);
+
+ return $target;
+ }
+
+ /**
+ * @param array $files
+ *
+ * @return \Robo\Result
+ */
+ protected function minify($files)
+ {
+ // store the individual results into the results array
+ $this->results = [
+ 'success' => [],
+ 'error' => [],
+ ];
+
+ // loop through the files
+ foreach ($files as $from => $to) {
+ if (!isset($this->minifier)) {
+ // check filetype based on the extension
+ $extension = strtolower(pathinfo($from, PATHINFO_EXTENSION));
+
+ // set the default minifiers based on the extension
+ switch ($extension) {
+ case 'png':
+ $minifier = 'optipng';
+ break;
+ case 'jpg':
+ case 'jpeg':
+ $minifier = 'jpegtran';
+ break;
+ case 'gif':
+ $minifier = 'gifsicle';
+ break;
+ case 'svg':
+ $minifier = 'svgo';
+ break;
+ }
+ } else {
+ if (!in_array($this->minifier, $this->minifiers, true)
+ && !is_callable(strtr($this->minifier, '-', '_'))
+ ) {
+ $message = sprintf('Invalid minifier %s!', $this->minifier);
+
+ return Result::error($this, $message);
+ }
+ $minifier = $this->minifier;
+ }
+
+ // Convert minifier name to camelCase (e.g. jpeg-recompress)
+ $funcMinifier = $this->camelCase($minifier);
+
+ // call the minifier method which prepares the command
+ if (is_callable($funcMinifier)) {
+ $command = call_user_func($funcMinifier, $from, $to, $this->minifierOptions);
+ } elseif (method_exists($this, $funcMinifier)) {
+ $command = $this->{$funcMinifier}($from, $to);
+ } else {
+ $message = sprintf('Minifier method %s cannot be found!', $funcMinifier);
+
+ return Result::error($this, $message);
+ }
+
+ // launch the command
+ $this->printTaskInfo('Minifying {filepath} with {minifier}', ['filepath' => $from, 'minifier' => $minifier]);
+ $result = $this->executeCommand($command);
+
+ // check the return code
+ if ($result->getExitCode() == 127) {
+ $this->printTaskError('The {minifier} executable cannot be found', ['minifier' => $minifier]);
+ // try to install from imagemin repository
+ if (array_key_exists($minifier, $this->imageminRepos)) {
+ $result = $this->installFromImagemin($minifier);
+ if ($result instanceof Result) {
+ if ($result->wasSuccessful()) {
+ $this->printTaskSuccess($result->getMessage());
+ // retry the conversion with the downloaded executable
+ if (is_callable($minifier)) {
+ $command = call_user_func($minifier, $from, $to, $minifierOptions);
+ } elseif (method_exists($this, $minifier)) {
+ $command = $this->{$minifier}($from, $to);
+ }
+ // launch the command
+ $this->printTaskInfo('Minifying {filepath} with {minifier}', ['filepath' => $from, 'minifier' => $minifier]);
+ $result = $this->executeCommand($command);
+ } else {
+ $this->printTaskError($result->getMessage());
+ // the download was not successful
+ return $result;
+ }
+ }
+ } else {
+ return $result;
+ }
+ }
+
+ // check the success of the conversion
+ if ($result->getExitCode() !== 0) {
+ $this->results['error'][] = $from;
+ } else {
+ $this->results['success'][] = $from;
+ }
+ }
+ }
+
+ /**
+ * @return string
+ */
+ protected function getOS()
+ {
+ $os = php_uname('s');
+ $os .= '/'.php_uname('m');
+ // replace x86_64 to x64, because the imagemin repo uses that
+ $os = str_replace('x86_64', 'x64', $os);
+ // replace i386, i686, etc to x86, because of imagemin
+ $os = preg_replace('/i[0-9]86/', 'x86', $os);
+ // turn info to lowercase, because of imagemin
+ $os = strtolower($os);
+
+ return $os;
+ }
+
+ /**
+ * @param string $command
+ *
+ * @return \Robo\Result
+ */
+ protected function executeCommand($command)
+ {
+ // insert the options into the command
+ $a = explode(' ', $command);
+ $executable = array_shift($a);
+ foreach ($this->minifierOptions as $key => $value) {
+ // first prepend the value
+ if (!empty($value)) {
+ array_unshift($a, $value);
+ }
+ // then add the key
+ if (!is_numeric($key)) {
+ array_unshift($a, $key);
+ }
+ }
+ // check if the executable can be replaced with the downloaded one
+ if (array_key_exists($executable, $this->executablePaths)) {
+ $executable = $this->executablePaths[$executable];
+ }
+ array_unshift($a, $executable);
+ $command = implode(' ', $a);
+
+ // execute the command
+ $exec = new Exec($command);
+
+ return $exec->inflect($this)->printed(false)->run();
+ }
+
+ /**
+ * @param string $executable
+ *
+ * @return \Robo\Result
+ */
+ protected function installFromImagemin($executable)
+ {
+ // check if there is an url defined for the executable
+ if (!array_key_exists($executable, $this->imageminRepos)) {
+ $message = sprintf('The executable %s cannot be found in the defined imagemin repositories', $executable);
+
+ return Result::error($this, $message);
+ }
+ $this->printTaskInfo('Downloading the {executable} executable from the imagemin repository', ['executable' => $executable]);
+
+ $os = $this->getOS();
+ $url = $this->imageminRepos[$executable].'/blob/master/vendor/'.$os.'/'.$executable.'?raw=true';
+ if (substr($os, 0, 3) == 'win') {
+ // if it is win, add a .exe extension
+ $url = $this->imageminRepos[$executable].'/blob/master/vendor/'.$os.'/'.$executable.'.exe?raw=true';
+ }
+ $data = @file_get_contents($url, false, null);
+ if ($data === false) {
+ // there is something wrong with the url, try it without the version info
+ $url = preg_replace('/x[68][64]\//', '', $url);
+ $data = @file_get_contents($url, false, null);
+ if ($data === false) {
+ // there is still something wrong with the url if it is win, try with win32
+ if (substr($os, 0, 3) == 'win') {
+ $url = preg_replace('win/', 'win32/', $url);
+ $data = @file_get_contents($url, false, null);
+ if ($data === false) {
+ // there is nothing more we can do
+ $message = sprintf('Could not download the executable %s', $executable);
+
+ return Result::error($this, $message);
+ }
+ }
+ // if it is not windows there is nothing we can do
+ $message = sprintf('Could not download the executable %s', $executable);
+
+ return Result::error($this, $message);
+ }
+ }
+ // check if target directory exists
+ if (!is_dir($this->executableTargetDir)) {
+ mkdir($this->executableTargetDir);
+ }
+ // save the executable into the target dir
+ $path = $this->executableTargetDir.'/'.$executable;
+ if (substr($os, 0, 3) == 'win') {
+ // if it is win, add a .exe extension
+ $path = $this->executableTargetDir.'/'.$executable.'.exe';
+ }
+ $result = file_put_contents($path, $data);
+ if ($result === false) {
+ $message = sprintf('Could not copy the executable %s to %s', $executable, $target_dir);
+
+ return Result::error($this, $message);
+ }
+ // set the binary to executable
+ chmod($path, 0755);
+
+ // if everything successful, store the executable path
+ $this->executablePaths[$executable] = $this->executableTargetDir.'/'.$executable;
+ // if it is win, add a .exe extension
+ if (substr($os, 0, 3) == 'win') {
+ $this->executablePaths[$executable] .= '.exe';
+ }
+
+ $message = sprintf('Executable %s successfully downloaded', $executable);
+
+ return Result::success($this, $message);
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function optipng($from, $to)
+ {
+ $command = sprintf('optipng -quiet -out "%s" -- "%s"', $to, $from);
+ if ($from != $to && is_file($to)) {
+ // earlier versions of optipng do not overwrite the target without a backup
+ // http://sourceforge.net/p/optipng/bugs/37/
+ unlink($to);
+ }
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function jpegtran($from, $to)
+ {
+ $command = sprintf('jpegtran -optimize -outfile "%s" "%s"', $to, $from);
+
+ return $command;
+ }
+
+ protected function gifsicle($from, $to)
+ {
+ $command = sprintf('gifsicle -o "%s" "%s"', $to, $from);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function svgo($from, $to)
+ {
+ $command = sprintf('svgo "%s" "%s"', $from, $to);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function pngquant($from, $to)
+ {
+ $command = sprintf('pngquant --force --output "%s" "%s"', $to, $from);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function advpng($from, $to)
+ {
+ // advpng does not have any output parameters, copy the file and then compress the copy
+ $command = sprintf('advpng --recompress --quiet "%s"', $to);
+ $this->fs->copy($from, $to, true);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function pngout($from, $to)
+ {
+ $command = sprintf('pngout -y -q "%s" "%s"', $from, $to);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function zopflipng($from, $to)
+ {
+ $command = sprintf('zopflipng -y "%s" "%s"', $from, $to);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function pngcrush($from, $to)
+ {
+ $command = sprintf('pngcrush -q -ow "%s" "%s"', $from, $to);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function jpegoptim($from, $to)
+ {
+ // jpegoptim only takes the destination directory as an argument
+ $command = sprintf('jpegoptim --quiet -o --dest "%s" "%s"', dirname($to), $from);
+
+ return $command;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function jpegRecompress($from, $to)
+ {
+ $command = sprintf('jpeg-recompress --quiet "%s" "%s"', $from, $to);
+
+ return $command;
+ }
+
+ /**
+ * @param string $text
+ *
+ * @return string
+ */
+ public static function camelCase($text)
+ {
+ // non-alpha and non-numeric characters become spaces
+ $text = preg_replace('/[^a-z0-9]+/i', ' ', $text);
+ $text = trim($text);
+ // uppercase the first character of each word
+ $text = ucwords($text);
+ $text = str_replace(" ", "", $text);
+ $text = lcfirst($text);
+
+ return $text;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Assets/Less.php b/src/composer/vendor/consolidation/robo/src/Task/Assets/Less.php
new file mode 100644
index 00000000..4cfa0978
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Assets/Less.php
@@ -0,0 +1,108 @@
+taskLess([
+ * 'less/default.less' => 'css/default.css'
+ * ])
+ * ->run();
+ * ?>
+ * ```
+ *
+ * Use one of both less compilers in your project:
+ *
+ * ```
+ * "leafo/lessphp": "~0.5",
+ * "oyejorge/less.php": "~1.5"
+ * ```
+ *
+ * Specify directory (string or array) for less imports lookup:
+ *
+ * ```php
+ * taskLess([
+ * 'less/default.less' => 'css/default.css'
+ * ])
+ * ->importDir('less')
+ * ->compiler('lessphp')
+ * ->run();
+ * ?>
+ * ```
+ *
+ * You can implement additional compilers by extending this task and adding a
+ * method named after them and overloading the lessCompilers() method to
+ * inject the name there.
+ */
+class Less extends CssPreprocessor
+{
+ const FORMAT_NAME = 'less';
+
+ /**
+ * @var string[]
+ */
+ protected $compilers = [
+ 'less', // https://github.com/oyejorge/less.php
+ 'lessphp', //https://github.com/leafo/lessphp
+ ];
+
+ /**
+ * lessphp compiler
+ * @link https://github.com/leafo/lessphp
+ *
+ * @param string $file
+ *
+ * @return string
+ */
+ protected function lessphp($file)
+ {
+ if (!class_exists('\lessc')) {
+ return Result::errorMissingPackage($this, 'lessc', 'leafo/lessphp');
+ }
+
+ $lessCode = file_get_contents($file);
+
+ $less = new \lessc();
+ if (isset($this->compilerOptions['importDirs'])) {
+ $less->setImportDir($this->compilerOptions['importDirs']);
+ }
+
+ return $less->compile($lessCode);
+ }
+
+ /**
+ * less compiler
+ * @link https://github.com/oyejorge/less.php
+ *
+ * @param string $file
+ *
+ * @return string
+ */
+ protected function less($file)
+ {
+ if (!class_exists('\Less_Parser')) {
+ return Result::errorMissingPackage($this, 'Less_Parser', 'oyejorge/less.php');
+ }
+
+ $lessCode = file_get_contents($file);
+
+ $parser = new \Less_Parser();
+ $parser->SetOptions($this->compilerOptions);
+ if (isset($this->compilerOptions['importDirs'])) {
+ $importDirs = [];
+ foreach ($this->compilerOptions['importDirs'] as $dir) {
+ $importDirs[$dir] = $dir;
+ }
+ $parser->SetImportDirs($importDirs);
+ }
+
+ $parser->parse($lessCode);
+
+ return $parser->getCss();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Assets/Minify.php b/src/composer/vendor/consolidation/robo/src/Task/Assets/Minify.php
new file mode 100644
index 00000000..3187714e
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Assets/Minify.php
@@ -0,0 +1,297 @@
+taskMinify( 'web/assets/theme.css' )
+ * ->run()
+ * ?>
+ * ```
+ * Please install additional dependencies to use:
+ *
+ * ```
+ * "patchwork/jsqueeze": "~1.0",
+ * "natxet/CssMin": "~3.0"
+ * ```
+ */
+class Minify extends BaseTask
+{
+ /**
+ * @var array
+ */
+ protected $types = ['css', 'js'];
+
+ /**
+ * @var string
+ */
+ protected $text;
+
+ /**
+ * @var string
+ */
+ protected $dst;
+
+ /**
+ * @var string
+ */
+ protected $type;
+
+ /**
+ * @var array
+ */
+ protected $squeezeOptions = [
+ 'singleLine' => true,
+ 'keepImportantComments' => true,
+ 'specialVarRx' => false,
+ ];
+
+ /**
+ * Constructor. Accepts asset file path or string source.
+ *
+ * @param string $input
+ */
+ public function __construct($input)
+ {
+ if (file_exists($input)) {
+ $this->fromFile($input);
+ return;
+ }
+
+ $this->fromText($input);
+ }
+
+ /**
+ * Sets destination. Tries to guess type from it.
+ *
+ * @param string $dst
+ *
+ * @return $this
+ */
+ public function to($dst)
+ {
+ $this->dst = $dst;
+
+ if (!empty($this->dst) && empty($this->type)) {
+ $this->type($this->getExtension($this->dst));
+ }
+
+ return $this;
+ }
+
+ /**
+ * Sets type with validation.
+ *
+ * @param string $type css|js
+ *
+ * @return $this
+ */
+ public function type($type)
+ {
+ $type = strtolower($type);
+
+ if (in_array($type, $this->types)) {
+ $this->type = $type;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Sets text from string source.
+ *
+ * @param string $text
+ *
+ * @return $this
+ */
+ protected function fromText($text)
+ {
+ $this->text = (string)$text;
+ unset($this->type);
+
+ return $this;
+ }
+
+ /**
+ * Sets text from asset file path. Tries to guess type and set default destination.
+ *
+ * @param string $path
+ *
+ * @return $this
+ */
+ protected function fromFile($path)
+ {
+ $this->text = file_get_contents($path);
+
+ unset($this->type);
+ $this->type($this->getExtension($path));
+
+ if (empty($this->dst) && !empty($this->type)) {
+ $ext_length = strlen($this->type) + 1;
+ $this->dst = substr($path, 0, -$ext_length) . '.min.' . $this->type;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Gets file extension from path.
+ *
+ * @param string $path
+ *
+ * @return string
+ */
+ protected function getExtension($path)
+ {
+ return pathinfo($path, PATHINFO_EXTENSION);
+ }
+
+ /**
+ * Minifies and returns text.
+ *
+ * @return string|bool
+ */
+ protected function getMinifiedText()
+ {
+ switch ($this->type) {
+ case 'css':
+ if (!class_exists('\CssMin')) {
+ return Result::errorMissingPackage($this, 'CssMin', 'natxet/CssMin');
+ }
+
+ return \CssMin::minify($this->text);
+ break;
+
+ case 'js':
+ if (!class_exists('\JSqueeze') && !class_exists('\Patchwork\JSqueeze')) {
+ return Result::errorMissingPackage($this, 'Patchwork\JSqueeze', 'patchwork/jsqueeze');
+ }
+
+ if (class_exists('\JSqueeze')) {
+ $jsqueeze = new \JSqueeze();
+ } else {
+ $jsqueeze = new \Patchwork\JSqueeze();
+ }
+
+ return $jsqueeze->squeeze(
+ $this->text,
+ $this->squeezeOptions['singleLine'],
+ $this->squeezeOptions['keepImportantComments'],
+ $this->squeezeOptions['specialVarRx']
+ );
+ break;
+ }
+
+ return false;
+ }
+
+ /**
+ * Single line option for the JS minimisation.
+ *
+ * @param bool $singleLine
+ *
+ * @return $this
+ */
+ public function singleLine($singleLine)
+ {
+ $this->squeezeOptions['singleLine'] = (bool)$singleLine;
+ return $this;
+ }
+
+ /**
+ * keepImportantComments option for the JS minimisation.
+ *
+ * @param bool $keepImportantComments
+ *
+ * @return $this
+ */
+ public function keepImportantComments($keepImportantComments)
+ {
+ $this->squeezeOptions['keepImportantComments'] = (bool)$keepImportantComments;
+ return $this;
+ }
+
+ /**
+ * specialVarRx option for the JS minimisation.
+ *
+ * @param bool $specialVarRx
+ *
+ * @return $this ;
+ */
+ public function specialVarRx($specialVarRx)
+ {
+ $this->squeezeOptions['specialVarRx'] = (bool)$specialVarRx;
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string) $this->getMinifiedText();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (empty($this->type)) {
+ return Result::error($this, 'Unknown asset type.');
+ }
+
+ if (empty($this->dst)) {
+ return Result::error($this, 'Unknown file destination.');
+ }
+
+ if (file_exists($this->dst) && !is_writable($this->dst)) {
+ return Result::error($this, 'Destination already exists and cannot be overwritten.');
+ }
+
+ $size_before = strlen($this->text);
+ $minified = $this->getMinifiedText();
+
+ if ($minified instanceof Result) {
+ return $minified;
+ } elseif (false === $minified) {
+ return Result::error($this, 'Minification failed.');
+ }
+
+ $size_after = strlen($minified);
+
+ // Minification did not reduce file size, so use original file.
+ if ($size_after > $size_before) {
+ $minified = $this->text;
+ $size_after = $size_before;
+ }
+
+ $dst = $this->dst . '.part';
+ $write_result = file_put_contents($dst, $minified);
+
+ if (false === $write_result) {
+ @unlink($dst);
+ return Result::error($this, 'File write failed.');
+ }
+ // Cannot be cross-volume; should always succeed.
+ @rename($dst, $this->dst);
+ if ($size_before === 0) {
+ $minified_percent = 0;
+ } else {
+ $minified_percent = number_format(100 - ($size_after / $size_before * 100), 1);
+ }
+ $this->printTaskSuccess('Wrote {filepath}', ['filepath' => $this->dst]);
+ $context = [
+ 'bytes' => $this->formatBytes($size_after),
+ 'reduction' => $this->formatBytes(($size_before - $size_after)),
+ 'percentage' => $minified_percent,
+ ];
+ $this->printTaskSuccess('Wrote {bytes} (reduced by {reduction} / {percentage})', $context);
+ return Result::success($this, 'Asset minified.');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Assets/Scss.php b/src/composer/vendor/consolidation/robo/src/Task/Assets/Scss.php
new file mode 100644
index 00000000..ffd39345
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Assets/Scss.php
@@ -0,0 +1,93 @@
+taskScss([
+ * 'scss/default.scss' => 'css/default.css'
+ * ])
+ * ->importDir('assets/styles')
+ * ->run();
+ * ?>
+ * ```
+ *
+ * Use the following scss compiler in your project:
+ *
+ * ```
+ * "leafo/scssphp": "~0.1",
+ * ```
+ *
+ * You can implement additional compilers by extending this task and adding a
+ * method named after them and overloading the scssCompilers() method to
+ * inject the name there.
+ */
+class Scss extends CssPreprocessor
+{
+ const FORMAT_NAME = 'scss';
+
+ /**
+ * @var string[]
+ */
+ protected $compilers = [
+ 'scssphp', // https://github.com/leafo/scssphp
+ ];
+
+ /**
+ * scssphp compiler
+ * @link https://github.com/leafo/scssphp
+ *
+ * @param string $file
+ *
+ * @return string
+ */
+ protected function scssphp($file)
+ {
+ if (!class_exists('\Leafo\ScssPhp\Compiler')) {
+ return Result::errorMissingPackage($this, 'scssphp', 'leafo/scssphp');
+ }
+
+ $scssCode = file_get_contents($file);
+ $scss = new \Leafo\ScssPhp\Compiler();
+
+ // set options for the scssphp compiler
+ if (isset($this->compilerOptions['importDirs'])) {
+ $scss->setImportPaths($this->compilerOptions['importDirs']);
+ }
+
+ if (isset($this->compilerOptions['formatter'])) {
+ $scss->setFormatter($this->compilerOptions['formatter']);
+ }
+
+ return $scss->compile($scssCode);
+ }
+
+ /**
+ * Sets the formatter for scssphp
+ *
+ * The method setFormatter($formatterName) sets the current formatter to $formatterName,
+ * the name of a class as a string that implements the formatting interface. See the source
+ * for Leafo\ScssPhp\Formatter\Expanded for an example.
+ *
+ * Five formatters are included with leafo/scssphp:
+ * - Leafo\ScssPhp\Formatter\Expanded
+ * - Leafo\ScssPhp\Formatter\Nested (default)
+ * - Leafo\ScssPhp\Formatter\Compressed
+ * - Leafo\ScssPhp\Formatter\Compact
+ * - Leafo\ScssPhp\Formatter\Crunched
+ *
+ * @link http://leafo.github.io/scssphp/docs/#output-formatting
+ *
+ * @param string $formatterName
+ *
+ * @return $this
+ */
+ public function setFormatter($formatterName)
+ {
+ return parent::setFormatter($formatterName);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Assets/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Assets/loadTasks.php
new file mode 100644
index 00000000..12192dd8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Assets/loadTasks.php
@@ -0,0 +1,45 @@
+task(Minify::class, $input);
+ }
+
+ /**
+ * @param string|string[] $input
+ *
+ * @return \Robo\Task\Assets\ImageMinify
+ */
+ protected function taskImageMinify($input)
+ {
+ return $this->task(ImageMinify::class, $input);
+ }
+
+ /**
+ * @param array $input
+ *
+ * @return \Robo\Task\Assets\Less
+ */
+ protected function taskLess($input)
+ {
+ return $this->task(Less::class, $input);
+ }
+
+ /**
+ * @param array $input
+ *
+ * @return \Robo\Task\Assets\Scss
+ */
+ protected function taskScss($input)
+ {
+ return $this->task(Scss::class, $input);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Base/Exec.php b/src/composer/vendor/consolidation/robo/src/Task/Base/Exec.php
new file mode 100644
index 00000000..5baccedd
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Base/Exec.php
@@ -0,0 +1,224 @@
+taskExec('compass')->arg('watch')->run();
+ * // or use shortcut
+ * $this->_exec('compass watch');
+ *
+ * $this->taskExec('compass watch')->background()->run();
+ *
+ * if ($this->taskExec('phpunit .')->run()->wasSuccessful()) {
+ * $this->say('tests passed');
+ * }
+ *
+ * ?>
+ * ```
+ */
+class Exec extends BaseTask implements CommandInterface, PrintedInterface, SimulatedInterface
+{
+ use \Robo\Common\CommandReceiver;
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var static[]
+ */
+ protected static $instances = [];
+
+ /**
+ * @var string|\Robo\Contract\CommandInterface
+ */
+ protected $command;
+
+ /**
+ * @var bool
+ */
+ protected $background = false;
+
+ /**
+ * @var null|int
+ */
+ protected $timeout = null;
+
+ /**
+ * @var null|int
+ */
+ protected $idleTimeout = null;
+
+ /**
+ * @var null|array
+ */
+ protected $env = null;
+
+ /**
+ * @var Process
+ */
+ protected $process;
+
+ /**
+ * @param string|\Robo\Contract\CommandInterface $command
+ */
+ public function __construct($command)
+ {
+ $this->command = $this->receiveCommand($command);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return trim($this->command . $this->arguments);
+ }
+
+ /**
+ * Executes command in background mode (asynchronously)
+ *
+ * @return $this
+ */
+ public function background()
+ {
+ self::$instances[] = $this;
+ $this->background = true;
+ return $this;
+ }
+
+ /**
+ * Stop command if it runs longer then $timeout in seconds
+ *
+ * @param int $timeout
+ *
+ * @return $this
+ */
+ public function timeout($timeout)
+ {
+ $this->timeout = $timeout;
+ return $this;
+ }
+
+ /**
+ * Stops command if it does not output something for a while
+ *
+ * @param int $timeout
+ *
+ * @return $this
+ */
+ public function idleTimeout($timeout)
+ {
+ $this->idleTimeout = $timeout;
+ return $this;
+ }
+
+ /**
+ * Sets the environment variables for the command
+ *
+ * @param array $env
+ *
+ * @return $this
+ */
+ public function env(array $env)
+ {
+ $this->env = $env;
+ return $this;
+ }
+
+ public function __destruct()
+ {
+ $this->stop();
+ }
+
+ protected function stop()
+ {
+ if ($this->background && $this->process->isRunning()) {
+ $this->process->stop();
+ $this->printTaskInfo("Stopped {command}", ['command' => $this->getCommand()]);
+ }
+ }
+
+ /**
+ * @param array $context
+ */
+ protected function printAction($context = [])
+ {
+ $command = $this->getCommand();
+ $dir = $this->workingDirectory ? " in {dir}" : "";
+ $this->printTaskInfo("Running {command}$dir", ['command' => $command, 'dir' => $this->workingDirectory] + $context);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printAction();
+ $this->process = new Process($this->getCommand());
+ $this->process->setTimeout($this->timeout);
+ $this->process->setIdleTimeout($this->idleTimeout);
+ $this->process->setWorkingDirectory($this->workingDirectory);
+
+ if (isset($this->env)) {
+ $this->process->setEnv($this->env);
+ }
+
+ if (!$this->background and !$this->isPrinted) {
+ $this->startTimer();
+ $this->process->run();
+ $this->stopTimer();
+ return new Result($this, $this->process->getExitCode(), $this->process->getOutput(), ['time' => $this->getExecutionTime()]);
+ }
+
+ if (!$this->background and $this->isPrinted) {
+ $this->startTimer();
+ $this->process->run(
+ function ($type, $buffer) {
+ $progressWasVisible = $this->hideTaskProgress();
+ print($buffer);
+ $this->showTaskProgress($progressWasVisible);
+ }
+ );
+ $this->stopTimer();
+ return new Result($this, $this->process->getExitCode(), $this->process->getOutput(), ['time' => $this->getExecutionTime()]);
+ }
+
+ try {
+ $this->process->start();
+ } catch (\Exception $e) {
+ return Result::fromException($this, $e);
+ }
+ return Result::success($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function simulate($context)
+ {
+ $this->printAction($context);
+ }
+
+ public static function stopRunningJobs()
+ {
+ foreach (self::$instances as $instance) {
+ if ($instance) {
+ unset($instance);
+ }
+ }
+ }
+}
+
+if (function_exists('pcntl_signal')) {
+ pcntl_signal(SIGTERM, ['Robo\Task\Base\Exec', 'stopRunningJobs']);
+}
+
+register_shutdown_function(['Robo\Task\Base\Exec', 'stopRunningJobs']);
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Base/ExecStack.php b/src/composer/vendor/consolidation/robo/src/Task/Base/ExecStack.php
new file mode 100644
index 00000000..b5855dee
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Base/ExecStack.php
@@ -0,0 +1,26 @@
+taskExecStack()
+ * ->stopOnFail()
+ * ->exec('mkdir site')
+ * ->exec('cd site')
+ * ->run();
+ *
+ * ?>
+ * ```
+ *
+ * @method $this stopOnFail()
+ */
+class ExecStack extends CommandStack
+{
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Base/ParallelExec.php b/src/composer/vendor/consolidation/robo/src/Task/Base/ParallelExec.php
new file mode 100644
index 00000000..2cd1ebc6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Base/ParallelExec.php
@@ -0,0 +1,177 @@
+taskParallelExec()
+ * ->process('php ~/demos/script.php hey')
+ * ->process('php ~/demos/script.php hoy')
+ * ->process('php ~/demos/script.php gou')
+ * ->run();
+ * ?>
+ * ```
+ *
+ *
+ * @method \Robo\Task\Base\ParallelExec timeout(int $timeout) stops process if it runs longer then `$timeout` (seconds)
+ * @method \Robo\Task\Base\ParallelExec idleTimeout(int $timeout) stops process if it does not output for time longer then `$timeout` (seconds)
+ */
+class ParallelExec extends BaseTask implements CommandInterface, PrintedInterface
+{
+ use \Robo\Common\CommandReceiver;
+
+ /**
+ * @var Process[]
+ */
+ protected $processes = [];
+
+ /**
+ * @var null|int
+ */
+ protected $timeout = null;
+
+ /**
+ * @var null|int
+ */
+ protected $idleTimeout = null;
+
+ /**
+ * @var bool
+ */
+ protected $isPrinted = false;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPrinted()
+ {
+ return $this->isPrinted;
+ }
+
+ /**
+ * @param bool $isPrinted
+ *
+ * @return $this
+ */
+ public function printed($isPrinted = true)
+ {
+ $this->isPrinted = $isPrinted;
+ return $this;
+ }
+
+ /**
+ * @param string|\Robo\Contract\CommandInterface $command
+ *
+ * @return $this
+ */
+ public function process($command)
+ {
+ $this->processes[] = new Process($this->receiveCommand($command));
+ return $this;
+ }
+
+ /**
+ * @param int $timeout
+ *
+ * @return $this
+ */
+ public function timeout($timeout)
+ {
+ $this->timeout = $timeout;
+ return $this;
+ }
+
+ /**
+ * @param int $idleTimeout
+ *
+ * @return $this
+ */
+ public function idleTimeout($idleTimeout)
+ {
+ $this->idleTimeout = $idleTimeout;
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return implode(' && ', $this->processes);
+ }
+
+ /**
+ * @return int
+ */
+ public function progressIndicatorSteps()
+ {
+ return count($this->processes);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ foreach ($this->processes as $process) {
+ $process->setIdleTimeout($this->idleTimeout);
+ $process->setTimeout($this->timeout);
+ $process->start();
+ $this->printTaskInfo($process->getCommandLine());
+ }
+
+ $this->startProgressIndicator();
+ $running = $this->processes;
+ while (true) {
+ foreach ($running as $k => $process) {
+ try {
+ $process->checkTimeout();
+ } catch (ProcessTimedOutException $e) {
+ $this->printTaskWarning("Process timed out for {command}", ['command' => $process->getCommandLine(), '_style' => ['command' => 'fg=white;bg=magenta']]);
+ }
+ if (!$process->isRunning()) {
+ $this->advanceProgressIndicator();
+ if ($this->isPrinted) {
+ $this->printTaskInfo("Output for {command}:\n\n{output}", ['command' => $process->getCommandLine(), 'output' => $process->getOutput(), '_style' => ['command' => 'fg=white;bg=magenta']]);
+ $errorOutput = $process->getErrorOutput();
+ if ($errorOutput) {
+ $this->printTaskError(rtrim($errorOutput));
+ }
+ }
+ unset($running[$k]);
+ }
+ }
+ if (empty($running)) {
+ break;
+ }
+ usleep(1000);
+ }
+ $this->stopProgressIndicator();
+
+ $errorMessage = '';
+ $exitCode = 0;
+ foreach ($this->processes as $p) {
+ if ($p->getExitCode() === 0) {
+ continue;
+ }
+ $errorMessage .= "'" . $p->getCommandLine() . "' exited with code ". $p->getExitCode()." \n";
+ $exitCode = max($exitCode, $p->getExitCode());
+ }
+ if (!$errorMessage) {
+ $this->printTaskSuccess('{process-count} processes finished running', ['process-count' => count($this->processes)]);
+ }
+
+ return new Result($this, $exitCode, $errorMessage, ['time' => $this->getExecutionTime()]);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Base/SymfonyCommand.php b/src/composer/vendor/consolidation/robo/src/Task/Base/SymfonyCommand.php
new file mode 100644
index 00000000..51c81d6d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Base/SymfonyCommand.php
@@ -0,0 +1,76 @@
+taskSymfonyCommand(new \Codeception\Command\Run('run'))
+ * ->arg('suite','acceptance')
+ * ->opt('debug')
+ * ->run();
+ *
+ * // Artisan Command
+ * $this->taskSymfonyCommand(new ModelGeneratorCommand())
+ * ->arg('name', 'User')
+ * ->run();
+ * ?>
+ * ```
+ */
+class SymfonyCommand extends BaseTask
+{
+ /**
+ * @var \Symfony\Component\Console\Command\Command
+ */
+ protected $command;
+
+ /**
+ * @var string[]
+ */
+ protected $input;
+
+ public function __construct(Command $command)
+ {
+ $this->command = $command;
+ $this->input = [];
+ }
+
+ /**
+ * @param string $arg
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function arg($arg, $value)
+ {
+ $this->input[$arg] = $value;
+ return $this;
+ }
+
+ public function opt($option, $value = null)
+ {
+ $this->input["--$option"] = $value;
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Running command {command}', ['command' => $this->command->getName()]);
+ return new Result(
+ $this,
+ $this->command->run(new ArrayInput($this->input), Robo::output())
+ );
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Base/Watch.php b/src/composer/vendor/consolidation/robo/src/Task/Base/Watch.php
new file mode 100644
index 00000000..d7940ac9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Base/Watch.php
@@ -0,0 +1,89 @@
+taskWatch()
+ * ->monitor('composer.json', function() {
+ * $this->taskComposerUpdate()->run();
+ * })->monitor('src', function() {
+ * $this->taskExec('phpunit')->run();
+ * })->run();
+ * ?>
+ * ```
+ */
+class Watch extends BaseTask
+{
+ /**
+ * @var \Closure
+ */
+ protected $closure;
+
+ /**
+ * @var array
+ */
+ protected $monitor = [];
+
+ /**
+ * @var object
+ */
+ protected $bindTo;
+
+ /**
+ * @param $bindTo
+ */
+ public function __construct($bindTo)
+ {
+ $this->bindTo = $bindTo;
+ }
+
+ /**
+ * @param string|string[] $paths
+ * @param \Closure $callable
+ *
+ * @return $this
+ */
+ public function monitor($paths, \Closure $callable)
+ {
+ if (!is_array($paths)) {
+ $paths = [$paths];
+ }
+ $this->monitor[] = [$paths, $callable];
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (!class_exists('Lurker\\ResourceWatcher')) {
+ return Result::errorMissingPackage($this, 'ResourceWatcher', 'henrikbjorn/lurker');
+ }
+
+ $watcher = new ResourceWatcher();
+
+ foreach ($this->monitor as $k => $monitor) {
+ /** @var \Closure $closure */
+ $closure = $monitor[1];
+ $closure->bindTo($this->bindTo);
+ foreach ($monitor[0] as $i => $dir) {
+ $watcher->track("fs.$k.$i", $dir, FilesystemEvent::MODIFY);
+ $this->printTaskInfo('Watching {dir} for changes...', ['dir' => $dir]);
+ $watcher->addListener("fs.$k.$i", $closure);
+ }
+ }
+
+ $watcher->start();
+ return Result::success($this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Base/loadShortcuts.php b/src/composer/vendor/consolidation/robo/src/Task/Base/loadShortcuts.php
new file mode 100644
index 00000000..dba0af66
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Base/loadShortcuts.php
@@ -0,0 +1,17 @@
+taskExec($command)->run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Base/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Base/loadTasks.php
new file mode 100644
index 00000000..530fbcd5
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Base/loadTasks.php
@@ -0,0 +1,45 @@
+task(Exec::class, $command);
+ }
+
+ protected function taskExecStack()
+ {
+ return $this->task(ExecStack::class);
+ }
+
+ /**
+ * @return ParallelExec
+ */
+ protected function taskParallelExec()
+ {
+ return $this->task(ParallelExec::class);
+ }
+
+ /**
+ * @param $command
+ * @return SymfonyCommand
+ */
+ protected function taskSymfonyCommand($command)
+ {
+ return $this->task(SymfonyCommand::class, $command);
+ }
+
+ /**
+ * @return Watch
+ */
+ protected function taskWatch()
+ {
+ return $this->task(Watch::class, $this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/BaseTask.php b/src/composer/vendor/consolidation/robo/src/Task/BaseTask.php
new file mode 100644
index 00000000..36c9fa8c
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/BaseTask.php
@@ -0,0 +1,35 @@
+logger) {
+ $child->setLogger($this->logger);
+ }
+ if ($child instanceof ProgressIndicatorAwareInterface && $this->progressIndicator) {
+ $child->setProgressIndicator($this->progressIndicator);
+ }
+ if ($child instanceof ConfigAwareInterface && $this->getConfig()) {
+ $child->setConfig($this->getConfig());
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Bower/Base.php b/src/composer/vendor/consolidation/robo/src/Task/Bower/Base.php
new file mode 100644
index 00000000..9bc614c6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Bower/Base.php
@@ -0,0 +1,88 @@
+option('allow-root');
+ return $this;
+ }
+
+ /**
+ * adds `force-latest` option to bower
+ *
+ * @return $this
+ */
+ public function forceLatest()
+ {
+ $this->option('force-latest');
+ return $this;
+ }
+
+ /**
+ * adds `production` option to bower
+ *
+ * @return $this
+ */
+ public function noDev()
+ {
+ $this->option('production');
+ return $this;
+ }
+
+ /**
+ * adds `offline` option to bower
+ *
+ * @return $this
+ */
+ public function offline()
+ {
+ $this->option('offline');
+ return $this;
+ }
+
+ /**
+ * Base constructor.
+ *
+ * @param null|string $pathToBower
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToBower = null)
+ {
+ $this->command = $pathToBower;
+ if (!$this->command) {
+ $this->command = $this->findExecutable('bower');
+ }
+ if (!$this->command) {
+ throw new TaskException(__CLASS__, "Bower executable not found.");
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getCommand()
+ {
+ return "{$this->command} {$this->action}{$this->arguments}";
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Bower/Install.php b/src/composer/vendor/consolidation/robo/src/Task/Bower/Install.php
new file mode 100644
index 00000000..d7fb57dd
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Bower/Install.php
@@ -0,0 +1,37 @@
+taskBowerInstall()->run();
+ *
+ * // prefer dist with custom path
+ * $this->taskBowerInstall('path/to/my/bower')
+ * ->noDev()
+ * ->run();
+ * ?>
+ * ```
+ */
+class Install extends Base implements CommandInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $action = 'install';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Install Bower packages: {arguments}', ['arguments' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Bower/Update.php b/src/composer/vendor/consolidation/robo/src/Task/Bower/Update.php
new file mode 100644
index 00000000..1d2c53f9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Bower/Update.php
@@ -0,0 +1,36 @@
+taskBowerUpdate->run();
+ *
+ * // prefer dist with custom path
+ * $this->taskBowerUpdate('path/to/my/bower')
+ * ->noDev()
+ * ->run();
+ * ?>
+ * ```
+ */
+class Update extends Base
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $action = 'update';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Update Bower packages: {arguments}', ['arguments' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Bower/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Bower/loadTasks.php
new file mode 100644
index 00000000..6e33f8ac
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Bower/loadTasks.php
@@ -0,0 +1,25 @@
+task(Install::class, $pathToBower);
+ }
+
+ /**
+ * @param null|string $pathToBower
+ *
+ * @return Update
+ */
+ protected function taskBowerUpdate($pathToBower = null)
+ {
+ return $this->task(Update::class, $pathToBower);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/CommandStack.php b/src/composer/vendor/consolidation/robo/src/Task/CommandStack.php
new file mode 100644
index 00000000..542bf6d8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/CommandStack.php
@@ -0,0 +1,123 @@
+exec);
+ }
+
+ /**
+ * @param string $executable
+ *
+ * @return $this
+ */
+ public function executable($executable)
+ {
+ $this->executable = $executable;
+ return $this;
+ }
+
+ /**
+ * @param string|string[] $command
+ *
+ * @return $this
+ */
+ public function exec($command)
+ {
+ if (is_array($command)) {
+ $command = implode(' ', array_filter($command));
+ }
+
+ $command = $this->executable . ' ' . $this->stripExecutableFromCommand($command);
+ array_push($this->exec, trim($command));
+ return $this;
+ }
+
+ /**
+ * @param bool $stopOnFail
+ *
+ * @return $this
+ */
+ public function stopOnFail($stopOnFail = true)
+ {
+ $this->stopOnFail = $stopOnFail;
+ return $this;
+ }
+
+ public function result($result)
+ {
+ $this->result = $result;
+ return $this;
+ }
+
+ /**
+ * @param string $command
+ *
+ * @return string
+ */
+ protected function stripExecutableFromCommand($command)
+ {
+ $command = trim($command);
+ $executable = $this->executable . ' ';
+ if (strpos($command, $executable) === 0) {
+ $command = substr($command, strlen($executable));
+ }
+ return $command;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (empty($this->exec)) {
+ throw new TaskException($this, 'You must add at least one command');
+ }
+ if (!$this->stopOnFail) {
+ $this->printTaskInfo('{command}', ['command' => $this->getCommand()]);
+ return $this->executeCommand($this->getCommand());
+ }
+
+ foreach ($this->exec as $command) {
+ $this->printTaskInfo("Executing {command}", ['command' => $command]);
+ $result = $this->executeCommand($command);
+ if (!$result->wasSuccessful()) {
+ return $result;
+ }
+ }
+
+ return Result::success($this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Composer/Base.php b/src/composer/vendor/consolidation/robo/src/Task/Composer/Base.php
new file mode 100644
index 00000000..4f6597b7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Composer/Base.php
@@ -0,0 +1,145 @@
+prefer = '--prefer-dist';
+ return $this;
+ }
+
+ /**
+ * adds `prefer-source` option to composer
+ *
+ * @return $this
+ */
+ public function preferSource()
+ {
+ $this->prefer = '--prefer-source';
+ return $this;
+ }
+
+ /**
+ * adds `no-dev` option to composer
+ *
+ * @return $this
+ */
+ public function noDev()
+ {
+ $this->dev = '--no-dev';
+ return $this;
+ }
+
+ /**
+ * adds `no-ansi` option to composer
+ *
+ * @return $this
+ */
+ public function noAnsi()
+ {
+ $this->ansi = '--no-ansi';
+ return $this;
+ }
+
+ /**
+ * adds `ansi` option to composer
+ *
+ * @return $this
+ */
+ public function ansi()
+ {
+ $this->ansi = '--ansi';
+ return $this;
+ }
+
+ /**
+ * adds `optimize-autoloader` option to composer
+ *
+ * @return $this
+ */
+ public function optimizeAutoloader()
+ {
+ $this->optimizeAutoloader = '--optimize-autoloader';
+ return $this;
+ }
+
+ /**
+ * @param null|string $pathToComposer
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToComposer = null)
+ {
+ $this->command = $pathToComposer;
+ if (!$this->command) {
+ $this->command = $this->findExecutablePhar('composer');
+ }
+ if (!$this->command) {
+ throw new TaskException(__CLASS__, "Neither local composer.phar nor global composer installation could be found.");
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ if (!isset($this->ansi) && $this->getConfig()->isDecorated()) {
+ $this->ansi();
+ }
+ $this->option($this->prefer)
+ ->option($this->dev)
+ ->option($this->optimizeAutoloader)
+ ->option($this->ansi);
+ return "{$this->command} {$this->action}{$this->arguments}";
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Composer/DumpAutoload.php b/src/composer/vendor/consolidation/robo/src/Task/Composer/DumpAutoload.php
new file mode 100644
index 00000000..6297a2b4
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Composer/DumpAutoload.php
@@ -0,0 +1,69 @@
+taskComposerDumpAutoload()->run();
+ *
+ * // dump auto loader with custom path
+ * $this->taskComposerDumpAutoload('path/to/my/composer.phar')
+ * ->preferDist()
+ * ->run();
+ *
+ * // optimize autoloader dump with custom path
+ * $this->taskComposerDumpAutoload('path/to/my/composer.phar')
+ * ->optimize()
+ * ->run();
+ *
+ * // optimize autoloader dump with custom path and no dev
+ * $this->taskComposerDumpAutoload('path/to/my/composer.phar')
+ * ->optimize()
+ * ->noDev()
+ * ->run();
+ * ?>
+ * ```
+ */
+class DumpAutoload extends Base
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $action = 'dump-autoload';
+
+ /**
+ * @var string
+ */
+ protected $optimize;
+
+ /**
+ * @return $this
+ */
+ public function optimize()
+ {
+ $this->optimize = "--optimize";
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ $this->option($this->optimize);
+ return parent::getCommand();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo('Dumping Autoloader: {command}', ['command' => $command]);
+ return $this->executeCommand($command);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Composer/Install.php b/src/composer/vendor/consolidation/robo/src/Task/Composer/Install.php
new file mode 100644
index 00000000..76cb9861
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Composer/Install.php
@@ -0,0 +1,40 @@
+taskComposerInstall()->run();
+ *
+ * // prefer dist with custom path
+ * $this->taskComposerInstall('path/to/my/composer.phar')
+ * ->preferDist()
+ * ->run();
+ *
+ * // optimize autoloader with custom path
+ * $this->taskComposerInstall('path/to/my/composer.phar')
+ * ->optimizeAutoloader()
+ * ->run();
+ * ?>
+ * ```
+ */
+class Install extends Base
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $action = 'install';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo('Installing Packages: {command}', ['command' => $command]);
+ return $this->executeCommand($command);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Composer/Remove.php b/src/composer/vendor/consolidation/robo/src/Task/Composer/Remove.php
new file mode 100644
index 00000000..0011055a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Composer/Remove.php
@@ -0,0 +1,75 @@
+taskComposerValidate()->run();
+ * ?>
+ * ```
+ */
+class Remove extends Base
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $action = 'remove';
+
+ /**
+ * @return $this
+ */
+ public function dev()
+ {
+ $this->option('--dev');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function noProgress()
+ {
+ $this->option('--no-progress');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function noUpdate()
+ {
+ $this->option('--no-update');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function updateNoDev()
+ {
+ $this->option('--update-no-dev');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function noUpdateWithDependencies()
+ {
+ $this->option('--no-update-with-dependencies');
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo('Removing packages: {command}', ['command' => $command]);
+ return $this->executeCommand($command);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Composer/Update.php b/src/composer/vendor/consolidation/robo/src/Task/Composer/Update.php
new file mode 100644
index 00000000..3a0a64af
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Composer/Update.php
@@ -0,0 +1,40 @@
+taskComposerUpdate()->run();
+ *
+ * // prefer dist with custom path
+ * $this->taskComposerUpdate('path/to/my/composer.phar')
+ * ->preferDist()
+ * ->run();
+ *
+ * // optimize autoloader with custom path
+ * $this->taskComposerUpdate('path/to/my/composer.phar')
+ * ->optimizeAutoloader()
+ * ->run();
+ * ?>
+ * ```
+ */
+class Update extends Base
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $action = 'update';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo('Updating Packages: {command}', ['command' => $command]);
+ return $this->executeCommand($command);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Composer/Validate.php b/src/composer/vendor/consolidation/robo/src/Task/Composer/Validate.php
new file mode 100644
index 00000000..6db6fdd1
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Composer/Validate.php
@@ -0,0 +1,114 @@
+taskComposerValidate()->run();
+ * ?>
+ * ```
+ */
+class Validate extends Base
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected $action = 'validate';
+
+ /**
+ * @var string
+ */
+ protected $noCheckAll;
+
+ /**
+ * @var string
+ */
+ protected $noCheckLock;
+
+ /**
+ * @var string
+ */
+ protected $noCheckPublish;
+
+ /**
+ * @var string
+ */
+ protected $withDependencies;
+
+ /**
+ * @var string
+ */
+ protected $strict;
+
+ /**
+ * @return $this
+ */
+ public function noCheckAll()
+ {
+ $this->noCheckAll = '--no-check-all';
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function noCheckLock()
+ {
+ $this->noCheckLock = '--no-check-lock';
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function noCheckPublish()
+ {
+ $this->noCheckPublish = '--no-check-publish';
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function withDependencies()
+ {
+ $this->withDependencies = '--with-dependencies';
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function strict()
+ {
+ $this->strict = '--strict';
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ $this->option($this->noCheckAll);
+ $this->option($this->noCheckLock);
+ $this->option($this->noCheckPublish);
+ $this->option($this->withDependencies);
+ $this->option($this->strict);
+
+ return parent::getCommand();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo('Validating composer.json: {command}', ['command' => $command]);
+ return $this->executeCommand($command);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Composer/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Composer/loadTasks.php
new file mode 100644
index 00000000..50dab2ec
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Composer/loadTasks.php
@@ -0,0 +1,55 @@
+task(Install::class, $pathToComposer);
+ }
+
+ /**
+ * @param null|string $pathToComposer
+ *
+ * @return Update
+ */
+ protected function taskComposerUpdate($pathToComposer = null)
+ {
+ return $this->task(Update::class, $pathToComposer);
+ }
+
+ /**
+ * @param null|string $pathToComposer
+ *
+ * @return DumpAutoload
+ */
+ protected function taskComposerDumpAutoload($pathToComposer = null)
+ {
+ return $this->task(DumpAutoload::class, $pathToComposer);
+ }
+
+ /**
+ * @param null|string $pathToComposer
+ *
+ * @return Validate
+ */
+ protected function taskComposerValidate($pathToComposer = null)
+ {
+ return $this->task(Validate::class, $pathToComposer);
+ }
+
+ /**
+ * @param null|string $pathToComposer
+ *
+ * @return Remove
+ */
+ protected function taskComposerRemove($pathToComposer = null)
+ {
+ return $this->task(Remove::class, $pathToComposer);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/Changelog.php b/src/composer/vendor/consolidation/robo/src/Task/Development/Changelog.php
new file mode 100644
index 00000000..ce281852
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/Changelog.php
@@ -0,0 +1,191 @@
+taskChangelog()
+ * ->version($version)
+ * ->change("released to github")
+ * ->run();
+ * ?>
+ * ```
+ *
+ * Changes can be asked from Console
+ *
+ * ``` php
+ * taskChangelog()
+ * ->version($version)
+ * ->askForChanges()
+ * ->run();
+ * ?>
+ * ```
+ *
+ * @method Development\Changelog filename(string $filename)
+ * @method Development\Changelog anchor(string $anchor)
+ * @method Development\Changelog version(string $version)
+ */
+class Changelog extends BaseTask implements BuilderAwareInterface
+{
+ use BuilderAwareTrait;
+
+ /**
+ * @var string
+ */
+ protected $filename;
+
+ /**
+ * @var array
+ */
+ protected $log = [];
+
+ /**
+ * @var string
+ */
+ protected $anchor = "# Changelog";
+
+ /**
+ * @var string
+ */
+ protected $version = "";
+
+ /**
+ * @param string $filename
+ *
+ * @return $this
+ */
+ public function filename($filename)
+ {
+ $this->filename = $filename;
+ return $this;
+ }
+
+ /**
+ * @param string $item
+ *
+ * @return $this
+ */
+ public function log($item)
+ {
+ $this->log[] = $item;
+ return $this;
+ }
+
+ /**
+ * @param string $anchor
+ *
+ * @return $this
+ */
+ public function anchor($anchor)
+ {
+ $this->anchor = $anchor;
+ return $this;
+ }
+
+ /**
+ * @param string $version
+ *
+ * @return $this
+ */
+ public function version($version)
+ {
+ $this->version = $version;
+ return $this;
+ }
+
+ /**
+ * @param string $filename
+ */
+ public function __construct($filename)
+ {
+ $this->filename = $filename;
+ }
+
+ /**
+ * @param array $data
+ *
+ * @return $this
+ */
+ public function changes(array $data)
+ {
+ $this->log = array_merge($this->log, $data);
+ return $this;
+ }
+
+ /**
+ * @param string $change
+ *
+ * @return $this
+ */
+ public function change($change)
+ {
+ $this->log[] = $change;
+ return $this;
+ }
+
+ /**
+ * @return array
+ */
+ public function getChanges()
+ {
+ return $this->log;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (empty($this->log)) {
+ return Result::error($this, "Changelog is empty");
+ }
+ $text = implode(
+ "\n",
+ array_map(
+ function ($i) {
+ return "* $i *" . date('Y-m-d') . "*";
+ },
+ $this->log
+ )
+ ) . "\n";
+ $ver = "#### {$this->version}\n\n";
+ $text = $ver . $text;
+
+ if (!file_exists($this->filename)) {
+ $this->printTaskInfo('Creating {filename}', ['filename' => $this->filename]);
+ $res = file_put_contents($this->filename, $this->anchor);
+ if ($res === false) {
+ return Result::error($this, "File {filename} cant be created", ['filename' => $this->filename]);
+ }
+ }
+
+ /** @var \Robo\Result $result */
+ // trying to append to changelog for today
+ $result = $this->collectionBuilder()->taskReplace($this->filename)
+ ->from($ver)
+ ->to($text)
+ ->run();
+
+ if (!isset($result['replaced']) || !$result['replaced']) {
+ $result = $this->collectionBuilder()->taskReplace($this->filename)
+ ->from($this->anchor)
+ ->to($this->anchor . "\n\n" . $text)
+ ->run();
+ }
+
+ return new Result($this, $result->getExitCode(), $result->getMessage(), $this->log);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/GenerateMarkdownDoc.php b/src/composer/vendor/consolidation/robo/src/Task/Development/GenerateMarkdownDoc.php
new file mode 100644
index 00000000..2387199f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/GenerateMarkdownDoc.php
@@ -0,0 +1,769 @@
+taskGenDoc('models.md')
+ * ->docClass('Model\User') // take class Model\User
+ * ->docClass('Model\Post') // take class Model\Post
+ * ->filterMethods(function(\ReflectionMethod $r) {
+ * return $r->isPublic() or $r->isProtected(); // process public and protected methods
+ * })->processClass(function(\ReflectionClass $r, $text) {
+ * return "Class ".$r->getName()."\n\n$text\n\n###Methods\n";
+ * })->run();
+ * ```
+ *
+ * By default this task generates a documentation for each public method of a class.
+ * It combines method signature with a docblock. Both can be post-processed.
+ *
+ * ``` php
+ * taskGenDoc('models.md')
+ * ->docClass('Model\User')
+ * ->processClassSignature(false) // false can be passed to not include class signature
+ * ->processClassDocBlock(function(\ReflectionClass $r, $text) {
+ * return "[This is part of application model]\n" . $text;
+ * })->processMethodSignature(function(\ReflectionMethod $r, $text) {
+ * return "#### {$r->name}()";
+ * })->processMethodDocBlock(function(\ReflectionMethod $r, $text) {
+ * return strpos($r->name, 'save')===0 ? "[Saves to the database]\n" . $text : $text;
+ * })->run();
+ * ```
+ *
+ * @method \Robo\Task\Development\GenerateMarkdownDoc docClass(string $classname) put a class you want to be documented
+ * @method \Robo\Task\Development\GenerateMarkdownDoc filterMethods(\Closure $func) using callback function filter out methods that won't be documented
+ * @method \Robo\Task\Development\GenerateMarkdownDoc filterClasses(\Closure $func) using callback function filter out classes that won't be documented
+ * @method \Robo\Task\Development\GenerateMarkdownDoc filterProperties(\Closure $func) using callback function filter out properties that won't be documented
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processClass(\Closure $func) post-process class documentation
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processClassSignature(\Closure $func) post-process class signature. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processClassDocBlock(\Closure $func) post-process class docblock contents. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processMethod(\Closure $func) post-process method documentation. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processMethodSignature(\Closure $func) post-process method signature. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processMethodDocBlock(\Closure $func) post-process method docblock contents. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processProperty(\Closure $func) post-process property documentation. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processPropertySignature(\Closure $func) post-process property signature. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc processPropertyDocBlock(\Closure $func) post-process property docblock contents. Provide *false* to skip.
+ * @method \Robo\Task\Development\GenerateMarkdownDoc reorder(\Closure $func) use a function to reorder classes
+ * @method \Robo\Task\Development\GenerateMarkdownDoc reorderMethods(\Closure $func) use a function to reorder methods in class
+ * @method \Robo\Task\Development\GenerateMarkdownDoc prepend($text) inserts text into beginning of markdown file
+ * @method \Robo\Task\Development\GenerateMarkdownDoc append($text) inserts text in the end of markdown file
+ */
+class GenerateMarkdownDoc extends BaseTask implements BuilderAwareInterface
+{
+ use BuilderAwareTrait;
+
+ /**
+ * @var string[]
+ */
+ protected $docClass = [];
+
+ /**
+ * @var callable
+ */
+ protected $filterMethods;
+
+ /**
+ * @var callable
+ */
+ protected $filterClasses;
+
+ /**
+ * @var callable
+ */
+ protected $filterProperties;
+
+ /**
+ * @var callable
+ */
+ protected $processClass;
+
+ /**
+ * @var callable|false
+ */
+ protected $processClassSignature;
+
+ /**
+ * @var callable|false
+ */
+ protected $processClassDocBlock;
+
+ /**
+ * @var callable|false
+ */
+ protected $processMethod;
+
+ /**
+ * @var callable|false
+ */
+ protected $processMethodSignature;
+
+ /**
+ * @var callable|false
+ */
+ protected $processMethodDocBlock;
+
+ /**
+ * @var callable|false
+ */
+ protected $processProperty;
+
+ /**
+ * @var callable|false
+ */
+ protected $processPropertySignature;
+
+ /**
+ * @var callable|false
+ */
+ protected $processPropertyDocBlock;
+
+ /**
+ * @var callable
+ */
+ protected $reorder;
+
+ /**
+ * @var callable
+ */
+ protected $reorderMethods;
+
+ /**
+ * @todo Unused property.
+ *
+ * @var callable
+ */
+ protected $reorderProperties;
+
+ /**
+ * @var string
+ */
+ protected $filename;
+
+ /**
+ * @var string
+ */
+ protected $prepend = "";
+
+ /**
+ * @var string
+ */
+ protected $append = "";
+
+ /**
+ * @var string
+ */
+ protected $text;
+
+ /**
+ * @var string[]
+ */
+ protected $textForClass = [];
+
+ /**
+ * @param string $filename
+ *
+ * @return static
+ */
+ public static function init($filename)
+ {
+ return new static($filename);
+ }
+
+ /**
+ * @param string $filename
+ */
+ public function __construct($filename)
+ {
+ $this->filename = $filename;
+ }
+
+ /**
+ * @param string $item
+ *
+ * @return $this
+ */
+ public function docClass($item)
+ {
+ $this->docClass[] = $item;
+ return $this;
+ }
+
+ /**
+ * @param callable $filterMethods
+ *
+ * @return $this
+ */
+ public function filterMethods($filterMethods)
+ {
+ $this->filterMethods = $filterMethods;
+ return $this;
+ }
+
+ /**
+ * @param callable $filterClasses
+ *
+ * @return $this
+ */
+ public function filterClasses($filterClasses)
+ {
+ $this->filterClasses = $filterClasses;
+ return $this;
+ }
+
+ /**
+ * @param callable $filterProperties
+ *
+ * @return $this
+ */
+ public function filterProperties($filterProperties)
+ {
+ $this->filterProperties = $filterProperties;
+ return $this;
+ }
+
+ /**
+ * @param callable $processClass
+ *
+ * @return $this
+ */
+ public function processClass($processClass)
+ {
+ $this->processClass = $processClass;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processClassSignature
+ *
+ * @return $this
+ */
+ public function processClassSignature($processClassSignature)
+ {
+ $this->processClassSignature = $processClassSignature;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processClassDocBlock
+ *
+ * @return $this
+ */
+ public function processClassDocBlock($processClassDocBlock)
+ {
+ $this->processClassDocBlock = $processClassDocBlock;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processMethod
+ *
+ * @return $this
+ */
+ public function processMethod($processMethod)
+ {
+ $this->processMethod = $processMethod;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processMethodSignature
+ *
+ * @return $this
+ */
+ public function processMethodSignature($processMethodSignature)
+ {
+ $this->processMethodSignature = $processMethodSignature;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processMethodDocBlock
+ *
+ * @return $this
+ */
+ public function processMethodDocBlock($processMethodDocBlock)
+ {
+ $this->processMethodDocBlock = $processMethodDocBlock;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processProperty
+ *
+ * @return $this
+ */
+ public function processProperty($processProperty)
+ {
+ $this->processProperty = $processProperty;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processPropertySignature
+ *
+ * @return $this
+ */
+ public function processPropertySignature($processPropertySignature)
+ {
+ $this->processPropertySignature = $processPropertySignature;
+ return $this;
+ }
+
+ /**
+ * @param callable|false $processPropertyDocBlock
+ *
+ * @return $this
+ */
+ public function processPropertyDocBlock($processPropertyDocBlock)
+ {
+ $this->processPropertyDocBlock = $processPropertyDocBlock;
+ return $this;
+ }
+
+ /**
+ * @param callable $reorder
+ *
+ * @return $this
+ */
+ public function reorder($reorder)
+ {
+ $this->reorder = $reorder;
+ return $this;
+ }
+
+ /**
+ * @param callable $reorderMethods
+ *
+ * @return $this
+ */
+ public function reorderMethods($reorderMethods)
+ {
+ $this->reorderMethods = $reorderMethods;
+ return $this;
+ }
+
+ /**
+ * @param callable $reorderProperties
+ *
+ * @return $this
+ */
+ public function reorderProperties($reorderProperties)
+ {
+ $this->reorderProperties = $reorderProperties;
+ return $this;
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return $this
+ */
+ public function filename($filename)
+ {
+ $this->filename = $filename;
+ return $this;
+ }
+
+ /**
+ * @param string $prepend
+ *
+ * @return $this
+ */
+ public function prepend($prepend)
+ {
+ $this->prepend = $prepend;
+ return $this;
+ }
+
+ /**
+ * @param string $append
+ *
+ * @return $this
+ */
+ public function append($append)
+ {
+ $this->append = $append;
+ return $this;
+ }
+
+ /**
+ * @param string $text
+ *
+ * @return $this
+ */
+ public function text($text)
+ {
+ $this->text = $text;
+ return $this;
+ }
+
+ /**
+ * @param string $item
+ *
+ * @return $this
+ */
+ public function textForClass($item)
+ {
+ $this->textForClass[] = $item;
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ foreach ($this->docClass as $class) {
+ $this->printTaskInfo("Processing {class}", ['class' => $class]);
+ $this->textForClass[$class] = $this->documentClass($class);
+ }
+
+ if (is_callable($this->reorder)) {
+ $this->printTaskInfo("Applying reorder function");
+ call_user_func_array($this->reorder, [$this->textForClass]);
+ }
+
+ $this->text = implode("\n", $this->textForClass);
+
+ /** @var \Robo\Result $result */
+ $result = $this->collectionBuilder()->taskWriteToFile($this->filename)
+ ->line($this->prepend)
+ ->text($this->text)
+ ->line($this->append)
+ ->run();
+
+ $this->printTaskSuccess('{filename} created. {class-count} classes documented', ['filename' => $this->filename, 'class-count' => count($this->docClass)]);
+
+ return new Result($this, $result->getExitCode(), $result->getMessage(), $this->textForClass);
+ }
+
+ /**
+ * @param string $class
+ *
+ * @return null|string
+ */
+ protected function documentClass($class)
+ {
+ if (!class_exists($class)) {
+ return "";
+ }
+ $refl = new \ReflectionClass($class);
+
+ if (is_callable($this->filterClasses)) {
+ $ret = call_user_func($this->filterClasses, $refl);
+ if (!$ret) {
+ return;
+ }
+ }
+ $doc = $this->documentClassSignature($refl);
+ $doc .= "\n" . $this->documentClassDocBlock($refl);
+ $doc .= "\n";
+
+ if (is_callable($this->processClass)) {
+ $doc = call_user_func($this->processClass, $refl, $doc);
+ }
+
+ $properties = [];
+ foreach ($refl->getProperties() as $reflProperty) {
+ $properties[] = $this->documentProperty($reflProperty);
+ }
+
+ $properties = array_filter($properties);
+ $doc .= implode("\n", $properties);
+
+ $methods = [];
+ foreach ($refl->getMethods() as $reflMethod) {
+ $methods[$reflMethod->name] = $this->documentMethod($reflMethod);
+ }
+ if (is_callable($this->reorderMethods)) {
+ call_user_func_array($this->reorderMethods, [&$methods]);
+ }
+
+ $methods = array_filter($methods);
+
+ $doc .= implode("\n", $methods)."\n";
+
+ return $doc;
+ }
+
+ /**
+ * @param \ReflectionClass $reflectionClass
+ *
+ * @return string
+ */
+ protected function documentClassSignature(\ReflectionClass $reflectionClass)
+ {
+ if ($this->processClassSignature === false) {
+ return "";
+ }
+
+ $signature = "## {$reflectionClass->name}\n\n";
+
+ if ($parent = $reflectionClass->getParentClass()) {
+ $signature .= "* *Extends* `{$parent->name}`";
+ }
+ $interfaces = $reflectionClass->getInterfaceNames();
+ if (count($interfaces)) {
+ $signature .= "\n* *Implements* `" . implode('`, `', $interfaces) . '`';
+ }
+ $traits = $reflectionClass->getTraitNames();
+ if (count($traits)) {
+ $signature .= "\n* *Uses* `" . implode('`, `', $traits) . '`';
+ }
+ if (is_callable($this->processClassSignature)) {
+ $signature = call_user_func($this->processClassSignature, $reflectionClass, $signature);
+ }
+
+ return $signature;
+ }
+
+ /**
+ * @param \ReflectionClass $reflectionClass
+ *
+ * @return string
+ */
+ protected function documentClassDocBlock(\ReflectionClass $reflectionClass)
+ {
+ if ($this->processClassDocBlock === false) {
+ return "";
+ }
+ $doc = self::indentDoc($reflectionClass->getDocComment());
+ if (is_callable($this->processClassDocBlock)) {
+ $doc = call_user_func($this->processClassDocBlock, $reflectionClass, $doc);
+ }
+ return $doc;
+ }
+
+ /**
+ * @param \ReflectionMethod $reflectedMethod
+ *
+ * @return string
+ */
+ protected function documentMethod(\ReflectionMethod $reflectedMethod)
+ {
+ if ($this->processMethod === false) {
+ return "";
+ }
+ if (is_callable($this->filterMethods)) {
+ $ret = call_user_func($this->filterMethods, $reflectedMethod);
+ if (!$ret) {
+ return "";
+ }
+ } else {
+ if (!$reflectedMethod->isPublic()) {
+ return "";
+ }
+ }
+
+ $signature = $this->documentMethodSignature($reflectedMethod);
+ $docblock = $this->documentMethodDocBlock($reflectedMethod);
+ $methodDoc = "$signature $docblock";
+ if (is_callable($this->processMethod)) {
+ $methodDoc = call_user_func($this->processMethod, $reflectedMethod, $methodDoc);
+ }
+ return $methodDoc;
+ }
+
+ /**
+ * @param \ReflectionProperty $reflectedProperty
+ *
+ * @return string
+ */
+ protected function documentProperty(\ReflectionProperty $reflectedProperty)
+ {
+ if ($this->processProperty === false) {
+ return "";
+ }
+ if (is_callable($this->filterProperties)) {
+ $ret = call_user_func($this->filterProperties, $reflectedProperty);
+ if (!$ret) {
+ return "";
+ }
+ } else {
+ if (!$reflectedProperty->isPublic()) {
+ return "";
+ }
+ }
+ $signature = $this->documentPropertySignature($reflectedProperty);
+ $docblock = $this->documentPropertyDocBlock($reflectedProperty);
+ $propertyDoc = $signature . $docblock;
+ if (is_callable($this->processProperty)) {
+ $propertyDoc = call_user_func($this->processProperty, $reflectedProperty, $propertyDoc);
+ }
+ return $propertyDoc;
+ }
+
+ /**
+ * @param \ReflectionProperty $reflectedProperty
+ *
+ * @return string
+ */
+ protected function documentPropertySignature(\ReflectionProperty $reflectedProperty)
+ {
+ if ($this->processPropertySignature === false) {
+ return "";
+ }
+ $modifiers = implode(' ', \Reflection::getModifierNames($reflectedProperty->getModifiers()));
+ $signature = "#### *$modifiers* {$reflectedProperty->name}";
+ if (is_callable($this->processPropertySignature)) {
+ $signature = call_user_func($this->processPropertySignature, $reflectedProperty, $signature);
+ }
+ return $signature;
+ }
+
+ /**
+ * @param \ReflectionProperty $reflectedProperty
+ *
+ * @return string
+ */
+ protected function documentPropertyDocBlock(\ReflectionProperty $reflectedProperty)
+ {
+ if ($this->processPropertyDocBlock === false) {
+ return "";
+ }
+ $propertyDoc = $reflectedProperty->getDocComment();
+ // take from parent
+ if (!$propertyDoc) {
+ $parent = $reflectedProperty->getDeclaringClass();
+ while ($parent = $parent->getParentClass()) {
+ if ($parent->hasProperty($reflectedProperty->name)) {
+ $propertyDoc = $parent->getProperty($reflectedProperty->name)->getDocComment();
+ }
+ }
+ }
+ $propertyDoc = self::indentDoc($propertyDoc, 7);
+ $propertyDoc = preg_replace("~^@(.*?)([$\s])~", ' * `$1` $2', $propertyDoc); // format annotations
+ if (is_callable($this->processPropertyDocBlock)) {
+ $propertyDoc = call_user_func($this->processPropertyDocBlock, $reflectedProperty, $propertyDoc);
+ }
+ return ltrim($propertyDoc);
+ }
+
+ /**
+ * @param \ReflectionParameter $param
+ *
+ * @return string
+ */
+ protected function documentParam(\ReflectionParameter $param)
+ {
+ $text = "";
+ if ($param->isArray()) {
+ $text .= 'array ';
+ }
+ if ($param->isCallable()) {
+ $text .= 'callable ';
+ }
+ $text .= '$' . $param->name;
+ if ($param->isDefaultValueAvailable()) {
+ if ($param->allowsNull()) {
+ $text .= ' = null';
+ } else {
+ $text .= ' = ' . str_replace("\n", ' ', print_r($param->getDefaultValue(), true));
+ }
+ }
+
+ return $text;
+ }
+
+ /**
+ * @param string $doc
+ * @param int $indent
+ *
+ * @return string
+ */
+ public static function indentDoc($doc, $indent = 3)
+ {
+ if (!$doc) {
+ return $doc;
+ }
+ return implode(
+ "\n",
+ array_map(
+ function ($line) use ($indent) {
+ return substr($line, $indent);
+ },
+ explode("\n", $doc)
+ )
+ );
+ }
+
+ /**
+ * @param \ReflectionMethod $reflectedMethod
+ *
+ * @return string
+ */
+ protected function documentMethodSignature(\ReflectionMethod $reflectedMethod)
+ {
+ if ($this->processMethodSignature === false) {
+ return "";
+ }
+ $modifiers = implode(' ', \Reflection::getModifierNames($reflectedMethod->getModifiers()));
+ $params = implode(
+ ', ',
+ array_map(
+ function ($p) {
+ return $this->documentParam($p);
+ },
+ $reflectedMethod->getParameters()
+ )
+ );
+ $signature = "#### *$modifiers* {$reflectedMethod->name}($params)";
+ if (is_callable($this->processMethodSignature)) {
+ $signature = call_user_func($this->processMethodSignature, $reflectedMethod, $signature);
+ }
+ return $signature;
+ }
+
+ /**
+ * @param \ReflectionMethod $reflectedMethod
+ *
+ * @return string
+ */
+ protected function documentMethodDocBlock(\ReflectionMethod $reflectedMethod)
+ {
+ if ($this->processMethodDocBlock === false) {
+ return "";
+ }
+ $methodDoc = $reflectedMethod->getDocComment();
+ // take from parent
+ if (!$methodDoc) {
+ $parent = $reflectedMethod->getDeclaringClass();
+ while ($parent = $parent->getParentClass()) {
+ if ($parent->hasMethod($reflectedMethod->name)) {
+ $methodDoc = $parent->getMethod($reflectedMethod->name)->getDocComment();
+ }
+ }
+ }
+ // take from interface
+ if (!$methodDoc) {
+ $interfaces = $reflectedMethod->getDeclaringClass()->getInterfaces();
+ foreach ($interfaces as $interface) {
+ $i = new \ReflectionClass($interface->name);
+ if ($i->hasMethod($reflectedMethod->name)) {
+ $methodDoc = $i->getMethod($reflectedMethod->name)->getDocComment();
+ break;
+ }
+ }
+ }
+
+ $methodDoc = self::indentDoc($methodDoc, 7);
+ $methodDoc = preg_replace("~^@(.*?) ([$\s])~m", ' * `$1` $2', $methodDoc); // format annotations
+ if (is_callable($this->processMethodDocBlock)) {
+ $methodDoc = call_user_func($this->processMethodDocBlock, $reflectedMethod, $methodDoc);
+ }
+
+ return $methodDoc;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/GenerateTask.php b/src/composer/vendor/consolidation/robo/src/Task/Development/GenerateTask.php
new file mode 100644
index 00000000..e5040575
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/GenerateTask.php
@@ -0,0 +1,108 @@
+taskGenerateTask('Symfony\Component\Filesystem\Filesystem', 'FilesystemStack')
+ * ->run();
+ * ```
+ */
+class GenerateTask extends BaseTask
+{
+ /**
+ * @var string
+ */
+ protected $className;
+
+ /**
+ * @var string
+ */
+ protected $wrapperClassName;
+
+ /**
+ * @param string $className
+ * @param string $wrapperClassName
+ */
+ public function __construct($className, $wrapperClassName = '')
+ {
+ $this->className = $className;
+ $this->wrapperClassName = $wrapperClassName;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $delegate = new \ReflectionClass($this->className);
+ $replacements = [];
+
+ $leadingCommentChars = " * ";
+ $methodDescriptions = [];
+ $methodImplementations = [];
+ $immediateMethods = [];
+ foreach ($delegate->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
+ $methodName = $method->name;
+ $getter = preg_match('/^(get|has|is)/', $methodName);
+ $setter = preg_match('/^(set|unset)/', $methodName);
+ $argPrototypeList = [];
+ $argNameList = [];
+ $needsImplementation = false;
+ foreach ($method->getParameters() as $arg) {
+ $argDescription = '$' . $arg->name;
+ $argNameList[] = $argDescription;
+ if ($arg->isOptional()) {
+ $argDescription = $argDescription . ' = ' . str_replace("\n", "", var_export($arg->getDefaultValue(), true));
+ // We will create wrapper methods for any method that
+ // has default parameters.
+ $needsImplementation = true;
+ }
+ $argPrototypeList[] = $argDescription;
+ }
+ $argPrototypeString = implode(', ', $argPrototypeList);
+ $argNameListString = implode(', ', $argNameList);
+
+ if ($methodName[0] != '_') {
+ $methodDescriptions[] = "@method $methodName($argPrototypeString)";
+
+ if ($getter) {
+ $immediateMethods[] = " public function $methodName($argPrototypeString)\n {\n return \$this->delegate->$methodName($argNameListString);\n }";
+ } elseif ($setter) {
+ $immediateMethods[] = " public function $methodName($argPrototypeString)\n {\n \$this->delegate->$methodName($argNameListString);\n return \$this;\n }";
+ } elseif ($needsImplementation) {
+ // Include an implementation for the wrapper method if necessary
+ $methodImplementations[] = " protected function _$methodName($argPrototypeString)\n {\n \$this->delegate->$methodName($argNameListString);\n }";
+ }
+ }
+ }
+
+ $classNameParts = explode('\\', $this->className);
+ $delegate = array_pop($classNameParts);
+ $delegateNamespace = implode('\\', $classNameParts);
+
+ if (empty($this->wrapperClassName)) {
+ $this->wrapperClassName = $delegate;
+ }
+
+ $replacements['{delegateNamespace}'] = $delegateNamespace;
+ $replacements['{delegate}'] = $delegate;
+ $replacements['{wrapperClassName}'] = $this->wrapperClassName;
+ $replacements['{taskname}'] = "task$delegate";
+ $replacements['{methodList}'] = $leadingCommentChars . implode("\n$leadingCommentChars", $methodDescriptions);
+ $replacements['{immediateMethods}'] = "\n\n" . implode("\n\n", $immediateMethods);
+ $replacements['{methodImplementations}'] = "\n\n" . implode("\n\n", $methodImplementations);
+
+ $template = file_get_contents(__DIR__ . '/../../../data/Task/Development/GeneratedWrapper.tmpl');
+ $template = str_replace(array_keys($replacements), array_values($replacements), $template);
+
+ // Returning data in the $message will cause it to be printed.
+ return Result::success($this, $template);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/GitHub.php b/src/composer/vendor/consolidation/robo/src/Task/Development/GitHub.php
new file mode 100644
index 00000000..62407241
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/GitHub.php
@@ -0,0 +1,141 @@
+repo = $repo;
+ return $this;
+ }
+
+ /**
+ * @param string $owner
+ *
+ * @return $this
+ */
+ public function owner($owner)
+ {
+ $this->owner = $owner;
+ return $this;
+ }
+
+ /**
+ * @param string $uri
+ *
+ * @return $this
+ */
+ public function uri($uri)
+ {
+ list($this->owner, $this->repo) = explode('/', $uri);
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ protected function getUri()
+ {
+ return $this->owner . '/' . $this->repo;
+ }
+
+ /**
+ * @param string $user
+ *
+ * @return $this
+ */
+ public function user($user)
+ {
+ $this->user = $user;
+ return $this;
+ }
+
+ /**
+ * @param $password
+ *
+ * @return $this
+ */
+ public function password($password)
+ {
+ $this->password = $password;
+ return $this;
+ }
+
+ /**
+ * @param string $uri
+ * @param array $params
+ * @param string $method
+ *
+ * @return array
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ protected function sendRequest($uri, $params = [], $method = 'POST')
+ {
+ if (!$this->owner or !$this->repo) {
+ throw new TaskException($this, 'Repo URI is not set');
+ }
+
+ $ch = curl_init();
+ $url = sprintf('%s/repos/%s/%s', self::GITHUB_URL, $this->getUri(), $uri);
+ $this->printTaskInfo($url);
+ $this->printTaskInfo('{method} {url}', ['method' => $method, 'url' => $url]);
+
+ if (!empty($this->user)) {
+ curl_setopt($ch, CURLOPT_USERPWD, $this->user . ':' . $this->password);
+ }
+
+ curl_setopt_array(
+ $ch,
+ array(
+ CURLOPT_URL => $url,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_POST => $method != 'GET',
+ CURLOPT_POSTFIELDS => json_encode($params),
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_USERAGENT => "Robo"
+ )
+ );
+
+ $output = curl_exec($ch);
+ $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $response = json_decode($output);
+
+ $this->printTaskInfo($output);
+ return [$code, $response];
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/GitHubRelease.php b/src/composer/vendor/consolidation/robo/src/Task/Development/GitHubRelease.php
new file mode 100644
index 00000000..ac9743e0
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/GitHubRelease.php
@@ -0,0 +1,208 @@
+taskGitHubRelease('0.1.0')
+ * ->uri('consolidation-org/Robo')
+ * ->description('Add stuff people need.')
+ * ->change('Fix #123')
+ * ->change('Add frobulation method to all widgets')
+ * ->run();
+ * ?>
+ * ```
+ */
+class GitHubRelease extends GitHub
+{
+ /**
+ * @var string
+ */
+ protected $tag;
+
+ /**
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * @var string
+ */
+ protected $description = '';
+
+ /**
+ * @var string[]
+ */
+ protected $changes = [];
+
+ /**
+ * @var bool
+ */
+ protected $draft = false;
+
+ /**
+ * @var bool
+ */
+ protected $prerelease = false;
+
+ /**
+ * @var string
+ */
+ protected $comittish = 'master';
+
+ /**
+ * @param string $tag
+ */
+ public function __construct($tag)
+ {
+ $this->tag = $tag;
+ }
+
+ /**
+ * @param string $tag
+ *
+ * @return $this
+ */
+ public function tag($tag)
+ {
+ $this->tag = $tag;
+ return $this;
+ }
+
+ /**
+ * @param bool $draft
+ *
+ * @return $this
+ */
+ public function draft($draft)
+ {
+ $this->draft = $draft;
+ return $this;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return $this
+ */
+ public function name($name)
+ {
+ $this->name = $name;
+ return $this;
+ }
+
+ /**
+ * @param string $description
+ *
+ * @return $this
+ */
+ public function description($description)
+ {
+ $this->description = $description;
+ return $this;
+ }
+
+ /**
+ * @param bool $prerelease
+ *
+ * @return $this
+ */
+ public function prerelease($prerelease)
+ {
+ $this->prerelease = $prerelease;
+ return $this;
+ }
+
+ /**
+ * @param string $comittish
+ *
+ * @return $this
+ */
+ public function comittish($comittish)
+ {
+ $this->comittish = $comittish;
+ return $this;
+ }
+
+ /**
+ * @param string $description
+ *
+ * @return $this
+ */
+ public function appendDescription($description)
+ {
+ if (!empty($this->description)) {
+ $this->description .= "\n\n";
+ }
+ $this->description .= $description;
+ return $this;
+ }
+
+ public function changes(array $changes)
+ {
+ $this->changes = array_merge($this->changes, $changes);
+ return $this;
+ }
+
+ /**
+ * @param string $change
+ *
+ * @return $this
+ */
+ public function change($change)
+ {
+ $this->changes[] = $change;
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ protected function getBody()
+ {
+ $body = $this->description;
+ if (!empty($this->changes)) {
+ $changes = array_map(
+ function ($line) {
+ return "* $line";
+ },
+ $this->changes
+ );
+ $changesText = implode("\n", $changes);
+ $body .= "### Changelog \n\n$changesText";
+ }
+ return $body;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Releasing {tag}', ['tag' => $this->tag]);
+ $this->startTimer();
+ list($code, $data) = $this->sendRequest(
+ 'releases',
+ [
+ "tag_name" => $this->tag,
+ "target_commitish" => $this->comittish,
+ "name" => $this->tag,
+ "body" => $this->getBody(),
+ "draft" => $this->draft,
+ "prerelease" => $this->prerelease
+ ]
+ );
+ $this->stopTimer();
+
+ return new Result(
+ $this,
+ in_array($code, [200, 201]) ? 0 : 1,
+ isset($data->message) ? $data->message : '',
+ ['response' => $data, 'time' => $this->getExecutionTime()]
+ );
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/OpenBrowser.php b/src/composer/vendor/consolidation/robo/src/Task/Development/OpenBrowser.php
new file mode 100644
index 00000000..867216ea
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/OpenBrowser.php
@@ -0,0 +1,80 @@
+taskOpenBrowser('http://localhost')
+ * ->run();
+ *
+ * // open two browser windows
+ * $this->taskOpenBrowser([
+ * 'http://localhost/mysite',
+ * 'http://localhost/mysite2'
+ * ])
+ * ->run();
+ * ```
+ */
+class OpenBrowser extends BaseTask
+{
+ /**
+ * @var string[]
+ */
+ protected $urls = [];
+
+ /**
+ * @param string|array $url
+ */
+ public function __construct($url)
+ {
+ $this->urls = (array) $url;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $openCommand = $this->getOpenCommand();
+
+ if (empty($openCommand)) {
+ return Result::error($this, 'no suitable browser opening command found');
+ }
+
+ foreach ($this->urls as $url) {
+ passthru(sprintf($openCommand, ProcessUtils::escapeArgument($url)));
+ $this->printTaskInfo('Opened {url}', ['url' => $url]);
+ }
+
+ return Result::success($this);
+ }
+
+ /**
+ * @return null|string
+ */
+ private function getOpenCommand()
+ {
+ if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
+ return 'start "web" explorer "%s"';
+ }
+
+ passthru('which xdg-open', $linux);
+ passthru('which open', $osx);
+
+ if (0 === $linux) {
+ return 'xdg-open %s';
+ }
+
+ if (0 === $osx) {
+ return 'open %s';
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/PackPhar.php b/src/composer/vendor/consolidation/robo/src/Task/Development/PackPhar.php
new file mode 100644
index 00000000..3565dcbc
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/PackPhar.php
@@ -0,0 +1,253 @@
+taskPackPhar('package/codecept.phar')
+ * ->compress()
+ * ->stub('package/stub.php');
+ *
+ * $finder = Finder::create()
+ * ->name('*.php')
+ * ->in('src');
+ *
+ * foreach ($finder as $file) {
+ * $pharTask->addFile('src/'.$file->getRelativePathname(), $file->getRealPath());
+ * }
+ *
+ * $finder = Finder::create()->files()
+ * ->name('*.php')
+ * ->in('vendor');
+ *
+ * foreach ($finder as $file) {
+ * $pharTask->addStripped('vendor/'.$file->getRelativePathname(), $file->getRealPath());
+ * }
+ * $pharTask->run();
+ *
+ * // verify Phar is packed correctly
+ * $code = $this->_exec('php package/codecept.phar');
+ * ?>
+ * ```
+ */
+class PackPhar extends BaseTask implements PrintedInterface, ProgressIndicatorAwareInterface
+{
+ /**
+ * @var \Phar
+ */
+ protected $phar;
+
+ /**
+ * @var null|string
+ */
+ protected $compileDir = null;
+
+ /**
+ * @var string
+ */
+ protected $filename;
+
+ /**
+ * @var bool
+ */
+ protected $compress = false;
+
+ protected $stub;
+
+ protected $bin;
+
+ /**
+ * @var string
+ */
+ protected $stubTemplate = <<filename = $filename;
+ if (file_exists($file->getRealPath())) {
+ @unlink($file->getRealPath());
+ }
+ $this->phar = new \Phar($file->getPathname(), 0, $file->getFilename());
+ }
+
+ /**
+ * @param bool $compress
+ *
+ * @return $this
+ */
+ public function compress($compress = true)
+ {
+ $this->compress = $compress;
+ return $this;
+ }
+
+ /**
+ * @param string $stub
+ *
+ * @return $this
+ */
+ public function stub($stub)
+ {
+ $this->phar->setStub(file_get_contents($stub));
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function progressIndicatorSteps()
+ {
+ // run() will call advanceProgressIndicator() once for each
+ // file, one after calling stopBuffering, and again after compression.
+ return count($this->files)+2;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Creating {filename}', ['filename' => $this->filename]);
+ $this->phar->setSignatureAlgorithm(\Phar::SHA1);
+ $this->phar->startBuffering();
+
+ $this->printTaskInfo('Packing {file-count} files into phar', ['file-count' => count($this->files)]);
+
+ $this->startProgressIndicator();
+ foreach ($this->files as $path => $content) {
+ $this->phar->addFromString($path, $content);
+ $this->advanceProgressIndicator();
+ }
+ $this->phar->stopBuffering();
+ $this->advanceProgressIndicator();
+
+ if ($this->compress and in_array('GZ', \Phar::getSupportedCompression())) {
+ if (count($this->files) > 1000) {
+ $this->printTaskInfo('Too many files. Compression DISABLED');
+ } else {
+ $this->printTaskInfo('{filename} compressed', ['filename' => $this->filename]);
+ $this->phar = $this->phar->compressFiles(\Phar::GZ);
+ }
+ }
+ $this->advanceProgressIndicator();
+ $this->stopProgressIndicator();
+ $this->printTaskSuccess('{filename} produced', ['filename' => $this->filename]);
+ return Result::success($this, '', ['time' => $this->getExecutionTime()]);
+ }
+
+ /**
+ * @param string $path
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function addStripped($path, $file)
+ {
+ $this->files[$path] = $this->stripWhitespace(file_get_contents($file));
+ return $this;
+ }
+
+ /**
+ * @param string $path
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function addFile($path, $file)
+ {
+ $this->files[$path] = file_get_contents($file);
+ return $this;
+ }
+
+ /**
+ * @param \Symfony\Component\Finder\SplFileInfo[] $files
+ */
+ public function addFiles($files)
+ {
+ foreach ($files as $file) {
+ $this->addFile($file->getRelativePathname(), $file->getRealPath());
+ }
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function executable($file)
+ {
+ $source = file_get_contents($file);
+ if (strpos($source, '#!/usr/bin/env php') === 0) {
+ $source = substr($source, strpos($source, 'phar->setStub(sprintf($this->stubTemplate, $source));
+ return $this;
+ }
+
+ /**
+ * Strips whitespace from source. Taken from composer
+ *
+ * @param string $source
+ *
+ * @return string
+ */
+ private function stripWhitespace($source)
+ {
+ if (!function_exists('token_get_all')) {
+ return $source;
+ }
+
+ $output = '';
+ foreach (token_get_all($source) as $token) {
+ if (is_string($token)) {
+ $output .= $token;
+ } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
+ // $output .= $token[1];
+ $output .= str_repeat("\n", substr_count($token[1], "\n"));
+ } elseif (T_WHITESPACE === $token[0]) {
+ // reduce wide spaces
+ $whitespace = preg_replace('{[ \t]+}', ' ', $token[1]);
+ // normalize newlines to \n
+ $whitespace = preg_replace('{(?:\r\n|\r|\n)}', "\n", $whitespace);
+ // trim leading spaces
+ $whitespace = preg_replace('{\n +}', "\n", $whitespace);
+ $output .= $whitespace;
+ } else {
+ $output .= $token[1];
+ }
+ }
+
+ return $output;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/PhpServer.php b/src/composer/vendor/consolidation/robo/src/Task/Development/PhpServer.php
new file mode 100644
index 00000000..6dd36680
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/PhpServer.php
@@ -0,0 +1,86 @@
+taskServer(8000)
+ * ->dir('public')
+ * ->run();
+ *
+ * // run with IP 0.0.0.0
+ * $this->taskServer(8000)
+ * ->host('0.0.0.0')
+ * ->run();
+ *
+ * // execute server in background
+ * $this->taskServer(8000)
+ * ->background()
+ * ->run();
+ * ?>
+ * ```
+ */
+class PhpServer extends Exec
+{
+ /**
+ * @var int
+ */
+ protected $port;
+
+ /**
+ * @var string
+ */
+ protected $host = '127.0.0.1';
+
+ /**
+ * {@inheritdoc}
+ */
+ protected $command = 'php -S %s:%d ';
+
+ /**
+ * @param int $port
+ */
+ public function __construct($port)
+ {
+ $this->port = $port;
+
+ if (strtolower(PHP_OS) === 'linux') {
+ $this->command = 'exec php -S %s:%d ';
+ }
+ }
+
+ /**
+ * @param string $host
+ *
+ * @return $this
+ */
+ public function host($host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ /**
+ * @param string $path
+ *
+ * @return $this
+ */
+ public function dir($path)
+ {
+ $this->command .= "-t $path";
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return sprintf($this->command . $this->arguments, $this->host, $this->port);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/SemVer.php b/src/composer/vendor/consolidation/robo/src/Task/Development/SemVer.php
new file mode 100644
index 00000000..b9fb5929
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/SemVer.php
@@ -0,0 +1,233 @@
+taskSemVer('.semver')
+ * ->increment()
+ * ->run();
+ * ?>
+ * ```
+ *
+ */
+class SemVer implements TaskInterface
+{
+ const SEMVER = "---\n:major: %d\n:minor: %d\n:patch: %d\n:special: '%s'\n:metadata: '%s'";
+
+ const REGEX = "/^\-\-\-\n:major:\s(0|[1-9]\d*)\n:minor:\s(0|[1-9]\d*)\n:patch:\s(0|[1-9]\d*)\n:special:\s'([a-zA-z0-9]*\.?(?:0|[1-9]\d*)?)'\n:metadata:\s'((?:0|[1-9]\d*)?(?:\.[a-zA-z0-9\.]*)?)'/";
+
+ /**
+ * @var string
+ */
+ protected $format = 'v%M.%m.%p%s';
+
+ /**
+ * @var string
+ */
+ protected $specialSeparator = '-';
+
+ /**
+ * @var string
+ */
+ protected $metadataSeparator = '+';
+
+ /**
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * @var array
+ */
+ protected $version = [
+ 'major' => 0,
+ 'minor' => 0,
+ 'patch' => 0,
+ 'special' => '',
+ 'metadata' => ''
+ ];
+
+ /**
+ * @param string $filename
+ */
+ public function __construct($filename = '')
+ {
+ $this->path = $filename;
+
+ if (file_exists($this->path)) {
+ $this->parse();
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ $search = ['%M', '%m', '%p', '%s'];
+ $replace = $this->version + ['extra' => ''];
+
+ foreach (['special', 'metadata'] as $key) {
+ if (!empty($replace[$key])) {
+ $separator = $key . 'Separator';
+ $replace['extra'] .= $this->{$separator} . $replace[$key];
+ }
+ unset($replace[$key]);
+ }
+
+ return str_replace($search, $replace, $this->format);
+ }
+
+ /**
+ * @param string $format
+ *
+ * @return $this
+ */
+ public function setFormat($format)
+ {
+ $this->format = $format;
+ return $this;
+ }
+
+ /**
+ * @param string $separator
+ *
+ * @return $this
+ */
+ public function setMetadataSeparator($separator)
+ {
+ $this->metadataSeparator = $separator;
+ return $this;
+ }
+
+ /**
+ * @param string $separator
+ *
+ * @return $this
+ */
+ public function setPrereleaseSeparator($separator)
+ {
+ $this->specialSeparator = $separator;
+ return $this;
+ }
+
+ /**
+ * @param string $what
+ *
+ * @return $this
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function increment($what = 'patch')
+ {
+ switch ($what) {
+ case 'major':
+ $this->version['major']++;
+ $this->version['minor'] = 0;
+ $this->version['patch'] = 0;
+ break;
+ case 'minor':
+ $this->version['minor']++;
+ $this->version['patch'] = 0;
+ break;
+ case 'patch':
+ $this->version['patch']++;
+ break;
+ default:
+ throw new TaskException(
+ $this,
+ 'Bad argument, only one of the following is allowed: major, minor, patch'
+ );
+ }
+ return $this;
+ }
+
+ /**
+ * @param string $tag
+ *
+ * @return $this
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function prerelease($tag = 'RC')
+ {
+ if (!is_string($tag)) {
+ throw new TaskException($this, 'Bad argument, only strings allowed.');
+ }
+
+ $number = 0;
+
+ if (!empty($this->version['special'])) {
+ list($current, $number) = explode('.', $this->version['special']);
+ if ($tag != $current) {
+ $number = 0;
+ }
+ }
+
+ $number++;
+
+ $this->version['special'] = implode('.', [$tag, $number]);
+ return $this;
+ }
+
+ /**
+ * @param array|string $data
+ *
+ * @return $this
+ */
+ public function metadata($data)
+ {
+ if (is_array($data)) {
+ $data = implode('.', $data);
+ }
+
+ $this->version['metadata'] = $data;
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $written = $this->dump();
+ return new Result($this, (int)($written === false), $this->__toString());
+ }
+
+ /**
+ * @return bool
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ protected function dump()
+ {
+ extract($this->version);
+ $semver = sprintf(self::SEMVER, $major, $minor, $patch, $special, $metadata);
+ if (is_writeable($this->path) === false || file_put_contents($this->path, $semver) === false) {
+ throw new TaskException($this, 'Failed to write semver file.');
+ }
+ return true;
+ }
+
+ /**
+ * @throws \Robo\Exception\TaskException
+ */
+ protected function parse()
+ {
+ $output = file_get_contents($this->path);
+
+ if (!preg_match_all(self::REGEX, $output, $matches)) {
+ throw new TaskException($this, 'Bad semver file.');
+ }
+
+ list(, $major, $minor, $patch, $special, $metadata) = array_map('current', $matches);
+ $this->version = compact('major', 'minor', 'patch', 'special', 'metadata');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Development/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Development/loadTasks.php
new file mode 100644
index 00000000..e3dc49a3
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Development/loadTasks.php
@@ -0,0 +1,86 @@
+task(Changelog::class, $filename);
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return GenerateMarkdownDoc
+ */
+ protected function taskGenDoc($filename)
+ {
+ return $this->task(GenerateMarkdownDoc::class, $filename);
+ }
+
+ /**
+ * @param string $className
+ * @param string $wrapperClassName
+ *
+ * @return \Robo\Task\Development\GenerateTask
+ */
+ protected function taskGenTask($className, $wrapperClassName = '')
+ {
+ return $this->task(GenerateTask::class, $className, $wrapperClassName);
+ }
+
+ /**
+ * @param string $pathToSemVer
+ *
+ * @return SemVer
+ */
+ protected function taskSemVer($pathToSemVer = '.semver')
+ {
+ return $this->task(SemVer::class, $pathToSemVer);
+ }
+
+ /**
+ * @param int $port
+ *
+ * @return PhpServer
+ */
+ protected function taskServer($port = 8000)
+ {
+ return $this->task(PhpServer::class, $port);
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return PackPhar
+ */
+ protected function taskPackPhar($filename)
+ {
+ return $this->task(PackPhar::class, $filename);
+ }
+
+ /**
+ * @param string $tag
+ *
+ * @return GitHubRelease
+ */
+ protected function taskGitHubRelease($tag)
+ {
+ return $this->task(GitHubRelease::class, $tag);
+ }
+
+ /**
+ * @param string|array $url
+ *
+ * @return OpenBrowser
+ */
+ protected function taskOpenBrowser($url)
+ {
+ return $this->task(OpenBrowser::class, $url);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Base.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Base.php
new file mode 100644
index 00000000..9ecc3b6b
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Base.php
@@ -0,0 +1,28 @@
+getCommand();
+ $this->printTaskInfo('Running {command}', ['command' => $command]);
+ return $this->executeCommand($command);
+ }
+
+ abstract public function getCommand();
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Build.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Build.php
new file mode 100644
index 00000000..11eb92ab
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Build.php
@@ -0,0 +1,55 @@
+taskDockerBuild()->run();
+ *
+ * $this->taskDockerBuild('path/to/dir')
+ * ->tag('database')
+ * ->run();
+ *
+ * ?>
+ *
+ * ```
+ *
+ * Class Build
+ * @package Robo\Task\Docker
+ */
+class Build extends Base
+{
+ /**
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * @param string $path
+ */
+ public function __construct($path = '.')
+ {
+ $this->command = "docker build";
+ $this->path = $path;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . ' ' . $this->arguments . ' ' . $this->path;
+ }
+
+ /**
+ * @param string $tag
+ *
+ * @return $this
+ */
+ public function tag($tag)
+ {
+ return $this->option('-t', $tag);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Commit.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Commit.php
new file mode 100644
index 00000000..302f1920
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Commit.php
@@ -0,0 +1,66 @@
+taskDockerCommit($containerId)
+ * ->name('my/database')
+ * ->run();
+ *
+ * // alternatively you can take the result from DockerRun task:
+ *
+ * $result = $this->taskDockerRun('db')
+ * ->exec('./prepare_database.sh')
+ * ->run();
+ *
+ * $task->dockerCommit($result)
+ * ->name('my/database')
+ * ->run();
+ * ```
+ */
+class Commit extends Base
+{
+ /**
+ * @var string
+ */
+ protected $command = "docker commit";
+
+ /**
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * @var string
+ */
+ protected $cid;
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ */
+ public function __construct($cidOrResult)
+ {
+ $this->cid = $cidOrResult instanceof Result ? $cidOrResult->getCid() : $cidOrResult;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . ' ' . $this->cid . ' ' . $this->name . ' ' . $this->arguments;
+ }
+
+ /**
+ * @param $name
+ *
+ * @return $this
+ */
+ public function name($name)
+ {
+ $this->name = $name;
+ return $this;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Exec.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Exec.php
new file mode 100644
index 00000000..f26942e3
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Exec.php
@@ -0,0 +1,93 @@
+taskDockerRun('test_env')
+ * ->detached()
+ * ->run();
+ *
+ * $this->taskDockerExec($test)
+ * ->interactive()
+ * ->exec('./runtests')
+ * ->run();
+ *
+ * // alternatively use commands from other tasks
+ *
+ * $this->taskDockerExec($test)
+ * ->interactive()
+ * ->exec($this->taskCodecept()->suite('acceptance'))
+ * ->run();
+ * ?>
+ * ```
+ *
+ */
+class Exec extends Base
+{
+ use CommandReceiver;
+
+ /**
+ * @var string
+ */
+ protected $command = "docker exec";
+
+ /**
+ * @var string
+ */
+ protected $cid;
+
+ /**
+ * @var string
+ */
+ protected $run = '';
+
+ /**
+ * @param string|\Robo\Result $cidOrResult
+ */
+ public function __construct($cidOrResult)
+ {
+ $this->cid = $cidOrResult instanceof Result ? $cidOrResult->getCid() : $cidOrResult;
+ }
+
+ /**
+ * @return $this
+ */
+ public function detached()
+ {
+ $this->option('-d');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function interactive()
+ {
+ $this->option('-i');
+ return $this;
+ }
+
+ /**
+ * @param string|\Robo\Contract\CommandInterface $command
+ *
+ * @return $this
+ */
+ public function exec($command)
+ {
+ $this->run = $this->receiveCommand($command);
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . ' ' . $this->arguments . ' ' . $this->cid.' '.$this->run;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Pull.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Pull.php
new file mode 100644
index 00000000..32ba5b40
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Pull.php
@@ -0,0 +1,33 @@
+taskDockerPull('wordpress')
+ * ->run();
+ *
+ * ?>
+ * ```
+ *
+ */
+class Pull extends Base
+{
+ /**
+ * @param string $image
+ */
+ public function __construct($image)
+ {
+ $this->command = "docker pull $image ";
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . ' ' . $this->arguments;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Remove.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Remove.php
new file mode 100644
index 00000000..0a8c0ac6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Remove.php
@@ -0,0 +1,32 @@
+taskDockerRemove($container)
+ * ->run();
+ * ?>
+ * ```
+ *
+ */
+class Remove extends Base
+{
+ /**
+ * @param string $container
+ */
+ public function __construct($container)
+ {
+ $this->command = "docker rm $container ";
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . ' ' . $this->arguments;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Result.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Result.php
new file mode 100644
index 00000000..0533159a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Result.php
@@ -0,0 +1,35 @@
+taskDockerRun('mysql')->run();
+ *
+ * $result = $this->taskDockerRun('my_db_image')
+ * ->env('DB', 'database_name')
+ * ->volume('/path/to/data', '/data')
+ * ->detached()
+ * ->publish(3306)
+ * ->name('my_mysql')
+ * ->run();
+ *
+ * // retrieve container's cid:
+ * $this->say("Running container ".$result->getCid());
+ *
+ * // execute script inside container
+ * $result = $this->taskDockerRun('db')
+ * ->exec('prepare_test_data.sh')
+ * ->run();
+ *
+ * $this->taskDockerCommit($result)
+ * ->name('test_db')
+ * ->run();
+ *
+ * // link containers
+ * $mysql = $this->taskDockerRun('mysql')
+ * ->name('wp_db') // important to set name for linked container
+ * ->env('MYSQL_ROOT_PASSWORD', '123456')
+ * ->run();
+ *
+ * $this->taskDockerRun('wordpress')
+ * ->link($mysql)
+ * ->publish(80, 8080)
+ * ->detached()
+ * ->run();
+ *
+ * ?>
+ * ```
+ *
+ */
+class Run extends Base
+{
+ use CommandReceiver;
+
+ /**
+ * @var string
+ */
+ protected $image = '';
+
+ /**
+ * @var string
+ */
+ protected $run = '';
+
+ /**
+ * @var string
+ */
+ protected $cidFile;
+
+ /**
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * @var string
+ */
+ protected $dir;
+
+ /**
+ * @param string $image
+ */
+ public function __construct($image)
+ {
+ $this->image = $image;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPrinted()
+ {
+ return $this->isPrinted;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ if ($this->isPrinted) {
+ $this->option('-i');
+ }
+ if ($this->cidFile) {
+ $this->option('cidfile', $this->cidFile);
+ }
+ return trim('docker run ' . $this->arguments . ' ' . $this->image . ' ' . $this->run);
+ }
+
+ /**
+ * @return $this
+ */
+ public function detached()
+ {
+ $this->option('-d');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function interactive()
+ {
+ $this->option('-i');
+ return $this;
+ }
+
+ /**
+ * @param string|\Robo\Contract\CommandInterface $run
+ *
+ * @return $this
+ */
+ public function exec($run)
+ {
+ $this->run = $this->receiveCommand($run);
+ return $this;
+ }
+
+ /**
+ * @param string $from
+ * @param null|string $to
+ *
+ * @return $this
+ */
+ public function volume($from, $to = null)
+ {
+ $volume = $to ? "$from:$to" : $from;
+ $this->option('-v', $volume);
+ return $this;
+ }
+
+ /**
+ * @param string $variable
+ * @param null|string $value
+ *
+ * @return $this
+ */
+ public function env($variable, $value = null)
+ {
+ $env = $value ? "$variable=$value" : $variable;
+ return $this->option("-e", $env);
+ }
+
+ /**
+ * @param null|int $port
+ * @param null|int $portTo
+ *
+ * @return $this
+ */
+ public function publish($port = null, $portTo = null)
+ {
+ if (!$port) {
+ return $this->option('-P');
+ }
+ if ($portTo) {
+ $port = "$port:$portTo";
+ }
+ return $this->option('-p', $port);
+ }
+
+ /**
+ * @param string $dir
+ *
+ * @return $this
+ */
+ public function containerWorkdir($dir)
+ {
+ return $this->option('-w', $dir);
+ }
+
+ /**
+ * @param string $user
+ *
+ * @return $this
+ */
+ public function user($user)
+ {
+ return $this->option('-u', $user);
+ }
+
+ /**
+ * @return $this
+ */
+ public function privileged()
+ {
+ return $this->option('--privileged');
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return $this
+ */
+ public function name($name)
+ {
+ $this->name = $name;
+ return $this->option('name', $name);
+ }
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $name
+ * @param string $alias
+ *
+ * @return $this
+ */
+ public function link($name, $alias)
+ {
+ if ($name instanceof Result) {
+ $name = $name->getContainerName();
+ }
+ $this->option('link', "$name:$alias");
+ return $this;
+ }
+
+ /**
+ * @param string $dir
+ *
+ * @return $this
+ */
+ public function tmpDir($dir)
+ {
+ $this->dir = $dir;
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getTmpDir()
+ {
+ return $this->dir ? $this->dir : sys_get_temp_dir();
+ }
+
+ /**
+ * @return string
+ */
+ public function getUniqId()
+ {
+ return uniqid();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->cidFile = $this->getTmpDir() . '/docker_' . $this->getUniqId() . '.cid';
+ $result = parent::run();
+ $result['cid'] = $this->getCid();
+ return $result;
+ }
+
+ /**
+ * @return null|string
+ */
+ protected function getCid()
+ {
+ if (!$this->cidFile || !file_exists($this->cidFile)) {
+ return null;
+ }
+ $cid = trim(file_get_contents($this->cidFile));
+ @unlink($this->cidFile);
+ return $cid;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Start.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Start.php
new file mode 100644
index 00000000..ef19d74d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Start.php
@@ -0,0 +1,41 @@
+taskDockerStart($cidOrResult)
+ * ->run();
+ * ?>
+ * ```
+ */
+class Start extends Base
+{
+ /**
+ * @var string
+ */
+ protected $command = "docker start";
+
+ /**
+ * @var null|string
+ */
+ protected $cid;
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ */
+ public function __construct($cidOrResult)
+ {
+ $this->cid = $cidOrResult instanceof Result ? $cidOrResult->getCid() : $cidOrResult;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . ' ' . $this->arguments . ' ' . $this->cid;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/Stop.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/Stop.php
new file mode 100644
index 00000000..4d0d436d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/Stop.php
@@ -0,0 +1,41 @@
+taskDockerStop($cidOrResult)
+ * ->run();
+ * ?>
+ * ```
+ */
+class Stop extends Base
+{
+ /**
+ * @var string
+ */
+ protected $command = "docker stop";
+
+ /**
+ * @var null|string
+ */
+ protected $cid;
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ */
+ public function __construct($cidOrResult)
+ {
+ $this->cid = $cidOrResult instanceof Result ? $cidOrResult->getCid() : $cidOrResult;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . ' ' . $this->arguments . ' ' . $this->cid;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Docker/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Docker/loadTasks.php
new file mode 100644
index 00000000..e58f5ef0
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Docker/loadTasks.php
@@ -0,0 +1,85 @@
+task(Run::class, $image);
+ }
+
+ /**
+ * @param string $image
+ *
+ * @return \Robo\Task\Docker\Pull
+ */
+ protected function taskDockerPull($image)
+ {
+ return $this->task(Pull::class, $image);
+ }
+
+ /**
+ * @param string $path
+ *
+ * @return \Robo\Task\Docker\Build
+ */
+ protected function taskDockerBuild($path = '.')
+ {
+ return $this->task(Build::class, $path);
+ }
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ *
+ * @return \Robo\Task\Docker\Stop
+ */
+ protected function taskDockerStop($cidOrResult)
+ {
+ return $this->task(Stop::class, $cidOrResult);
+ }
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ *
+ * @return \Robo\Task\Docker\Commit
+ */
+ protected function taskDockerCommit($cidOrResult)
+ {
+ return $this->task(Commit::class, $cidOrResult);
+ }
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ *
+ * @return \Robo\Task\Docker\Start
+ */
+ protected function taskDockerStart($cidOrResult)
+ {
+ return $this->task(Start::class, $cidOrResult);
+ }
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ *
+ * @return \Robo\Task\Docker\Remove
+ */
+ protected function taskDockerRemove($cidOrResult)
+ {
+ return $this->task(Remove::class, $cidOrResult);
+ }
+
+ /**
+ * @param string|\Robo\Task\Docker\Result $cidOrResult
+ *
+ * @return \Robo\Task\Docker\Exec
+ */
+ protected function taskDockerExec($cidOrResult)
+ {
+ return $this->task(Exec::class, $cidOrResult);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/File/Concat.php b/src/composer/vendor/consolidation/robo/src/Task/File/Concat.php
new file mode 100644
index 00000000..12b1eca0
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/File/Concat.php
@@ -0,0 +1,101 @@
+taskConcat([
+ * 'web/assets/screen.css',
+ * 'web/assets/print.css',
+ * 'web/assets/theme.css'
+ * ])
+ * ->to('web/assets/style.css')
+ * ->run()
+ * ?>
+ * ```
+ */
+class Concat extends BaseTask
+{
+ use ResourceExistenceChecker;
+
+ /**
+ * @var array|Iterator
+ */
+ protected $files;
+
+ /**
+ * @var string
+ */
+ protected $dst;
+
+ /**
+ * Constructor.
+ *
+ * @param array|Iterator $files
+ */
+ public function __construct($files)
+ {
+ $this->files = $files;
+ }
+
+ /**
+ * set the destination file
+ *
+ * @param string $dst
+ *
+ * @return $this
+ */
+ public function to($dst)
+ {
+ $this->dst = $dst;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (is_null($this->dst) || "" === $this->dst) {
+ return Result::error($this, 'You must specify a destination file with to() method.');
+ }
+
+ if (!$this->checkResources($this->files, 'file')) {
+ return Result::error($this, 'Source files are missing!');
+ }
+
+ if (file_exists($this->dst) && !is_writable($this->dst)) {
+ return Result::error($this, 'Destination already exists and cannot be overwritten.');
+ }
+
+ $dump = '';
+
+ foreach ($this->files as $path) {
+ foreach (glob($path) as $file) {
+ $dump .= file_get_contents($file) . "\n";
+ }
+ }
+
+ $this->printTaskInfo('Writing {destination}', ['destination' => $this->dst]);
+
+ $dst = $this->dst . '.part';
+ $write_result = file_put_contents($dst, $dump);
+
+ if (false === $write_result) {
+ @unlink($dst);
+ return Result::error($this, 'File write failed.');
+ }
+ // Cannot be cross-volume; should always succeed.
+ @rename($dst, $this->dst);
+
+ return Result::success($this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/File/Replace.php b/src/composer/vendor/consolidation/robo/src/Task/File/Replace.php
new file mode 100644
index 00000000..1c7f16a1
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/File/Replace.php
@@ -0,0 +1,139 @@
+taskReplaceInFile('VERSION')
+ * ->from('0.2.0')
+ * ->to('0.3.0')
+ * ->run();
+ *
+ * $this->taskReplaceInFile('README.md')
+ * ->from(date('Y')-1)
+ * ->to(date('Y'))
+ * ->run();
+ *
+ * $this->taskReplaceInFile('config.yml')
+ * ->regex('~^service:~')
+ * ->to('services:')
+ * ->run();
+ *
+ * $this->taskReplaceInFile('box/robo.txt')
+ * ->from(array('##dbname##', '##dbhost##'))
+ * ->to(array('robo', 'localhost'))
+ * ->run();
+ * ?>
+ * ```
+ *
+ * @method regex(string) regex to match string to be replaced
+ * @method from(string|array) string(s) to be replaced
+ * @method to(string|array) value(s) to be set as a replacement
+ */
+class Replace extends BaseTask
+{
+ /**
+ * @var string
+ */
+ protected $filename;
+
+ /**
+ * @var string[]
+ */
+ protected $from;
+
+ /**
+ * @var string[]
+ */
+ protected $to;
+
+ /**
+ * @var string
+ */
+ protected $regex;
+
+ /**
+ * @param string $filename
+ */
+ public function __construct($filename)
+ {
+ $this->filename = $filename;
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return $this
+ */
+ public function filename($filename)
+ {
+ $this->filename = $filename;
+ return $this;
+ }
+
+ /**
+ * @param string $from
+ *
+ * @return $this
+ */
+ public function from($from)
+ {
+ $this->from = $from;
+ return $this;
+ }
+
+ /**
+ * @param string $to
+ *
+ * @return $this
+ */
+ public function to($to)
+ {
+ $this->to = $to;
+ return $this;
+ }
+
+ /**
+ * @param string $regex
+ *
+ * @return $this
+ */
+ public function regex($regex)
+ {
+ $this->regex = $regex;
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (!file_exists($this->filename)) {
+ $this->printTaskError('File {filename} does not exist', ['filename' => $this->filename]);
+ return false;
+ }
+
+ $text = file_get_contents($this->filename);
+ if ($this->regex) {
+ $text = preg_replace($this->regex, $this->to, $text, -1, $count);
+ } else {
+ $text = str_replace($this->from, $this->to, $text, $count);
+ }
+ if ($count > 0) {
+ $res = file_put_contents($this->filename, $text);
+ if ($res === false) {
+ return Result::error($this, "Error writing to file {filename}.", ['filename' => $this->filename]);
+ }
+ $this->printTaskSuccess("{filename} updated. {count} items replaced", ['filename' => $this->filename, 'count' => $count]);
+ } else {
+ $this->printTaskInfo("{filename} unchanged. {count} items replaced", ['filename' => $this->filename, 'count' => $count]);
+ }
+ return Result::success($this, '', ['replaced' => $count]);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/File/TmpFile.php b/src/composer/vendor/consolidation/robo/src/Task/File/TmpFile.php
new file mode 100644
index 00000000..7c796d4c
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/File/TmpFile.php
@@ -0,0 +1,73 @@
+collectionBuilder();
+ * $tmpFilePath = $collection->taskTmpFile()
+ * ->line('-----')
+ * ->line(date('Y-m-d').' '.$title)
+ * ->line('----')
+ * ->getPath();
+ * $collection->run();
+ * ?>
+ * ```
+ */
+class TmpFile extends Write implements CompletionInterface
+{
+ /**
+ * @param string $filename
+ * @param string $extension
+ * @param string $baseDir
+ * @param bool $includeRandomPart
+ */
+ public function __construct($filename = 'tmp', $extension = '', $baseDir = '', $includeRandomPart = true)
+ {
+ if (empty($base)) {
+ $base = sys_get_temp_dir();
+ }
+ if ($includeRandomPart) {
+ $random = static::randomString();
+ $filename = "{$filename}_{$random}";
+ }
+ $filename .= $extension;
+ parent::__construct("{$base}/{$filename}");
+ }
+
+ /**
+ * Generate a suitably random string to use as the suffix for our
+ * temporary file.
+ *
+ * @param int $length
+ *
+ * @return string
+ */
+ private static function randomString($length = 12)
+ {
+ return substr(str_shuffle('23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'), 0, $length);
+ }
+
+ /**
+ * Delete this file when our collection completes.
+ * If this temporary file is not part of a collection,
+ * then it will be deleted when the program terminates,
+ * presuming that it was created by taskTmpFile() or _tmpFile().
+ */
+ public function complete()
+ {
+ unlink($this->getPath());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/File/Write.php b/src/composer/vendor/consolidation/robo/src/Task/File/Write.php
new file mode 100644
index 00000000..6f0dae3a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/File/Write.php
@@ -0,0 +1,337 @@
+taskWriteToFile('blogpost.md')
+ * ->line('-----')
+ * ->line(date('Y-m-d').' '.$title)
+ * ->line('----')
+ * ->run();
+ * ?>
+ * ```
+ *
+ * @method append()
+ */
+class Write extends BaseTask
+{
+ /**
+ * @var array
+ */
+ protected $stack = [];
+
+ /**
+ * @var string
+ */
+ protected $filename;
+
+ /**
+ * @var bool
+ */
+ protected $append = false;
+
+ /**
+ * @var null|string
+ */
+ protected $originalContents = null;
+
+ /**
+ * @param string $filename
+ */
+ public function __construct($filename)
+ {
+ $this->filename = $filename;
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return $this
+ */
+ public function filename($filename)
+ {
+ $this->filename = $filename;
+ return $this;
+ }
+
+ /**
+ * @param bool $append
+ *
+ * @return $this
+ */
+ public function append($append = true)
+ {
+ $this->append = $append;
+ return $this;
+ }
+
+ /**
+ * add a line.
+ *
+ * @param string $line
+ *
+ * @return $this The current instance
+ */
+ public function line($line)
+ {
+ $this->text($line . "\n");
+ return $this;
+ }
+
+ /**
+ * add more lines.
+ *
+ * @param array $lines
+ *
+ * @return $this The current instance
+ */
+ public function lines(array $lines)
+ {
+ $this->text(implode("\n", $lines) . "\n");
+ return $this;
+ }
+
+ /**
+ * add a text.
+ *
+ * @param string $text
+ *
+ * @return $this The current instance
+ */
+ public function text($text)
+ {
+ $this->stack[] = array_merge([__FUNCTION__ . 'Collect'], func_get_args());
+ return $this;
+ }
+
+ /**
+ * add a text from a file.
+ *
+ * Note that the file is read in the run() method of this task.
+ * To load text from the current state of a file (e.g. one that may
+ * be deleted or altered by other tasks prior the execution of this one),
+ * use:
+ * $task->text(file_get_contents($filename));
+ *
+ * @param string $filename
+ *
+ * @return $this The current instance
+ */
+ public function textFromFile($filename)
+ {
+ $this->stack[] = array_merge([__FUNCTION__ . 'Collect'], func_get_args());
+ return $this;
+ }
+
+ /**
+ * substitute a placeholder with value, placeholder must be enclosed by `{}`.
+ *
+ * @param string $name
+ * @param string $val
+ *
+ * @return $this The current instance
+ */
+ public function place($name, $val)
+ {
+ $this->replace('{'.$name.'}', $val);
+
+ return $this;
+ }
+
+ /**
+ * replace any string with value.
+ *
+ * @param string $string
+ * @param string $replacement
+ *
+ * @return $this The current instance
+ */
+ public function replace($string, $replacement)
+ {
+ $this->stack[] = array_merge([__FUNCTION__ . 'Collect'], func_get_args());
+ return $this;
+ }
+
+ /**
+ * replace any string with value using regular expression.
+ *
+ * @param string $pattern
+ * @param string $replacement
+ *
+ * @return $this The current instance
+ */
+ public function regexReplace($pattern, $replacement)
+ {
+ $this->stack[] = array_merge([__FUNCTION__ . 'Collect'], func_get_args());
+ return $this;
+ }
+
+ /**
+ * Append the provided text to the end of the buffer if the provided
+ * regex pattern matches any text already in the buffer.
+ *
+ * @param string $pattern
+ * @param string $text
+ *
+ * @return $this
+ */
+ public function appendIfMatches($pattern, $text)
+ {
+ $this->stack[] = array_merge(['appendIfMatchesCollect'], [$pattern, $text, true]);
+ return $this;
+ }
+
+ /**
+ * Append the provided text to the end of the buffer unless the provided
+ * regex pattern matches any text already in the buffer.
+ *
+ * @param string $pattern
+ * @param string $text
+ *
+ * @return $this
+ */
+ public function appendUnlessMatches($pattern, $text)
+ {
+ $this->stack[] = array_merge(['appendIfMatchesCollect'], [$pattern, $text, false]);
+ return $this;
+ }
+
+ /**
+ * @param $contents string
+ * @param $filename string
+ *
+ * @return string
+ */
+ protected function textFromFileCollect($contents, $filename)
+ {
+ if (file_exists($filename)) {
+ $contents .= file_get_contents($filename);
+ }
+ return $contents;
+ }
+
+ /**
+ * @param string|string[] $contents
+ * @param string|string[] $string
+ * @param string|string[] $replacement
+ *
+ * @return string|string[]
+ */
+ protected function replaceCollect($contents, $string, $replacement)
+ {
+ return str_replace($string, $replacement, $contents);
+ }
+
+ /**
+ * @param string|string[] $contents
+ * @param string|string[] $pattern
+ * @param string|string[] $replacement
+ *
+ * @return string|string[]
+ */
+ protected function regexReplaceCollect($contents, $pattern, $replacement)
+ {
+ return preg_replace($pattern, $replacement, $contents);
+ }
+
+ /**
+ * @param string $contents
+ * @param string $text
+ *
+ * @return string
+ */
+ protected function textCollect($contents, $text)
+ {
+ return $contents . $text;
+ }
+
+ /**
+ * @param string $contents
+ * @param string $pattern
+ * @param string $text
+ * @param bool $shouldMatch
+ *
+ * @return string
+ */
+ protected function appendIfMatchesCollect($contents, $pattern, $text, $shouldMatch)
+ {
+ if (preg_match($pattern, $contents) == $shouldMatch) {
+ $contents .= $text;
+ }
+ return $contents;
+ }
+
+ /**
+ * @return string
+ */
+ public function originalContents()
+ {
+ if (!isset($this->originalContents)) {
+ $this->originalContents = '';
+ if (file_exists($this->filename)) {
+ $this->originalContents = file_get_contents($this->filename);
+ }
+ }
+ return $this->originalContents;
+ }
+
+ /**
+ * @return bool
+ */
+ public function wouldChange()
+ {
+ return $this->originalContents() != $this->getContentsToWrite();
+ }
+
+ /**
+ * @return string
+ */
+ protected function getContentsToWrite()
+ {
+ $contents = "";
+ if ($this->append) {
+ $contents = $this->originalContents();
+ }
+ foreach ($this->stack as $action) {
+ $command = array_shift($action);
+ if (method_exists($this, $command)) {
+ array_unshift($action, $contents);
+ $contents = call_user_func_array([$this, $command], $action);
+ }
+ }
+ return $contents;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo("Writing to {filename}.", ['filename' => $this->filename]);
+ $contents = $this->getContentsToWrite();
+ if (!file_exists(dirname($this->filename))) {
+ mkdir(dirname($this->filename), 0777, true);
+ }
+ $res = file_put_contents($this->filename, $contents);
+ if ($res === false) {
+ return Result::error($this, "File {$this->filename} couldn't be created");
+ }
+
+ return Result::success($this);
+ }
+
+ /**
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->filename;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/File/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/File/loadTasks.php
new file mode 100644
index 00000000..76ef7230
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/File/loadTasks.php
@@ -0,0 +1,50 @@
+task(Concat::class, $files);
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return \Robo\Task\File\Replace
+ */
+ protected function taskReplaceInFile($file)
+ {
+ return $this->task(Replace::class, $file);
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return \Robo\Task\File\Write
+ */
+ protected function taskWriteToFile($file)
+ {
+ return $this->task(Write::class, $file);
+ }
+
+ /**
+ * @param string $filename
+ * @param string $extension
+ * @param string $baseDir
+ * @param bool $includeRandomPart
+ *
+ * @return \Robo\Task\File\TmpFile
+ */
+ protected function taskTmpFile($filename = 'tmp', $extension = '', $baseDir = '', $includeRandomPart = true)
+ {
+ return $this->task(TmpFile::class, $filename, $extension, $baseDir, $includeRandomPart);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/BaseDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/BaseDir.php
new file mode 100644
index 00000000..434334d7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/BaseDir.php
@@ -0,0 +1,30 @@
+dirs = $dirs
+ : $this->dirs[] = $dirs;
+
+ $this->fs = new sfFilesystem();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/CleanDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/CleanDir.php
new file mode 100644
index 00000000..762f8550
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/CleanDir.php
@@ -0,0 +1,63 @@
+taskCleanDir(['tmp','logs'])->run();
+ * // as shortcut
+ * $this->_cleanDir('app/cache');
+ * ?>
+ * ```
+ */
+class CleanDir extends BaseDir
+{
+ use ResourceExistenceChecker;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (!$this->checkResources($this->dirs, 'dir')) {
+ return Result::error($this, 'Source directories are missing!');
+ }
+ foreach ($this->dirs as $dir) {
+ $this->emptyDir($dir);
+ $this->printTaskInfo("Cleaned {dir}", ['dir' => $dir]);
+ }
+ return Result::success($this);
+ }
+
+ /**
+ * @param string $path
+ */
+ protected function emptyDir($path)
+ {
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($path),
+ \RecursiveIteratorIterator::CHILD_FIRST
+ );
+
+ foreach ($iterator as $path) {
+ if ($path->isDir()) {
+ $dir = (string)$path;
+ if (basename($dir) === '.' || basename($dir) === '..') {
+ continue;
+ }
+ $this->fs->remove($dir);
+ } else {
+ $file = (string)$path;
+ if (basename($file) === '.gitignore' || basename($file) === '.gitkeep') {
+ continue;
+ }
+ $this->fs->remove($file);
+ }
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/CopyDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/CopyDir.php
new file mode 100644
index 00000000..e65639aa
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/CopyDir.php
@@ -0,0 +1,113 @@
+taskCopyDir(['dist/config' => 'config'])->run();
+ * // as shortcut
+ * $this->_copyDir('dist/config', 'config');
+ * ?>
+ * ```
+ */
+class CopyDir extends BaseDir
+{
+ use ResourceExistenceChecker;
+
+ /**
+ * @var int
+ */
+ protected $chmod = 0755;
+
+ /**
+ * Files to exclude on copying.
+ *
+ * @var string[]
+ */
+ protected $exclude = [];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (!$this->checkResources($this->dirs, 'dir')) {
+ return Result::error($this, 'Source directories are missing!');
+ }
+ foreach ($this->dirs as $src => $dst) {
+ $this->copyDir($src, $dst);
+ $this->printTaskInfo('Copied from {source} to {destination}', ['source' => $src, 'destination' => $dst]);
+ }
+ return Result::success($this);
+ }
+
+ /**
+ * Sets the default folder permissions for the destination if it doesn't exist
+ *
+ * @link http://en.wikipedia.org/wiki/Chmod
+ * @link http://php.net/manual/en/function.mkdir.php
+ * @link http://php.net/manual/en/function.chmod.php
+ *
+ * @param int $value
+ *
+ * @return $this
+ */
+ public function dirPermissions($value)
+ {
+ $this->chmod = (int)$value;
+ return $this;
+ }
+
+ /**
+ * List files to exclude.
+ *
+ * @param string[] $exclude
+ *
+ * @return $this
+ */
+ public function exclude($exclude = [])
+ {
+ $this->exclude = $exclude;
+ return $this;
+ }
+
+ /**
+ * Copies a directory to another location.
+ *
+ * @param string $src Source directory
+ * @param string $dst Destination directory
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ protected function copyDir($src, $dst)
+ {
+ $dir = @opendir($src);
+ if (false === $dir) {
+ throw new TaskException($this, "Cannot open source directory '" . $src . "'");
+ }
+ if (!is_dir($dst)) {
+ mkdir($dst, $this->chmod, true);
+ }
+ while (false !== ($file = readdir($dir))) {
+ if (in_array($file, $this->exclude)) {
+ continue;
+ }
+ if (($file !== '.') && ($file !== '..')) {
+ $srcFile = $src . '/' . $file;
+ $destFile = $dst . '/' . $file;
+ if (is_dir($srcFile)) {
+ $this->copyDir($srcFile, $destFile);
+ } else {
+ copy($srcFile, $destFile);
+ }
+ }
+ }
+ closedir($dir);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/DeleteDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/DeleteDir.php
new file mode 100644
index 00000000..25cf007b
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/DeleteDir.php
@@ -0,0 +1,36 @@
+taskDeleteDir('tmp')->run();
+ * // as shortcut
+ * $this->_deleteDir(['tmp', 'log']);
+ * ?>
+ * ```
+ */
+class DeleteDir extends BaseDir
+{
+ use ResourceExistenceChecker;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (!$this->checkResources($this->dirs, 'dir')) {
+ return Result::error($this, 'Source directories are missing!');
+ }
+ foreach ($this->dirs as $dir) {
+ $this->fs->remove($dir);
+ $this->printTaskInfo("Deleted {dir}...", ['dir' => $dir]);
+ }
+ return Result::success($this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/FilesystemStack.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/FilesystemStack.php
new file mode 100644
index 00000000..2a0e115a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/FilesystemStack.php
@@ -0,0 +1,156 @@
+taskFilesystemStack()
+ * ->mkdir('logs')
+ * ->touch('logs/.gitignore')
+ * ->chgrp('www', 'www-data')
+ * ->symlink('/var/log/nginx/error.log', 'logs/error.log')
+ * ->run();
+ *
+ * // one line
+ * $this->_touch('.gitignore');
+ * $this->_mkdir('logs');
+ *
+ * ?>
+ * ```
+ *
+ * @method $this mkdir($dir)
+ * @method $this touch($file)
+ * @method $this copy($from, $to, $force = null)
+ * @method $this chmod($file, $permissions, $umask = null, $recursive = null)
+ * @method $this chgrp($file, $group, $recursive = null)
+ * @method $this chown($file, $user, $recursive = null)
+ * @method $this remove($file)
+ * @method $this rename($from, $to)
+ * @method $this symlink($from, $to)
+ * @method $this mirror($from, $to)
+ */
+class FilesystemStack extends StackBasedTask implements BuilderAwareInterface
+{
+ use BuilderAwareTrait;
+
+ /**
+ * @var \Symfony\Component\Filesystem\Filesystem
+ */
+ protected $fs;
+
+ public function __construct()
+ {
+ $this->fs = new sfFilesystem();
+ }
+
+ /**
+ * @return \Symfony\Component\Filesystem\Filesystem
+ */
+ protected function getDelegate()
+ {
+ return $this->fs;
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ * @param bool $force
+ */
+ protected function _copy($from, $to, $force = false)
+ {
+ $this->fs->copy($from, $to, $force);
+ }
+
+ /**
+ * @param string|string[]|\Traversable $file
+ * @param int $permissions
+ * @param int $umask
+ * @param bool $recursive
+ */
+ protected function _chmod($file, $permissions, $umask = 0000, $recursive = false)
+ {
+ $this->fs->chmod($file, $permissions, $umask, $recursive);
+ }
+
+ /**
+ * @param string|string[]|\Traversable $file
+ * @param string $group
+ * @param bool $recursive
+ */
+ protected function _chgrp($file, $group, $recursive = null)
+ {
+ $this->fs->chgrp($file, $group, $recursive);
+ }
+
+ /**
+ * @param string|string[]|\Traversable $file
+ * @param string $user
+ * @param bool $recursive
+ */
+ protected function _chown($file, $user, $recursive = null)
+ {
+ $this->fs->chown($file, $user, $recursive);
+ }
+
+ /**
+ * @param string $origin
+ * @param string $target
+ * @param bool $overwrite
+ *
+ * @return null|true|\Robo\Result
+ */
+ protected function _rename($origin, $target, $overwrite = false)
+ {
+ // we check that target does not exist
+ if ((!$overwrite && is_readable($target)) || (file_exists($target) && !is_writable($target))) {
+ throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
+ }
+
+ // Due to a bug (limitation) in PHP, cross-volume renames do not work.
+ // See: https://bugs.php.net/bug.php?id=54097
+ if (true !== @rename($origin, $target)) {
+ return $this->crossVolumeRename($origin, $target);
+ }
+ return true;
+ }
+
+ /**
+ * @param string $origin
+ * @param string $target
+ *
+ * @return null|\Robo\Result
+ */
+ protected function crossVolumeRename($origin, $target)
+ {
+ // First step is to try to get rid of the target. If there
+ // is a single, deletable file, then we will just unlink it.
+ if (is_file($target)) {
+ unlink($target);
+ }
+ // If the target still exists, we will try to delete it.
+ // TODO: Note that if this fails partway through, then we cannot
+ // adequately rollback. Perhaps we need to preflight the operation
+ // and determine if everything inside of $target is writable.
+ if (file_exists($target)) {
+ $this->fs->remove($target);
+ }
+
+ /** @var \Robo\Result $result */
+ $result = $this->collectionBuilder()->taskCopyDir([$origin => $target])->run();
+ if (!$result->wasSuccessful()) {
+ return $result;
+ }
+ $this->fs->remove($origin);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/FlattenDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/FlattenDir.php
new file mode 100644
index 00000000..6e885112
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/FlattenDir.php
@@ -0,0 +1,294 @@
+taskFlattenDir(['assets/*.min.js' => 'dist'])->run();
+ * // or use shortcut
+ * $this->_flattenDir('assets/*.min.js', 'dist');
+ * ?>
+ * ```
+ *
+ * You can also define the target directory with an additional method, instead of
+ * key/value pairs. More similar to the gulp-flatten syntax:
+ *
+ * ``` php
+ * taskFlattenDir(['assets/*.min.js'])
+ * ->to('dist')
+ * ->run();
+ * ?>
+ * ```
+ *
+ * You can also append parts of the parent directories to the target path. If you give
+ * the value `1` to the `includeParents()` method, then the top parent will be appended
+ * to the target directory resulting in a path such as `dist/assets/asset-library1.min.js`.
+ *
+ * If you give a negative number, such as `-1` (the same as specifying `array(0, 1)` then
+ * the bottom parent will be appended, resulting in a path such as
+ * `dist/asset-library1/asset-library1.min.js`.
+ *
+ * The top parent directory will always be starting from the relative path to the current
+ * directory. You can override that with the `parentDir()` method. If in the above example
+ * you would specify `assets`, then the top parent directory would be `asset-library1`.
+ *
+ * ``` php
+ * taskFlattenDir(['assets/*.min.js' => 'dist'])
+ * ->parentDir('assets')
+ * ->includeParents(1)
+ * ->run();
+ * ?>
+ * ```
+ */
+class FlattenDir extends BaseDir
+{
+ /**
+ * @var int
+ */
+ protected $chmod = 0755;
+
+ /**
+ * @var int[]
+ */
+ protected $parents = array(0, 0);
+
+ /**
+ * @var string
+ */
+ protected $parentDir = '';
+
+ /**
+ * @var string
+ */
+ protected $to;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct($dirs)
+ {
+ parent::__construct($dirs);
+ $this->parentDir = getcwd();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ // find the files
+ $files = $this->findFiles($this->dirs);
+
+ // copy the files
+ $this->copyFiles($files);
+
+ $fileNoun = count($files) == 1 ? ' file' : ' files';
+ $this->printTaskSuccess("Copied {count} $fileNoun to {destination}", ['count' => count($files), 'destination' => $this->to]);
+
+ return Result::success($this);
+ }
+
+ /**
+ * Sets the default folder permissions for the destination if it does not exist.
+ *
+ * @link http://en.wikipedia.org/wiki/Chmod
+ * @link http://php.net/manual/en/function.mkdir.php
+ * @link http://php.net/manual/en/function.chmod.php
+ *
+ * @param int $permission
+ *
+ * @return $this
+ */
+ public function dirPermissions($permission)
+ {
+ $this->chmod = (int) $permission;
+
+ return $this;
+ }
+
+ /**
+ * Sets the value from which direction and how much parent dirs should be included.
+ * Accepts a positive or negative integer or an array with two integer values.
+ *
+ * @param int|int[] $parents
+ *
+ * @return $this
+ *
+ * @throws TaskException
+ */
+ public function includeParents($parents)
+ {
+ if (is_int($parents)) {
+ // if an integer is given check whether it is for top or bottom parent
+ if ($parents >= 0) {
+ $this->parents[0] = $parents;
+ return $this;
+ }
+ $this->parents[1] = 0 - $parents;
+ return $this;
+ }
+
+ if (is_array($parents)) {
+ // check if the array has two values no more, no less
+ if (count($parents) == 2) {
+ $this->parents = $parents;
+ return $this;
+ }
+ }
+
+ throw new TaskException($this, 'includeParents expects an integer or an array with two values');
+ }
+
+ /**
+ * Sets the parent directory from which the relative parent directories will be calculated.
+ *
+ * @param string $dir
+ *
+ * @return $this
+ */
+ public function parentDir($dir)
+ {
+ if (!$this->fs->isAbsolutePath($dir)) {
+ // attach the relative path to current working directory
+ $dir = getcwd().'/'.$dir;
+ }
+ $this->parentDir = $dir;
+
+ return $this;
+ }
+
+ /**
+ * Sets the target directory where the files will be copied to.
+ *
+ * @param string $target
+ *
+ * @return $this
+ */
+ public function to($target)
+ {
+ $this->to = rtrim($target, '/');
+
+ return $this;
+ }
+
+ /**
+ * @param array $dirs
+ *
+ * @return array|\Robo\Result
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ protected function findFiles($dirs)
+ {
+ $files = array();
+
+ // find the files
+ foreach ($dirs as $k => $v) {
+ // reset finder
+ $finder = new Finder();
+
+ $dir = $k;
+ $to = $v;
+ // check if target was given with the to() method instead of key/value pairs
+ if (is_int($k)) {
+ $dir = $v;
+ if (isset($this->to)) {
+ $to = $this->to;
+ } else {
+ throw new TaskException($this, 'target directory is not defined');
+ }
+ }
+
+ try {
+ $finder->files()->in($dir);
+ } catch (\InvalidArgumentException $e) {
+ // if finder cannot handle it, try with in()->name()
+ if (strpos($dir, '/') === false) {
+ $dir = './'.$dir;
+ }
+ $parts = explode('/', $dir);
+ $new_dir = implode('/', array_slice($parts, 0, -1));
+ try {
+ $finder->files()->in($new_dir)->name(array_pop($parts));
+ } catch (\InvalidArgumentException $e) {
+ return Result::fromException($this, $e);
+ }
+ }
+
+ foreach ($finder as $file) {
+ // store the absolute path as key and target as value in the files array
+ $files[$file->getRealpath()] = $this->getTarget($file->getRealPath(), $to);
+ }
+ $fileNoun = count($files) == 1 ? ' file' : ' files';
+ $this->printTaskInfo("Found {count} $fileNoun in {dir}", ['count' => count($files), 'dir' => $dir]);
+ }
+
+ return $files;
+ }
+
+ /**
+ * @param string $file
+ * @param string $to
+ *
+ * @return string
+ */
+ protected function getTarget($file, $to)
+ {
+ $target = $to.'/'.basename($file);
+ if ($this->parents !== array(0, 0)) {
+ // if the parent is set, create additional directories inside target
+ // get relative path to parentDir
+ $rel_path = $this->fs->makePathRelative(dirname($file), $this->parentDir);
+ // get top parents and bottom parents
+ $parts = explode('/', rtrim($rel_path, '/'));
+ $prefix_dir = '';
+ $prefix_dir .= ($this->parents[0] > 0 ? implode('/', array_slice($parts, 0, $this->parents[0])).'/' : '');
+ $prefix_dir .= ($this->parents[1] > 0 ? implode('/', array_slice($parts, (0 - $this->parents[1]), $this->parents[1])) : '');
+ $prefix_dir = rtrim($prefix_dir, '/');
+ $target = $to.'/'.$prefix_dir.'/'.basename($file);
+ }
+
+ return $target;
+ }
+
+ /**
+ * @param array $files
+ */
+ protected function copyFiles($files)
+ {
+ // copy the files
+ foreach ($files as $from => $to) {
+ // check if target dir exists
+ if (!is_dir(dirname($to))) {
+ $this->fs->mkdir(dirname($to), $this->chmod);
+ }
+ $this->fs->copy($from, $to);
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/MirrorDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/MirrorDir.php
new file mode 100644
index 00000000..4eda9097
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/MirrorDir.php
@@ -0,0 +1,40 @@
+taskMirrorDir(['dist/config/' => 'config/'])->run();
+ * // or use shortcut
+ * $this->_mirrorDir('dist/config/', 'config/');
+ *
+ * ?>
+ * ```
+ */
+class MirrorDir extends BaseDir
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ foreach ($this->dirs as $src => $dst) {
+ $this->fs->mirror(
+ $src,
+ $dst,
+ null,
+ [
+ 'override' => true,
+ 'copy_on_windows' => true,
+ 'delete' => true
+ ]
+ );
+ $this->printTaskInfo("Mirrored from {source} to {destination}", ['source' => $src, 'destination' => $dst]);
+ }
+ return Result::success($this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/TmpDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/TmpDir.php
new file mode 100644
index 00000000..8cf44f89
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/TmpDir.php
@@ -0,0 +1,174 @@
+run().
+ * $collection = $this->collectionBuilder();
+ * $tmpPath = $collection->tmpDir()->getPath();
+ * $collection->taskFilesystemStack()
+ * ->mkdir("$tmpPath/log")
+ * ->touch("$tmpPath/log/error.txt");
+ * $collection->run();
+ * // as shortcut (deleted when program exits)
+ * $tmpPath = $this->_tmpDir();
+ * ?>
+ * ```
+ */
+class TmpDir extends BaseDir implements CompletionInterface
+{
+ /**
+ * @var string
+ */
+ protected $base;
+
+ /**
+ * @var string
+ */
+ protected $prefix;
+
+ /**
+ * @var bool
+ */
+ protected $cwd;
+
+ /**
+ * @var string
+ */
+ protected $savedWorkingDirectory;
+
+ /**
+ * @param string $prefix
+ * @param string $base
+ * @param bool $includeRandomPart
+ */
+ public function __construct($prefix = 'tmp', $base = '', $includeRandomPart = true)
+ {
+ if (empty($base)) {
+ $base = sys_get_temp_dir();
+ }
+ $path = "{$base}/{$prefix}";
+ if ($includeRandomPart) {
+ $path = static::randomLocation($path);
+ }
+ parent::__construct(["$path"]);
+ }
+
+ /**
+ * Add a random part to a path, ensuring that the directory does
+ * not (currently) exist.
+ *
+ * @param string $path The base/prefix path to add a random component to
+ * @param int $length Number of digits in the random part
+ *
+ * @return string
+ */
+ protected static function randomLocation($path, $length = 12)
+ {
+ $random = static::randomString($length);
+ while (is_dir("{$path}_{$random}")) {
+ $random = static::randomString($length);
+ }
+ return "{$path}_{$random}";
+ }
+
+ /**
+ * Generate a suitably random string to use as the suffix for our
+ * temporary directory.
+ *
+ * @param int $length
+ *
+ * @return string
+ */
+ protected static function randomString($length = 12)
+ {
+ return substr(str_shuffle('23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'), 0, max($length, 3));
+ }
+
+ /**
+ * Flag that we should cwd to the temporary directory when it is
+ * created, and restore the old working directory when it is deleted.
+ *
+ * @param bool $shouldChangeWorkingDirectory
+ *
+ * @return $this
+ */
+ public function cwd($shouldChangeWorkingDirectory = true)
+ {
+ $this->cwd = $shouldChangeWorkingDirectory;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ // Save the current working directory
+ $this->savedWorkingDirectory = getcwd();
+ foreach ($this->dirs as $dir) {
+ $this->fs->mkdir($dir);
+ $this->printTaskInfo("Created {dir}...", ['dir' => $dir]);
+
+ // Change the current working directory, if requested
+ if ($this->cwd) {
+ chdir($dir);
+ }
+ }
+
+ return Result::success($this, '', ['path' => $this->getPath()]);
+ }
+
+ protected function restoreWorkingDirectory()
+ {
+ // Restore the current working directory, if we redirected it.
+ if ($this->cwd) {
+ chdir($this->savedWorkingDirectory);
+ }
+ }
+
+ protected function deleteTmpDir()
+ {
+ foreach ($this->dirs as $dir) {
+ $this->fs->remove($dir);
+ }
+ }
+
+ /**
+ * Delete this directory when our collection completes.
+ * If this temporary directory is not part of a collection,
+ * then it will be deleted when the program terminates,
+ * presuming that it was created by taskTmpDir() or _tmpDir().
+ */
+ public function complete()
+ {
+ $this->restoreWorkingDirectory();
+ $this->deleteTmpDir();
+ }
+
+ /**
+ * Get a reference to the path to the temporary directory, so that
+ * it may be used to create other tasks. Note that the directory
+ * is not actually created until the task runs.
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->dirs[0];
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/WorkDir.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/WorkDir.php
new file mode 100644
index 00000000..3c445b8b
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/WorkDir.php
@@ -0,0 +1,128 @@
+collectionBuilder();
+ * $workingPath = $collection->workDir("build")->getPath();
+ * $collection->taskFilesystemStack()
+ * ->mkdir("$workingPath/log")
+ * ->touch("$workingPath/log/error.txt");
+ * $collection->run();
+ * ?>
+ * ```
+ */
+class WorkDir extends TmpDir implements RollbackInterface, BuilderAwareInterface
+{
+ use BuilderAwareTrait;
+
+ /**
+ * @var string
+ */
+ protected $finalDestination;
+
+ /**
+ * @param string $finalDestination
+ */
+ public function __construct($finalDestination)
+ {
+ $this->finalDestination = $finalDestination;
+
+ // Create a temporary directory to work in. We will place our
+ // temporary directory in the same location as the final destination
+ // directory, so that the work directory can be moved into place
+ // without having to be copied, e.g. in a cross-volume rename scenario.
+ parent::__construct(basename($finalDestination), dirname($finalDestination));
+ }
+
+ /**
+ * Create our working directory.
+ *
+ * @return \Robo\Result
+ */
+ public function run()
+ {
+ // Destination cannot be empty
+ if (empty($this->finalDestination)) {
+ return Result::error($this, "Destination directory not specified.");
+ }
+
+ // Before we do anything else, ensure that any directory in the
+ // final destination is writable, so that we can at a minimum
+ // move it out of the way before placing our results there.
+ if (is_dir($this->finalDestination)) {
+ if (!is_writable($this->finalDestination)) {
+ return Result::error($this, "Destination directory {dir} exists and cannot be overwritten.", ['dir' => $this->finalDestination]);
+ }
+ }
+
+ return parent::run();
+ }
+
+ /**
+ * Move our working directory into its final destination once the
+ * collection it belongs to completes.
+ */
+ public function complete()
+ {
+ $this->restoreWorkingDirectory();
+
+ // Delete the final destination, if it exists.
+ // Move it out of the way first, in case it cannot
+ // be completely deleted.
+ if (file_exists($this->finalDestination)) {
+ $temporaryLocation = static::randomLocation($this->finalDestination . '_TO_DELETE_');
+ // This should always work, because we already created a temporary
+ // folder in the parent directory of the final destination, and we
+ // have already checked to confirm that the final destination is
+ // writable.
+ rename($this->finalDestination, $temporaryLocation);
+ // This may silently fail, leaving artifacts behind, if there
+ // are permissions problems with some items somewhere inside
+ // the folder being deleted.
+ $this->fs->remove($temporaryLocation);
+ }
+
+ // Move our working directory over the final destination.
+ // This should never be a cross-volume rename, so this should
+ // always succeed.
+ $workDir = reset($this->dirs);
+ if (file_exists($workDir)) {
+ rename($workDir, $this->finalDestination);
+ }
+ }
+
+ /**
+ * Delete our working directory
+ */
+ public function rollback()
+ {
+ $this->restoreWorkingDirectory();
+ $this->deleteTmpDir();
+ }
+
+ /**
+ * Get a reference to the path to the temporary directory, so that
+ * it may be used to create other tasks. Note that the directory
+ * is not actually created until the task runs.
+ *
+ * @return string
+ */
+ public function getPath()
+ {
+ return $this->dirs[0];
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/loadShortcuts.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/loadShortcuts.php
new file mode 100644
index 00000000..3a670a93
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/loadShortcuts.php
@@ -0,0 +1,160 @@
+taskCopyDir([$src => $dst])->run();
+ }
+
+ /**
+ * @param string $src
+ * @param string $dst
+ *
+ * @return \Robo\Result
+ */
+ protected function _mirrorDir($src, $dst)
+ {
+ return $this->taskMirrorDir([$src => $dst])->run();
+ }
+
+ /**
+ * @param string|string[] $dir
+ *
+ * @return \Robo\Result
+ */
+ protected function _deleteDir($dir)
+ {
+ return $this->taskDeleteDir($dir)->run();
+ }
+
+ /**
+ * @param string|string[] $dir
+ *
+ * @return \Robo\Result
+ */
+ protected function _cleanDir($dir)
+ {
+ return $this->taskCleanDir($dir)->run();
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return \Robo\Result
+ */
+ protected function _rename($from, $to)
+ {
+ return $this->taskFilesystemStack()->rename($from, $to)->run();
+ }
+
+ /**
+ * @param string|string[] $dir
+ *
+ * @return \Robo\Result
+ */
+ protected function _mkdir($dir)
+ {
+ return $this->taskFilesystemStack()->mkdir($dir)->run();
+ }
+
+ /**
+ * @param string $prefix
+ * @param string $base
+ * @param bool $includeRandomPart
+ *
+ * @return string
+ */
+ protected function _tmpDir($prefix = 'tmp', $base = '', $includeRandomPart = true)
+ {
+ $result = $this->taskTmpDir($prefix, $base, $includeRandomPart)->run();
+ return isset($result['path']) ? $result['path'] : '';
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return \Robo\Result
+ */
+ protected function _touch($file)
+ {
+ return $this->taskFilesystemStack()->touch($file)->run();
+ }
+
+ /**
+ * @param string|string[] $file
+ *
+ * @return \Robo\Result
+ */
+ protected function _remove($file)
+ {
+ return $this->taskFilesystemStack()->remove($file)->run();
+ }
+
+ /**
+ * @param string|string[] $file
+ * @param string $group
+ *
+ * @return \Robo\Result
+ */
+ protected function _chgrp($file, $group)
+ {
+ return $this->taskFilesystemStack()->chgrp($file, $group)->run();
+ }
+
+ /**
+ * @param string|string[] $file
+ * @param int $permissions
+ * @param int $umask
+ * @param bool $recursive
+ *
+ * @return \Robo\Result
+ */
+ protected function _chmod($file, $permissions, $umask = 0000, $recursive = false)
+ {
+ return $this->taskFilesystemStack()->chmod($file, $permissions, $umask, $recursive)->run();
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return \Robo\Result
+ */
+ protected function _symlink($from, $to)
+ {
+ return $this->taskFilesystemStack()->symlink($from, $to)->run();
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return \Robo\Result
+ */
+ protected function _copy($from, $to)
+ {
+ return $this->taskFilesystemStack()->copy($from, $to)->run();
+ }
+
+ /**
+ * @param string $from
+ * @param string $to
+ *
+ * @return \Robo\Result
+ */
+ protected function _flattenDir($from, $to)
+ {
+ return $this->taskFlattenDir([$from => $to])->run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Filesystem/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/loadTasks.php
new file mode 100644
index 00000000..932e8332
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Filesystem/loadTasks.php
@@ -0,0 +1,87 @@
+task(CleanDir::class, $dirs);
+ }
+
+ /**
+ * @param string|string[] $dirs
+ *
+ * @return \Robo\Task\Filesystem\DeleteDir
+ */
+ protected function taskDeleteDir($dirs)
+ {
+ return $this->task(DeleteDir::class, $dirs);
+ }
+
+ /**
+ * @param string $prefix
+ * @param string $base
+ * @param bool $includeRandomPart
+ *
+ * @return \Robo\Task\Filesystem\WorkDir
+ */
+ protected function taskTmpDir($prefix = 'tmp', $base = '', $includeRandomPart = true)
+ {
+ return $this->task(TmpDir::class, $prefix, $base, $includeRandomPart);
+ }
+
+ /**
+ * @param string $finalDestination
+ *
+ * @return \Robo\Task\Filesystem\TmpDir
+ */
+ protected function taskWorkDir($finalDestination)
+ {
+ return $this->task(WorkDir::class, $finalDestination);
+ }
+
+ /**
+ * @param string|string[] $dirs
+ *
+ * @return \Robo\Task\Filesystem\CopyDir
+ */
+ protected function taskCopyDir($dirs)
+ {
+ return $this->task(CopyDir::class, $dirs);
+ }
+
+ /**
+ * @param string|string[] $dirs
+ *
+ * @return \Robo\Task\Filesystem\MirrorDir
+ */
+ protected function taskMirrorDir($dirs)
+ {
+ return $this->task(MirrorDir::class, $dirs);
+ }
+
+ /**
+ * @param string|string[] $dirs
+ *
+ * @return \Robo\Task\Filesystem\FlattenDir
+ */
+ protected function taskFlattenDir($dirs)
+ {
+ return $this->task(FlattenDir::class, $dirs);
+ }
+
+ /**
+ * @return \Robo\Task\Filesystem\FilesystemStack
+ */
+ protected function taskFilesystemStack()
+ {
+ return $this->task(FilesystemStack::class);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Gulp/Base.php b/src/composer/vendor/consolidation/robo/src/Task/Gulp/Base.php
new file mode 100644
index 00000000..c1cf8ae2
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Gulp/Base.php
@@ -0,0 +1,97 @@
+option('silent');
+ return $this;
+ }
+
+ /**
+ * adds `--no-color` option to gulp
+ *
+ * @return $this
+ */
+ public function noColor()
+ {
+ $this->option('no-color');
+ return $this;
+ }
+
+ /**
+ * adds `--color` option to gulp
+ *
+ * @return $this
+ */
+ public function color()
+ {
+ $this->option('color');
+ return $this;
+ }
+
+ /**
+ * adds `--tasks-simple` option to gulp
+ *
+ * @return $this
+ */
+ public function simple()
+ {
+ $this->option('tasks-simple');
+ return $this;
+ }
+
+ /**
+ * @param string $task
+ * @param null|string $pathToGulp
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($task, $pathToGulp = null)
+ {
+ $this->task = $task;
+ $this->command = $pathToGulp;
+ if (!$this->command) {
+ $this->command = $this->findExecutable('gulp');
+ }
+ if (!$this->command) {
+ throw new TaskException(__CLASS__, "Gulp executable not found.");
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getCommand()
+ {
+ return "{$this->command} " . ProcessUtils::escapeArgument($this->task) . "{$this->arguments}";
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Gulp/Run.php b/src/composer/vendor/consolidation/robo/src/Task/Gulp/Run.php
new file mode 100644
index 00000000..dde81cc7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Gulp/Run.php
@@ -0,0 +1,36 @@
+taskGulpRun()->run();
+ *
+ * // run task 'clean' with --silent option
+ * $this->taskGulpRun('clean')
+ * ->silent()
+ * ->run();
+ * ?>
+ * ```
+ */
+class Run extends Base implements CommandInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ if (strlen($this->arguments)) {
+ $this->printTaskInfo('Running Gulp task: {gulp_task} with arguments: {arguments}', ['gulp_task' => $this->task, 'arguments' => $this->arguments]);
+ } else {
+ $this->printTaskInfo('Running Gulp task: {gulp_task} without arguments', ['gulp_task' => $this->task]);
+ }
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Gulp/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Gulp/loadTasks.php
new file mode 100644
index 00000000..6fdc6ca7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Gulp/loadTasks.php
@@ -0,0 +1,16 @@
+task(Run::class, $task, $pathToGulp);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Npm/Base.php b/src/composer/vendor/consolidation/robo/src/Task/Npm/Base.php
new file mode 100644
index 00000000..35ff9c48
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Npm/Base.php
@@ -0,0 +1,60 @@
+option('production');
+ return $this;
+ }
+
+ /**
+ * @param null|string $pathToNpm
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToNpm = null)
+ {
+ $this->command = $pathToNpm;
+ if (!$this->command) {
+ $this->command = $this->findExecutable('npm');
+ }
+ if (!$this->command) {
+ throw new TaskException(__CLASS__, "Npm executable not found.");
+ }
+ }
+
+ /**
+ * @return string
+ */
+ public function getCommand()
+ {
+ return "{$this->command} {$this->action}{$this->arguments}";
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Npm/Install.php b/src/composer/vendor/consolidation/robo/src/Task/Npm/Install.php
new file mode 100644
index 00000000..65cbe618
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Npm/Install.php
@@ -0,0 +1,36 @@
+taskNpmInstall()->run();
+ *
+ * // prefer dist with custom path
+ * $this->taskNpmInstall('path/to/my/npm')
+ * ->noDev()
+ * ->run();
+ * ?>
+ * ```
+ */
+class Install extends Base implements CommandInterface
+{
+ /**
+ * @var string
+ */
+ protected $action = 'install';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Install Npm packages: {arguments}', ['arguments' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Npm/Update.php b/src/composer/vendor/consolidation/robo/src/Task/Npm/Update.php
new file mode 100644
index 00000000..75421b30
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Npm/Update.php
@@ -0,0 +1,34 @@
+taskNpmUpdate()->run();
+ *
+ * // prefer dist with custom path
+ * $this->taskNpmUpdate('path/to/my/npm')
+ * ->noDev()
+ * ->run();
+ * ?>
+ * ```
+ */
+class Update extends Base
+{
+ /**
+ * @var string
+ */
+ protected $action = 'update';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Update Npm packages: {arguments}', ['arguments' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Npm/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Npm/loadTasks.php
new file mode 100644
index 00000000..4d9a26eb
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Npm/loadTasks.php
@@ -0,0 +1,25 @@
+task(Install::class, $pathToNpm);
+ }
+
+ /**
+ * @param null|string $pathToNpm
+ *
+ * @return \Robo\Task\Npm\Update
+ */
+ protected function taskNpmUpdate($pathToNpm = null)
+ {
+ return $this->task(Update::class, $pathToNpm);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Remote/Rsync.php b/src/composer/vendor/consolidation/robo/src/Task/Remote/Rsync.php
new file mode 100644
index 00000000..33ed3a0e
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Remote/Rsync.php
@@ -0,0 +1,491 @@
+taskRsync()
+ * ->fromPath('src/')
+ * ->toHost('localhost')
+ * ->toUser('dev')
+ * ->toPath('/var/www/html/app/')
+ * ->remoteShell('ssh -i public_key')
+ * ->recursive()
+ * ->excludeVcs()
+ * ->checksum()
+ * ->wholeFile()
+ * ->verbose()
+ * ->progress()
+ * ->humanReadable()
+ * ->stats()
+ * ->run();
+ * ```
+ *
+ * You could also clone the task and do a dry-run first:
+ *
+ * ``` php
+ * $rsync = $this->taskRsync()
+ * ->fromPath('src/')
+ * ->toPath('example.com:/var/www/html/app/')
+ * ->archive()
+ * ->excludeVcs()
+ * ->progress()
+ * ->stats();
+ *
+ * $dryRun = clone $rsync;
+ * $dryRun->dryRun()->run();
+ * if ('y' === $this->ask('Do you want to run (y/n)')) {
+ * $rsync->run();
+ * }
+ * ```
+ *
+ * @method \Robo\Task\Remote\Rsync fromUser(string $user)
+ * @method \Robo\Task\Remote\Rsync fromHost(string $hostname)
+ * @method \Robo\Task\Remote\Rsync toUser(string $user)
+ * @method \Robo\Task\Remote\Rsync toHost(string $hostname)
+ */
+class Rsync extends BaseTask implements CommandInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var string
+ */
+ protected $command;
+
+ /**
+ * @var string
+ */
+ protected $fromUser;
+
+ /**
+ * @var string
+ */
+ protected $fromHost;
+
+ /**
+ * @var string
+ */
+ protected $fromPath;
+
+ /**
+ * @var string
+ */
+ protected $toUser;
+
+ /**
+ * @var string
+ */
+ protected $toHost;
+
+ /**
+ * @var string
+ */
+ protected $toPath;
+
+ /**
+ * @return static
+ */
+ public static function init()
+ {
+ return new static();
+ }
+
+ public function __construct()
+ {
+ $this->command = 'rsync';
+ }
+
+ /**
+ * This can either be a full rsync path spec (user@host:path) or just a path.
+ * In case of the former do not specify host and user.
+ *
+ * @param string|array $path
+ *
+ * @return $this
+ */
+ public function fromPath($path)
+ {
+ $this->fromPath = $path;
+
+ return $this;
+ }
+
+ /**
+ * This can either be a full rsync path spec (user@host:path) or just a path.
+ * In case of the former do not specify host and user.
+ *
+ * @param string $path
+ *
+ * @return $this
+ */
+ public function toPath($path)
+ {
+ $this->toPath = $path;
+
+ return $this;
+ }
+
+ /**
+ * @param string $fromUser
+ *
+ * @return $this
+ */
+ public function fromUser($fromUser)
+ {
+ $this->fromUser = $fromUser;
+ return $this;
+ }
+
+ /**
+ * @param string $fromHost
+ *
+ * @return $this
+ */
+ public function fromHost($fromHost)
+ {
+ $this->fromHost = $fromHost;
+ return $this;
+ }
+
+ /**
+ * @param string $toUser
+ *
+ * @return $this
+ */
+ public function toUser($toUser)
+ {
+ $this->toUser = $toUser;
+ return $this;
+ }
+
+ /**
+ * @param string $toHost
+ *
+ * @return $this
+ */
+ public function toHost($toHost)
+ {
+ $this->toHost = $toHost;
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function progress()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function stats()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function recursive()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function verbose()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function checksum()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function archive()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function compress()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function owner()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function group()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function times()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function delete()
+ {
+ $this->option(__FUNCTION__);
+
+ return $this;
+ }
+
+ /**
+ * @param int $seconds
+ *
+ * @return $this
+ */
+ public function timeout($seconds)
+ {
+ $this->option(__FUNCTION__, $seconds);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function humanReadable()
+ {
+ $this->option('human-readable');
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function wholeFile()
+ {
+ $this->option('whole-file');
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function dryRun()
+ {
+ $this->option('dry-run');
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function itemizeChanges()
+ {
+ $this->option('itemize-changes');
+
+ return $this;
+ }
+
+ /**
+ * Excludes .git, .svn and .hg items at any depth.
+ *
+ * @return $this
+ */
+ public function excludeVcs()
+ {
+ return $this->exclude([
+ '.git',
+ '.svn',
+ '.hg',
+ ]);
+ }
+
+ /**
+ * @param array|string $pattern
+ *
+ * @return $this
+ */
+ public function exclude($pattern)
+ {
+ return $this->optionList(__FUNCTION__, $pattern);
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return $this
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function excludeFrom($file)
+ {
+ if (!is_readable($file)) {
+ throw new TaskException($this, "Exclude file $file is not readable");
+ }
+
+ return $this->option('exclude-from', $file);
+ }
+
+ /**
+ * @param array|string $pattern
+ *
+ * @return $this
+ */
+ public function includeFilter($pattern)
+ {
+ return $this->optionList('include', $pattern);
+ }
+
+ /**
+ * @param array|string $pattern
+ *
+ * @return $this
+ */
+ public function filter($pattern)
+ {
+ return $this->optionList(__FUNCTION__, $pattern);
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return $this
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function filesFrom($file)
+ {
+ if (!is_readable($file)) {
+ throw new TaskException($this, "Files-from file $file is not readable");
+ }
+
+ return $this->option('files-from', $file);
+ }
+
+ /**
+ * @param string $command
+ *
+ * @return $this
+ */
+ public function remoteShell($command)
+ {
+ $this->option('rsh', "'$command'");
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo("Running {command}", ['command' => $command]);
+
+ return $this->executeCommand($command);
+ }
+
+ /**
+ * Returns command that can be executed.
+ * This method is used to pass generated command from one task to another.
+ *
+ * @return string
+ */
+ public function getCommand()
+ {
+ foreach ((array)$this->fromPath as $from) {
+ $this->option(null, $this->getFromPathSpec($from));
+ }
+ $this->option(null, $this->getToPathSpec());
+
+ return $this->command . $this->arguments;
+ }
+
+ /**
+ * @return string
+ */
+ protected function getFromPathSpec($from)
+ {
+ return $this->getPathSpec($this->fromHost, $this->fromUser, $from);
+ }
+
+ /**
+ * @return string
+ */
+ protected function getToPathSpec()
+ {
+ return $this->getPathSpec($this->toHost, $this->toUser, $this->toPath);
+ }
+
+ /**
+ * @param string $host
+ * @param string $user
+ * @param string $path
+ *
+ * @return string
+ */
+ protected function getPathSpec($host, $user, $path)
+ {
+ $spec = isset($path) ? $path : '';
+ if (!empty($host)) {
+ $spec = "{$host}:{$spec}";
+ }
+ if (!empty($user)) {
+ $spec = "{$user}@{$spec}";
+ }
+
+ return $spec;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Remote/Ssh.php b/src/composer/vendor/consolidation/robo/src/Task/Remote/Ssh.php
new file mode 100644
index 00000000..500e29fc
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Remote/Ssh.php
@@ -0,0 +1,274 @@
+taskSshExec('remote.example.com', 'user')
+ * ->remoteDir('/var/www/html')
+ * ->exec('ls -la')
+ * ->exec('chmod g+x logs')
+ * ->run();
+ *
+ * ```
+ *
+ * You can even exec other tasks (which implement CommandInterface):
+ *
+ * ```php
+ * $gitTask = $this->taskGitStack()
+ * ->checkout('master')
+ * ->pull();
+ *
+ * $this->taskSshExec('remote.example.com')
+ * ->remoteDir('/var/www/html/site')
+ * ->exec($gitTask)
+ * ->run();
+ * ```
+ *
+ * You can configure the remote directory for all future calls:
+ *
+ * ```php
+ * \Robo\Task\Remote\Ssh::configure('remoteDir', '/some-dir');
+ * ```
+ *
+ * @method $this stopOnFail(bool $stopOnFail) Whether or not to chain commands together with &&
+ * and stop the chain if one command fails
+ * @method $this remoteDir(string $remoteWorkingDirectory) Changes to the given directory before running commands
+ */
+class Ssh extends BaseTask implements CommandInterface, SimulatedInterface
+{
+ use \Robo\Common\CommandReceiver;
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var null|string
+ */
+ protected $hostname;
+
+ /**
+ * @var null|string
+ */
+ protected $user;
+
+ /**
+ * @var bool
+ */
+ protected $stopOnFail = true;
+
+ /**
+ * @var array
+ */
+ protected $exec = [];
+
+ /**
+ * Changes to the given directory before running commands.
+ *
+ * @var string
+ */
+ protected $remoteDir;
+
+ /**
+ * @param null|string $hostname
+ * @param null|string $user
+ */
+ public function __construct($hostname = null, $user = null)
+ {
+ $this->hostname = $hostname;
+ $this->user = $user;
+ }
+
+ /**
+ * @param string $hostname
+ *
+ * @return $this
+ */
+ public function hostname($hostname)
+ {
+ $this->hostname = $hostname;
+ return $this;
+ }
+
+ /**
+ * @param string $user
+ *
+ * @return $this
+ */
+ public function user($user)
+ {
+ $this->user = $user;
+ return $this;
+ }
+
+ /**
+ * @param bool $stopOnFail
+ *
+ * @return $this
+ */
+ public function stopOnFail($stopOnFail = true)
+ {
+ $this->stopOnFail = $stopOnFail;
+ return $this;
+ }
+
+ /**
+ * @param string $remoteDir
+ *
+ * @return $this
+ */
+ public function remoteDir($remoteDir)
+ {
+ $this->remoteDir = $remoteDir;
+ return $this;
+ }
+
+ /**
+ * @param string $filename
+ *
+ * @return $this
+ */
+ public function identityFile($filename)
+ {
+ $this->option('-i', $filename);
+
+ return $this;
+ }
+
+ /**
+ * @param int $port
+ *
+ * @return $this
+ */
+ public function port($port)
+ {
+ $this->option('-p', $port);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function forcePseudoTty()
+ {
+ $this->option('-t');
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function quiet()
+ {
+ $this->option('-q');
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function verbose()
+ {
+ $this->option('-v');
+
+ return $this;
+ }
+
+ /**
+ * @param string|string[]|CommandInterface $command
+ *
+ * @return $this
+ */
+ public function exec($command)
+ {
+ if (is_array($command)) {
+ $command = implode(' ', array_filter($command));
+ }
+
+ $this->exec[] = $command;
+
+ return $this;
+ }
+
+ /**
+ * Returns command that can be executed.
+ * This method is used to pass generated command from one task to another.
+ *
+ * @return string
+ */
+ public function getCommand()
+ {
+ $commands = [];
+ foreach ($this->exec as $command) {
+ $commands[] = $this->receiveCommand($command);
+ }
+
+ $remoteDir = $this->remoteDir ? $this->remoteDir : $this->getConfigValue('remoteDir');
+ if (!empty($remoteDir)) {
+ array_unshift($commands, sprintf('cd "%s"', $remoteDir));
+ }
+ $command = implode($this->stopOnFail ? ' && ' : ' ; ', $commands);
+
+ return $this->sshCommand($command);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->validateParameters();
+ $command = $this->getCommand();
+ return $this->executeCommand($command);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function simulate($context)
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo("Running {command}", ['command' => $command] + $context);
+ }
+
+ protected function validateParameters()
+ {
+ if (empty($this->hostname)) {
+ throw new TaskException($this, 'Please set a hostname');
+ }
+ if (empty($this->exec)) {
+ throw new TaskException($this, 'Please add at least one command');
+ }
+ }
+
+ /**
+ * Returns an ssh command string running $command on the remote.
+ *
+ * @param string|CommandInterface $command
+ *
+ * @return string
+ */
+ protected function sshCommand($command)
+ {
+ $command = $this->receiveCommand($command);
+ $sshOptions = $this->arguments;
+ $hostSpec = $this->hostname;
+ if ($this->user) {
+ $hostSpec = $this->user . '@' . $hostSpec;
+ }
+
+ return sprintf("ssh{$sshOptions} {$hostSpec} '{$command}'");
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Remote/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Remote/loadTasks.php
new file mode 100644
index 00000000..092d2a55
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Remote/loadTasks.php
@@ -0,0 +1,24 @@
+task(Rsync::class);
+ }
+
+ /**
+ * @param null|string $hostname
+ * @param null|string $user
+ *
+ * @return \Robo\Task\Remote\Ssh
+ */
+ protected function taskSshExec($hostname = null, $user = null)
+ {
+ return $this->task(Ssh::class, $hostname, $user);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Simulator.php b/src/composer/vendor/consolidation/robo/src/Task/Simulator.php
new file mode 100644
index 00000000..bc5f555b
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Simulator.php
@@ -0,0 +1,169 @@
+task = ($task instanceof WrappedTaskInterface) ? $task->original() : $task;
+ $this->constructorParameters = $constructorParameters;
+ }
+
+ /**
+ * @param string $function
+ * @param array $args
+ *
+ * @return \Robo\Result|\Robo\Task\Simulator
+ */
+ public function __call($function, $args)
+ {
+ $this->stack[] = array_merge([$function], $args);
+ $result = call_user_func_array([$this->task, $function], $args);
+ return $result == $this->task ? $this : $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $callchain = '';
+ foreach ($this->stack as $action) {
+ $command = array_shift($action);
+ $parameters = $this->formatParameters($action);
+ $callchain .= "\n ->$command($parameters>)";
+ }
+ $context = $this->getTaskContext(
+ [
+ '_level' => RoboLogLevel::SIMULATED_ACTION,
+ 'simulated' => TaskInfo::formatTaskName($this->task),
+ 'parameters' => $this->formatParameters($this->constructorParameters),
+ '_style' => ['simulated' => 'fg=blue;options=bold'],
+ ]
+ );
+
+ // RoboLogLevel::SIMULATED_ACTION
+ $this->printTaskInfo(
+ "Simulating {simulated}({parameters})$callchain",
+ $context
+ );
+
+ $result = null;
+ if ($this->task instanceof SimulatedInterface) {
+ $result = $this->task->simulate($context);
+ }
+ if (!isset($result)) {
+ $result = Result::success($this);
+ }
+
+ return $result;
+ }
+
+ /**
+ * Danger: reach through the simulated wrapper and pull out the command
+ * to be executed. This is used when using a simulated task with another
+ * simulated task that runs commands, e.g. the Remote\Ssh task. Using
+ * a simulated CommandInterface task with a non-simulated task may produce
+ * unexpected results (e.g. execution!).
+ *
+ * @return string
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function getCommand()
+ {
+ if (!$this->task instanceof CommandInterface) {
+ throw new TaskException($this->task, 'Simulated task that is not a CommandInterface used as a CommandInterface.');
+ }
+ return $this->task->getCommand();
+ }
+
+ /**
+ * @param string $action
+ *
+ * @return string
+ */
+ protected function formatParameters($action)
+ {
+ $parameterList = array_map([$this, 'convertParameter'], $action);
+ return implode(', ', $parameterList);
+ }
+
+ /**
+ * @param mixed $item
+ *
+ * @return string
+ */
+ protected function convertParameter($item)
+ {
+ if (is_callable($item)) {
+ return 'inline_function(...)';
+ }
+ if (is_array($item)) {
+ return $this->shortenParameter(var_export($item, true));
+ }
+ if (is_object($item)) {
+ return '[' . get_class($item). ' object]';
+ }
+ if (is_string($item)) {
+ return $this->shortenParameter("'$item'");
+ }
+ if (is_null($item)) {
+ return 'null';
+ }
+ return $item;
+ }
+
+ /**
+ * @param string $item
+ * @param string $shortForm
+ *
+ * @return string
+ */
+ protected function shortenParameter($item, $shortForm = '')
+ {
+ $maxLength = 80;
+ $tailLength = 20;
+ if (strlen($item) < $maxLength) {
+ return $item;
+ }
+ if (!empty($shortForm)) {
+ return $shortForm;
+ }
+ $item = trim($item);
+ $tail = preg_replace("#.*\n#ms", '', substr($item, -$tailLength));
+ $head = preg_replace("#\n.*#ms", '', substr($item, 0, $maxLength - (strlen($tail) + 5)));
+ return "$head ... $tail";
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/StackBasedTask.php b/src/composer/vendor/consolidation/robo/src/Task/StackBasedTask.php
new file mode 100644
index 00000000..868fead8
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/StackBasedTask.php
@@ -0,0 +1,238 @@
+friz()
+ * ->fraz()
+ * ->frob();
+ *
+ * We presume that the existing library throws an exception on error.
+ *
+ * You want:
+ *
+ * $result = $this->taskFrobinator($a, $b, $c)
+ * ->friz()
+ * ->fraz()
+ * ->frob()
+ * ->run();
+ *
+ * Execution is deferred until run(), and a Robo\Result instance is
+ * returned. Additionally, using Robo will covert Exceptions
+ * into RoboResult objects.
+ *
+ * To create a new Robo task:
+ *
+ * - Make a new class that extends StackBasedTask
+ * - Give it a constructor that creates a new Frobinator
+ * - Override getDelegate(), and return the Frobinator instance
+ *
+ * Finally, add your new class to loadTasks.php as usual,
+ * and you are all done.
+ *
+ * If you need to add any methods to your task that should run
+ * immediately (e.g. to set parameters used at run() time), just
+ * implement them in your derived class.
+ *
+ * If you need additional methods that should run deferred, just
+ * define them as 'protected function _foo()'. Then, users may
+ * call $this->taskFrobinator()->foo() to get deferred execution
+ * of _foo().
+ */
+abstract class StackBasedTask extends BaseTask
+{
+ /**
+ * @var array
+ */
+ protected $stack = [];
+
+ /**
+ * @var bool
+ */
+ protected $stopOnFail = true;
+
+ /**
+ * @param bool $stop
+ *
+ * @return $this
+ */
+ public function stopOnFail($stop = true)
+ {
+ $this->stopOnFail = $stop;
+ return $this;
+ }
+
+ /**
+ * Derived classes should override the getDelegate() method, and
+ * return an instance of the API class being wrapped. When this
+ * is done, any method of the delegate is available as a method of
+ * this class. Calling one of the delegate's methods will defer
+ * execution until the run() method is called.
+ *
+ * @return null
+ */
+ protected function getDelegate()
+ {
+ return null;
+ }
+
+ /**
+ * Derived classes that have more than one delegate may override
+ * getCommandList to add as many delegate commands as desired to
+ * the list of potential functions that __call() tried to find.
+ *
+ * @param string $function
+ *
+ * @return array
+ */
+ protected function getDelegateCommandList($function)
+ {
+ return [[$this, "_$function"], [$this->getDelegate(), $function]];
+ }
+
+ /**
+ * Print progress about the commands being executed
+ *
+ * @param string $command
+ * @param string $action
+ */
+ protected function printTaskProgress($command, $action)
+ {
+ $this->printTaskInfo('{command} {action}', ['command' => "{$command[1]}", 'action' => json_encode($action)]);
+ }
+
+ /**
+ * Derived classes can override processResult to add more
+ * logic to result handling from functions. By default, it
+ * is assumed that if a function returns in int, then
+ * 0 == success, and any other value is the error code.
+ *
+ * @param int|\Robo\Result $function_result
+ *
+ * @return \Robo\Result
+ */
+ protected function processResult($function_result)
+ {
+ if (is_int($function_result)) {
+ if ($function_result) {
+ return Result::error($this, $function_result);
+ }
+ }
+ return Result::success($this);
+ }
+
+ /**
+ * Record a function to call later.
+ *
+ * @param string $command
+ * @param array $args
+ *
+ * @return $this
+ */
+ protected function addToCommandStack($command, $args)
+ {
+ $this->stack[] = array_merge([$command], $args);
+ return $this;
+ }
+
+ /**
+ * Any API function provided by the delegate that executes immediately
+ * may be handled by __call automatically. These operations will all
+ * be deferred until this task's run() method is called.
+ *
+ * @param string $function
+ * @param array $args
+ *
+ * @return $this
+ */
+ public function __call($function, $args)
+ {
+ foreach ($this->getDelegateCommandList($function) as $command) {
+ if (method_exists($command[0], $command[1])) {
+ // Otherwise, we'll defer calling this function
+ // until run(), and return $this.
+ $this->addToCommandStack($command, $args);
+ return $this;
+ }
+ }
+
+ $message = "Method $function does not exist.\n";
+ throw new \BadMethodCallException($message);
+ }
+
+ /**
+ * @return int
+ */
+ public function progressIndicatorSteps()
+ {
+ // run() will call advanceProgressIndicator() once for each
+ // file, one after calling stopBuffering, and again after compression.
+ return count($this->stack);
+ }
+
+ /**
+ * Run all of the queued objects on the stack
+ *
+ * @return \Robo\Result
+ */
+ public function run()
+ {
+ $this->startProgressIndicator();
+ $result = Result::success($this);
+
+ foreach ($this->stack as $action) {
+ $command = array_shift($action);
+ $this->printTaskProgress($command, $action);
+ $this->advanceProgressIndicator();
+ // TODO: merge data from the result on this call
+ // with data from the result on the previous call?
+ // For now, the result always comes from the last function.
+ $result = $this->callTaskMethod($command, $action);
+ if ($this->stopOnFail && $result && !$result->wasSuccessful()) {
+ break;
+ }
+ }
+
+ $this->stopProgressIndicator();
+
+ // todo: add timing information to the result
+ return $result;
+ }
+
+ /**
+ * Execute one task method
+ *
+ * @param string $command
+ * @param string $action
+ *
+ * @return \Robo\Result
+ */
+ protected function callTaskMethod($command, $action)
+ {
+ try {
+ $function_result = call_user_func_array($command, $action);
+ return $this->processResult($function_result);
+ } catch (\Exception $e) {
+ $this->printTaskError($e->getMessage());
+ return Result::fromException($this, $e);
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Testing/Atoum.php b/src/composer/vendor/consolidation/robo/src/Task/Testing/Atoum.php
new file mode 100644
index 00000000..56b47d84
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Testing/Atoum.php
@@ -0,0 +1,184 @@
+taskAtoum()
+ * ->files('path/to/test.php')
+ * ->configFile('config/dev.php')
+ * ->run()
+ *
+ * ?>
+ * ```
+ */
+class Atoum extends BaseTask implements CommandInterface, PrintedInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var string
+ */
+ protected $command;
+
+ /**
+ * Atoum constructor.
+ *
+ * @param null|string $pathToAtoum
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToAtoum = null)
+ {
+ $this->command = $pathToAtoum;
+ if (!$this->command) {
+ $this->command = $this->findExecutable('atoum');
+ }
+ if (!$this->command) {
+ throw new \Robo\Exception\TaskException(__CLASS__, "Neither local atoum nor global composer installation not found");
+ }
+ }
+
+ /**
+ * Tag or Tags to filter.
+ *
+ * @param string|array $tags
+ *
+ * @return $this
+ */
+ public function tags($tags)
+ {
+ return $this->addMultipleOption('tags', $tags);
+ }
+
+ /**
+ * Display result using the light reporter.
+ *
+ * @return $this
+ */
+ public function lightReport()
+ {
+ $this->option("--use-light-report");
+
+ return $this;
+ }
+
+ /**
+ * Display result using the tap reporter.
+ *
+ * @return $this
+ */
+ public function tap()
+ {
+ $this->option("use-tap-report");
+
+ return $this;
+ }
+
+ /**
+ * Path to the bootstrap file.
+
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function bootstrap($file)
+ {
+ $this->option("bootstrap", $file);
+
+ return $this;
+ }
+
+ /**
+ * Path to the config file.
+ *
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function configFile($file)
+ {
+ $this->option('-c', $file);
+
+ return $this;
+ }
+
+ /**
+ * Use atoum's debug mode.
+ *
+ * @return $this
+ */
+ public function debug()
+ {
+ $this->option("debug");
+
+ return $this;
+ }
+
+ /**
+ * Test file or test files to run.
+ *
+ * @param string|array
+ *
+ * @return $this
+ */
+ public function files($files)
+ {
+ return $this->addMultipleOption('f', $files);
+ }
+
+ /**
+ * Test directory or directories to run.
+ *
+ * @param string|array A single directory or a list of directories.
+ *
+ * @return $this
+ */
+ public function directories($directories)
+ {
+ return $this->addMultipleOption('directories', $directories);
+ }
+
+ /**
+ * @param string $option
+ * @param string|array $values
+ *
+ * @return $this
+ */
+ protected function addMultipleOption($option, $values)
+ {
+ if (is_string($values)) {
+ $values = [$values];
+ }
+
+ foreach ($values as $value) {
+ $this->option($option, $value);
+ }
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . $this->arguments;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Running atoum ' . $this->arguments);
+
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Testing/Behat.php b/src/composer/vendor/consolidation/robo/src/Task/Testing/Behat.php
new file mode 100644
index 00000000..a5d9ea0a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Testing/Behat.php
@@ -0,0 +1,164 @@
+taskBehat()
+ * ->format('pretty')
+ * ->noInteraction()
+ * ->run();
+ * ?>
+ * ```
+ *
+ */
+class Behat extends BaseTask implements CommandInterface, PrintedInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var string
+ */
+ protected $command;
+
+ /**
+ * @var string[] $formaters available formaters for format option
+ */
+ protected $formaters = ['progress', 'pretty', 'junit'];
+
+ /**
+ * @var string[] $verbose_levels available verbose levels
+ */
+ protected $verbose_levels = ['v', 'vv'];
+
+ /**
+ * Behat constructor.
+ *
+ * @param null|string $pathToBehat
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToBehat = null)
+ {
+ $this->command = $pathToBehat;
+ if (!$this->command) {
+ $this->command = $this->findExecutable('behat');
+ }
+ if (!$this->command) {
+ throw new \Robo\Exception\TaskException(__CLASS__, "Neither composer nor phar installation of Behat found");
+ }
+ $this->arg('run');
+ }
+
+ /**
+ * @return $this
+ */
+ public function stopOnFail()
+ {
+ $this->option('stop-on-failure');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function noInteraction()
+ {
+ $this->option('no-interaction');
+ return $this;
+ }
+
+ /**
+ * @param $config_file
+ *
+ * @return $this
+ */
+ public function config($config_file)
+ {
+ $this->option('config', $config_file);
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function colors()
+ {
+ $this->option('colors');
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function noColors()
+ {
+ $this->option('no-colors');
+ return $this;
+ }
+
+ /**
+ * @param string $suite
+ *
+ * @return $this
+ */
+ public function suite($suite)
+ {
+ $this->option('suite', $suite);
+ return $this;
+ }
+
+ /**
+ * @param string $level
+ *
+ * @return $this
+ */
+ public function verbose($level = 'v')
+ {
+ if (!in_array($level, $this->verbose_levels)) {
+ throw new \InvalidArgumentException('expected ' . implode(',', $this->verbose_levels));
+ }
+ $this->option('-' . $level);
+ return $this;
+ }
+
+ /**
+ * @param string $formater
+ *
+ * @return $this
+ */
+ public function format($formater)
+ {
+ if (!in_array($formater, $this->formaters)) {
+ throw new \InvalidArgumentException('expected ' . implode(',', $this->formaters));
+ }
+ $this->option('format', $formater);
+ return $this;
+ }
+
+ /**
+ * Returns command that can be executed.
+ * This method is used to pass generated command from one task to another.
+ *
+ * @return string
+ */
+ public function getCommand()
+ {
+ return $this->command . $this->arguments;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Running behat {arguments}', ['arguments' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Testing/Codecept.php b/src/composer/vendor/consolidation/robo/src/Task/Testing/Codecept.php
new file mode 100644
index 00000000..442540a1
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Testing/Codecept.php
@@ -0,0 +1,263 @@
+taskCodecept()
+ * ->suite('acceptance')
+ * ->env('chrome')
+ * ->group('admin')
+ * ->xml()
+ * ->html()
+ * ->run();
+ *
+ * ?>
+ * ```
+ *
+ */
+class Codecept extends BaseTask implements CommandInterface, PrintedInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var string
+ */
+ protected $suite = '';
+
+ /**
+ * @var string
+ */
+ protected $test = '';
+
+ /**
+ * @var string
+ */
+ protected $command;
+
+ /**
+ * @param string $pathToCodeception
+ *
+ * @throws \Robo\Exception\TaskException
+ */
+ public function __construct($pathToCodeception = '')
+ {
+ $this->command = $pathToCodeception;
+ if (!$this->command) {
+ $this->command = $this->findExecutable('codecept');
+ }
+ if (!$this->command) {
+ throw new TaskException(__CLASS__, "Neither composer nor phar installation of Codeception found.");
+ }
+ $this->command .= ' run';
+ }
+
+ /**
+ * @param string $suite
+ *
+ * @return $this
+ */
+ public function suite($suite)
+ {
+ $this->suite = $suite;
+ return $this;
+ }
+
+ /**
+ * @param string $testName
+ *
+ * @return $this
+ */
+ public function test($testName)
+ {
+ $this->test = $testName;
+ return $this;
+ }
+
+ /**
+ * set group option. Can be called multiple times
+ *
+ * @param string $group
+ *
+ * @return $this
+ */
+ public function group($group)
+ {
+ $this->option("group", $group);
+ return $this;
+ }
+
+ /**
+ * @param string $group
+ *
+ * @return $this
+ */
+ public function excludeGroup($group)
+ {
+ $this->option("skip-group", $group);
+ return $this;
+ }
+
+ /**
+ * generate json report
+ *
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function json($file = null)
+ {
+ $this->option("json", $file);
+ return $this;
+ }
+
+ /**
+ * generate xml JUnit report
+ *
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function xml($file = null)
+ {
+ $this->option("xml", $file);
+ return $this;
+ }
+
+ /**
+ * Generate html report
+ *
+ * @param string $dir
+ *
+ * @return $this
+ */
+ public function html($dir = null)
+ {
+ $this->option("html", $dir);
+ return $this;
+ }
+
+ /**
+ * generate tap report
+ *
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function tap($file = null)
+ {
+ $this->option("tap", $file);
+ return $this;
+ }
+
+ /**
+ * provides config file other then default `codeception.yml` with `-c` option
+ *
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function configFile($file)
+ {
+ $this->option("-c", $file);
+ return $this;
+ }
+
+ /**
+ * collect codecoverage in raw format. You may pass name of cov file to save results
+ *
+ * @param null|string $cov
+ *
+ * @return $this
+ */
+ public function coverage($cov = null)
+ {
+ $this->option("coverage", $cov);
+ return $this;
+ }
+
+ /**
+ * execute in silent mode
+ *
+ * @return $this
+ */
+ public function silent()
+ {
+ $this->option("silent");
+ return $this;
+ }
+
+ /**
+ * collect code coverage in xml format. You may pass name of xml file to save results
+ *
+ * @param string $xml
+ *
+ * @return $this
+ */
+ public function coverageXml($xml = null)
+ {
+ $this->option("coverage-xml", $xml);
+ return $this;
+ }
+
+ /**
+ * collect code coverage and generate html report. You may pass
+ *
+ * @param string $html
+ *
+ * @return $this
+ */
+ public function coverageHtml($html = null)
+ {
+ $this->option("coverage-html", $html);
+ return $this;
+ }
+
+ /**
+ * @param string $env
+ *
+ * @return $this
+ */
+ public function env($env)
+ {
+ $this->option("env", $env);
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function debug()
+ {
+ $this->option("debug");
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ $this->option(null, $this->suite)
+ ->option(null, $this->test);
+ return $this->command . $this->arguments;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $command = $this->getCommand();
+ $this->printTaskInfo('Executing {command}', ['command' => $command]);
+ return $this->executeCommand($command);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Testing/PHPUnit.php b/src/composer/vendor/consolidation/robo/src/Task/Testing/PHPUnit.php
new file mode 100644
index 00000000..df67e1c7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Testing/PHPUnit.php
@@ -0,0 +1,199 @@
+taskPHPUnit()
+ * ->group('core')
+ * ->bootstrap('test/bootstrap.php')
+ * ->run()
+ *
+ * ?>
+ * ```
+ */
+class PHPUnit extends BaseTask implements CommandInterface, PrintedInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var string
+ */
+ protected $command;
+
+ /**
+ * Directory of test files or single test file to run. Appended to
+ * the command and arguments.
+ *
+ * @var string
+ */
+ protected $files = '';
+
+ public function __construct($pathToPhpUnit = null)
+ {
+ $this->command = $pathToPhpUnit;
+ if (!$this->command) {
+ $this->command = $this->findExecutablePhar('phpunit');
+ }
+ if (!$this->command) {
+ throw new \Robo\Exception\TaskException(__CLASS__, "Neither local phpunit nor global composer installation not found");
+ }
+ }
+
+ /**
+ * @param string $filter
+ *
+ * @return $this
+ */
+ public function filter($filter)
+ {
+ $this->option('filter', $filter);
+ return $this;
+ }
+
+ /**
+ * @param string $group
+ *
+ * @return $this
+ */
+ public function group($group)
+ {
+ $this->option("group", $group);
+ return $this;
+ }
+
+ /**
+ * @param string $group
+ *
+ * @return $this
+ */
+ public function excludeGroup($group)
+ {
+ $this->option("exclude-group", $group);
+ return $this;
+ }
+
+ /**
+ * adds `log-json` option to runner
+ *
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function json($file = null)
+ {
+ $this->option("log-json", $file);
+ return $this;
+ }
+
+ /**
+ * adds `log-junit` option
+ *
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function xml($file = null)
+ {
+ $this->option("log-junit", $file);
+ return $this;
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function tap($file = "")
+ {
+ $this->option("log-tap", $file);
+ return $this;
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function bootstrap($file)
+ {
+ $this->option("bootstrap", $file);
+ return $this;
+ }
+
+ /**
+ * @param string $file
+ *
+ * @return $this
+ */
+ public function configFile($file)
+ {
+ $this->option('-c', $file);
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ public function debug()
+ {
+ $this->option("debug");
+ return $this;
+ }
+
+ /**
+ * Directory of test files or single test file to run.
+ *
+ * @param string $files A single test file or a directory containing test files.
+ *
+ * @return $this
+ *
+ * @throws \Robo\Exception\TaskException
+ *
+ * @deprecated Use file() or dir() method instead
+ */
+ public function files($files)
+ {
+ if (!empty($this->files) || is_array($files)) {
+ throw new \Robo\Exception\TaskException(__CLASS__, "Only one file or directory may be provided.");
+ }
+ $this->files = ' ' . $files;
+
+ return $this;
+ }
+
+ /**
+ * Test the provided file.
+ *
+ * @param string $file path to file to test
+ *
+ * @return $this
+ */
+ public function file($file)
+ {
+ return $this->files($file);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCommand()
+ {
+ return $this->command . $this->arguments . $this->files;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Running PHPUnit {arguments}', ['arguments' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Testing/Phpspec.php b/src/composer/vendor/consolidation/robo/src/Task/Testing/Phpspec.php
new file mode 100644
index 00000000..dd6a5ae7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Testing/Phpspec.php
@@ -0,0 +1,116 @@
+taskPhpspec()
+ * ->format('pretty')
+ * ->noInteraction()
+ * ->run();
+ * ?>
+ * ```
+ *
+ */
+class Phpspec extends BaseTask implements CommandInterface, PrintedInterface
+{
+ use \Robo\Common\ExecOneCommand;
+
+ /**
+ * @var string
+ */
+ protected $command;
+
+ /**
+ * @var string[] $formaters available formaters for format option
+ */
+ protected $formaters = ['progress', 'html', 'pretty', 'junit', 'dot', 'tap'];
+
+ /**
+ * @var array $verbose_levels available verbose levels
+ */
+ protected $verbose_levels = ['v', 'vv', 'vvv'];
+
+ public function __construct($pathToPhpspec = null)
+ {
+ $this->command = $pathToPhpspec;
+ if (!$this->command) {
+ $this->command = $this->findExecutable('phpspec');
+ }
+ if (!$this->command) {
+ throw new \Robo\Exception\TaskException(__CLASS__, "Neither composer nor phar installation of Phpspec found");
+ }
+ $this->arg('run');
+ }
+
+ public function stopOnFail()
+ {
+ $this->option('stop-on-failure');
+ return $this;
+ }
+
+ public function noCodeGeneration()
+ {
+ $this->option('no-code-generation');
+ return $this;
+ }
+
+ public function quiet()
+ {
+ $this->option('quiet');
+ return $this;
+ }
+
+ public function verbose($level = 'v')
+ {
+ if (!in_array($level, $this->verbose_levels)) {
+ throw new \InvalidArgumentException('expected ' . implode(',', $this->verbose_levels));
+ }
+ $this->option('-' . $level);
+ return $this;
+ }
+
+ public function noAnsi()
+ {
+ $this->option('no-ansi');
+ return $this;
+ }
+
+ public function noInteraction()
+ {
+ $this->option('no-interaction');
+ return $this;
+ }
+
+ public function config($config_file)
+ {
+ $this->option('config', $config_file);
+ return $this;
+ }
+
+ public function format($formater)
+ {
+ if (!in_array($formater, $this->formaters)) {
+ throw new \InvalidArgumentException('expected ' . implode(',', $this->formaters));
+ }
+ $this->option('format', $formater);
+ return $this;
+ }
+
+ public function getCommand()
+ {
+ return $this->command . $this->arguments;
+ }
+
+ public function run()
+ {
+ $this->printTaskInfo('Running phpspec {arguments}', ['arguments' => $this->arguments]);
+ return $this->executeCommand($this->getCommand());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Testing/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Testing/loadTasks.php
new file mode 100644
index 00000000..43145b9b
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Testing/loadTasks.php
@@ -0,0 +1,55 @@
+task(Codecept::class, $pathToCodeception);
+ }
+
+ /**
+ * @param null|string $pathToPhpUnit
+ *
+ * @return \Robo\Task\Testing\PHPUnit
+ */
+ protected function taskPhpUnit($pathToPhpUnit = null)
+ {
+ return $this->task(PHPUnit::class, $pathToPhpUnit);
+ }
+
+ /**
+ * @param null $pathToPhpspec
+ *
+ * @return \Robo\Task\Testing\Phpspec
+ */
+ protected function taskPhpspec($pathToPhpspec = null)
+ {
+ return $this->task(Phpspec::class, $pathToPhpspec);
+ }
+
+ /**
+ * @param null $pathToAtoum
+ *
+ * @return \Robo\Task\Testing\Atoum
+ */
+ protected function taskAtoum($pathToAtoum = null)
+ {
+ return $this->task(Atoum::class, $pathToAtoum);
+ }
+
+ /**
+ * @param null $pathToBehat
+ *
+ * @return \Robo\Task\Testing\Behat
+ */
+ protected function taskBehat($pathToBehat = null)
+ {
+ return $this->task(Behat::class, $pathToBehat);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Vcs/GitStack.php b/src/composer/vendor/consolidation/robo/src/Task/Vcs/GitStack.php
new file mode 100644
index 00000000..9210bfec
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Vcs/GitStack.php
@@ -0,0 +1,153 @@
+taskGitStack()
+ * ->stopOnFail()
+ * ->add('-A')
+ * ->commit('adding everything')
+ * ->push('origin','master')
+ * ->tag('0.6.0')
+ * ->push('origin','0.6.0')
+ * ->run()
+ *
+ * $this->taskGitStack()
+ * ->stopOnFail()
+ * ->add('doc/*')
+ * ->commit('doc updated')
+ * ->push()
+ * ->run();
+ * ?>
+ * ```
+ */
+class GitStack extends CommandStack
+{
+ /**
+ * @param string $pathToGit
+ */
+ public function __construct($pathToGit = 'git')
+ {
+ $this->executable = $pathToGit;
+ }
+
+ /**
+ * Executes `git clone`
+ *
+ * @param string $repo
+ * @param string $to
+ *
+ * @return $this
+ */
+ public function cloneRepo($repo, $to = "")
+ {
+ return $this->exec(['clone', $repo, $to]);
+ }
+
+ /**
+ * Executes `git add` command with files to add pattern
+ *
+ * @param string $pattern
+ *
+ * @return $this
+ */
+ public function add($pattern)
+ {
+ return $this->exec([__FUNCTION__, $pattern]);
+ }
+
+ /**
+ * Executes `git commit` command with a message
+ *
+ * @param string $message
+ * @param string $options
+ *
+ * @return $this
+ */
+ public function commit($message, $options = "")
+ {
+ $message = ProcessUtils::escapeArgument($message);
+ return $this->exec([__FUNCTION__, "-m $message", $options]);
+ }
+
+ /**
+ * Executes `git pull` command.
+ *
+ * @param string $origin
+ * @param string $branch
+ *
+ * @return $this
+ */
+ public function pull($origin = '', $branch = '')
+ {
+ return $this->exec([__FUNCTION__, $origin, $branch]);
+ }
+
+ /**
+ * Executes `git push` command
+ *
+ * @param string $origin
+ * @param string $branch
+ *
+ * @return $this
+ */
+ public function push($origin = '', $branch = '')
+ {
+ return $this->exec([__FUNCTION__, $origin, $branch]);
+ }
+
+ /**
+ * Performs git merge
+ *
+ * @param string $branch
+ *
+ * @return $this
+ */
+ public function merge($branch)
+ {
+ return $this->exec([__FUNCTION__, $branch]);
+ }
+
+ /**
+ * Executes `git checkout` command
+ *
+ * @param string $branch
+ *
+ * @return $this
+ */
+ public function checkout($branch)
+ {
+ return $this->exec([__FUNCTION__, $branch]);
+ }
+
+ /**
+ * Executes `git tag` command
+ *
+ * @param string $tag_name
+ * @param string $message
+ *
+ * @return $this
+ */
+ public function tag($tag_name, $message = "")
+ {
+ if ($message != "") {
+ $message = "-m '$message'";
+ }
+ return $this->exec([__FUNCTION__, $message, $tag_name]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo("Running git commands...");
+ return parent::run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Vcs/HgStack.php b/src/composer/vendor/consolidation/robo/src/Task/Vcs/HgStack.php
new file mode 100644
index 00000000..71cc0ca9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Vcs/HgStack.php
@@ -0,0 +1,153 @@
+hgStack
+ * ->cloneRepo('https://bitbucket.org/durin42/hgsubversion')
+ * ->pull()
+ * ->add()
+ * ->commit('changed')
+ * ->push()
+ * ->tag('0.6.0')
+ * ->push('0.6.0')
+ * ->run();
+ * ?>
+ * ```
+ */
+class HgStack extends CommandStack
+{
+
+ /**
+ * @param string $pathToHg
+ */
+ public function __construct($pathToHg = 'hg')
+ {
+ $this->executable = $pathToHg;
+ }
+
+ /**
+ * Executes `hg clone`
+ *
+ * @param string $repo
+ * @param string $to
+ *
+ * @return $this
+ */
+ public function cloneRepo($repo, $to = '')
+ {
+ return $this->exec(['clone', $repo, $to]);
+ }
+
+ /**
+ * Executes `hg add` command with files to add by pattern
+ *
+ * @param string $include
+ * @param string $exclude
+ *
+ * @return $this
+ */
+ public function add($include = '', $exclude = '')
+ {
+ if (strlen($include) > 0) {
+ $include = "-I {$include}";
+ }
+
+ if (strlen($exclude) > 0) {
+ $exclude = "-X {$exclude}";
+ }
+
+ return $this->exec([__FUNCTION__, $include, $exclude]);
+ }
+
+ /**
+ * Executes `hg commit` command with a message
+ *
+ * @param string $message
+ * @param string $options
+ *
+ * @return $this
+ */
+ public function commit($message, $options = '')
+ {
+ return $this->exec([__FUNCTION__, "-m '{$message}'", $options]);
+ }
+
+ /**
+ * Executes `hg pull` command.
+ *
+ * @param string $branch
+ *
+ * @return $this
+ */
+ public function pull($branch = '')
+ {
+ if (strlen($branch) > 0) {
+ $branch = "-b '{$branch}''";
+ }
+
+ return $this->exec([__FUNCTION__, $branch]);
+ }
+
+ /**
+ * Executes `hg push` command
+ *
+ * @param string $branch
+ *
+ * @return $this
+ */
+ public function push($branch = '')
+ {
+ if (strlen($branch) > 0) {
+ $branch = "-b '{$branch}'";
+ }
+
+ return $this->exec([__FUNCTION__, $branch]);
+ }
+
+ /**
+ * Performs hg merge
+ *
+ * @param string $revision
+ *
+ * @return $this
+ */
+ public function merge($revision = '')
+ {
+ if (strlen($revision) > 0) {
+ $revision = "-r {$revision}";
+ }
+
+ return $this->exec([__FUNCTION__, $revision]);
+ }
+
+ /**
+ * Executes `hg tag` command
+ *
+ * @param string $tag_name
+ * @param string $message
+ *
+ * @return $this
+ */
+ public function tag($tag_name, $message = '')
+ {
+ if ($message !== '') {
+ $message = "-m '{$message}'";
+ }
+ return $this->exec([__FUNCTION__, $message, $tag_name]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ $this->printTaskInfo('Running hg commands...');
+ return parent::run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Vcs/SvnStack.php b/src/composer/vendor/consolidation/robo/src/Task/Vcs/SvnStack.php
new file mode 100644
index 00000000..ec719b53
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Vcs/SvnStack.php
@@ -0,0 +1,106 @@
+taskSvnStack()
+ * ->checkout('http://svn.collab.net/repos/svn/trunk')
+ * ->run()
+ *
+ * // alternatively
+ * $this->_svnCheckout('http://svn.collab.net/repos/svn/trunk');
+ *
+ * $this->taskSvnStack('username', 'password')
+ * ->stopOnFail()
+ * ->update()
+ * ->add('doc/*')
+ * ->commit('doc updated')
+ * ->run();
+ * ?>
+ * ```
+ */
+class SvnStack extends CommandStack implements CommandInterface
+{
+ /**
+ * @var bool
+ */
+ protected $stopOnFail = false;
+
+ /**
+ * @var \Robo\Result
+ */
+ protected $result;
+
+ /**
+ * @param string $username
+ * @param string $password
+ * @param string $pathToSvn
+ */
+ public function __construct($username = '', $password = '', $pathToSvn = 'svn')
+ {
+ $this->executable = $pathToSvn;
+ if (!empty($username)) {
+ $this->executable .= " --username $username";
+ }
+ if (!empty($password)) {
+ $this->executable .= " --password $password";
+ }
+ $this->result = Result::success($this);
+ }
+
+ /**
+ * Updates `svn update` command
+ *
+ * @param string $path
+ *
+ * @return $this;
+ */
+ public function update($path = '')
+ {
+ return $this->exec("update $path");
+ }
+
+ /**
+ * Executes `svn add` command with files to add pattern
+ *
+ * @param string $pattern
+ *
+ * @return $this
+ */
+ public function add($pattern = '')
+ {
+ return $this->exec("add $pattern");
+ }
+
+ /**
+ * Executes `svn commit` command with a message
+ *
+ * @param string $message
+ * @param string $options
+ *
+ * @return $this
+ */
+ public function commit($message, $options = "")
+ {
+ return $this->exec("commit -m '$message' $options");
+ }
+
+ /**
+ * Executes `svn checkout` command
+ *
+ * @param string $branch
+ *
+ * @return $this
+ */
+ public function checkout($branch)
+ {
+ return $this->exec("checkout $branch");
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Vcs/loadShortcuts.php b/src/composer/vendor/consolidation/robo/src/Task/Vcs/loadShortcuts.php
new file mode 100644
index 00000000..7d64ab58
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Vcs/loadShortcuts.php
@@ -0,0 +1,35 @@
+taskSvnStack()->checkout($url)->run();
+ }
+
+ /**
+ * @param string $url
+ *
+ * @return \Robo\Result
+ */
+ protected function _gitClone($url)
+ {
+ return $this->taskGitStack()->cloneRepo($url)->run();
+ }
+
+ /**
+ * @param string $url
+ *
+ * @return \Robo\Result
+ */
+ protected function _hgClone($url)
+ {
+ return $this->taskHgStack()->cloneRepo($url)->run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Task/Vcs/loadTasks.php b/src/composer/vendor/consolidation/robo/src/Task/Vcs/loadTasks.php
new file mode 100644
index 00000000..6dd06228
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Task/Vcs/loadTasks.php
@@ -0,0 +1,37 @@
+task(SvnStack::class, $username, $password, $pathToSvn);
+ }
+
+ /**
+ * @param string $pathToGit
+ *
+ * @return \Robo\Task\Vcs\GitStack
+ */
+ protected function taskGitStack($pathToGit = 'git')
+ {
+ return $this->task(GitStack::class, $pathToGit);
+ }
+
+ /**
+ * @param string $pathToHg
+ *
+ * @return \Robo\Task\Vcs\HgStack
+ */
+ protected function taskHgStack($pathToHg = 'hg')
+ {
+ return $this->task(HgStack::class, $pathToHg);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/TaskAccessor.php b/src/composer/vendor/consolidation/robo/src/TaskAccessor.php
new file mode 100644
index 00000000..e65cd3eb
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/TaskAccessor.php
@@ -0,0 +1,47 @@
+task(Foo::class, $a, $b);
+ *
+ * instead of:
+ *
+ * $this->taskFoo($a, $b);
+ *
+ * The later form is preferred.
+ *
+ * @return \Robo\Collection\CollectionBuilder
+ */
+ protected function task()
+ {
+ $args = func_get_args();
+ $name = array_shift($args);
+
+ $collectionBuilder = $this->collectionBuilder();
+ return $collectionBuilder->build($name, $args);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/TaskInfo.php b/src/composer/vendor/consolidation/robo/src/TaskInfo.php
new file mode 100644
index 00000000..ce59c2d5
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/TaskInfo.php
@@ -0,0 +1,35 @@
+ TaskInfo::formatTaskName($task),
+ 'task' => $task,
+ ];
+ }
+
+ /**
+ * @param object $task
+ *
+ * @return string
+ */
+ public static function formatTaskName($task)
+ {
+ $name = get_class($task);
+ $name = preg_replace('~Stack^~', '', $name);
+ $name = str_replace('Robo\\Task\Base\\', '', $name);
+ $name = str_replace('Robo\\Task\\', '', $name);
+ $name = str_replace('Robo\\Collection\\', '', $name);
+ return $name;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/src/Tasks.php b/src/composer/vendor/consolidation/robo/src/Tasks.php
new file mode 100644
index 00000000..2822d7d5
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/src/Tasks.php
@@ -0,0 +1,23 @@
+init([
+ 'debug' => true,
+ 'includePaths' => [
+ __DIR__.'/../src',
+ __DIR__.'/../vendor/symfony/process',
+ __DIR__.'/../vendor/symfony/console',
+ ]
+]);
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/TestedRoboFile.php b/src/composer/vendor/consolidation/robo/tests/_data/TestedRoboFile.php
new file mode 100644
index 00000000..bc11796f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/TestedRoboFile.php
@@ -0,0 +1,38 @@
+ false, 'to' => null]) {
+ }
+
+ /**
+ * Calculate the fibonacci sequence between two numbers.
+ *
+ * Graphic output will look like
+ * +----+---+-------------+
+ * | | | |
+ * | |-+-| |
+ * |----+-+-+ |
+ * | | |
+ * | | |
+ * | | |
+ * +--------+-------------+
+ *
+ * @param int $start Number to start from
+ * @param int $steps Number of steps to perform
+ * @param array $opts
+ * @option $graphic Display the sequence graphically using cube
+ * representation
+ */
+ public function fibonacci($start, $steps, $opts = ['graphic' => false])
+ {
+ }
+
+ /** Compact doc comment */
+ public function compact()
+ {
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/TestedRoboTask.php b/src/composer/vendor/consolidation/robo/tests/_data/TestedRoboTask.php
new file mode 100644
index 00000000..c1c5efba
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/TestedRoboTask.php
@@ -0,0 +1,61 @@
+taskTestedRoboTask([
+ * 'web/assets/screen.css',
+ * 'web/assets/print.css',
+ * 'web/assets/theme.css'
+ * ])
+ * ->to('web/assets/style.css')
+ * ->run()
+ * ?>
+ * ```
+ */
+class TestedRoboTask extends BaseTask
+{
+ /**
+ * @var array|Iterator files
+ */
+ protected $files;
+
+ /**
+ * @var string dst
+ */
+ protected $dst;
+
+ /**
+ * Constructor. This should not be documented
+ *
+ * @param array|Iterator $files
+ */
+ public function __construct()
+ {
+ }
+
+ /**
+ * Set the destination file
+ *
+ * @param string $dst
+ *
+ * @return Concat The current instance
+ */
+ public function to($dst)
+ {
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function run()
+ {
+ return Result::success($this);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/claypit/a.txt b/src/composer/vendor/consolidation/robo/tests/_data/claypit/a.txt
new file mode 100644
index 00000000..8c7e5a66
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/claypit/a.txt
@@ -0,0 +1 @@
+A
\ No newline at end of file
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/claypit/b.txt b/src/composer/vendor/consolidation/robo/tests/_data/claypit/b.txt
new file mode 100644
index 00000000..7371f47a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/claypit/b.txt
@@ -0,0 +1 @@
+B
\ No newline at end of file
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/claypit/box/robo.txt b/src/composer/vendor/consolidation/robo/tests/_data/claypit/box/robo.txt
new file mode 100644
index 00000000..3ba64572
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/claypit/box/robo.txt
@@ -0,0 +1 @@
+HELLOROBO
\ No newline at end of file
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/claypit/some/deeply/existing_file b/src/composer/vendor/consolidation/robo/tests/_data/claypit/some/deeply/existing_file
new file mode 100644
index 00000000..37cfa282
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/claypit/some/deeply/existing_file
@@ -0,0 +1 @@
+some existing file
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/claypit/some/deeply/nested/structu.re b/src/composer/vendor/consolidation/robo/tests/_data/claypit/some/deeply/nested/structu.re
new file mode 100644
index 00000000..98a202cb
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/claypit/some/deeply/nested/structu.re
@@ -0,0 +1 @@
+Just a file
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/claypit/some_destination/deeply/existing_file b/src/composer/vendor/consolidation/robo/tests/_data/claypit/some_destination/deeply/existing_file
new file mode 100644
index 00000000..1765b73b
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/claypit/some_destination/deeply/existing_file
@@ -0,0 +1 @@
+some_destination existing file
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/dump.sql b/src/composer/vendor/consolidation/robo/tests/_data/dump.sql
new file mode 100644
index 00000000..4bc742ce
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/dump.sql
@@ -0,0 +1 @@
+/* Replace this file with actual dump of your database */
\ No newline at end of file
diff --git a/src/composer/vendor/consolidation/robo/tests/_data/parascript.php b/src/composer/vendor/consolidation/robo/tests/_data/parascript.php
new file mode 100644
index 00000000..403e2f1c
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_data/parascript.php
@@ -0,0 +1,8 @@
+getContainer()->get('collectionBuilder', [$tasks]);
+ $tasks->setBuilder($builder);
+ return $builder;
+ }
+
+ public function seeDirFound($dir)
+ {
+ $this->assertTrue(is_dir($dir) && file_exists($dir), "Directory does not exist");
+ }
+
+ public function _before(\Codeception\TestCase $test) {
+ $container = new \League\Container\Container();
+ $this->initSeeInOutputTrait($container);
+ Robo::setContainer($container);
+ $this->setContainer($container);
+
+ $this->getModule('Filesystem')->copyDir(codecept_data_dir().'claypit', codecept_data_dir().'sandbox');
+ }
+
+ public function _after(\Codeception\TestCase $test) {
+ $this->getModule('Filesystem')->deleteDir(codecept_data_dir().'sandbox');
+ $this->getContainer()->add('output', new ConsoleOutput());
+ chdir(codecept_root_dir());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/_helpers/CodeGuy.php b/src/composer/vendor/consolidation/robo/tests/_helpers/CodeGuy.php
new file mode 100644
index 00000000..e7ce5917
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_helpers/CodeGuy.php
@@ -0,0 +1,26 @@
+initSeeInOutputTrait(static::$container);
+ }
+
+ public function _after(\Codeception\TestCase $test)
+ {
+ // Ensure that $stopOnFail global static is reset, as tests
+ // that set it to true will force an exception, and therefor
+ // will not have a chance to clean this up.
+ \Robo\Result::$stopOnFail = false;
+
+ \AspectMock\Test::clean();
+ $consoleOutput = new ConsoleOutput();
+ static::$container->add('output', $consoleOutput);
+ static::$container->add('logger', new \Consolidation\Log\Logger($consoleOutput));
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/_helpers/SeeInOutputTrait.php b/src/composer/vendor/consolidation/robo/tests/_helpers/SeeInOutputTrait.php
new file mode 100644
index 00000000..85ae5335
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_helpers/SeeInOutputTrait.php
@@ -0,0 +1,62 @@
+capturedOutput = '';
+ $this->testPrinter = new BufferedOutput(OutputInterface::VERBOSITY_DEBUG);
+
+ $app = Robo::createDefaultApplication();
+ $config = new \Robo\Config();
+ \Robo\Robo::configureContainer($container, $app, $config, $input, $this->testPrinter);
+
+ // Set the application dispatcher
+ $app->setDispatcher($container->get('eventDispatcher'));
+ $this->logger = $container->get('logger');
+ }
+
+ public function capturedOutputStream()
+ {
+ return $this->testPrinter;
+ }
+
+ public function logger()
+ {
+ return $this->logger;
+ }
+
+ protected function accumulate()
+ {
+ $this->capturedOutput .= $this->testPrinter->fetch();
+ return $this->capturedOutput;
+ }
+
+ public function seeInOutput($value)
+ {
+ $output = $this->accumulate();
+ $this->assertContains($value, $output);
+ }
+
+ public function doNotSeeInOutput($value)
+ {
+ $output = $this->accumulate();
+ $this->assertNotContains($value, $output);
+ }
+
+ public function seeOutputEquals($value)
+ {
+ $output = $this->accumulate();
+ $this->assertEquals($value, $output);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/_helpers/TestHelper.php b/src/composer/vendor/consolidation/robo/tests/_helpers/TestHelper.php
new file mode 100644
index 00000000..d25d90b7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/_helpers/TestHelper.php
@@ -0,0 +1,10 @@
+wantTo('minify a css file');
+$I->amInPath(codecept_data_dir().'sandbox');
+
+$sampleCss = dirname(__DIR__) . '/_data/sample.css';
+$outputCss = 'minifiedSample.css';
+
+$initialFileSize = filesize($sampleCss);
+
+$I->taskMinify($sampleCss)
+ ->to('minifiedSample.css')
+ ->run();
+
+$I->seeFileFound($outputCss);
+$minifiedFileSize = filesize($outputCss);
+$outputCssContents = file_get_contents($outputCss);
+
+$I->assertLessThan($initialFileSize, $minifiedFileSize, 'Minified file is smaller than the source file');
+$I->assertGreaterThan(0, $minifiedFileSize, 'Minified file is not empty');
+$I->assertContains('body', $outputCssContents, 'Minified file has some content from the source file');
+$I->assertNotContains('Sample css file', $outputCssContents, 'Minified file does not contain comment from source file');
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/CleanDirCept.php b/src/composer/vendor/consolidation/robo/tests/cli/CleanDirCept.php
new file mode 100644
index 00000000..041f8b69
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/CleanDirCept.php
@@ -0,0 +1,13 @@
+wantTo('clean dir with DeleteDirTask');
+$I->amInPath(codecept_data_dir());
+$I->seeFileFound('robo.txt', 'sandbox');
+$I->taskCleanDir(['sandbox'])
+ ->run();
+$I->dontSeeFileFound('box', 'sandbox');
+$I->dontSeeFileFound('robo.txt', 'sandbox');
+$I->dontSeeFileFound('a.txt' , 'sandbox');
+
+
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/CollectionCest.php b/src/composer/vendor/consolidation/robo/tests/cli/CollectionCest.php
new file mode 100644
index 00000000..493daf09
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/CollectionCest.php
@@ -0,0 +1,409 @@
+amInPath(codecept_data_dir().'sandbox');
+ }
+
+ public function toRunMultipleTasksViaACollectionBuilder(CliGuy $I)
+ {
+ // This tests creating multiple tasks in a single builder,
+ // which implicitly adds them to a collection. To keep things
+ // simple, we are only going to use taskFilesystemStack. It
+ // would be possible, of course, to do these operations with
+ // a single FilesystemStack, but our goal is to test creating
+ // multiple tasks with a builder, and ensure that a propper
+ // collection is built.
+ $collection = $I->collectionBuilder();
+ $result = $collection->taskFilesystemStack()
+ ->mkdir('a')
+ ->touch('a/a.txt')
+ ->rollback(
+ $I->taskDeleteDir('a')
+ )
+ ->taskFilesystemStack()
+ ->mkdir('a/b')
+ ->touch('a/b/b.txt')
+ ->taskFilesystemStack()
+ ->mkdir('a/c')
+ ->touch('a/c/c.txt')
+ ->run();
+
+ $I->assertEquals(0, $result->getExitCode(), $result->getMessage());
+
+ // All of the tasks created by the builder should be added
+ // to a collection, and `run()` should run them all.
+ $I->seeDirFound('a');
+ $I->seeFileFound('a/a.txt');
+ $I->seeDirFound('a/b');
+ $I->seeFileFound('a/b/b.txt');
+ $I->seeDirFound('a/c');
+ $I->seeFileFound('a/c/c.txt');
+ }
+
+ public function toUseAWorkingDirWithACollectionBuilder(CliGuy $I)
+ {
+ // Run the same test with a working directory. The working
+ // directory path will point to a temporary directory which
+ // will be moved into place once the tasks complete.
+ $collection = $I->collectionBuilder();
+ $workDirPath = $collection->workDir("build");
+ $I->assertNotEquals("build", basename($workDirPath));
+ $result = $collection->taskFilesystemStack()
+ ->mkdir("{$workDirPath}/a")
+ ->touch("{$workDirPath}/a/a.txt")
+ ->taskFilesystemStack()
+ ->mkdir("{$workDirPath}/a/b")
+ ->touch("{$workDirPath}/a/b/b.txt")
+ ->taskFilesystemStack()
+ ->mkdir("{$workDirPath}/a/c")
+ ->touch("{$workDirPath}/a/c/c.txt")
+ ->run();
+
+ $I->assertEquals(0, $result->getExitCode(), $result->getMessage());
+
+ // All of the tasks created by the builder should be added
+ // to a collection, and `run()` should run them all.
+ $I->seeDirFound('build/a');
+ $I->seeFileFound('build/a/a.txt');
+ $I->seeDirFound('build/a/b');
+ $I->seeFileFound('build/a/b/b.txt');
+ $I->seeDirFound('build/a/c');
+ $I->seeFileFound('build/a/c/c.txt');
+ }
+
+ public function toRollbackAfterFailureViaACollectionBuilder(CliGuy $I)
+ {
+ // This is like the previous test, toRunMultipleTasksViaACollectionBuilder,
+ // except we force an error at the end, and confirm that the
+ // rollback function is called.
+ $collection = $I->collectionBuilder();
+ $result = $collection->taskFilesystemStack()
+ ->mkdir('j')
+ ->touch('j/j.txt')
+ ->rollback(
+ $I->taskDeleteDir('j')
+ )
+ ->taskFilesystemStack()
+ ->mkdir('j/k')
+ ->touch('j/k/k.txt')
+ ->taskFilesystemStack()
+ ->mkdir('j/k/m')
+ ->touch('j/k/m/m.txt')
+ ->taskCopyDir(['doesNotExist' => 'copied'])
+ ->run();
+
+ $I->assertEquals(1, $result->getExitCode(), $result->getMessage());
+
+ // All of the tasks created by the builder should be added
+ // to a collection, and `run()` should run them all.
+ $I->dontSeeFileFound('q/q.txt');
+ $I->dontSeeFileFound('j/j.txt');
+ $I->dontSeeFileFound('j/k/k.txt');
+ $I->dontSeeFileFound('j/k/m/m.txt');
+ }
+
+ public function toRollbackAWorkingDir(CliGuy $I)
+ {
+ // Run the same test with a working directory. The working
+ // directory path will point to a temporary directory which
+ // will be moved into place once the tasks complete.
+ $collection = $I->collectionBuilder();
+ $workDirPath = $collection->workDir("build");
+ $I->assertNotEquals("build", basename($workDirPath));
+ $result = $collection->taskFilesystemStack()
+ ->mkdir("{$workDirPath}/a")
+ ->touch("{$workDirPath}/a/a.txt")
+ ->taskFilesystemStack()
+ ->mkdir("{$workDirPath}/a/b")
+ ->touch("{$workDirPath}/a/b/b.txt")
+ ->taskFilesystemStack()
+ ->mkdir("{$workDirPath}/a/c")
+ ->touch("{$workDirPath}/a/c/c.txt")
+ ->taskCopyDir(['doesNotExist' => 'copied'])
+ ->run();
+
+ $I->assertEquals(1, $result->getExitCode(), $result->getMessage());
+
+ // All of the tasks created by the builder should be added
+ // to a collection, and `run()` should run them all.
+ $I->dontSeeFileFound('build/a');
+ $I->dontSeeFileFound($workDirPath);
+ }
+
+ public function toBuildFilesViaAddIterable(CliGuy $I)
+ {
+ $processList = ['cats', 'dogs', 'sheep', 'fish', 'horses', 'cows'];
+
+ $collection = $I->collectionBuilder();
+ $result = $collection
+ ->taskFilesystemStack()
+ ->mkdir('stuff')
+ ->taskForEach($processList)
+ ->withBuilder(
+ function ($builder, $key, $value) {
+ return $builder
+ ->taskFilesystemStack()
+ ->touch("stuff/{$value}.txt");
+ }
+ )
+ ->run();
+
+ $I->assertEquals(0, $result->getExitCode(), $result->getMessage());
+
+ $I->seeFileFound('stuff/cats.txt');
+ $I->seeFileFound('stuff/dogs.txt');
+ $I->seeFileFound('stuff/sheep.txt');
+ $I->seeFileFound('stuff/fish.txt');
+ $I->seeFileFound('stuff/horses.txt');
+ $I->seeFileFound('stuff/cows.txt');
+ }
+
+ public function toRollbackANestedCollection(CliGuy $I)
+ {
+ // This is like the previous test, toRunMultipleTasksViaACollectionBuilder,
+ // except we force an error at the end, and confirm that the
+ // rollback function is called.
+ $collection = $I->collectionBuilder();
+ $collection->taskFilesystemStack()
+ ->mkdir('j')
+ ->touch('j/j.txt')
+ ->rollback(
+ $I->taskDeleteDir('j')
+ )
+ ->taskFilesystemStack()
+ ->mkdir('j/k')
+ ->touch('j/k/k.txt')
+ ->taskFilesystemStack()
+ ->mkdir('j/k/m')
+ ->touch('j/k/m/m.txt');
+
+ $result = $I->collectionBuilder()
+ ->taskFilesystemStack()
+ ->mkdir('q')
+ ->touch('q/q.txt')
+ ->addTask($collection)
+ ->taskCopyDir(['doesNotExist' => 'copied'])
+ ->run();
+
+ $I->assertEquals(1, $result->getExitCode(), $result->getMessage());
+
+ // All of the tasks created by the builder should be added
+ // to a collection, and `run()` should run them all.
+ $I->seeFileFound('q/q.txt');
+ $I->dontSeeFileFound('j/j.txt');
+ $I->dontSeeFileFound('j/k/k.txt');
+ $I->dontSeeFileFound('j/k/m/m.txt');
+ }
+
+ public function toCreateDirViaCollection(CliGuy $I)
+ {
+ // Set up a collection to add tasks to
+ $collection = $I->collectionBuilder();
+
+ // Set up a filesystem stack
+ $collection->taskFilesystemStack()
+ ->mkdir('log')
+ ->touch('log/error.txt');
+
+ // FilesystemStack has not run yet, so file should not be found.
+ $I->dontSeeFileFound('log/error.txt');
+
+ // Run the task collection; now the files should be present
+ $collection->run();
+ $I->seeFileFound('log/error.txt');
+ $I->seeDirFound('log');
+ }
+
+ public function toUseATmpDirAndConfirmItIsDeleted(CliGuy $I)
+ {
+ // Set up a collection to add tasks to
+ $collection = $I->collectionBuilder();
+
+ // Get a temporary directory to work in. Note that we get a
+ // name back, but the directory is not created until the task
+ // runs. This technically is not thread-safe, but we create
+ // a random name, so it is unlikely to conflict.
+ $tmpPath = $collection->tmpDir();
+
+ // Set up a filesystem stack, but use a collection to defer execution
+ $collection->taskFilesystemStack()
+ ->mkdir("$tmpPath/tmp")
+ ->touch("$tmpPath/tmp/error.txt")
+ ->rename("$tmpPath/tmp", "$tmpPath/log");
+
+ // Copy our tmp directory to a location that is not transient
+ $collection->taskCopyDir([$tmpPath => 'copied']);
+
+ // FilesystemStack has not run yet, so no files should be found.
+ $I->dontSeeFileFound("$tmpPath/tmp/error.txt");
+ $I->dontSeeFileFound("$tmpPath/log/error.txt");
+ $I->dontSeeFileFound('copied/log/error.txt');
+
+ // Run the task collection
+ $result = $collection->run();
+ $I->assertEquals(0, $result->getExitCode(), $result->getMessage());
+ $I->assertEquals($result['path'], $tmpPath, "Tmp dir result matches accessor.");
+
+ // The file 'error.txt' should have been copied into the "copied" dir.
+ // This also proves that the tmp directory was created.
+ $I->seeFileFound('copied/log/error.txt');
+ // $tmpPath should be deleted after $collection->run() completes.
+ $I->dontSeeFileFound("$tmpPath/tmp/error.txt");
+ $I->dontSeeFileFound("$tmpPath/log/error.txt");
+ $I->dontSeeFileFound("$tmpPath");
+ }
+
+ public function toUseATmpDirAndChangeWorkingDirectory(CliGuy $I)
+ {
+ // Set up a collection to add tasks to
+ $collection = $I->collectionBuilder();
+
+ $cwd = getcwd();
+
+ $tmpPath = $collection->taskTmpDir()
+ ->cwd()
+ ->getPath();
+
+ // Set up a filesystem stack, but use a collection to defer execution.
+ // Note that since we used 'cwd()' above, the relative file paths
+ // used below will be inside the temporary directory.
+ $collection->taskFilesystemStack()
+ ->mkdir("log")
+ ->touch("log/error.txt");
+
+ // Copy our tmp directory to a location that is not transient
+ $collection->taskCopyDir(['log' => "$cwd/copied2"]);
+
+ // FilesystemStack has not run yet, so no files should be found.
+ $I->dontSeeFileFound("$tmpPath/log/error.txt");
+ $I->dontSeeFileFound('$cwd/copied2/log/error.txt');
+
+ // Run the task collection
+ $result = $collection->run();
+ $I->assertEquals(0, $result->getExitCode(), $result->getMessage());
+
+ // The file 'error.txt' should have been copied into the "copied" dir
+ $I->seeFileFound("$cwd/copied2/error.txt");
+ // $tmpPath should be deleted after $collection->run() completes.
+ $I->dontSeeFileFound("$tmpPath/log/error.txt");
+ // Make sure that 'log' was created in the temporary directory, not
+ // at the current working directory.
+ $I->dontSeeFileFound("$cwd/log/error.txt");
+
+ // Make sure that our working directory was restored.
+ $finalWorkingDir = getcwd();
+ $I->assertEquals($cwd, $finalWorkingDir);
+ }
+
+ public function toCreateATmpFileAndConfirmItIsDeleted(CliGuy $I)
+ {
+ // Set up a collection to add tasks to
+ $collection = $I->collectionBuilder();
+
+ // Write to a temporary file. Note that we can get the path
+ // to the tempoary file that will be created, even though the
+ // the file is not created until the task collecction runs.
+ $tmpPath = $collection->taskTmpFile('tmp', '.txt')
+ ->line("This is a test file")
+ ->getPath();
+
+ // Copy our tmp directory to a location that is not transient
+ $collection->taskFilesystemStack()
+ ->copy($tmpPath, 'copied.txt');
+
+ // FilesystemStack has not run yet, so no files should be found.
+ $I->dontSeeFileFound("$tmpPath");
+ $I->dontSeeFileFound('copied.txt');
+
+ // Run the task collection
+ $result = $collection->run();
+ $I->assertEquals(0, $result->getExitCode(), $result->getMessage());
+
+ // The file 'copied.txt' should have been copied from the tmp file
+ $I->seeFileFound('copied.txt');
+ // $tmpPath should be deleted after $collection->run() completes.
+ $I->dontSeeFileFound("$tmpPath");
+ }
+
+ public function toUseATmpDirWithAlternateSyntax(CliGuy $I)
+ {
+ $collection = $I->collectionBuilder();
+
+ // This test is equivalent to toUseATmpDirAndConfirmItIsDeleted,
+ // but uses a different technique to create a collection of tasks.
+ $tmpPath = $collection->tmpDir();
+
+ // Now, rather than creating the tasks with a collection builder,
+ // which automatically adds the tasks to the collection as they are
+ // created, we will instead create them individually and then add
+ // them to the collection via the addTaskList() method.
+ $result = $collection->addTaskList(
+ [
+ $I->taskFilesystemStack()->mkdir("$tmpPath/log")->touch("$tmpPath/log/error.txt"),
+ $I->taskCopyDir([$tmpPath => 'copied3']),
+ ]
+ )->run();
+
+ // The results of this operation should be the same.
+ $I->assertEquals(0, $result->getExitCode(), $result->getMessage());
+ $I->seeFileFound('copied3/log/error.txt');
+ $I->dontSeeFileFound("$tmpPath/log/error.txt");
+ }
+
+ public function toCreateATmpDirWithoutACollection(CliGuy $I)
+ {
+ // Create a temporary directory, using our function name as
+ // the prefix for the directory name.
+ $tmpDirTask = $I->taskTmpDir(__FUNCTION__);
+ $tmpPath = $tmpDirTask->getPath();
+ $I->dontSeeFileFound($tmpPath);
+ $tmpDirTask->run();
+ $I->seeDirFound($tmpPath);
+ // Creating a temporary directory without a task collection will
+ // cause the temporary directory to be deleted when the program
+ // terminates. We can force it to clean up sooner by calling
+ // TransientManager::complete(); note that this deletes ALL global tmp
+ // directories, so this is not thread-safe! Useful in tests, though.
+ Temporary::complete();
+ $I->dontSeeFileFound($tmpPath);
+ }
+
+ public function toCreateATmpDirUsingShortcut(CliGuy $I)
+ {
+ // Create a temporary directory, using our function name as
+ // the prefix for the directory name.
+ $tmpPath = $I->shortcutTmpDir(__FUNCTION__);
+ $I->seeDirFound($tmpPath);
+ // Creating a temporary directory without a task collection will
+ // cause the temporary directory to be deleted when the program
+ // terminates. We can force it to clean up sooner by calling
+ // TransientManager::complete(); note that this deletes ALL global tmp
+ // directories, so this is not thread-safe! Useful in tests, though.
+ Temporary::complete();
+ $I->dontSeeFileFound($tmpPath);
+ }
+
+ public function toThrowAnExceptionAndConfirmItIsCaught(CliGuy $I)
+ {
+ $collection = $I->getContainer()->get('collection');
+
+ $collection->addCode(
+ function () {
+ throw new \RuntimeException('Error');
+ }
+ );
+ $result = $collection->run();
+ $I->assertEquals('Error', $result->getMessage());
+ $I->assertEquals(1, $result->getExitCode());
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/ConcatCept.php b/src/composer/vendor/consolidation/robo/tests/cli/ConcatCept.php
new file mode 100644
index 00000000..d68798a5
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/ConcatCept.php
@@ -0,0 +1,11 @@
+wantTo('concat files using Concat Task');
+$I->amInPath(codecept_data_dir() . 'sandbox');
+$I->taskConcat(['a.txt', 'b.txt'])
+ ->to('merged.txt')
+ ->run();
+$I->seeFileFound('merged.txt');
+$I->seeFileContentsEqual("A\nB\n");
+
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/CopyDirCept.php b/src/composer/vendor/consolidation/robo/tests/cli/CopyDirCept.php
new file mode 100644
index 00000000..1022ca2b
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/CopyDirCept.php
@@ -0,0 +1,10 @@
+wantTo('copy dir with CopyDir task');
+$I->amInPath(codecept_data_dir().'sandbox');
+$I->taskCopyDir(['box' => 'bin'])
+ ->run();
+$I->seeDirFound('bin');
+$I->seeFileFound('robo.txt', 'bin');
+
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/CopyDirOverwritesFilesCept.php b/src/composer/vendor/consolidation/robo/tests/cli/CopyDirOverwritesFilesCept.php
new file mode 100644
index 00000000..03b02394
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/CopyDirOverwritesFilesCept.php
@@ -0,0 +1,12 @@
+wantTo('overwrite a file with CopyDir task');
+$I->amInPath(codecept_data_dir() . 'sandbox');
+$I->seeDirFound('some');
+$I->seeFileFound('existing_file', 'some');
+$I->taskCopyDir(['some' => 'some_destination'])
+ ->run();
+$I->seeFileFound('existing_file', 'some_destination/deeply');
+$I->openFile('some_destination/deeply/existing_file');
+$I->seeInThisFile('some existing file');
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/CopyDirRecursiveCept.php b/src/composer/vendor/consolidation/robo/tests/cli/CopyDirRecursiveCept.php
new file mode 100644
index 00000000..a793faa2
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/CopyDirRecursiveCept.php
@@ -0,0 +1,11 @@
+wantTo('copy dir recursively with CopyDir task');
+$I->amInPath(codecept_data_dir() . 'sandbox');
+$I->seeDirFound('some/deeply/nested');
+$I->seeFileFound('structu.re', 'some/deeply/nested');
+$I->taskCopyDir(['some/deeply' => 'some_destination/deeply'])
+ ->run();
+$I->seeDirFound('some_destination/deeply/nested');
+$I->seeFileFound('structu.re', 'some_destination/deeply/nested');
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/DeleteDirCept.php b/src/composer/vendor/consolidation/robo/tests/cli/DeleteDirCept.php
new file mode 100644
index 00000000..ead565ff
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/DeleteDirCept.php
@@ -0,0 +1,11 @@
+wantTo('delete dir with DeleteDirTask');
+$I->amInPath(codecept_data_dir());
+$I->seeFileFound('robo.txt', 'sandbox');
+$I->taskDeleteDir(['sandbox/box'])
+ ->run();
+$I->dontSeeFileFound('box', 'sandbox');
+$I->dontSeeFileFound('robo.txt', 'sandbox');
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/ExecCest.php b/src/composer/vendor/consolidation/robo/tests/cli/ExecCest.php
new file mode 100644
index 00000000..b8769246
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/ExecCest.php
@@ -0,0 +1,13 @@
+taskExec($command)->run();
+ verify($res->getMessage())->contains('src');
+ verify($res->getMessage())->contains('codeception.yml');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/FilesystemStackCest.php b/src/composer/vendor/consolidation/robo/tests/cli/FilesystemStackCest.php
new file mode 100644
index 00000000..b9e68043
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/FilesystemStackCest.php
@@ -0,0 +1,50 @@
+amInPath(codecept_data_dir().'sandbox');
+ }
+
+ public function toCreateDir(CliGuy $I)
+ {
+ $I->taskFilesystemStack()
+ ->mkdir('log')
+ ->touch('log/error.txt')
+ ->run();
+ $I->seeFileFound('log/error.txt');
+ }
+
+ public function toDeleteFile(CliGuy $I)
+ {
+ $I->taskFilesystemStack()
+ ->stopOnFail()
+ ->remove('a.txt')
+ ->run();
+ $I->dontSeeFileFound('a.txt');
+ }
+
+ public function toTestCrossVolumeRename(CliGuy $I)
+ {
+ $fsStack = $I->taskFilesystemStack()
+ ->mkdir('log')
+ ->touch('log/error.txt');
+ $fsStack->run();
+
+ // We can't force _rename to run the cross-volume
+ // code path, so we will directly call the protected
+ // method crossVolumeRename to test to ensure it works.
+ // We will get a reference to it via reflection, set
+ // the reflected method object to public, and then
+ // call it via reflection.
+ $class = new ReflectionClass('\Robo\Task\Filesystem\FilesystemStack');
+ $method = $class->getMethod('crossVolumeRename');
+ $method->setAccessible(true);
+ $actualFsStackTask = $fsStack->getCollectionBuilderCurrentTask();
+ $method->invokeArgs($actualFsStackTask, ['log', 'logfiles']);
+
+ $I->dontSeeFileFound('log/error.txt');
+ $I->seeFileFound('logfiles/error.txt');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/FlattenDirCept.php b/src/composer/vendor/consolidation/robo/tests/cli/FlattenDirCept.php
new file mode 100644
index 00000000..fbb27a56
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/FlattenDirCept.php
@@ -0,0 +1,14 @@
+wantTo('flatten dir with FlattenDir task');
+$I->amInPath(codecept_data_dir().'sandbox');
+$I->taskFlattenDir([
+ 'some/deeply/nested/*.re' => 'flattened',
+ '*.txt' => 'flattened'
+ ])
+ ->run();
+$I->seeDirFound('flattened');
+$I->seeFileFound('structu.re', 'flattened');
+$I->seeFileFound('a.txt', 'flattened');
+$I->seeFileFound('b.txt', 'flattened');
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/FlattenDirParentsCept.php b/src/composer/vendor/consolidation/robo/tests/cli/FlattenDirParentsCept.php
new file mode 100644
index 00000000..d1d0504d
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/FlattenDirParentsCept.php
@@ -0,0 +1,12 @@
+wantTo('flatten dir with FlattenDir task including parents');
+$I->amInPath(codecept_data_dir().'sandbox');
+$I->taskFlattenDir('some/deeply/nested/*.re')
+ ->includeParents(array(1,1))
+ ->parentDir('some')
+ ->to('flattened')
+ ->run();
+$I->seeDirFound('flattened/deeply/nested');
+$I->seeFileFound('structu.re', 'flattened/deeply/nested');
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/GenTaskCest.php b/src/composer/vendor/consolidation/robo/tests/cli/GenTaskCest.php
new file mode 100644
index 00000000..ce892874
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/GenTaskCest.php
@@ -0,0 +1,11 @@
+taskGenTask('Symfony\Component\Filesystem\Filesystem', 'FilesystemStack')->run();
+ verify($result->getMessage())->contains('protected function _chgrp($files, $group, $recursive = false)');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/GenerateMarkdownDocCest.php b/src/composer/vendor/consolidation/robo/tests/cli/GenerateMarkdownDocCest.php
new file mode 100644
index 00000000..de2b40e4
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/GenerateMarkdownDocCest.php
@@ -0,0 +1,86 @@
+amInPath(codecept_data_dir().'sandbox');
+ }
+
+ public function toGenerateDocumentation(CliGuy $I)
+ {
+ $sourceFile = codecept_data_dir() . 'TestedRoboTask.php';
+ $I->seeFileFound($sourceFile);
+ include $sourceFile;
+ $I->assertTrue(class_exists('TestedRoboTask'));
+
+ $collection = $I->collectionBuilder();
+ $taskGenerator = $collection->taskGenDoc("TestedRoboTask.md");
+ $taskGenerator->filterClasses(function (\ReflectionClass $r) {
+ return !($r->isAbstract() || $r->isTrait()) && $r->implementsInterface('Robo\Contract\TaskInterface');
+ })->prepend("# TestedRoboTask Tasks");
+ $taskGenerator->docClass('TestedRoboTask');
+
+ $taskGenerator->filterMethods(
+ function (\ReflectionMethod $m) {
+ if ($m->isConstructor() || $m->isDestructor() || $m->isStatic()) {
+ return false;
+ }
+ $undocumentedMethods =
+ [
+ '',
+ 'run',
+ '__call',
+ 'inflect',
+ 'injectDependencies',
+ 'getCommand',
+ 'getPrinted',
+ 'getConfig',
+ 'setConfig',
+ 'logger',
+ 'setLogger',
+ 'setProgressIndicator',
+ 'progressIndicatorSteps',
+ 'setBuilder',
+ 'getBuilder',
+ 'collectionBuilder',
+ ];
+ return !in_array($m->name, $undocumentedMethods) && $m->isPublic(); // methods are not documented
+ }
+ )->processClassSignature(
+ function ($c) {
+ return "## " . preg_replace('~Task$~', '', $c->getShortName()) . "\n";
+ }
+ )->processClassDocBlock(
+ function (\ReflectionClass $c, $doc) {
+ $doc = preg_replace('~@method .*?(.*?)\)~', '* `$1)` ', $doc);
+ $doc = str_replace('\\'.$c->name, '', $doc);
+ return $doc;
+ }
+ )->processMethodSignature(
+ function (\ReflectionMethod $m, $text) {
+ return str_replace('#### *public* ', '* `', $text) . '`';
+ }
+ )->processMethodDocBlock(
+ function (\ReflectionMethod $m, $text) {
+
+ return $text ? ' ' . trim(strtok($text, "\n"), "\n") : '';
+ }
+ );
+
+ $collection->run();
+ $I->seeFileFound('TestedRoboTask.md');
+
+ $contents = file_get_contents('TestedRoboTask.md');
+ $I->assertContains('A test task file. Used for testig documentation generation.', $contents);
+ $I->assertContains('taskTestedRoboTask', $contents);
+ $I->assertContains('Set the destination file', $contents);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/PackExtractCept.php b/src/composer/vendor/consolidation/robo/tests/cli/PackExtractCept.php
new file mode 100644
index 00000000..a280c0cb
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/PackExtractCept.php
@@ -0,0 +1,57 @@
+wantTo('archive directory and then extract it again with Archive and Extract tasks');
+$I->amInPath(codecept_data_dir().'sandbox');
+$I->seeDirFound('some/deeply/nested');
+$I->seeFileFound('structu.re', 'some/deeply/nested');
+$I->seeFileFound('existing_file', 'some/deeply');
+
+// Test a bunch of archive types that we support
+foreach (['zip', 'tar', 'tar.gz', 'tar.bz2', 'tgz'] as $archiveType) {
+ // First, take everything from the folder 'some/deeply' and make
+ // an archive for it located in 'deep'
+ $I->taskPack("deeply.$archiveType")
+ ->add(['deep' => 'some/deeply'])
+ ->run();
+ $I->seeFileFound("deeply.$archiveType");
+ // We are next going to extract the archive we created, this time
+ // putting it into a folder called "extracted-$archiveType" (different
+ // for each archive type we test). We rely on the default behavior
+ // of our extractor to remove the top-level directory in the archive
+ // ("deeply").
+ $I->taskExtract("deeply.$archiveType")
+ ->to("extracted-$archiveType")
+ ->preserveTopDirectory(false) // this is the default
+ ->run();
+ $I->seeDirFound("extracted-$archiveType");
+ $I->seeDirFound("extracted-$archiveType/nested");
+ $I->seeFileFound('structu.re', "extracted-$archiveType/nested");
+ // Next, we'll extract the same archive again, this time preserving
+ // the top-level folder.
+ $I->taskExtract("deeply.$archiveType")
+ ->to("preserved-$archiveType")
+ ->preserveTopDirectory()
+ ->run();
+ $I->seeDirFound("preserved-$archiveType");
+ $I->seeDirFound("preserved-$archiveType/deep/nested");
+ $I->seeFileFound('structu.re', "preserved-$archiveType/deep/nested");
+ // Make another archive, this time composed of fanciful locations
+ $I->taskPack("composed.$archiveType")
+ ->add(['a/b/existing_file' => 'some/deeply/existing_file'])
+ ->add(['x/y/z/structu.re' => 'some/deeply/nested/structu.re'])
+ ->run();
+ $I->seeFileFound("composed.$archiveType");
+ // Extract our composed archive, and see if the resulting file
+ // structure matches expectations.
+ $I->taskExtract("composed.$archiveType")
+ ->to("decomposed-$archiveType")
+ ->preserveTopDirectory()
+ ->run();
+ $I->seeDirFound("decomposed-$archiveType");
+ $I->seeDirFound("decomposed-$archiveType/x/y/z");
+ $I->seeFileFound('structu.re', "decomposed-$archiveType/x/y/z");
+ $I->seeDirFound("decomposed-$archiveType/a/b");
+ $I->seeFileFound('existing_file', "decomposed-$archiveType/a/b");
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/ShortcutsCest.php b/src/composer/vendor/consolidation/robo/tests/cli/ShortcutsCest.php
new file mode 100644
index 00000000..addfb27c
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/ShortcutsCest.php
@@ -0,0 +1,25 @@
+amInPath(codecept_data_dir('sandbox'));
+ }
+
+ public function useTheCopyDirShortcut(CliGuy $I)
+ {
+ $I->wantTo('copy dir with _copyDir shortcut');
+ $I->shortcutCopyDir('box', 'bin');
+ $I->seeDirFound('bin');
+ $I->seeFileFound('robo.txt', 'bin');
+ }
+
+ public function useTheMirrorDirShortcut(CliGuy $I)
+ {
+ $I->wantTo('mirror dir with _mirrorDir shortcut');
+ $I->shortcutMirrorDir('box', 'bin');
+ $I->seeDirFound('bin');
+ $I->seeFileFound('robo.txt', 'bin');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/SimulatedCest.php b/src/composer/vendor/consolidation/robo/tests/cli/SimulatedCest.php
new file mode 100644
index 00000000..fde6cc79
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/SimulatedCest.php
@@ -0,0 +1,34 @@
+amInPath(codecept_data_dir().'sandbox');
+ }
+
+ public function toSimulateDirCreation(CliGuy $I)
+ {
+ // Set up a collection to add tasks to
+ $collection = $I->collectionBuilder();
+ $collection->simulated(true);
+
+ // Set up a filesystem stack
+ $collection->taskFilesystemStack()
+ ->mkdir('simulatedir')
+ ->touch('simulatedir/error.txt');
+
+ // Run the task collection; now the files should be present
+ $collection->run();
+ // Nothing should be created in simulated mode
+ $I->dontSeeFileFound('simulatedir/error.txt');
+ $I->seeInOutput('[Simulator] Simulating Filesystem\FilesystemStack()');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/WriteFileCest.php b/src/composer/vendor/consolidation/robo/tests/cli/WriteFileCest.php
new file mode 100644
index 00000000..b9ede453
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/WriteFileCest.php
@@ -0,0 +1,111 @@
+amInPath(codecept_data_dir('sandbox'));
+ }
+
+ public function writeFewLines(CliGuy $I)
+ {
+ $I->wantTo('write lines with WriteToFile task');
+ $I->taskWriteToFile('blogpost.md')
+ ->line('****')
+ ->line('hello world')
+ ->line('****')
+ ->run();
+ $I->seeFileFound('blogpost.md');
+ $I->seeFileContentsEqual(<<taskWriteToFile('a.txt')
+ ->append()
+ ->line('hello world')
+ ->run();
+ $I->seeFileFound('a.txt');
+ $I->seeFileContentsEqual(<<taskWriteToFile('a.txt')
+ ->append();
+ $I->assertEquals(false, $writeTask->wouldChange(), "No changes to test file.");
+ $writeTask->line('hello world');
+ $I->assertEquals(true, $writeTask->wouldChange(), "Test file would change.");
+ }
+
+ public function insertFile(CliGuy $I)
+ {
+ $I->taskWriteToFile('a.txt')
+ ->line('****')
+ ->textFromFile('b.txt')
+ ->line("C")
+ ->run();
+ $I->seeFileFound('a.txt');
+ $I->seeFileContentsEqual(<<wantTo('append lines with WriteToFile task, but only if pattern does not match');
+ $I->taskWriteToFile('blogpost.md')
+ ->line('****')
+ ->line('hello world')
+ ->line('****')
+ ->appendUnlessMatches('/hello/', 'Should not add this')
+ ->appendUnlessMatches('/goodbye/', 'Should add this')
+ ->appendIfMatches('/hello/', ' and should also add this')
+ ->appendIfMatches('/goodbye/', ' but should not add this')
+ ->appendIfMatches('/should/', '!')
+ ->run();
+ $I->seeFileFound('blogpost.md');
+ $I->seeFileContentsEqual(<<taskReplaceInFile('a.txt')
+ ->from('A')
+ ->to('B')
+ ->run();
+ $I->seeFileFound('a.txt');
+ $I->seeFileContentsEqual('B');
+
+ }
+
+ public function replaceMultipleInFile(CliGuy $I)
+ {
+ $I->taskReplaceInFile('box/robo.txt')
+ ->from(array('HELLO', 'ROBO'))
+ ->to(array('Hello ', 'robo.li!'))
+ ->run();
+ $I->seeFileFound('box/robo.txt');
+ $I->seeFileContentsEqual('Hello robo.li!');
+ }
+}
+
diff --git a/src/composer/vendor/consolidation/robo/tests/cli/_bootstrap.php b/src/composer/vendor/consolidation/robo/tests/cli/_bootstrap.php
new file mode 100644
index 00000000..c481d9b4
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/cli/_bootstrap.php
@@ -0,0 +1,9 @@
+say("The parameters passed are:\n" . var_export($a, true));
+ }
+
+ /**
+ * Demonstrate use of SymfonyStyle
+ */
+ public function testSymfonyStyle()
+ {
+ $this->io()->title('My Title');
+ $this->io()->section('Section 1');
+ $this->io()->text('Some text in section one.');
+ $this->io()->comment('This is just an example of different styles.');
+ $this->io()->section('Section 2');
+ $this->io()->text('Some text in section two.');
+ }
+
+ /**
+ * @hook command-event test:command-event
+ */
+ public function hookCommandEvent()
+ {
+ $this->io()->text('This is the command-event hook for the test:command-event command.');
+ }
+
+ public function testCommandEvent()
+ {
+ $this->io()->text('This is the main method for the test:command-event command.');
+ }
+
+ /**
+ * @hook post-command test:command-event
+ */
+ public function hookPostCommand()
+ {
+ $this->io()->text('This is the post-command hook for the test:command-event command.');
+ }
+
+ /**
+ * Demonstrate Robo error output and command failure.
+ */
+ public function testError()
+ {
+ return $this->taskExec('ls xyzzy' . date('U'))->dir('/tmp')->run();
+ }
+
+ /**
+ * Demonstrate what happens when a command or a task
+ * throws an exception. Note that typically, Robo commands
+ * should return Result objects rather than throw exceptions.
+ */
+ public function testException($options = ['task' => false])
+ {
+ if (!$options['task']) {
+ throw new \RuntimeException('Command failed with an exception.');
+ }
+ throw new \RuntimeException('Task failed with an exception.');
+ }
+
+ public function testStopOnFail()
+ {
+ $this->stopOnFail();
+ $this->collectionBuilder()
+ ->taskExec('ls xyzzy' . date('U'))
+ ->dir('/tmp')
+ ->run();
+
+ // stopOnFail() should cause the failed task to throw an exception,
+ // so we should not get here, and instead exit the program with a
+ // non-zero status.
+ return 0;
+ }
+
+ public function testVerbosity()
+ {
+ $this->output()->writeln('This command will print more information at higher verbosity levels.');
+ $this->output()->writeln('Try running with -v, -vv or -vvv');
+ $this->output()->writeln('The current verbosity level is ' . $this->output()->getVerbosity());
+ $this->output()->writeln('This is a verbose message (-v).', OutputInterface::VERBOSITY_VERBOSE);
+ $this->output()->writeln('This is a very verbose message (-vv).', OutputInterface::VERBOSITY_VERY_VERBOSE);
+ $this->output()->writeln('This is a debug message (-vvv).', OutputInterface::VERBOSITY_DEBUG);
+ $this->logger->warning('This is a warning log message.');
+ $this->logger->notice('This is a notice log message.');
+ $this->logger->debug('This is a debug log message.');
+ }
+
+ public function testDeploy()
+ {
+ $gitTask = $this->taskGitStack()
+ ->pull();
+
+ $this->taskSshExec('mysite.com')
+ ->remoteDir('/var/www/somesite')
+ ->exec($gitTask)
+ ->run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/src/Traits/Common/CommandArgumentsHost.php b/src/composer/vendor/consolidation/robo/tests/src/Traits/Common/CommandArgumentsHost.php
new file mode 100644
index 00000000..363764dc
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/src/Traits/Common/CommandArgumentsHost.php
@@ -0,0 +1,18 @@
+arguments;
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit.suite.yml b/src/composer/vendor/consolidation/robo/tests/unit.suite.yml
new file mode 100644
index 00000000..bb94af02
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit.suite.yml
@@ -0,0 +1,8 @@
+# Codeception Test Suite Configuration
+
+# suite for unit (internal) tests.
+# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
+
+class_name: CodeGuy
+modules:
+ enabled: [Asserts, CodeHelper]
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/ApplicationTest.php b/src/composer/vendor/consolidation/robo/tests/unit/ApplicationTest.php
new file mode 100644
index 00000000..bdb6c90a
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/ApplicationTest.php
@@ -0,0 +1,140 @@
+app = $container->get('application');
+ $config = $container->get('config');
+ $this->commandFactory = $container->get('commandFactory');
+ $this->roboCommandFileInstance = new TestedRoboFile;
+ $builder = $container->get('collectionBuilder', [$this->roboCommandFileInstance]);
+ $this->roboCommandFileInstance->setBuilder($builder);
+ $commandList = $this->commandFactory->createCommandsFromClass($this->roboCommandFileInstance);
+ foreach ($commandList as $command) {
+ $this->app->add($command);
+ }
+ }
+
+ public function testTaskAccessor()
+ {
+ // Get a reference to the protected 'task' method, as
+ // this is normally only callable by methods of the
+ // commandfile instance.
+ $method = new ReflectionMethod($this->roboCommandFileInstance, 'task');
+ $method->setAccessible(true);
+ $collectionBuilder = $method->invoke($this->roboCommandFileInstance, 'Robo\Task\Base\Exec', ['ls']);
+ verify(get_class($collectionBuilder))->equals('Robo\Collection\CollectionBuilder');
+ $task = $collectionBuilder->getCollectionBuilderCurrentTask();
+ verify(get_class($task))->equals('Robo\Task\Base\Exec');
+ verify(get_class($task))->equals('Robo\Task\Base\Exec');
+ }
+
+ public function testAllowEmptyValuesAsDefaultsToOptionalOptions()
+ {
+ $command = $this->createCommand('hello');
+
+ $yell = $command->getDefinition()->getOption('yell');
+
+ verify($yell->isValueOptional())
+ ->equals(false);
+ verify($yell->getDefault())
+ ->equals(false);
+
+ $to = $command->getDefinition()->getOption('to');
+
+ verify($to->isValueOptional())
+ ->equals(true);
+ verify($to->getDefault())
+ ->equals(null);
+ }
+
+ public function testCommandDocumentation()
+ {
+ $command = $this->createCommand('fibonacci');
+
+ verify($command->getDescription())
+ ->equals('Calculate the fibonacci sequence between two numbers.');
+ }
+
+ public function testCommandCompactDocumentation()
+ {
+ $command = $this->createCommand('compact');
+
+ verify($command->getDescription())
+ ->equals('Compact doc comment');
+ }
+
+ public function testCommandArgumentDocumentation()
+ {
+ $command = $this->createCommand('fibonacci');
+
+ $start = $command->getDefinition()->getArgument('start');
+
+ verify($start->getDescription())
+ ->equals('Number to start from');
+
+ $steps = $command->getDefinition()->getArgument('steps');
+
+ verify($steps->getDescription())
+ ->equals('Number of steps to perform');
+ }
+
+ public function testCommandOptionDocumentation()
+ {
+ $command = $this->createCommand('fibonacci');
+
+ $graphic = $command->getDefinition()->getOption('graphic');
+
+ verify($graphic->getDescription())
+ ->equals('Display the sequence graphically using cube representation');
+ }
+
+ public function testCommandHelpDocumentation()
+ {
+ $command = $this->createCommand('fibonacci');
+
+ verify($command->getHelp())
+ ->contains('+----+---+');
+ }
+
+ public function testCommandNaming()
+ {
+ $this->assertNotNull($this->app->find('generate:user-avatar'));
+ }
+
+ protected function createCommand($name)
+ {
+ $commandInfo = new CommandInfo($this->roboCommandFileInstance, $name);
+ return $this->commandFactory->createCommand($commandInfo, $this->roboCommandFileInstance);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Common/CommandArgumentsTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Common/CommandArgumentsTest.php
new file mode 100644
index 00000000..c30672f1
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Common/CommandArgumentsTest.php
@@ -0,0 +1,86 @@
+ [
+ ' ',
+ [],
+ ],
+ 'empty string' => [
+ " ''",
+ [''],
+ ],
+ 'space' => [
+ " ' '",
+ [' '],
+ ],
+ 'no escape - a' => [
+ " a",
+ ['a'],
+ ],
+ 'no escape - A' => [
+ " A",
+ ['A'],
+ ],
+ 'no escape - 0' => [
+ " 0",
+ ['0'],
+ ],
+ 'no escape - --' => [
+ " --",
+ ['--'],
+ ],
+ 'no escape - @_~.' => [
+ " @_~.",
+ ['@_~.'],
+ ],
+ '$' => [
+ " 'a\$b'",
+ ['a$b'],
+ ],
+ '*' => [
+ " 'a*b'",
+ ['a*b'],
+ ],
+ 'multi' => [
+ " '' a '\$PATH'",
+ ['', 'a', '$PATH'],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider casesArgs
+ *
+ * @covers ::args
+ *
+ * @param string $expected
+ * @param array $args
+ */
+ public function testArgs($expected, $args)
+ {
+ $commandArguments = new CommandArgumentsHost();
+ $commandArguments->args($args);
+ $this->guy->assertEquals($expected, $commandArguments->getArguments());
+
+ if ($args) {
+ $commandArguments = new CommandArgumentsHost();
+ call_user_func_array([$commandArguments, 'args'], $args);
+ $this->guy->assertEquals($expected, $commandArguments->getArguments());
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Common/ResourceExistenceChecker.php b/src/composer/vendor/consolidation/robo/tests/unit/Common/ResourceExistenceChecker.php
new file mode 100644
index 00000000..e45f1df0
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Common/ResourceExistenceChecker.php
@@ -0,0 +1,80 @@
+apigen = test::double('Robo\Task\ApiGen\ApiGen', [
+ 'executeCommand' => null,
+ 'output' => new \Symfony\Component\Console\Output\NullOutput()
+ ]);
+ if (!defined('DS')) {
+ define('DS', DIRECTORY_SEPARATOR);
+ }
+ $this->testDir = __DIR__ . '..' . DS . '..' . DS . 'data' . DS;
+ $this->testFile = $this->testDir . 'dump.sql';
+ }
+
+ /**
+ * testCheckResources
+ */
+ public function testCheckResources()
+ {
+ $this->assertTrue($this->checkResources($this->testDir, 'dir'));
+ $this->assertTrue($this->checkResources([
+ $this->testDir,
+ $this->testFile
+ ]));
+ }
+
+ /**
+ * @expectException \InvalidArgumentException
+ */
+ public function testCheckResourcesException()
+ {
+ $this->checkResources('does not exist', 'invalid type');
+ }
+
+ /**
+ * testCheckResource
+ */
+ public function testCheckResource()
+ {
+ $this->assertTrue($this->checkResource($this->testDir, 'dir'));
+ $this->assertTrue($this->checkResource($this->testDir, 'fileAndDir'));
+ $this->assertTrue($this->checkResource($this->testFile, 'file'));
+ $this->assertTrue($this->checkResource($this->testFile, 'fileAndDir'));
+
+ $this->assertFalse($this->checkResource('does-not-exist', 'dir'));
+ $this->assertFalse($this->checkResource('does-not-exist', 'fileAndDir'));
+ $this->assertFalse($this->checkResource('does-not-exist', 'file'));
+ $this->assertFalse($this->checkResource('does-not-exist', 'fileAndDir'));
+ }
+
+ /**
+ * testIsDir
+ */
+ public function testIsDir()
+ {
+ $this->assertTrue($this->isDir($this->testDir));
+ $this->assertFalse($this->isDir('does-not-exist'));
+ }
+
+ /**
+ * testIsFile
+ */
+ public function testIsFile()
+ {
+ $this->assertTrue($this->isFile($this->testFile));
+ $this->assertFalse($this->isFile($this->testDir . 'does-not-exist'));
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/ConfigurationTest.php b/src/composer/vendor/consolidation/robo/tests/unit/ConfigurationTest.php
new file mode 100644
index 00000000..7c29ea4f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/ConfigurationTest.php
@@ -0,0 +1,40 @@
+setConfig(Robo::config());
+ verify($taskA->run())->equals('value-a');
+
+ $taskB = new ConfigurationTestTaskB();
+ $taskB->setConfig(Robo::config());
+ verify($taskB->run())->equals('value-b');
+ }
+
+}
+
+class ConfigurationTestTaskA extends BaseTask
+{
+ public function run()
+ {
+ return $this->getConfigValue('key');
+ }
+}
+
+class ConfigurationTestTaskB extends BaseTask
+{
+ public function run()
+ {
+ return $this->getConfigValue('key');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/OutputTest.php b/src/composer/vendor/consolidation/robo/tests/unit/OutputTest.php
new file mode 100644
index 00000000..0e1468d6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/OutputTest.php
@@ -0,0 +1,81 @@
+dialog = new Symfony\Component\Console\Helper\QuestionHelper;
+ $this->setOutput(Robo::service('output'));
+ }
+
+ public function testSay()
+ {
+ $this->say('Hello, world!');
+ $this->guy->seeInOutput('> Hello, world!');
+ }
+
+ public function testAskReply()
+ {
+ $this->expectedAnswer = 'jon';
+ verify($this->ask('What is your name?'))->equals('jon');
+ $this->guy->seeOutputEquals('? What is your name? ');
+ }
+ public function testAskMethod()
+ {
+ if (method_exists($this, 'createMock')) {
+ $this->dialog = $this->createMock('\Symfony\Component\Console\Helper\QuestionHelper', ['ask']);
+ } else {
+ $this->dialog = $this->getMock('\Symfony\Component\Console\Helper\QuestionHelper', ['ask']);
+ }
+ $this->dialog->expects($this->once())
+ ->method('ask');
+ $this->ask('What is your name?');
+ }
+ public function testAskHiddenMethod()
+ {
+ if (method_exists($this, 'createMock')) {
+ $this->dialog = $this->createMock('\Symfony\Component\Console\Helper\QuestionHelper', ['ask']);
+ } else {
+ $this->dialog = $this->getMock('\Symfony\Component\Console\Helper\QuestionHelper', ['ask']);
+ }
+ $this->dialog->expects($this->once())
+ ->method('ask');
+ $this->ask('What is your name?', true);
+ }
+ public function testYell()
+ {
+ $this->yell('Buuuu!');
+ $this->guy->seeInOutput('Buuuu!');
+ }
+ protected function getDialog()
+ {
+ $stream = fopen('php://memory', 'r+', false);
+ fputs($stream, $this->expectedAnswer);
+ rewind($stream);
+ $this->dialog->setInputStream($stream);
+ return $this->dialog;
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/ResultTest.php b/src/composer/vendor/consolidation/robo/tests/unit/ResultTest.php
new file mode 100644
index 00000000..02fc322e
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/ResultTest.php
@@ -0,0 +1,79 @@
+ 10]);
+
+ $this->guy->seeInOutput('The foo barred');
+ $this->guy->seeInOutput('Exit code 1');
+ $this->guy->seeInOutput('10s');
+ $this->guy->seeInOutput('[ResultDummyTask]');
+
+ $this->assertSame($task, $result->getTask());
+ $this->assertEquals(1, $result->getExitCode());
+ $this->assertEquals('The foo barred', $result->getMessage());
+ $data = $result->getData();
+ $this->assertEquals(10, $data['time']);
+
+ $taskClone = $result->cloneTask();
+ $this->assertNotSame($task, $taskClone);
+ $this->assertInstanceOf('Robo\Contract\TaskInterface', $taskClone);
+ }
+
+ public function testArrayAccess()
+ {
+ $task = new ResultDummyTask();
+ $result = new Result($task, 1, 'The foo barred', ['time' => 10]);
+ $this->assertEquals($result['time'], 10);
+ }
+
+ public function testStopOnFail()
+ {
+ $exceptionClass = false;
+ $task = new ResultDummyTask();
+
+ Result::$stopOnFail = true;
+ $result = Result::success($task, "Something that worked");
+ try {
+ $result = Result::error($task, "Something that did not work");
+ // stopOnFail will cause Result::error() to throw an exception,
+ // so we will never get here. If we did, the assert below would fail.
+ $this->assertTrue($result->wasSuccessful());
+ $this->assertTrue(false);
+ } catch (\Exception $e) {
+ $exceptionClass = get_class($e);
+ }
+ $this->assertEquals(TaskExitException::class, $exceptionClass);
+ $this->assertTrue($result->wasSuccessful());
+
+ /*
+ // This gives an error:
+ // Exception of class Robo\Exception\TaskExitException expected to
+ // be thrown, but PHPUnit_Framework_Exception caught
+ // This happens whether or not the expected exception is thrown
+ $this->guy->expectException(TaskExitException::class, function() {
+ // $result = Result::error($task, "Something that did not work");
+ $result = Result::success($task, "Something that worked");
+ });
+ */
+
+ Result::$stopOnFail = false;
+ }
+}
+
+class ResultDummyTask implements \Robo\Contract\TaskInterface
+{
+ public function run()
+ {
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/RunnerTest.php b/src/composer/vendor/consolidation/robo/tests/unit/RunnerTest.php
new file mode 100644
index 00000000..9a871c93
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/RunnerTest.php
@@ -0,0 +1,279 @@
+runner = new \Robo\Runner('\Robo\RoboFileFixture');
+ }
+
+ public function testHandleError()
+ {
+ $tmpLevel = error_reporting();
+
+ $this->assertFalse($this->runner->handleError());
+ error_reporting(0);
+ $this->assertTrue($this->runner->handleError());
+
+ error_reporting($tmpLevel);
+ }
+
+ public function testErrorIsHandled()
+ {
+ $tmpLevel = error_reporting();
+
+ // Set error_get_last to a known state. Note that it can never be
+ // reset; see http://php.net/manual/en/function.error-get-last.php
+ @trigger_error('control');
+ $error_description = error_get_last();
+ $this->assertEquals('control', $error_description['message']);
+ @trigger_error('');
+ $error_description = error_get_last();
+ $this->assertEquals('', $error_description['message']);
+
+ // Set error_reporting to a non-zero value. In this instance,
+ // 'trigger_error' would abort our test script, so we use
+ // @trigger_error so that execution will continue. With our
+ // error handler in place, the value of error_get_last() does
+ // not change.
+ error_reporting(E_USER_ERROR);
+ set_error_handler(array($this->runner, 'handleError'));
+ @trigger_error('test error', E_USER_ERROR);
+ $error_description = error_get_last();
+ $this->assertEquals('', $error_description['message']);
+
+ // Set error_reporting to zero. Now, even 'trigger_error'
+ // does not abort execution. The value of error_get_last()
+ // still does not change.
+ error_reporting(0);
+ trigger_error('test error 2', E_USER_ERROR);
+ $error_description = error_get_last();
+ $this->assertEquals('', $error_description['message']);
+
+ error_reporting($tmpLevel);
+ }
+
+ public function testThrowsExceptionWhenNoContainerAvailable()
+ {
+ \PHPUnit_Framework_TestCase::setExpectedExceptionRegExp(
+ '\RuntimeException',
+ '/container is not initialized yet.*/'
+ );
+ Robo::unsetContainer();
+ Robo::getContainer();
+ }
+
+ public function testRunnerNoSuchCommand()
+ {
+ $argv = ['placeholder', 'no-such-command'];
+ $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+ $this->guy->seeInOutput('Command "no-such-command" is not defined.');
+ }
+
+ public function testRunnerList()
+ {
+ $argv = ['placeholder', 'list'];
+ $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+ $this->guy->seeInOutput('test:array-args');
+ }
+
+ public function testRunnerTryArgs()
+ {
+ $argv = ['placeholder', 'test:array-args', 'a', 'b', 'c'];
+ $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $expected = << The parameters passed are:
+array (
+ 0 => 'a',
+ 1 => 'b',
+ 2 => 'c',
+)
+
+EOT;
+ $this->guy->seeOutputEquals($expected);
+ }
+
+ public function testSymfonyStyle()
+ {
+ $argv = ['placeholder', 'test:symfony-style'];
+ $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+ $this->guy->seeInOutput('Some text in section one.');
+ }
+
+ public function testCommandEventHook()
+ {
+ $argv = ['placeholder', 'test:command-event'];
+ $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $expected = <<guy->seeInOutput($expected);
+ }
+
+ public function testRoboStaticRunMethod()
+ {
+ $argv = ['placeholder', 'test:symfony-style'];
+ $commandFiles = ['\Robo\RoboFileFixture'];
+ Robo::run($argv, $commandFiles, 'MyApp', '1.2.3', $this->guy->capturedOutputStream());
+ $this->guy->seeInOutput('Some text in section one.');
+ }
+
+ public function testDeploy()
+ {
+ $argv = ['placeholder', 'test:deploy', '--simulate'];
+ $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+ $this->guy->seeInOutput('[Simulator] Simulating Remote\\Ssh(\'mysite.com\', null)');
+ $this->guy->seeInOutput('[Simulator] Running ssh mysite.com \'cd "/var/www/somesite" && git pull\'');
+ }
+
+ public function testRunnerTryError()
+ {
+ $argv = ['placeholder', 'test:error'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('[Exec] Running ls xyzzy');
+ $this->assertTrue($result > 0);
+ }
+
+ public function testRunnerTrySimulatedError()
+ {
+ $argv = ['placeholder', 'test:error', '--simulate'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('Simulating Exec');
+ $this->assertEquals(0, $result);
+ }
+
+ public function testRunnerTryException()
+ {
+ $argv = ['placeholder', 'test:exception', '--task'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('Task failed with an exception');
+ $this->assertEquals(1, $result);
+ }
+
+ public function testInitCommand()
+ {
+ $container = \Robo\Robo::getContainer();
+ $app = $container->get('application');
+ $app->addInitRoboFileCommand(getcwd() . '/testRoboFile.php', 'RoboTestClass');
+
+ $argv = ['placeholder', 'init'];
+ $status = $this->runner->run($argv, $this->guy->capturedOutputStream(), $app);
+ $this->guy->seeInOutput('testRoboFile.php will be created in the current directory');
+ $this->assertEquals(0, $status);
+
+ $this->assertTrue(file_exists('testRoboFile.php'));
+ $commandContents = file_get_contents('testRoboFile.php');
+ unlink('testRoboFile.php');
+ $this->assertContains('class RoboTestClass', $commandContents);
+ }
+
+ public function testTasksStopOnFail()
+ {
+ $argv = ['placeholder', 'test:stop-on-fail'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('[');
+ $this->assertTrue($result > 0);
+ }
+
+ public function testInvalidRoboDirectory()
+ {
+ $runnerWithNoRoboFile = new \Robo\Runner();
+
+ $argv = ['placeholder', 'list', '-f', 'no-such-directory'];
+ $result = $runnerWithNoRoboFile->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('Path `no-such-directory` is invalid; please provide a valid absolute path to the Robofile to load.');
+ }
+
+ public function testUnloadableRoboFile()
+ {
+ $runnerWithNoRoboFile = new \Robo\Runner();
+
+ $argv = ['placeholder', 'list', '-f', dirname(__DIR__) . '/src/RoboFileFixture.php'];
+ $result = $runnerWithNoRoboFile->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ // We cannot load RoboFileFixture.php via -f / --load-from because
+ // it has a namespace, and --load-from does not support that.
+ $this->guy->seeInOutput('Class RoboFileFixture was not loaded');
+ }
+
+ public function testRunnerQuietOutput()
+ {
+ $argv = ['placeholder', 'test:verbosity', '--quiet'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->doNotSeeInOutput('This command will print more information at higher verbosity levels');
+ $this->guy->doNotSeeInOutput('This is a verbose message (-v).');
+ $this->guy->doNotSeeInOutput('This is a very verbose message (-vv).');
+ $this->guy->doNotSeeInOutput('This is a debug message (-vvv).');
+ $this->guy->doNotSeeInOutput(' [warning] This is a warning log message.');
+ $this->guy->doNotSeeInOutput(' [notice] This is a notice log message.');
+ $this->guy->doNotSeeInOutput(' [debug] This is a debug log message.');
+ $this->assertEquals(0, $result);
+ }
+
+ public function testRunnerVerboseOutput()
+ {
+ $argv = ['placeholder', 'test:verbosity', '-v'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('This command will print more information at higher verbosity levels');
+ $this->guy->seeInOutput('This is a verbose message (-v).');
+ $this->guy->doNotSeeInOutput('This is a very verbose message (-vv).');
+ $this->guy->doNotSeeInOutput('This is a debug message (-vvv).');
+ $this->guy->seeInOutput(' [warning] This is a warning log message.');
+ $this->guy->seeInOutput(' [notice] This is a notice log message.');
+ $this->guy->doNotSeeInOutput(' [debug] This is a debug log message.');
+ $this->assertEquals(0, $result);
+ }
+
+ public function testRunnerVeryVerboseOutput()
+ {
+ $argv = ['placeholder', 'test:verbosity', '-vv'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('This command will print more information at higher verbosity levels');
+ $this->guy->seeInOutput('This is a verbose message (-v).');
+ $this->guy->seeInOutput('This is a very verbose message (-vv).');
+ $this->guy->doNotSeeInOutput('This is a debug message (-vvv).');
+ $this->guy->seeInOutput(' [warning] This is a warning log message.');
+ $this->guy->seeInOutput(' [notice] This is a notice log message.');
+ $this->guy->doNotSeeInOutput(' [debug] This is a debug log message.');
+ $this->assertEquals(0, $result);
+ }
+
+ public function testRunnerDebugOutput()
+ {
+ $argv = ['placeholder', 'test:verbosity', '-vvv'];
+ $result = $this->runner->execute($argv, null, null, $this->guy->capturedOutputStream());
+
+ $this->guy->seeInOutput('This command will print more information at higher verbosity levels');
+ $this->guy->seeInOutput('This is a verbose message (-v).');
+ $this->guy->seeInOutput('This is a very verbose message (-vv).');
+ $this->guy->seeInOutput('This is a debug message (-vvv).');
+ $this->guy->seeInOutput(' [warning] This is a warning log message.');
+ $this->guy->seeInOutput(' [notice] This is a notice log message.');
+ $this->guy->seeInOutput(' [debug] This is a debug log message.');
+ $this->assertEquals(0, $result);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/ApiGenTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/ApiGenTest.php
new file mode 100644
index 00000000..cc21850e
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/ApiGenTest.php
@@ -0,0 +1,52 @@
+apigen = test::double('Robo\Task\ApiGen\ApiGen', [
+ 'executeCommand' => null,
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+
+ $this->container = Robo::getContainer();
+ }
+
+ // tests
+ public function testPHPUnitCommand()
+ {
+ // need an explicit Traversable
+ $skippedPaths = new \SplDoublyLinkedList();
+ $skippedPaths->push('a');
+ $skippedPaths->push('b');
+
+ // going for 'bang for the buck' here re: test converage
+ $task = (new \Robo\Task\ApiGen\ApiGen('apigen'))
+ ->config('./apigen.neon')
+ ->source('src') // single string value of Traversable
+ ->extensions('php') // single string value of List
+ ->exclude(array('test', 'tmp')) // array value of Traversable
+ ->skipDocPath($skippedPaths) // multi-value of Traversable
+ ->charset(array('utf8','iso88591')) // array of List
+ ->internal('no') // boolean as supported "no"
+ ->php(true) // boolean as boolean
+ ->tree('Y') // boolean as string
+ ->debug('n');
+
+ $cmd = 'apigen --config ./apigen.neon --source src --extensions php --exclude test --exclude tmp --skip-doc-path a --skip-doc-path b --charset \'utf8,iso88591\' --internal no --php yes --tree yes --debug no';
+ verify($task->getCommand())->equals($cmd);
+
+ $task->run();
+ $this->apigen->verifyInvoked('executeCommand', [$cmd]);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/AtoumTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/AtoumTest.php
new file mode 100644
index 00000000..0bd71a34
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/AtoumTest.php
@@ -0,0 +1,38 @@
+atoum = test::double('Robo\Task\Testing\Atoum', [
+ 'executeCommand' => null,
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+
+ public function testAtoumCommand()
+ {
+ $task = (new \Robo\Task\Testing\Atoum('atoum'))
+ ->bootstrap('bootstrap.php')
+ ->tags("needDb")
+ ->lightReport()
+ ->tap()
+ ->bootstrap('tests/bootstrap.php')
+ ->configFile("config/dev.php")
+ ->debug()
+ ->files(array("path/to/file1.php", "path/to/file2.php"))
+ ->directories("tests/units")
+ ;
+ verify($task->getCommand())->equals('atoum --bootstrap bootstrap.php --tags needDb --use-light-report --use-tap-report --bootstrap tests/bootstrap.php -c config/dev.php --debug --f path/to/file1.php --f path/to/file2.php --directories tests/units');
+ $task->run();
+ $this->atoum->verifyInvoked('executeCommand', ['atoum --bootstrap bootstrap.php --tags needDb --use-light-report --use-tap-report --bootstrap tests/bootstrap.php -c config/dev.php --debug --f path/to/file1.php --f path/to/file2.php --directories tests/units']);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/BehatTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/BehatTest.php
new file mode 100644
index 00000000..d08e1570
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/BehatTest.php
@@ -0,0 +1,43 @@
+behat = test::double('Robo\Task\Testing\Behat', [
+ 'executeCommand' => null,
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+
+ // tests
+ public function testBehatRun()
+ {
+ $behat = test::double('Robo\Task\Testing\Behat', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Testing\Behat('behat'))->run();
+ $behat->verifyInvoked('executeCommand');
+ }
+
+ public function testBehatCommand()
+ {
+ $behat = test::double('Robo\Task\Testing\Behat', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ $task = (new \Robo\Task\Testing\Behat('behat'))
+ ->stopOnFail()
+ ->noInteraction()
+ ->colors();
+ verify($task->getCommand())->equals('behat run --stop-on-failure --no-interaction --colors');
+ $task->run();
+ $behat->verifyInvoked('executeCommand', ['behat run --stop-on-failure --no-interaction --colors']);
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/BowerTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/BowerTest.php
new file mode 100644
index 00000000..f656d753
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/BowerTest.php
@@ -0,0 +1,59 @@
+baseBower = test::double('Robo\Task\Bower\Base', [
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+ // tests
+ public function testBowerInstall()
+ {
+ $bower = test::double('Robo\Task\Bower\Install', ['executeCommand' => null, 'logger' => new \Psr\Log\NullLogger(),]);
+ (new \Robo\Task\Bower\Install('bower'))->run();
+ $bower->verifyInvoked('executeCommand', ['bower install']);
+ }
+
+ public function testBowerUpdate()
+ {
+ $bower = test::double('Robo\Task\Bower\Update', ['executeCommand' => null]);
+ $task = new \Robo\Task\Bower\Update('bower');
+ $task->setLogger(new \Psr\Log\NullLogger());
+
+ $task->run();
+ $bower->verifyInvoked('executeCommand', ['bower update']);
+ }
+
+ public function testBowerInstallCommand()
+ {
+ verify(
+ (new \Robo\Task\Bower\Install('bower'))->getCommand()
+ )->equals('bower install');
+
+ verify(
+ (new \Robo\Task\Bower\Update('bower'))->getCommand()
+ )->equals('bower update');
+
+ verify(
+ (new \Robo\Task\Bower\Install('bower'))
+ ->allowRoot()
+ ->forceLatest()
+ ->offline()
+ ->noDev()
+ ->getCommand()
+ )->equals('bower install --allow-root --force-latest --offline --production');
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/CodeceptionTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/CodeceptionTest.php
new file mode 100644
index 00000000..d2c637b0
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/CodeceptionTest.php
@@ -0,0 +1,63 @@
+codecept = test::double('Robo\Task\Testing\Codecept', [
+ 'executeCommand' => null,
+ 'output' => new \Symfony\Component\Console\Output\NullOutput()
+ ]);
+ }
+
+ // tests
+ public function testCodeceptionCommand()
+ {
+ verify(trim((new \Robo\Task\Testing\Codecept('codecept.phar'))->getCommand()))->equals('codecept.phar run');
+ }
+
+ public function testCodeceptionRun()
+ {
+ $task = new \Robo\Task\Testing\Codecept('codecept.phar');
+ $task->setLogger(new \Psr\Log\NullLogger());
+
+ $task->run();
+ $this->codecept->verifyInvoked('executeCommand');
+ }
+
+ public function testCodeceptOptions()
+ {
+ verify((new \Robo\Task\Testing\Codecept('codecept'))
+ ->suite('unit')
+ ->test('Codeception/Command')
+ ->group('core')
+ ->env('process1')
+ ->coverage()
+ ->getCommand()
+ )->equals('codecept run --group core --env process1 --coverage unit Codeception/Command');
+
+ verify((new \Robo\Task\Testing\Codecept('codecept'))
+ ->test('tests/unit/Codeception')
+ ->configFile('~/Codeception')
+ ->xml('result.xml')
+ ->html()
+ ->getCommand()
+ )->equals('codecept run -c ~/Codeception --xml result.xml --html tests/unit/Codeception');
+
+ verify((new \Robo\Task\Testing\Codecept('codecept.phar'))->debug()->getCommand())->contains(' --debug');
+ verify((new \Robo\Task\Testing\Codecept('codecept.phar'))->silent()->getCommand())->contains(' --silent');
+ verify((new \Robo\Task\Testing\Codecept('codecept.phar'))->excludeGroup('g')->getCommand())->contains(' --skip-group g');
+ verify((new \Robo\Task\Testing\Codecept('codecept.phar'))->tap()->getCommand())->contains('--tap');
+ verify((new \Robo\Task\Testing\Codecept('codecept.phar'))->json()->getCommand())->contains('--json');
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/CollectionTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/CollectionTest.php
new file mode 100644
index 00000000..843589a9
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/CollectionTest.php
@@ -0,0 +1,183 @@
+add($taskA, 'a-name')
+ ->add($taskB, 'b-name');
+
+ // We add methods of our task instances as before and
+ // after tasks. These methods have access to the task
+ // class' fields, and may modify them as needed.
+ $collection
+ ->after('a-name', [$taskA, 'parenthesizer'])
+ ->after('a-name', [$taskA, 'emphasizer'])
+ ->after('b-name', [$taskB, 'emphasizer'])
+ ->after('b-name', [$taskB, 'parenthesizer'])
+ ->after('b-name', [$taskB, 'parenthesizer'], 'special-name');
+
+ $result = $collection->run();
+
+ // verify(var_export($result->getData(), true))->equals('');
+
+ // Ensure that the results have the correct key values
+ verify(implode(',', array_keys($result->getData())))->equals('a-name,b-name,special-name,time');
+
+ // Verify that all of the after tasks ran in
+ // the correct order.
+ verify($result['a-name']['a'])->equals('*(value-a)*');
+ verify($result['b-name']['b'])->equals('(*value-b*)');
+
+ // Note that the last after task is added with a special name;
+ // its results therefore show up under the name given, rather
+ // than being stored under the name of the task it was added after.
+ verify($result['special-name']['b'])->equals('((*value-b*))');
+ }
+
+ public function testBeforeFilters()
+ {
+ $collection = new Collection();
+
+ $taskA = new CollectionTestTask('a', 'value-a');
+ $taskB = new CollectionTestTask('b', 'value-b');
+
+ $collection
+ ->add($taskA, 'a-name')
+ ->add($taskB, 'b-name');
+
+ // We add methods of our task instances as before and
+ // after tasks. These methods have access to the task
+ // class' fields, and may modify them as needed.
+ $collection
+ ->before('b-name', [$taskA, 'parenthesizer'])
+ ->before('b-name', [$taskA, 'emphasizer'], 'special-before-name');
+
+ $result = $collection->run();
+
+ // Ensure that the results have the correct key values
+ verify(implode(',', array_keys($result->getData())))->equals('a-name,b-name,special-before-name,time');
+
+ // The result from the 'before' task is attached
+ // to 'b-name', since it was called as before('b-name', ...)
+ verify($result['b-name']['a'])->equals('(value-a)');
+ // When a 'before' task is given its own name, then
+ // its results are attached under that name.
+ verify($result['special-before-name']['a'])->equals('*(value-a)*');
+ }
+
+ public function testAddCodeRollbackAndCompletion()
+ {
+ $collection = new Collection();
+ $rollback1 = new CountingTask();
+ $rollback2 = new CountingTask();
+ $completion1 = new CountingTask();
+ $completion2 = new CountingTask();
+
+ $collection
+ ->progressMessage("start collection tasks")
+ ->rollback($rollback1)
+ ->completion($completion1)
+ ->rollbackCode(function() use($rollback1) { $rollback1->run(); } )
+ ->completionCode(function() use($completion1) { $completion1->run(); } )
+ ->addCode(function () { return 42; })
+ ->progressMessage("not reached")
+ ->rollback($rollback2)
+ ->completion($completion2)
+ ->addCode(function () { return 13; });
+
+ $collection->setLogger($this->guy->logger());
+
+ $result = $collection->run();
+ // Execution stops on the first error.
+ // Confirm that status code is converted to a Result object.
+ verify($result->getExitCode())->equals(42);
+ verify($rollback1->getCount())->equals(2);
+ verify($rollback2->getCount())->equals(0);
+ verify($completion1->getCount())->equals(2);
+ verify($completion2->getCount())->equals(0);
+ $this->guy->seeInOutput('start collection tasks');
+ $this->guy->doNotSeeInOutput('not reached');
+ }
+}
+
+class CountingTask extends BaseTask
+{
+ protected $count = 0;
+
+ public function run()
+ {
+ $this->count++;
+ return Result::success($this);
+ }
+
+ public function getCount()
+ {
+ return $this->count;
+ }
+}
+
+class CollectionTestTask extends BaseTask
+{
+ protected $key;
+ protected $value;
+
+ public function __construct($key, $value)
+ {
+ $this->key = $key;
+ $this->value = $value;
+ }
+
+ public function run()
+ {
+ return $this->getValue();
+ }
+
+ protected function getValue()
+ {
+ $result = Result::success($this);
+ $result[$this->key] = $this->value;
+
+ return $result;
+ }
+
+ // Note that by returning a value with the same
+ // key as the result, we overwrite the value generated
+ // by the primary task method ('run()'). If we returned
+ // a result with a different key, then both values
+ // would appear in the result.
+ public function parenthesizer()
+ {
+ $this->value = "({$this->value})";
+ return $this->getValue();
+ }
+
+ public function emphasizer()
+ {
+ $this->value = "*{$this->value}*";
+ return $this->getValue();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/CommandStackTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/CommandStackTest.php
new file mode 100644
index 00000000..7a83b5f7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/CommandStackTest.php
@@ -0,0 +1,26 @@
+executable('some-executable')
+ ->exec('some-executable status')
+ ->getCommand()
+ )->equals('some-executable status');
+ }
+
+ public function testExecStackCommandIsNotTrimmedIfHavingSameCharsAsExecutable()
+ {
+ $commandStack = Stub::make('Robo\Task\CommandStack');
+ verify($commandStack
+ ->executable('some-executable')
+ ->exec('status')
+ ->getCommand()
+ )->equals('some-executable status');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/ComposerTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/ComposerTest.php
new file mode 100644
index 00000000..4e01fb89
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/ComposerTest.php
@@ -0,0 +1,266 @@
+baseComposer = test::double('Robo\Task\Composer\Base', [
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+ // tests
+ public function testComposerInstall()
+ {
+ $composer = test::double('Robo\Task\Composer\Install', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Composer\Install('composer'))->run();
+ $composer->verifyInvoked('executeCommand', ['composer install']);
+
+ (new \Robo\Task\Composer\Install('composer'))
+ ->preferSource()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer install --prefer-source']);
+
+ (new \Robo\Task\Composer\Install('composer'))
+ ->optimizeAutoloader()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer install --optimize-autoloader']);
+ }
+
+ public function testComposerInstallAnsi()
+ {
+ $config = new \Robo\Config();
+ $config->setDecorated(true);
+ $composer = test::double('Robo\Task\Composer\Install', ['executeCommand' => null, 'getConfig' => $config, 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Composer\Install('composer'))->run();
+ $composer->verifyInvoked('executeCommand', ['composer install --ansi']);
+
+ (new \Robo\Task\Composer\Install('composer'))
+ ->preferSource()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer install --prefer-source --ansi']);
+
+ (new \Robo\Task\Composer\Install('composer'))
+ ->optimizeAutoloader()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer install --optimize-autoloader --ansi']);
+ }
+
+ public function testComposerUpdate()
+ {
+ $composer = test::double('Robo\Task\Composer\Update', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Composer\Update('composer'))->run();
+ $composer->verifyInvoked('executeCommand', ['composer update']);
+
+ (new \Robo\Task\Composer\Update('composer'))
+ ->optimizeAutoloader()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer update --optimize-autoloader']);
+ }
+
+ public function testComposerDumpAutoload()
+ {
+ $composer = test::double('Robo\Task\Composer\DumpAutoload', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Composer\DumpAutoload('composer'))->run();
+ $composer->verifyInvoked('executeCommand', ['composer dump-autoload']);
+
+ (new \Robo\Task\Composer\DumpAutoload('composer'))
+ ->noDev()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer dump-autoload --no-dev']);
+
+ (new \Robo\Task\Composer\DumpAutoload('composer'))
+ ->optimize()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer dump-autoload --optimize']);
+
+ (new \Robo\Task\Composer\DumpAutoload('composer'))
+ ->optimize()
+ ->noDev()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer dump-autoload --optimize --no-dev']);
+ }
+
+ public function testComposerValidate()
+ {
+ $composer = test::double('Robo\Task\Composer\Validate', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Composer\Validate('composer'))->run();
+ $composer->verifyInvoked('executeCommand', ['composer validate']);
+
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->noCheckAll()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer validate --no-check-all']);
+
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->noCheckLock()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer validate --no-check-lock']);
+
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->noCheckPublish()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer validate --no-check-publish']);
+
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->withDependencies()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer validate --with-dependencies']);
+
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->strict()
+ ->run();
+ $composer->verifyInvoked('executeCommand', ['composer validate --strict']);
+ }
+
+ public function testComposerInstallCommand()
+ {
+ verify(
+ (new \Robo\Task\Composer\Install('composer'))->setConfig(new \Robo\Config())->getCommand()
+ )->equals('composer install');
+
+ verify(
+ (new \Robo\Task\Composer\Install('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noDev()
+ ->preferDist()
+ ->optimizeAutoloader()
+ ->getCommand()
+ )->equals('composer install --prefer-dist --no-dev --optimize-autoloader');
+ }
+
+ public function testComposerUpdateCommand()
+ {
+ verify(
+ (new \Robo\Task\Composer\Update('composer'))->setConfig(new \Robo\Config())->getCommand()
+ )->equals('composer update');
+
+ verify(
+ (new \Robo\Task\Composer\Update('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noDev()
+ ->preferDist()
+ ->getCommand()
+ )->equals('composer update --prefer-dist --no-dev');
+
+ verify(
+ (new \Robo\Task\Composer\Update('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noDev()
+ ->preferDist()
+ ->optimizeAutoloader()
+ ->getCommand()
+ )->equals('composer update --prefer-dist --no-dev --optimize-autoloader');
+ }
+
+ public function testComposerDumpAutoloadCommand()
+ {
+ verify(
+ (new \Robo\Task\Composer\DumpAutoload('composer'))->setConfig(new \Robo\Config())->getCommand()
+ )->equals('composer dump-autoload');
+
+ verify(
+ (new \Robo\Task\Composer\DumpAutoload('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noDev()
+ ->getCommand()
+ )->equals('composer dump-autoload --no-dev');
+
+ verify(
+ (new \Robo\Task\Composer\DumpAutoload('composer'))
+ ->setConfig(new \Robo\Config())
+ ->optimize()
+ ->getCommand()
+ )->equals('composer dump-autoload --optimize');
+
+ verify(
+ (new \Robo\Task\Composer\DumpAutoload('composer'))
+ ->setConfig(new \Robo\Config())
+ ->optimize()
+ ->noDev()
+ ->getCommand()
+ )->equals('composer dump-autoload --optimize --no-dev');
+ }
+
+ public function testComposerRemove()
+ {
+ verify(
+ (new \Robo\Task\Composer\Remove('composer'))->setConfig(new \Robo\Config())->getCommand()
+ )->equals('composer remove');
+ verify(
+ (new \Robo\Task\Composer\Remove('composer'))
+ ->setConfig(new \Robo\Config())
+ ->dev()
+ ->noProgress()
+ ->noUpdate()
+ ->getCommand()
+ )->equals('composer remove --dev --no-progress --no-update');
+ }
+
+ public function testComposerValidateCommand()
+ {
+ verify(
+ (new \Robo\Task\Composer\Validate('composer'))->setConfig(new \Robo\Config())->getCommand()
+ )->equals('composer validate');
+
+ verify(
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noCheckAll()
+ ->getCommand()
+ )->equals('composer validate --no-check-all');
+
+ verify(
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noCheckLock()
+ ->getCommand()
+ )->equals('composer validate --no-check-lock');
+
+ verify(
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noCheckPublish()
+ ->getCommand()
+ )->equals('composer validate --no-check-publish');
+
+ verify(
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->setConfig(new \Robo\Config())
+ ->withDependencies()
+ ->getCommand()
+ )->equals('composer validate --with-dependencies');
+
+ verify(
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->setConfig(new \Robo\Config())
+ ->strict()
+ ->getCommand()
+ )->equals('composer validate --strict');
+
+ verify(
+ (new \Robo\Task\Composer\Validate('composer'))
+ ->setConfig(new \Robo\Config())
+ ->noCheckAll()
+ ->noCheckLock()
+ ->noCheckPublish()
+ ->withDependencies()
+ ->strict()
+ ->getCommand()
+ )->equals('composer validate --no-check-all --no-check-lock --no-check-publish --with-dependencies --strict');
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/DockerTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/DockerTest.php
new file mode 100644
index 00000000..f72b237f
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/DockerTest.php
@@ -0,0 +1,97 @@
+baseDocker = test::double('Robo\Task\Docker\Base', [
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+ // tests
+ public function testDockerBuild()
+ {
+ $docker = test::double('Robo\Task\Docker\Build', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Docker\Build())->run();
+ $docker->verifyInvoked('executeCommand', ['docker build .']);
+
+ (new \Robo\Task\Docker\Build())->tag('something')->run();
+ $docker->verifyInvoked('executeCommand', ['docker build -t something .']);
+ }
+
+ public function testDockerCommit()
+ {
+ $docker = test::double('Robo\Task\Docker\Commit', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Docker\Commit('cid'))->run();
+ $docker->verifyInvoked('executeCommand', ['docker commit cid ']);
+
+ (new \Robo\Task\Docker\Commit('cid'))->name('somename')->run();
+ $docker->verifyInvoked('executeCommand', ['docker commit cid somename ']);
+ }
+
+ public function testDockerExec()
+ {
+ $docker = test::double('Robo\Task\Docker\Exec', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Docker\Exec('cid'))->run();
+ $docker->verifyInvoked('executeCommand', ['docker exec cid ']);
+
+ (new \Robo\Task\Docker\Exec('cid'))->exec('pwd')->run();
+ $docker->verifyInvoked('executeCommand', ['docker exec cid pwd']);
+ }
+
+ public function testDockerPull()
+ {
+ $docker = test::double('Robo\Task\Docker\Pull', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Docker\Pull('image'))->run();
+ $docker->verifyInvoked('executeCommand', ['docker pull image ']);
+ }
+
+ public function testDockerRemove()
+ {
+ $docker = test::double('Robo\Task\Docker\Remove', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Docker\Remove('container'))->run();
+ $docker->verifyInvoked('executeCommand', ['docker rm container ']);
+ }
+
+ public function testDockerRun()
+ {
+ $docker = test::double('Robo\Task\Docker\Run', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger(), 'getUniqId' => '12345']);
+
+ (new \Robo\Task\Docker\Run('cid'))->tmpDir('/tmp')->run();
+ $docker->verifyInvoked('executeCommand', ['docker run -i --cidfile /tmp/docker_12345.cid cid']);
+
+ (new \Robo\Task\Docker\Run('cid'))->tmpDir('/tmp')->exec('pwd')->run();
+ $docker->verifyInvoked('executeCommand', ['docker run -i --cidfile /tmp/docker_12345.cid cid pwd']);
+ }
+
+ public function testDockerStart()
+ {
+ $docker = test::double('Robo\Task\Docker\Start', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Docker\Start('cid'))->run();
+ $docker->verifyInvoked('executeCommand', ['docker start cid']);
+ }
+
+ public function testDockerStop()
+ {
+ $docker = test::double('Robo\Task\Docker\Stop', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ (new \Robo\Task\Docker\Stop('cid'))->run();
+ $docker->verifyInvoked('executeCommand', ['docker stop cid']);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/ExecTaskTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/ExecTaskTest.php
new file mode 100644
index 00000000..15b3c224
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/ExecTaskTest.php
@@ -0,0 +1,73 @@
+process = test::double('Symfony\Component\Process\Process', [
+ 'run' => false,
+ 'start' => false,
+ 'getOutput' => 'Hello world',
+ 'getExitCode' => 0,
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ test::double('Robo\Task\Base\Exec', ['output' => new \Symfony\Component\Console\Output\NullOutput()]);
+ }
+
+ public function testExec()
+ {
+ $task = new \Robo\Task\Base\Exec('ls');
+ $task->setLogger(new \Psr\Log\NullLogger());
+
+ $result = $task->run();
+ $this->process->verifyInvoked('run');
+ verify($result->getMessage())->equals('Hello world');
+ verify($result->getExitCode())->equals(0);
+ }
+
+ public function testExecInBackground()
+ {
+ $task = new \Robo\Task\Base\Exec('ls');
+ $task->setLogger(new \Psr\Log\NullLogger());
+
+ $result = $task->background()->run();
+ $this->process->verifyInvoked('start');
+ $this->process->verifyNeverInvoked('run');
+ verify('exit code was not received', $result->getExitCode())->notEquals(100);
+ }
+
+ public function testGetCommand()
+ {
+ verify((new \Robo\Task\Base\Exec('ls'))->getCommand())->equals('ls');
+ }
+
+ public function testExecStack()
+ {
+ $task = new \Robo\Task\Base\ExecStack();
+ $task->setLogger(new \Psr\Log\NullLogger());
+
+ $task
+ ->exec('ls')
+ ->exec('cd /')
+ ->exec('cd home')
+ ->run();
+ $this->process->verifyInvoked('run', 3);
+ }
+
+ public function testExecStackCommand()
+ {
+ verify((new \Robo\Task\Base\ExecStack())
+ ->exec('ls')
+ ->exec('cd /')
+ ->exec('cd home')
+ ->getCommand()
+ )->equals('ls && cd / && cd home');
+ }
+};
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/GitTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/GitTest.php
new file mode 100644
index 00000000..63b463b6
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/GitTest.php
@@ -0,0 +1,62 @@
+git = test::double('Robo\Task\Vcs\GitStack', [
+ 'executeCommand' => new \AspectMock\Proxy\Anything(),
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+
+ // tests
+ public function testGitStackRun()
+ {
+ (new \Robo\Task\Vcs\GitStack('git'))->stopOnFail()->add('-A')->pull()->run();
+ $this->git->verifyInvoked('executeCommand', ['git add -A']);
+ $this->git->verifyInvoked('executeCommand', ['git pull']);
+
+ (new \Robo\Task\Vcs\GitStack('git'))->add('-A')->pull()->run();
+ $this->git->verifyInvoked('executeCommand', ['git add -A && git pull']);
+ }
+
+ public function testGitStackCommands()
+ {
+ verify(
+ (new \Robo\Task\Vcs\GitStack())
+ ->cloneRepo('http://github.com/consolidation-org/Robo')
+ ->pull()
+ ->add('-A')
+ ->commit('changed')
+ ->push()
+ ->tag('0.6.0')
+ ->push('origin', '0.6.0')
+ ->getCommand()
+ )->equals("git clone http://github.com/consolidation-org/Robo && git pull && git add -A && git commit -m 'changed' && git push && git tag 0.6.0 && git push origin 0.6.0");
+ }
+
+ public function testGitStackCommandsWithTagMessage()
+ {
+ verify(
+ (new \Robo\Task\Vcs\GitStack())
+ ->cloneRepo('http://github.com/consolidation-org/Robo')
+ ->pull()
+ ->add('-A')
+ ->commit('changed')
+ ->push()
+ ->tag('0.6.0', 'message')
+ ->push('origin', '0.6.0')
+ ->getCommand()
+ )->equals("git clone http://github.com/consolidation-org/Robo && git pull && git add -A && git commit -m 'changed' && git push && git tag -m 'message' 0.6.0 && git push origin 0.6.0");
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/GulpTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/GulpTest.php
new file mode 100644
index 00000000..e5b36c98
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/GulpTest.php
@@ -0,0 +1,85 @@
+baseGulp = test::double('Robo\Task\Gulp\Base', [
+ 'output' => new \Symfony\Component\Console\Output\NullOutput()
+ ]);
+ }
+
+ protected function adjustQuotes($expected)
+ {
+ $isWindows = defined('PHP_WINDOWS_VERSION_MAJOR');
+
+ if (!$isWindows) {
+ return strtr($expected, '"', "'");
+ }
+ return $expected;
+ }
+
+ // tests
+ public function testGulpGetCommand()
+ {
+ verify(
+ (new \Robo\Task\Gulp\Run('default','gulp'))->getCommand()
+ )->equals($this->adjustQuotes('gulp "default"'));
+
+ verify(
+ (new \Robo\Task\Gulp\Run('another','gulp'))->getCommand()
+ )->equals($this->adjustQuotes('gulp "another"'));
+
+ verify(
+ (new \Robo\Task\Gulp\Run('default','gulp'))->silent()->getCommand()
+ )->equals($this->adjustQuotes('gulp "default" --silent'));
+
+ verify(
+ (new \Robo\Task\Gulp\Run('default','gulp'))->noColor()->getCommand()
+ )->equals($this->adjustQuotes('gulp "default" --no-color'));
+
+ verify(
+ (new \Robo\Task\Gulp\Run('default','gulp'))->color()->getCommand()
+ )->equals($this->adjustQuotes('gulp "default" --color'));
+
+ verify(
+ (new \Robo\Task\Gulp\Run('default','gulp'))->simple()->getCommand()
+ )->equals($this->adjustQuotes('gulp "default" --tasks-simple'));
+ }
+
+ public function testGulpRun()
+ {
+ $gulp = test::double('Robo\Task\Gulp\Run', ['executeCommand' => null, 'getConfig' => new \Robo\Config(), 'logger' => new \Psr\Log\NullLogger()]);
+
+ $task = (new \Robo\Task\Gulp\Run('default','gulp'))->simple();
+ verify($task->getCommand())->equals($this->adjustQuotes('gulp "default" --tasks-simple'));
+ $task->run();
+ $gulp->verifyInvoked('executeCommand', [$this->adjustQuotes('gulp "default" --tasks-simple')]);
+ }
+
+ public function testGulpUnusualChars()
+ {
+ $isWindows = defined('PHP_WINDOWS_VERSION_MAJOR');
+
+ if ($isWindows) {
+
+ verify(
+ (new \Robo\Task\Gulp\Run('anotherWith weired!("\') Chars','gulp'))->getCommand()
+ )->equals('gulp "anotherWith weired!(\"\') Chars"');
+
+ } else {
+
+ verify(
+ (new \Robo\Task\Gulp\Run('anotherWith weired!("\') Chars','gulp'))->getCommand()
+ )->equals("gulp 'anotherWith weired!(\"'\\'') Chars'");
+
+ }
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/HgTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/HgTest.php
new file mode 100644
index 00000000..7b36ece3
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/HgTest.php
@@ -0,0 +1,86 @@
+hg = Test::double('Robo\Task\Vcs\HgStack', [
+ 'executeCommand' => new \AspectMock\Proxy\Anything(),
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ $this->hgStack = (new \Robo\Task\Vcs\HgStack('hg'));
+ }
+
+ // tests
+ public function testHgStackRun()
+ {
+ $this->hgStack->stopOnFail()->add()->pull()->run();
+ $this->hg->verifyInvoked('executeCommand', ['hg add']);
+ $this->hg->verifyInvoked('executeCommand', ['hg pull']);
+
+ (new \Robo\Task\Vcs\HgStack('hg'))->add()->pull()->run();
+ $this->hg->verifyInvoked('executeCommand', ['hg add && hg pull']);
+ }
+
+ public function testHgStackPull()
+ {
+ verify(
+ $this->hgStack
+ ->pull()
+ ->getCommand()
+ )->equals('hg pull');
+ }
+
+ public function testHgStackAddFiles()
+ {
+ verify(
+ $this->hgStack
+ ->add('*.php', '*.css')
+ ->getCommand()
+ )->equals('hg add -I *.php -X *.css');
+ }
+
+ public function testHgStackCommands()
+ {
+ verify(
+ $this->hgStack
+ ->cloneRepo('https://bitbucket.org/durin42/hgsubversion')
+ ->pull()
+ ->add()
+ ->commit('changed')
+ ->push()
+ ->tag('0.6.0')
+ ->push('0.6.0')
+ ->getCommand()
+ )->equals("hg clone https://bitbucket.org/durin42/hgsubversion && hg pull && hg add && hg commit -m 'changed' && hg push && hg tag 0.6.0 && hg push -b '0.6.0'");
+ }
+
+ public function testHgStackCommandsWithTagMessage()
+ {
+ verify(
+ $this->hgStack
+ ->cloneRepo('https://bitbucket.org/durin42/hgsubversion')
+ ->pull()
+ ->add()
+ ->commit('changed')
+ ->push()
+ ->tag('0.6.0', 'message')
+ ->push('0.6.0')
+ ->getCommand()
+ )->equals("hg clone https://bitbucket.org/durin42/hgsubversion && hg pull && hg add && hg commit -m 'changed' && hg push && hg tag -m 'message' 0.6.0 && hg push -b '0.6.0'");
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/NpmTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/NpmTest.php
new file mode 100644
index 00000000..ce3ba6f4
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/NpmTest.php
@@ -0,0 +1,52 @@
+baseNpm = test::double('Robo\Task\Npm\Base', [
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+
+ // tests
+ public function testNpmInstall()
+ {
+ $npm = test::double('Robo\Task\Npm\Install', ['executeCommand' => null, 'logger' => new \Psr\Log\NullLogger()]);
+ (new \Robo\Task\Npm\Install('npm'))->run();
+ $npm->verifyInvoked('executeCommand', ['npm install']);
+ }
+
+ public function testNpmUpdate()
+ {
+ $npm = test::double('Robo\Task\Npm\Update', ['executeCommand' => null, 'logger' => new \Psr\Log\NullLogger()]);
+ (new \Robo\Task\Npm\Update('npm'))->run();
+ $npm->verifyInvoked('executeCommand', ['npm update']);
+ }
+
+ public function testNpmInstallCommand()
+ {
+ verify(
+ (new \Robo\Task\Npm\Install('npm'))->getCommand()
+ )->equals('npm install');
+
+ verify(
+ (new \Robo\Task\Npm\Install('npm'))->getCommand()
+ )->equals('npm install');
+
+ verify(
+ (new \Robo\Task\Npm\Install('npm'))
+ ->noDev()
+ ->getCommand()
+ )->equals('npm install --production');
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/PHPServerTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/PHPServerTest.php
new file mode 100644
index 00000000..30744958
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/PHPServerTest.php
@@ -0,0 +1,59 @@
+process = test::double('Symfony\Component\Process\Process', [
+ 'run' => false,
+ 'start' => false,
+ 'getOutput' => 'Hello world',
+ 'getExitCode' => 0,
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ test::double('Robo\Task\Development\PhpServer', ['output' => new \Symfony\Component\Console\Output\NullOutput()]);
+ }
+
+ public function testServerBackgroundRun()
+ {
+ $task = new \Robo\Task\Development\PhpServer('8000');
+ $task->setLogger(new \Psr\Log\NullLogger());
+
+ $task->background()->run();
+ $this->process->verifyInvoked('start');
+ }
+
+ public function testServerRun()
+ {
+ $task = new \Robo\Task\Development\PhpServer('8000');
+ $task->setLogger(new \Psr\Log\NullLogger());
+
+ $task->run();
+ $this->process->verifyInvoked('run');
+ }
+
+ public function testServerCommand()
+ {
+ if (strtolower(PHP_OS) === 'linux') {
+ $expectedCommand = 'exec php -S 127.0.0.1:8000 -t web';
+ } else {
+ $expectedCommand = 'php -S 127.0.0.1:8000 -t web';
+ }
+
+ verify(
+ (new \Robo\Task\Development\PhpServer('8000'))
+ ->host('127.0.0.1')
+ ->dir('web')
+ ->getCommand()
+ )->equals($expectedCommand);
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/PHPUnitTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/PHPUnitTest.php
new file mode 100644
index 00000000..3f7b235c
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/PHPUnitTest.php
@@ -0,0 +1,41 @@
+phpunit = test::double('Robo\Task\Testing\PHPUnit', [
+ 'executeCommand' => null,
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+
+ // tests
+ public function testPhpUnitRun()
+ {
+ (new \Robo\Task\Testing\PHPUnit())->run();
+ $this->phpunit->verifyInvoked('executeCommand');
+ }
+
+ public function testPHPUnitCommand()
+ {
+ $task = (new \Robo\Task\Testing\PHPUnit('phpunit'))
+ ->bootstrap('bootstrap.php')
+ ->filter('Model')
+ ->group('important')
+ ->xml('result.xml')
+ ->debug();
+ verify($task->getCommand())->equals('phpunit --bootstrap bootstrap.php --filter Model --group important --log-junit result.xml --debug');
+ $task->run();
+ $this->phpunit->verifyInvoked('executeCommand', ['phpunit --bootstrap bootstrap.php --filter Model --group important --log-junit result.xml --debug']);
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/ParallelExecTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/ParallelExecTest.php
new file mode 100644
index 00000000..037f7ee3
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/ParallelExecTest.php
@@ -0,0 +1,43 @@
+process = test::double('Symfony\Component\Process\Process', [
+ 'run' => false,
+ 'start' => false,
+ 'isRunning' => false,
+ 'getOutput' => 'Hello world',
+ 'getExitCode' => 0,
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+
+ public function testParallelExec()
+ {
+ $task = new \Robo\Task\Base\ParallelExec();
+ $task->setLogger($this->guy->logger());
+
+ $result = $task
+ ->process('ls 1')
+ ->process('ls 2')
+ ->process('ls 3')
+ ->run();
+ $this->process->verifyInvokedMultipleTimes('start', 3);
+ verify($result->getExitCode())->equals(0);
+ $this->guy->seeInOutput("3 processes finished");
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/PhpspecTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/PhpspecTest.php
new file mode 100644
index 00000000..71336b33
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/PhpspecTest.php
@@ -0,0 +1,42 @@
+phpspec = test::double('Robo\Task\Testing\Phpspec', [
+ 'executeCommand' => null,
+ 'output' => new \Symfony\Component\Console\Output\NullOutput(),
+ 'logger' => new \Psr\Log\NullLogger(),
+ ]);
+ }
+
+ // tests
+ public function testPhpSpecRun()
+ {
+ (new \Robo\Task\Testing\Phpspec('phpspec'))->run();
+ $this->phpspec->verifyInvoked('executeCommand', ['phpspec run']);
+ }
+
+ public function testPHPSpecCommand()
+ {
+ $task = (new \Robo\Task\Testing\Phpspec('phpspec'))
+ ->stopOnFail()
+ ->noCodeGeneration()
+ ->quiet()
+ ->verbose('vv')
+ ->noAnsi()
+ ->noInteraction()
+ ->format('pretty');
+ verify($task->getCommand())->equals('phpspec run --stop-on-failure --no-code-generation --quiet -vv --no-ansi --no-interaction --format pretty');
+ $task->run();
+ $this->phpspec->verifyInvoked('executeCommand', ['phpspec run --stop-on-failure --no-code-generation --quiet -vv --no-ansi --no-interaction --format pretty']);
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/RsyncTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/RsyncTest.php
new file mode 100644
index 00000000..957d2188
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/RsyncTest.php
@@ -0,0 +1,59 @@
+fromPath('src/')
+ ->toHost('localhost')
+ ->toUser('dev')
+ ->toPath('/var/www/html/app/')
+ ->recursive()
+ ->excludeVcs()
+ ->checksum()
+ ->wholeFile()
+ ->verbose()
+ ->progress()
+ ->humanReadable()
+ ->stats()
+ ->getCommand()
+ )->equals(
+ 'rsync --recursive --exclude .git --exclude .svn --exclude .hg --checksum --whole-file --verbose --progress --human-readable --stats src/ \'dev@localhost:/var/www/html/app/\''
+ );
+
+ // From the folder 'foo bar' (with space) in 'src' directory
+ verify(
+ (new \Robo\Task\Remote\Rsync())
+ ->fromPath('src/foo bar/baz')
+ ->toHost('localhost')
+ ->toUser('dev')
+ ->toPath('/var/path/with/a space')
+ ->getCommand()
+ )->equals(
+ 'rsync \'src/foo bar/baz\' \'dev@localhost:/var/path/with/a space\''
+ );
+
+ // Copy two folders, 'src/foo' and 'src/bar'
+ verify(
+ (new \Robo\Task\Remote\Rsync())
+ ->fromPath(['src/foo', 'src/bar'])
+ ->toHost('localhost')
+ ->toUser('dev')
+ ->toPath('/var/path/with/a space')
+ ->getCommand()
+ )->equals(
+ 'rsync src/foo src/bar \'dev@localhost:/var/path/with/a space\''
+ );
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/SemVerTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/SemVerTest.php
new file mode 100644
index 00000000..f68535bb
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/SemVerTest.php
@@ -0,0 +1,72 @@
+ null]);
+ $res = (new \Robo\Task\Development\SemVer())
+ ->increment('major')
+ ->prerelease('RC')
+ ->increment('patch')
+ ->run();
+ verify($res->getMessage())->equals('v1.0.1-RC.1');
+ $semver->verifyInvoked('dump');
+ }
+
+ public function testSemverIncrementMinorAfterIncrementedPatch()
+ {
+ $semver = test::double('Robo\Task\Development\SemVer', ['dump' => null]);
+ $res = (new \Robo\Task\Development\SemVer())
+ ->increment('patch')
+ ->run();
+ verify($res->getMessage())->equals('v0.0.1');
+ $res = (new \Robo\Task\Development\SemVer())
+ ->increment('minor')
+ ->run();
+ verify($res->getMessage())->equals('v0.1.0');
+ $semver->verifyInvoked('dump');
+ }
+
+ public function testSemverIncrementMajorAfterIncrementedMinorAndPatch()
+ {
+ $semver = test::double('Robo\Task\Development\SemVer', ['dump' => null]);
+ $res = (new \Robo\Task\Development\SemVer())
+ ->increment('patch')
+ ->run();
+ verify($res->getMessage())->equals('v0.0.1');
+ $res = (new \Robo\Task\Development\SemVer())
+ ->increment('minor')
+ ->run();
+ verify($res->getMessage())->equals('v0.1.0');
+ $res = (new \Robo\Task\Development\SemVer())
+ ->increment('major')
+ ->run();
+ verify($res->getMessage())->equals('v1.0.0');
+ $semver->verifyInvoked('dump');
+ }
+
+ public function testThrowsExceptionWhenIncrementWithWrongParameter()
+ {
+ \PHPUnit_Framework_TestCase::setExpectedExceptionRegExp(
+ 'Robo\Exception\TaskException',
+ '/Bad argument, only one of the following is allowed: major, minor, patch/'
+ );
+ $res = (new \Robo\Task\Development\SemVer())
+ ->increment('wrongParameter');
+ }
+
+ public function testThrowsExceptionWhenSemverFileNotWriteable()
+ {
+ \PHPUnit_Framework_TestCase::setExpectedExceptionRegExp(
+ 'Robo\Exception\TaskException',
+ '/Failed to write semver file./'
+ );
+ (new \Robo\Task\Development\SemVer('/.semver'))
+ ->increment('major')
+ ->run();
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/SshTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/SshTest.php
new file mode 100644
index 00000000..ec228998
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/SshTest.php
@@ -0,0 +1,61 @@
+exec('ls -la')
+ ->exec('chmod g+x logs')
+ ->getCommand()
+ )->equals("ssh user@remote.example.com 'ls -la && chmod g+x logs'");
+ }
+
+ public function testStopOnFail()
+ {
+ verify(
+ (new \Robo\Task\Remote\Ssh('remote.example.com', 'user'))
+ ->stopOnFail(false)
+ ->exec('one')
+ ->exec('two')
+ ->getCommand()
+ )->equals("ssh user@remote.example.com 'one ; two'");
+ }
+
+ /**
+ * Sets static configuration, then runs task without working dir, with working dir and again without.
+ */
+ public function testWorkingDirectoryStaticConfiguration()
+ {
+ \Robo\Task\Remote\Ssh::configure('remoteDir', '/some-dir');
+ verify(
+ (new \Robo\Task\Remote\Ssh('remote.example.com', 'user'))
+ ->setConfig(Robo::config())
+ ->exec('echo test')
+ ->getCommand()
+ )->equals("ssh user@remote.example.com 'cd \"/some-dir\" && echo test'");
+ verify(
+ (new \Robo\Task\Remote\Ssh('remote.example.com', 'user'))
+ ->remoteDir('/other-dir')
+ ->exec('echo test')
+ ->getCommand()
+ )->equals("ssh user@remote.example.com 'cd \"/other-dir\" && echo test'");
+ verify(
+ (new \Robo\Task\Remote\Ssh('remote.example.com', 'user'))
+ ->setConfig(Robo::config())
+ ->exec('echo test')
+ ->getCommand()
+ )->equals("ssh user@remote.example.com 'cd \"/some-dir\" && echo test'");
+ \Robo\Task\Remote\Ssh::configure('remoteDir', null);
+ verify(
+ (new \Robo\Task\Remote\Ssh('remote.example.com', 'user'))
+ ->exec('echo test')
+ ->getCommand()
+ )->equals("ssh user@remote.example.com 'echo test'");
+ }
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/Task/SvnTest.php b/src/composer/vendor/consolidation/robo/tests/unit/Task/SvnTest.php
new file mode 100644
index 00000000..eeff03b7
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/Task/SvnTest.php
@@ -0,0 +1,49 @@
+svn = test::double('Robo\Task\Vcs\SvnStack', [
+ 'executeCommand' => new \AspectMock\Proxy\Anything(),
+ 'output' => $nullOutput,
+ 'logger' => new \Psr\Log\NullLogger(),
+ 'logger' => Robo::logger(),
+ 'getConfig' => Robo::config(),
+ 'progressIndicator' => $progressIndicator,
+ ]);
+ }
+
+ // tests
+ public function testSvnStackRun()
+ {
+ $this->svn->construct()->update()->add()->run();
+ $this->svn->verifyInvoked('executeCommand', ['svn update && svn add']);
+ }
+
+ public function testSvnStackCommands()
+ {
+ verify(
+ (new \Robo\Task\Vcs\SvnStack('guest', 'foo'))
+ ->checkout('svn://server/trunk')
+ ->update()
+ ->add()
+ ->commit('changed')
+ ->getCommand()
+ )->equals("svn --username guest --password foo checkout svn://server/trunk && svn --username guest --password foo update && svn --username guest --password foo add && svn --username guest --password foo commit -m 'changed'");
+ }
+
+}
diff --git a/src/composer/vendor/consolidation/robo/tests/unit/_bootstrap.php b/src/composer/vendor/consolidation/robo/tests/unit/_bootstrap.php
new file mode 100644
index 00000000..8a885558
--- /dev/null
+++ b/src/composer/vendor/consolidation/robo/tests/unit/_bootstrap.php
@@ -0,0 +1,2 @@
+setParentContainer($this);
+ }
+ }
+ ...
+ }
+}
+
+```
+
+**Cons:**
+
+Cons have been extensively discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777).
+Basically, forcing a setter into an interface is a bad idea. Setters are similar to constructor arguments,
+and it's a bad idea to standardize a constructor: how the delegate container is configured into a container is an implementation detail. This outweights the benefits of the interface.
+
+### 4.4 Alternative: no exception case for delegate lookups
+
+Originally, the proposed wording for delegate lookup calls was:
+
+> Important! The lookup MUST be performed on the delegate container **only**, not on the container itself.
+
+This was later replaced by:
+
+> Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
+>
+> It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+> into the same container (or another container) instead of the delegate container.
+
+Exception cases have been allowed to avoid breaking dependencies with some services that must be provided
+by the container (on @njasm proposal). This was proposed here: https://github.com/container-interop/container-interop/pull/20#issuecomment-56597235
+
+### 4.5 Alternative: having one of the containers act as the composite container
+
+In real-life scenarios, we usually have a big framework (Symfony 2, Zend Framework 2, etc...) and we want to
+add another DI container to this container. Most of the time, the "big" framework will be responsible for
+creating the controller's instances, using it's own DI container. Until *container-interop* is fully adopted,
+the "big" framework will not be aware of the existence of a composite container that it should use instead
+of its own container.
+
+For this real-life use cases, @mnapoli and @moufmouf proposed to extend the "big" framework's DI container
+to make it act as a composite container.
+
+This has been discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-40367194)
+and [here](http://mouf-php.com/container-interop-whats-next#solution4).
+
+This was implemented in Symfony 2 using:
+
+- [interop.symfony.di](https://github.com/thecodingmachine/interop.symfony.di/tree/v0.1.0)
+- [framework interop](https://github.com/mnapoli/framework-interop/)
+
+This was implemented in Silex using:
+
+- [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di)
+
+Having a container act as the composite container is not part of the delegate lookup standard because it is
+simply a temporary design pattern used to make existing frameworks that do not support yet ContainerInterop
+play nice with other DI containers.
+
+
+5. Implementations
+------------------
+
+The following projects already implement the delegate lookup feature:
+
+- [Mouf](http://mouf-php.com), through the [`setDelegateLookupContainer` method](https://github.com/thecodingmachine/mouf/blob/2.0/src/Mouf/MoufManager.php#L2120)
+- [PHP-DI](http://php-di.org/), through the [`$wrapperContainer` parameter of the constructor](https://github.com/mnapoli/PHP-DI/blob/master/src/DI/Container.php#L72)
+- [pimple-interop](https://github.com/moufmouf/pimple-interop), through the [`$container` parameter of the constructor](https://github.com/moufmouf/pimple-interop/blob/master/src/Interop/Container/Pimple/PimpleInterop.php#L62)
+
+6. People
+---------
+
+Are listed here all people that contributed in the discussions, by alphabetical order:
+
+- [Alexandru Pătrănescu](https://github.com/drealecs)
+- [Ben Peachey](https://github.com/potherca)
+- [David Négrier](https://github.com/moufmouf)
+- [Jeremy Lindblom](https://github.com/jeremeamia)
+- [Marco Pivetta](https://github.com/Ocramius)
+- [Matthieu Napoli](https://github.com/mnapoli)
+- [Nelson J Morais](https://github.com/njasm)
+- [Phil Sturgeon](https://github.com/philsturgeon)
+- [Stephan Hochdörfer](https://github.com/shochdoerfer)
+
+7. Relevant Links
+-----------------
+
+_**Note:** Order descending chronologically._
+
+- [Pull request on the delegate lookup feature](https://github.com/container-interop/container-interop/pull/20)
+- [Pull request on the interface idea](https://github.com/container-interop/container-interop/pull/8)
+- [Original article exposing the delegate lookup idea along many others](http://mouf-php.com/container-interop-whats-next)
+
diff --git a/src/composer/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/src/composer/vendor/container-interop/container-interop/docs/Delegate-lookup.md
new file mode 100644
index 00000000..04eb3aea
--- /dev/null
+++ b/src/composer/vendor/container-interop/container-interop/docs/Delegate-lookup.md
@@ -0,0 +1,60 @@
+Delegate lookup feature
+=======================
+
+This document describes a standard for dependency injection containers.
+
+The goal set by the *delegate lookup* feature is to allow several containers to share entries.
+Containers implementing this feature can perform dependency lookups in other containers.
+
+Containers implementing this feature will offer a greater lever of interoperability
+with other containers. Implementation of this feature is therefore RECOMMENDED.
+
+The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
+"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
+interpreted as described in [RFC 2119][].
+
+The word `implementor` in this document is to be interpreted as someone
+implementing the delegate lookup feature in a dependency injection-related library or framework.
+Users of dependency injections containers (DIC) are refered to as `user`.
+
+[RFC 2119]: http://tools.ietf.org/html/rfc2119
+
+1. Vocabulary
+-------------
+
+In a dependency injection container, the container is used to fetch entries.
+Entries can have dependencies on other entries. Usually, these other entries are fetched by the container.
+
+The *delegate lookup* feature is the ability for a container to fetch dependencies in
+another container. In the rest of the document, the word "container" will reference the container
+implemented by the implementor. The word "delegate container" will reference the container we are
+fetching the dependencies from.
+
+2. Specification
+----------------
+
+A container implementing the *delegate lookup* feature:
+
+- MUST implement the [`ContainerInterface`](ContainerInterface.md)
+- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
+ or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md).
+
+When a container is configured to use a delegate container for dependencies:
+
+- Calls to the `get` method should only return an entry if the entry is part of the container.
+ If the entry is not part of the container, an exception should be thrown
+ (as requested by the [`ContainerInterface`](ContainerInterface.md)).
+- Calls to the `has` method should only return `true` if the entry is part of the container.
+ If the entry is not part of the container, `false` should be returned.
+- If the fetched entry has dependencies, **instead** of performing
+ the dependency lookup in the container, the lookup is performed on the *delegate container*.
+
+Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself.
+
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+into the same container (or another container) instead of the delegate container.
+
+3. Package / Interface
+----------------------
+
+This feature is not tied to any code, interface or package.
diff --git a/src/composer/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/src/composer/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
new file mode 100644
index 00000000..9c672e16
Binary files /dev/null and b/src/composer/vendor/container-interop/container-interop/docs/images/interoperating_containers.png differ
diff --git a/src/composer/vendor/container-interop/container-interop/docs/images/priority.png b/src/composer/vendor/container-interop/container-interop/docs/images/priority.png
new file mode 100644
index 00000000..5760dc71
Binary files /dev/null and b/src/composer/vendor/container-interop/container-interop/docs/images/priority.png differ
diff --git a/src/composer/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png b/src/composer/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
new file mode 100644
index 00000000..24ca03c7
Binary files /dev/null and b/src/composer/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png differ
diff --git a/src/composer/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php b/src/composer/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
new file mode 100644
index 00000000..dee5ffa7
--- /dev/null
+++ b/src/composer/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
@@ -0,0 +1,37 @@
+ composer-installer.php
+ hhvm composer-installer.php
+ hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 composer.phar update --prefer-source
+elif [ "$TRAVIS_PHP_VERSION" = '5.3.3' ] ; then
+ composer self-update
+ composer update --prefer-source --no-dev
+ composer dump-autoload
+else
+ composer self-update
+ composer update --prefer-source
+fi
diff --git a/src/composer/vendor/doctrine/instantiator/.travis.yml b/src/composer/vendor/doctrine/instantiator/.travis.yml
new file mode 100644
index 00000000..7f1ec5f9
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/.travis.yml
@@ -0,0 +1,22 @@
+language: php
+
+php:
+ - 5.3.3
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - hhvm
+
+before_script:
+ - ./.travis.install.sh
+ - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then PHPUNIT_FLAGS="--coverage-clover coverage.clover"; else PHPUNIT_FLAGS=""; fi
+
+script:
+ - if [ $TRAVIS_PHP_VERSION = '5.3.3' ]; then phpunit; fi
+ - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpunit $PHPUNIT_FLAGS; fi
+ - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpcs --standard=PSR2 ./src/ ./tests/; fi
+ - if [[ $TRAVIS_PHP_VERSION != '5.3.3' && $TRAVIS_PHP_VERSION != '5.4.29' && $TRAVIS_PHP_VERSION != '5.5.13' ]]; then php -n ./vendor/bin/athletic -p ./tests/DoctrineTest/InstantiatorPerformance/ -f GroupedFormatter; fi
+
+after_script:
+ - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
diff --git a/src/composer/vendor/doctrine/instantiator/CONTRIBUTING.md b/src/composer/vendor/doctrine/instantiator/CONTRIBUTING.md
new file mode 100644
index 00000000..75b84b2a
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/CONTRIBUTING.md
@@ -0,0 +1,35 @@
+# Contributing
+
+ * Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
+ * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php)
+ * Any contribution must provide tests for additional introduced conditions
+ * Any un-confirmed issue needs a failing test case before being accepted
+ * Pull requests must be sent from a new hotfix/feature branch, not from `master`.
+
+## Installation
+
+To install the project and run the tests, you need to clone it first:
+
+```sh
+$ git clone git://github.com/doctrine/instantiator.git
+```
+
+You will then need to run a composer installation:
+
+```sh
+$ cd Instantiator
+$ curl -s https://getcomposer.org/installer | php
+$ php composer.phar update
+```
+
+## Testing
+
+The PHPUnit version to be used is the one installed as a dev- dependency via composer:
+
+```sh
+$ ./vendor/bin/phpunit
+```
+
+Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement
+won't be merged.
+
diff --git a/src/composer/vendor/doctrine/instantiator/LICENSE b/src/composer/vendor/doctrine/instantiator/LICENSE
new file mode 100644
index 00000000..4d983d1a
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014 Doctrine Project
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/composer/vendor/doctrine/instantiator/README.md b/src/composer/vendor/doctrine/instantiator/README.md
new file mode 100644
index 00000000..393ec7ca
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/README.md
@@ -0,0 +1,40 @@
+# Instantiator
+
+This library provides a way of avoiding usage of constructors when instantiating PHP classes.
+
+[](https://travis-ci.org/doctrine/instantiator)
+[](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master)
+[](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master)
+[](https://www.versioneye.com/package/php--doctrine--instantiator)
+[](http://hhvm.h4cc.de/package/doctrine/instantiator)
+
+[](https://packagist.org/packages/doctrine/instantiator)
+[](https://packagist.org/packages/doctrine/instantiator)
+
+## Installation
+
+The suggested installation method is via [composer](https://getcomposer.org/):
+
+```sh
+php composer.phar require "doctrine/instantiator:~1.0.3"
+```
+
+## Usage
+
+The instantiator is able to create new instances of any class without using the constructor or any API of the class
+itself:
+
+```php
+$instantiator = new \Doctrine\Instantiator\Instantiator();
+
+$instance = $instantiator->instantiate('My\\ClassName\\Here');
+```
+
+## Contributing
+
+Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out!
+
+## Credits
+
+This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which
+has been donated to the doctrine organization, and which is now deprecated in favour of this package.
diff --git a/src/composer/vendor/doctrine/instantiator/composer.json b/src/composer/vendor/doctrine/instantiator/composer.json
new file mode 100644
index 00000000..4823890b
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/composer.json
@@ -0,0 +1,45 @@
+{
+ "name": "doctrine/instantiator",
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "type": "library",
+ "license": "MIT",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "instantiate",
+ "constructor"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "ext-phar": "*",
+ "ext-pdo": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0",
+ "athletic/athletic": "~0.1.8"
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "autoload-dev": {
+ "psr-0": {
+ "DoctrineTest\\InstantiatorPerformance\\": "tests",
+ "DoctrineTest\\InstantiatorTest\\": "tests",
+ "DoctrineTest\\InstantiatorTestAsset\\": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/phpmd.xml.dist b/src/composer/vendor/doctrine/instantiator/phpmd.xml.dist
new file mode 100644
index 00000000..82541056
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/phpmd.xml.dist
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/composer/vendor/doctrine/instantiator/phpunit.xml.dist b/src/composer/vendor/doctrine/instantiator/phpunit.xml.dist
new file mode 100644
index 00000000..0a8d5709
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/phpunit.xml.dist
@@ -0,0 +1,22 @@
+
+
+
+ ./tests/DoctrineTest/InstantiatorTest
+
+
+
+ ./src
+
+
+
diff --git a/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
new file mode 100644
index 00000000..3065375a
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+/**
+ * Base exception marker interface for the instantiator component
+ *
+ * @author Marco Pivetta
+ */
+interface ExceptionInterface
+{
+}
diff --git a/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
new file mode 100644
index 00000000..ea8d28c5
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
@@ -0,0 +1,62 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+use InvalidArgumentException as BaseInvalidArgumentException;
+use ReflectionClass;
+
+/**
+ * Exception for invalid arguments provided to the instantiator
+ *
+ * @author Marco Pivetta
+ */
+class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
+{
+ /**
+ * @param string $className
+ *
+ * @return self
+ */
+ public static function fromNonExistingClass($className)
+ {
+ if (interface_exists($className)) {
+ return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className));
+ }
+
+ if (PHP_VERSION_ID >= 50400 && trait_exists($className)) {
+ return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className));
+ }
+
+ return new self(sprintf('The provided class "%s" does not exist', $className));
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return self
+ */
+ public static function fromAbstractClass(ReflectionClass $reflectionClass)
+ {
+ return new self(sprintf(
+ 'The provided class "%s" is abstract, and can not be instantiated',
+ $reflectionClass->getName()
+ ));
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
new file mode 100644
index 00000000..1681e56e
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
@@ -0,0 +1,79 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+use Exception;
+use ReflectionClass;
+use UnexpectedValueException as BaseUnexpectedValueException;
+
+/**
+ * Exception for given parameters causing invalid/unexpected state on instantiation
+ *
+ * @author Marco Pivetta
+ */
+class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
+{
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param Exception $exception
+ *
+ * @return self
+ */
+ public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception)
+ {
+ return new self(
+ sprintf(
+ 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
+ $reflectionClass->getName()
+ ),
+ 0,
+ $exception
+ );
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $errorString
+ * @param int $errorCode
+ * @param string $errorFile
+ * @param int $errorLine
+ *
+ * @return UnexpectedValueException
+ */
+ public static function fromUncleanUnSerialization(
+ ReflectionClass $reflectionClass,
+ $errorString,
+ $errorCode,
+ $errorFile,
+ $errorLine
+ ) {
+ return new self(
+ sprintf(
+ 'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
+ . 'in file "%s" at line "%d"',
+ $reflectionClass->getName(),
+ $errorFile,
+ $errorLine
+ ),
+ 0,
+ new Exception($errorString, $errorCode)
+ );
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
new file mode 100644
index 00000000..6d5b3b65
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
@@ -0,0 +1,273 @@
+.
+ */
+
+namespace Doctrine\Instantiator;
+
+use Closure;
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Exception;
+use ReflectionClass;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta
+ */
+final class Instantiator implements InstantiatorInterface
+{
+ /**
+ * Markers used internally by PHP to define whether {@see \unserialize} should invoke
+ * the method {@see \Serializable::unserialize()} when dealing with classes implementing
+ * the {@see \Serializable} interface.
+ */
+ const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C';
+ const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
+
+ /**
+ * @var \Closure[] of {@see \Closure} instances used to instantiate specific classes
+ */
+ private static $cachedInstantiators = array();
+
+ /**
+ * @var object[] of objects that can directly be cloned
+ */
+ private static $cachedCloneables = array();
+
+ /**
+ * {@inheritDoc}
+ */
+ public function instantiate($className)
+ {
+ if (isset(self::$cachedCloneables[$className])) {
+ return clone self::$cachedCloneables[$className];
+ }
+
+ if (isset(self::$cachedInstantiators[$className])) {
+ $factory = self::$cachedInstantiators[$className];
+
+ return $factory();
+ }
+
+ return $this->buildAndCacheFromFactory($className);
+ }
+
+ /**
+ * Builds the requested object and caches it in static properties for performance
+ *
+ * @param string $className
+ *
+ * @return object
+ */
+ private function buildAndCacheFromFactory($className)
+ {
+ $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className);
+ $instance = $factory();
+
+ if ($this->isSafeToClone(new ReflectionClass($instance))) {
+ self::$cachedCloneables[$className] = clone $instance;
+ }
+
+ return $instance;
+ }
+
+ /**
+ * Builds a {@see \Closure} capable of instantiating the given $className without
+ * invoking its constructor.
+ *
+ * @param string $className
+ *
+ * @return Closure
+ */
+ private function buildFactory($className)
+ {
+ $reflectionClass = $this->getReflectionClass($className);
+
+ if ($this->isInstantiableViaReflection($reflectionClass)) {
+ return function () use ($reflectionClass) {
+ return $reflectionClass->newInstanceWithoutConstructor();
+ };
+ }
+
+ $serializedString = sprintf(
+ '%s:%d:"%s":0:{}',
+ $this->getSerializationFormat($reflectionClass),
+ strlen($className),
+ $className
+ );
+
+ $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString);
+
+ return function () use ($serializedString) {
+ return unserialize($serializedString);
+ };
+ }
+
+ /**
+ * @param string $className
+ *
+ * @return ReflectionClass
+ *
+ * @throws InvalidArgumentException
+ */
+ private function getReflectionClass($className)
+ {
+ if (! class_exists($className)) {
+ throw InvalidArgumentException::fromNonExistingClass($className);
+ }
+
+ $reflection = new ReflectionClass($className);
+
+ if ($reflection->isAbstract()) {
+ throw InvalidArgumentException::fromAbstractClass($reflection);
+ }
+
+ return $reflection;
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $serializedString
+ *
+ * @throws UnexpectedValueException
+ *
+ * @return void
+ */
+ private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, $serializedString)
+ {
+ set_error_handler(function ($code, $message, $file, $line) use ($reflectionClass, & $error) {
+ $error = UnexpectedValueException::fromUncleanUnSerialization(
+ $reflectionClass,
+ $message,
+ $code,
+ $file,
+ $line
+ );
+ });
+
+ $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
+
+ restore_error_handler();
+
+ if ($error) {
+ throw $error;
+ }
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $serializedString
+ *
+ * @throws UnexpectedValueException
+ *
+ * @return void
+ */
+ private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, $serializedString)
+ {
+ try {
+ unserialize($serializedString);
+ } catch (Exception $exception) {
+ restore_error_handler();
+
+ throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
+ }
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return bool
+ */
+ private function isInstantiableViaReflection(ReflectionClass $reflectionClass)
+ {
+ if (\PHP_VERSION_ID >= 50600) {
+ return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
+ }
+
+ return \PHP_VERSION_ID >= 50400 && ! $this->hasInternalAncestors($reflectionClass);
+ }
+
+ /**
+ * Verifies whether the given class is to be considered internal
+ *
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return bool
+ */
+ private function hasInternalAncestors(ReflectionClass $reflectionClass)
+ {
+ do {
+ if ($reflectionClass->isInternal()) {
+ return true;
+ }
+ } while ($reflectionClass = $reflectionClass->getParentClass());
+
+ return false;
+ }
+
+ /**
+ * Verifies if the given PHP version implements the `Serializable` interface serialization
+ * with an incompatible serialization format. If that's the case, use serialization marker
+ * "C" instead of "O".
+ *
+ * @link http://news.php.net/php.internals/74654
+ *
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return string the serialization format marker, either self::SERIALIZATION_FORMAT_USE_UNSERIALIZER
+ * or self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER
+ */
+ private function getSerializationFormat(ReflectionClass $reflectionClass)
+ {
+ if ($this->isPhpVersionWithBrokenSerializationFormat()
+ && $reflectionClass->implementsInterface('Serializable')
+ ) {
+ return self::SERIALIZATION_FORMAT_USE_UNSERIALIZER;
+ }
+
+ return self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER;
+ }
+
+ /**
+ * Checks whether the current PHP runtime uses an incompatible serialization format
+ *
+ * @return bool
+ */
+ private function isPhpVersionWithBrokenSerializationFormat()
+ {
+ return PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513;
+ }
+
+ /**
+ * Checks if a class is cloneable
+ *
+ * @param ReflectionClass $reflection
+ *
+ * @return bool
+ */
+ private function isSafeToClone(ReflectionClass $reflection)
+ {
+ if (method_exists($reflection, 'isCloneable') && ! $reflection->isCloneable()) {
+ return false;
+ }
+
+ // not cloneable if it implements `__clone`, as we want to avoid calling it
+ return ! $reflection->hasMethod('__clone');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
new file mode 100644
index 00000000..b665bea8
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
@@ -0,0 +1,37 @@
+.
+ */
+
+namespace Doctrine\Instantiator;
+
+/**
+ * Instantiator provides utility methods to build objects without invoking their constructors
+ *
+ * @author Marco Pivetta
+ */
+interface InstantiatorInterface
+{
+ /**
+ * @param string $className
+ *
+ * @return object
+ *
+ * @throws \Doctrine\Instantiator\Exception\ExceptionInterface
+ */
+ public function instantiate($className);
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php
new file mode 100644
index 00000000..3e8fc6ff
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php
@@ -0,0 +1,96 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorPerformance;
+
+use Athletic\AthleticEvent;
+use Doctrine\Instantiator\Instantiator;
+
+/**
+ * Performance tests for {@see \Doctrine\Instantiator\Instantiator}
+ *
+ * @author Marco Pivetta
+ */
+class InstantiatorPerformanceEvent extends AthleticEvent
+{
+ /**
+ * @var \Doctrine\Instantiator\Instantiator
+ */
+ private $instantiator;
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function setUp()
+ {
+ $this->instantiator = new Instantiator();
+
+ $this->instantiator->instantiate(__CLASS__);
+ $this->instantiator->instantiate('ArrayObject');
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset');
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset');
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset');
+ }
+
+ /**
+ * @iterations 20000
+ * @baseline
+ * @group instantiation
+ */
+ public function testInstantiateSelf()
+ {
+ $this->instantiator->instantiate(__CLASS__);
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateInternalClass()
+ {
+ $this->instantiator->instantiate('ArrayObject');
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateSimpleSerializableAssetClass()
+ {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset');
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateSerializableArrayObjectAsset()
+ {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset');
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateUnCloneableAsset()
+ {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php
new file mode 100644
index 00000000..39d9b94d
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php
@@ -0,0 +1,83 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTest\Exception;
+
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \Doctrine\Instantiator\Exception\InvalidArgumentException}
+ *
+ * @author Marco Pivetta
+ *
+ * @covers \Doctrine\Instantiator\Exception\InvalidArgumentException
+ */
+class InvalidArgumentExceptionTest extends PHPUnit_Framework_TestCase
+{
+ public function testFromNonExistingTypeWithNonExistingClass()
+ {
+ $className = __CLASS__ . uniqid();
+ $exception = InvalidArgumentException::fromNonExistingClass($className);
+
+ $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\InvalidArgumentException', $exception);
+ $this->assertSame('The provided class "' . $className . '" does not exist', $exception->getMessage());
+ }
+
+ public function testFromNonExistingTypeWithTrait()
+ {
+ if (PHP_VERSION_ID < 50400) {
+ $this->markTestSkipped('Need at least PHP 5.4.0, as this test requires traits support to run');
+ }
+
+ $exception = InvalidArgumentException::fromNonExistingClass(
+ 'DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset'
+ );
+
+ $this->assertSame(
+ 'The provided type "DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset" is a trait, '
+ . 'and can not be instantiated',
+ $exception->getMessage()
+ );
+ }
+
+ public function testFromNonExistingTypeWithInterface()
+ {
+ $exception = InvalidArgumentException::fromNonExistingClass('Doctrine\\Instantiator\\InstantiatorInterface');
+
+ $this->assertSame(
+ 'The provided type "Doctrine\\Instantiator\\InstantiatorInterface" is an interface, '
+ . 'and can not be instantiated',
+ $exception->getMessage()
+ );
+ }
+
+ public function testFromAbstractClass()
+ {
+ $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset');
+ $exception = InvalidArgumentException::fromAbstractClass($reflection);
+
+ $this->assertSame(
+ 'The provided class "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" is abstract, '
+ . 'and can not be instantiated',
+ $exception->getMessage()
+ );
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php
new file mode 100644
index 00000000..84154e73
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php
@@ -0,0 +1,69 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTest\Exception;
+
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Exception;
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \Doctrine\Instantiator\Exception\UnexpectedValueException}
+ *
+ * @author Marco Pivetta
+ *
+ * @covers \Doctrine\Instantiator\Exception\UnexpectedValueException
+ */
+class UnexpectedValueExceptionTest extends PHPUnit_Framework_TestCase
+{
+ public function testFromSerializationTriggeredException()
+ {
+ $reflectionClass = new ReflectionClass($this);
+ $previous = new Exception();
+ $exception = UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $previous);
+
+ $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception);
+ $this->assertSame($previous, $exception->getPrevious());
+ $this->assertSame(
+ 'An exception was raised while trying to instantiate an instance of "'
+ . __CLASS__ . '" via un-serialization',
+ $exception->getMessage()
+ );
+ }
+
+ public function testFromUncleanUnSerialization()
+ {
+ $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset');
+ $exception = UnexpectedValueException::fromUncleanUnSerialization($reflection, 'foo', 123, 'bar', 456);
+
+ $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception);
+ $this->assertSame(
+ 'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" '
+ . 'via un-serialization, since an error was triggered in file "bar" at line "456"',
+ $exception->getMessage()
+ );
+
+ $previous = $exception->getPrevious();
+
+ $this->assertInstanceOf('Exception', $previous);
+ $this->assertSame('foo', $previous->getMessage());
+ $this->assertSame(123, $previous->getCode());
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php
new file mode 100644
index 00000000..0a2cb931
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php
@@ -0,0 +1,219 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTest;
+
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Doctrine\Instantiator\Instantiator;
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \Doctrine\Instantiator\Instantiator}
+ *
+ * @author Marco Pivetta
+ *
+ * @covers \Doctrine\Instantiator\Instantiator
+ */
+class InstantiatorTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @var Instantiator
+ */
+ private $instantiator;
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function setUp()
+ {
+ $this->instantiator = new Instantiator();
+ }
+
+ /**
+ * @param string $className
+ *
+ * @dataProvider getInstantiableClasses
+ */
+ public function testCanInstantiate($className)
+ {
+ $this->assertInstanceOf($className, $this->instantiator->instantiate($className));
+ }
+
+ /**
+ * @param string $className
+ *
+ * @dataProvider getInstantiableClasses
+ */
+ public function testInstantiatesSeparateInstances($className)
+ {
+ $instance1 = $this->instantiator->instantiate($className);
+ $instance2 = $this->instantiator->instantiate($className);
+
+ $this->assertEquals($instance1, $instance2);
+ $this->assertNotSame($instance1, $instance2);
+ }
+
+ public function testExceptionOnUnSerializationException()
+ {
+ if (defined('HHVM_VERSION')) {
+ $this->markTestSkipped(
+ 'As of facebook/hhvm#3432, HHVM has no PDORow, and therefore '
+ . ' no internal final classes that cannot be instantiated'
+ );
+ }
+
+ $className = 'DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset';
+
+ if (\PHP_VERSION_ID >= 50600) {
+ $className = 'PDORow';
+ }
+
+ if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) {
+ $className = 'DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset';
+ }
+
+ $this->setExpectedException('Doctrine\\Instantiator\\Exception\\UnexpectedValueException');
+
+ $this->instantiator->instantiate($className);
+ }
+
+ public function testNoticeOnUnSerializationException()
+ {
+ if (\PHP_VERSION_ID >= 50600) {
+ $this->markTestSkipped(
+ 'PHP 5.6 supports `ReflectionClass#newInstanceWithoutConstructor()` for some internal classes'
+ );
+ }
+
+ try {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
+
+ $this->fail('No exception was raised');
+ } catch (UnexpectedValueException $exception) {
+ $wakeUpNoticesReflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
+ $previous = $exception->getPrevious();
+
+ $this->assertInstanceOf('Exception', $previous);
+
+ // in PHP 5.4.29 and PHP 5.5.13, this case is not a notice, but an exception being thrown
+ if (! (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513)) {
+ $this->assertSame(
+ 'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\WakeUpNoticesAsset" '
+ . 'via un-serialization, since an error was triggered in file "'
+ . $wakeUpNoticesReflection->getFileName() . '" at line "36"',
+ $exception->getMessage()
+ );
+
+ $this->assertSame('Something went bananas while un-serializing this instance', $previous->getMessage());
+ $this->assertSame(\E_USER_NOTICE, $previous->getCode());
+ }
+ }
+ }
+
+ /**
+ * @param string $invalidClassName
+ *
+ * @dataProvider getInvalidClassNames
+ */
+ public function testInstantiationFromNonExistingClass($invalidClassName)
+ {
+ $this->setExpectedException('Doctrine\\Instantiator\\Exception\\InvalidArgumentException');
+
+ $this->instantiator->instantiate($invalidClassName);
+ }
+
+ public function testInstancesAreNotCloned()
+ {
+ $className = 'TemporaryClass' . uniqid();
+
+ eval('namespace ' . __NAMESPACE__ . '; class ' . $className . '{}');
+
+ $instance = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className);
+
+ $instance->foo = 'bar';
+
+ $instance2 = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className);
+
+ $this->assertObjectNotHasAttribute('foo', $instance2);
+ }
+
+ /**
+ * Provides a list of instantiable classes (existing)
+ *
+ * @return string[][]
+ */
+ public function getInstantiableClasses()
+ {
+ $classes = array(
+ array('stdClass'),
+ array(__CLASS__),
+ array('Doctrine\\Instantiator\\Instantiator'),
+ array('Exception'),
+ array('PharException'),
+ array('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\ExceptionAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\FinalExceptionAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\PharExceptionAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\XMLReaderAsset'),
+ );
+
+ if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) {
+ return $classes;
+ }
+
+ $classes = array_merge(
+ $classes,
+ array(
+ array('PharException'),
+ array('ArrayObject'),
+ array('DoctrineTest\\InstantiatorTestAsset\\ArrayObjectAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset'),
+ )
+ );
+
+ if (\PHP_VERSION_ID >= 50600) {
+ $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
+ $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset');
+ }
+
+ return $classes;
+ }
+
+ /**
+ * Provides a list of instantiable classes (existing)
+ *
+ * @return string[][]
+ */
+ public function getInvalidClassNames()
+ {
+ $classNames = array(
+ array(__CLASS__ . uniqid()),
+ array('Doctrine\\Instantiator\\InstantiatorInterface'),
+ array('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset'),
+ );
+
+ if (\PHP_VERSION_ID >= 50400) {
+ $classNames[] = array('DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset');
+ }
+
+ return $classNames;
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php
new file mode 100644
index 00000000..fbe28ddd
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+/**
+ * A simple asset for an abstract class
+ *
+ * @author Marco Pivetta
+ */
+abstract class AbstractClassAsset
+{
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php
new file mode 100644
index 00000000..56146d70
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+use BadMethodCallException;
+
+/**
+ * Test asset that extends an internal PHP class
+ *
+ * @author Marco Pivetta
+ */
+class ArrayObjectAsset extends ArrayObject
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php
new file mode 100644
index 00000000..43bbe46b
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Exception;
+
+/**
+ * Test asset that extends an internal PHP base exception
+ *
+ * @author Marco Pivetta
+ */
+class ExceptionAsset extends Exception
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php
new file mode 100644
index 00000000..7d268f5b
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Exception;
+
+/**
+ * Test asset that extends an internal PHP base exception
+ *
+ * @author Marco Pivetta
+ */
+final class FinalExceptionAsset extends Exception
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php
new file mode 100644
index 00000000..553fd561
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Phar;
+
+/**
+ * Test asset that extends an internal PHP class
+ *
+ * @author Marco Pivetta
+ */
+class PharAsset extends Phar
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php
new file mode 100644
index 00000000..42bf73e7
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php
@@ -0,0 +1,44 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use PharException;
+
+/**
+ * Test asset that extends an internal PHP class
+ * This class should be serializable without problems
+ * and without getting the "Erroneous data format for unserializing"
+ * error
+ *
+ * @author Marco Pivetta
+ */
+class PharExceptionAsset extends PharException
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php
new file mode 100644
index 00000000..ba19aaf6
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php
@@ -0,0 +1,62 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+use BadMethodCallException;
+use Serializable;
+
+/**
+ * Serializable test asset that also extends an internal class
+ *
+ * @author Marco Pivetta
+ */
+class SerializableArrayObjectAsset extends ArrayObject implements Serializable
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function serialize()
+ {
+ return '';
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function unserialize($serialized)
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php
new file mode 100644
index 00000000..39f84a6c
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php
@@ -0,0 +1,61 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Serializable;
+
+/**
+ * Base serializable test asset
+ *
+ * @author Marco Pivetta
+ */
+class SimpleSerializableAsset implements Serializable
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function serialize()
+ {
+ return '';
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function unserialize($serialized)
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php
new file mode 100644
index 00000000..04e78069
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+/**
+ * A simple trait with no attached logic
+ *
+ * @author Marco Pivetta
+ */
+trait SimpleTraitAsset
+{
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php
new file mode 100644
index 00000000..7d03bdab
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php
@@ -0,0 +1,50 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+
+/**
+ * Base un-cloneable asset
+ *
+ * @author Marco Pivetta
+ */
+class UnCloneableAsset
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+
+ /**
+ * Magic `__clone` - should not be invoked
+ *
+ * @throws BadMethodCallException
+ */
+ public function __clone()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php
new file mode 100644
index 00000000..b348a405
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php
@@ -0,0 +1,39 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+use BadMethodCallException;
+
+/**
+ * A simple asset for an abstract class
+ *
+ * @author Marco Pivetta
+ */
+class UnserializeExceptionArrayObjectAsset extends ArrayObject
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function __wakeup()
+ {
+ throw new BadMethodCallException();
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php
new file mode 100644
index 00000000..18dc6711
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php
@@ -0,0 +1,38 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+
+/**
+ * A simple asset for an abstract class
+ *
+ * @author Marco Pivetta
+ */
+class WakeUpNoticesAsset extends ArrayObject
+{
+ /**
+ * Wakeup method called after un-serialization
+ */
+ public function __wakeup()
+ {
+ trigger_error('Something went bananas while un-serializing this instance');
+ }
+}
diff --git a/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php
new file mode 100644
index 00000000..39ee6992
--- /dev/null
+++ b/src/composer/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use XMLReader;
+
+/**
+ * Test asset that extends an internal PHP class
+ *
+ * @author Dave Marshall
+ */
+class XMLReaderAsset extends XMLReader
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/src/composer/vendor/league/container/CHANGELOG.md b/src/composer/vendor/league/container/CHANGELOG.md
new file mode 100644
index 00000000..cb2a9251
--- /dev/null
+++ b/src/composer/vendor/league/container/CHANGELOG.md
@@ -0,0 +1,108 @@
+# Changelog
+
+All Notable changes to `League\Container` will be documented in this file
+
+## 2.2.0
+
+### Changed
+- Service providers can now be added multiple times by giving them a signature.
+
+## 2.1.0
+
+### Added
+- Allow resolving of `RawArgument` objects as first class dependencies.
+
+### Changed
+- Unnecessary recursion removed from `Container::get`.
+
+## 2.0.3
+
+### Fixed
+- Bug where delegating container was not passed to delegate when needed.
+- Bug where `Container::extend` would not return a shared definition to extend.
+
+## 2.0.2
+
+### Fixed
+- Bug introduced in 2.0.1 where shared definitions registered via a service provider would never be returned as shared.
+
+## 2.0.1
+
+### Fixed
+- Bug where shared definitions were not stored as shared.
+
+## 2.0.0
+
+### Added
+- Now implementation of the container-interop project.
+- `BootableServiceProviderInterface` for eagerly loaded service providers.
+- Delegate container functionality.
+- `RawArgument` to ensure scalars are not resolved from the container but seen as an argument.
+
+### Altered
+- Refactor of definition functionality.
+- `Container::share` replaces `singleton` functionality to improve understanding.
+- Auto wiring is now disabled by default.
+- Auto wiring abstracted to be a delegate container `ReflectionContainer` handling all reflection based functionality.
+- Inflection functionality abstracted to an aggregate.
+- Service provider functionality abstracted to an aggregate.
+- Much bloat removed.
+- `Container::call` now proxies to `ReflectionContainer::call` and handles argument resolution in a much more efficient way.
+
+### Removed
+- Ability to register invokables, this functionality added a layer of complexity too large for the problem it solved.
+- Container no longer accepts a configuration array, this functionality will now be provided by an external service provider package.
+
+## 1.4.0
+
+### Added
+- Added `isRegisteredCallable` method to public API.
+- Invoking `call` now accepts named arguments at runtime.
+
+### Fixed
+- Container now stores instantiated Service Providers after first instantiation.
+- Extending a definition now looks in Service Providers as well as just Definitions.
+
+## 1.3.1 - 2015-02-21
+
+### Fixed
+- Fixed bug where arbitrary values were attempted to be resolved as classes.
+
+## 1.3.0 - 2015-02-09
+
+### Added
+- Added `ServiceProvider` functionality to allow cleaner resolving of complex dependencies.
+- Added `Inflector` functionality to allow for manipulation of resolved objects of a specific type.
+- Improvements to DRY throughout the package.
+
+### Fixed
+- Setter in `ContainerAwareTrait` now returns self (`$this`).
+
+## 1.2.1 - 2015-01-29
+
+### Fixed
+- Allow arbitrary values to be registered via container config.
+
+## 1.2.0 - 2015-01-13
+
+### Added
+- Improvements to `Container::call` functionality.
+
+### Fixed
+- General code tidy.
+- Improvements to test suite.
+
+## 1.1.1 - 2015-01-13
+
+### Fixed
+- Allow singleton to be passed as method argument.
+
+## 1.1.0 - 2015-01-12
+
+### Added
+- Addition of `ContainerAwareTrait` to provide functionality from `ContainerAwareInterface`.
+
+## 1.0.0 - 2015-01-12
+
+### Added
+- Migrated from [Orno\Di](https://github.com/orno/di).
diff --git a/src/composer/vendor/league/container/CONTRIBUTING.md b/src/composer/vendor/league/container/CONTRIBUTING.md
new file mode 100644
index 00000000..e60a2612
--- /dev/null
+++ b/src/composer/vendor/league/container/CONTRIBUTING.md
@@ -0,0 +1,29 @@
+# Contributing
+
+Contributions are **welcome** and will be fully **credited**.
+
+We accept contributions via Pull Requests on [Github](https://github.com/thephpleague/container).
+
+## Pull Requests
+
+- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
+
+- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
+
+- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date.
+
+- **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option.
+
+- **Create feature branches** - Don't ask us to pull from your master branch.
+
+- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
+
+- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.
+
+## Running Tests
+
+``` bash
+$ phpunit
+```
+
+**Happy coding**!
diff --git a/src/composer/vendor/league/container/LICENSE.md b/src/composer/vendor/league/container/LICENSE.md
new file mode 100644
index 00000000..2b681a4f
--- /dev/null
+++ b/src/composer/vendor/league/container/LICENSE.md
@@ -0,0 +1,21 @@
+# The MIT License (MIT)
+
+Copyright (c) 2014 Phil Bennett
+
+> Permission is hereby granted, free of charge, to any person obtaining a copy
+> of this software and associated documentation files (the "Software"), to deal
+> in the Software without restriction, including without limitation the rights
+> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+> copies of the Software, and to permit persons to whom the Software is
+> furnished to do so, subject to the following conditions:
+>
+> The above copyright notice and this permission notice shall be included in
+> all copies or substantial portions of the Software.
+>
+> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+> THE SOFTWARE.
diff --git a/src/composer/vendor/league/container/README.md b/src/composer/vendor/league/container/README.md
new file mode 100644
index 00000000..536ec6de
--- /dev/null
+++ b/src/composer/vendor/league/container/README.md
@@ -0,0 +1,67 @@
+# Container (Dependency Injection)
+
+[](https://twitter.com/philipobenito)
+[](https://github.com/thephpleague/container/releases)
+[](LICENSE.md)
+[](https://travis-ci.org/thephpleague/container)
+[](https://scrutinizer-ci.com/g/thephpleague/container/code-structure)
+[](https://scrutinizer-ci.com/g/thephpleague/container)
+[](https://packagist.org/packages/league/container)
+
+[](https://insight.sensiolabs.com/projects/ad6b4c3e-8f93-4968-8dd3-391d39a4c3c2)
+
+This package is compliant with [PSR-1], [PSR-2] and [PSR-4]. If you notice compliance oversights,
+please send a patch via pull request.
+
+[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
+[PSR-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
+[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
+
+## Install
+
+Via Composer
+
+``` bash
+$ composer require league/container
+```
+
+## Requirements
+
+The following versions of PHP are supported by this version.
+
+* PHP 5.4
+* PHP 5.5
+* PHP 5.6
+* PHP 7.0
+* HHVM
+
+## Documentation
+
+Container has [full documentation](http://container.thephpleague.com), powered by [Jekyll](http://jekyllrb.com/).
+
+Contribute to this documentation in the [gh-pages branch](https://github.com/thephpleague/container/tree/gh-pages/).
+
+## Testing
+
+``` bash
+$ vendor/bin/phpunit
+```
+
+## Contributing
+
+Please see [CONTRIBUTING](https://github.com/thephpleague/container/blob/master/CONTRIBUTING.md) for details.
+
+## Security
+
+If you discover any security related issues, please email philipobenito@gmail.com instead of using the issue tracker.
+
+## Credits
+
+- [Phil Bennett](https://github.com/philipobenito)
+- [All Contributors](https://github.com/thephpleague/container/contributors)
+
+All `Orno\Di` contributions can be found [here](https://github.com/orno/di/graphs/contributors).
+
+## License
+
+The MIT License (MIT). Please see [License File](https://github.com/thephpleague/container/blob/master/LICENSE.md) for more information.
diff --git a/src/composer/vendor/league/container/composer.json b/src/composer/vendor/league/container/composer.json
new file mode 100644
index 00000000..26a17b7b
--- /dev/null
+++ b/src/composer/vendor/league/container/composer.json
@@ -0,0 +1,52 @@
+{
+ "name": "league/container",
+ "description": "A fast and intuitive dependency injection container.",
+ "keywords": [
+ "league",
+ "container",
+ "dependency",
+ "injection",
+ "di",
+ "service",
+ "provider"
+ ],
+ "homepage": "https://github.com/thephpleague/container",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Phil Bennett",
+ "email": "philipobenito@gmail.com",
+ "homepage": "http://www.philipobenito.com",
+ "role": "Developer"
+ }
+ ],
+ "require": {
+ "php": ">=5.4.0",
+ "container-interop/container-interop": "^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit" : "4.*"
+ },
+ "provide": {
+ "container-interop/container-interop-implementation": "^1.1"
+ },
+ "replace": {
+ "orno/di": "~2.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Container\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "League\\Container\\Test\\": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-1.x": "1.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Argument/ArgumentResolverInterface.php b/src/composer/vendor/league/container/src/Argument/ArgumentResolverInterface.php
new file mode 100644
index 00000000..2691d59c
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Argument/ArgumentResolverInterface.php
@@ -0,0 +1,26 @@
+getValue();
+ continue;
+ }
+
+ if (! is_string($arg)) {
+ continue;
+ }
+
+ $container = $this->getContainer();
+
+ if (is_null($container) && $this instanceof ReflectionContainer) {
+ $container = $this;
+ }
+
+ if (! is_null($container) && $container->has($arg)) {
+ $arg = $container->get($arg);
+
+ if ($arg instanceof RawArgumentInterface) {
+ $arg = $arg->getValue();
+ }
+
+ continue;
+ }
+ }
+
+ return $arguments;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reflectArguments(ReflectionFunctionAbstract $method, array $args = [])
+ {
+ $arguments = array_map(function (ReflectionParameter $param) use ($method, $args) {
+ $name = $param->getName();
+ $class = $param->getClass();
+
+ if (array_key_exists($name, $args)) {
+ return $args[$name];
+ }
+
+ if (! is_null($class)) {
+ return $class->getName();
+ }
+
+ if ($param->isDefaultValueAvailable()) {
+ return $param->getDefaultValue();
+ }
+
+ throw new NotFoundException(sprintf(
+ 'Unable to resolve a value for parameter (%s) in the function/method (%s)',
+ $name,
+ $method->getName()
+ ));
+ }, $method->getParameters());
+
+ return $this->resolveArguments($arguments);
+ }
+
+ /**
+ * @return ContainerInterface
+ */
+ abstract public function getContainer();
+}
diff --git a/src/composer/vendor/league/container/src/Argument/RawArgument.php b/src/composer/vendor/league/container/src/Argument/RawArgument.php
new file mode 100644
index 00000000..a52e4928
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Argument/RawArgument.php
@@ -0,0 +1,27 @@
+value = $value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Argument/RawArgumentInterface.php b/src/composer/vendor/league/container/src/Argument/RawArgumentInterface.php
new file mode 100644
index 00000000..85d92211
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Argument/RawArgumentInterface.php
@@ -0,0 +1,13 @@
+providers = (is_null($providers))
+ ? (new ServiceProviderAggregate)->setContainer($this)
+ : $providers->setContainer($this);
+
+ $this->inflectors = (is_null($inflectors))
+ ? (new InflectorAggregate)->setContainer($this)
+ : $inflectors->setContainer($this);
+
+ $this->definitionFactory = (is_null($definitionFactory))
+ ? (new DefinitionFactory)->setContainer($this)
+ : $definitionFactory->setContainer($this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get($alias, array $args = [])
+ {
+ $service = $this->getFromThisContainer($alias, $args);
+
+ if ($service === false && $this->providers->provides($alias)) {
+ $this->providers->register($alias);
+ $service = $this->getFromThisContainer($alias, $args);
+ }
+
+ if ($service !== false) {
+ return $service;
+ }
+
+ if ($resolved = $this->getFromDelegate($alias, $args)) {
+ return $this->inflectors->inflect($resolved);
+ }
+
+ throw new NotFoundException(
+ sprintf('Alias (%s) is not being managed by the container', $alias)
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function has($alias)
+ {
+ if (array_key_exists($alias, $this->definitions) || $this->hasShared($alias)) {
+ return true;
+ }
+
+ if ($this->providers->provides($alias)) {
+ return true;
+ }
+
+ return $this->hasInDelegate($alias);
+ }
+
+ /**
+ * Returns a boolean to determine if the container has a shared instance of an alias.
+ *
+ * @param string $alias
+ * @param boolean $resolved
+ * @return boolean
+ */
+ public function hasShared($alias, $resolved = false)
+ {
+ $shared = ($resolved === false) ? array_merge($this->shared, $this->sharedDefinitions) : $this->shared;
+
+ return (array_key_exists($alias, $shared));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function add($alias, $concrete = null, $share = false)
+ {
+ if (is_null($concrete)) {
+ $concrete = $alias;
+ }
+
+ $definition = $this->definitionFactory->getDefinition($alias, $concrete);
+
+ if ($definition instanceof DefinitionInterface) {
+ if ($share === false) {
+ $this->definitions[$alias] = $definition;
+ } else {
+ $this->sharedDefinitions[$alias] = $definition;
+ }
+
+ return $definition;
+ }
+
+ // dealing with a value that cannot build a definition
+ $this->shared[$alias] = $concrete;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function share($alias, $concrete = null)
+ {
+ return $this->add($alias, $concrete, true);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addServiceProvider($provider)
+ {
+ $this->providers->add($provider);
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function extend($alias)
+ {
+ if ($this->providers->provides($alias)) {
+ $this->providers->register($alias);
+ }
+
+ if (array_key_exists($alias, $this->definitions)) {
+ return $this->definitions[$alias];
+ }
+
+ if (array_key_exists($alias, $this->sharedDefinitions)) {
+ return $this->sharedDefinitions[$alias];
+ }
+
+ throw new NotFoundException(
+ sprintf('Unable to extend alias (%s) as it is not being managed as a definition', $alias)
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function inflector($type, callable $callback = null)
+ {
+ return $this->inflectors->add($type, $callback);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function call(callable $callable, array $args = [])
+ {
+ return (new ReflectionContainer)->setContainer($this)->call($callable, $args);
+ }
+
+ /**
+ * Delegate a backup container to be checked for services if it
+ * cannot be resolved via this container.
+ *
+ * @param \Interop\Container\ContainerInterface $container
+ * @return $this
+ */
+ public function delegate(InteropContainerInterface $container)
+ {
+ $this->delegates[] = $container;
+
+ if ($container instanceof ImmutableContainerAwareInterface) {
+ $container->setContainer($this);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns true if service is registered in one of the delegated backup containers.
+ *
+ * @param string $alias
+ * @return boolean
+ */
+ public function hasInDelegate($alias)
+ {
+ foreach ($this->delegates as $container) {
+ if ($container->has($alias)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Attempt to get a service from the stack of delegated backup containers.
+ *
+ * @param string $alias
+ * @param array $args
+ * @return mixed
+ */
+ protected function getFromDelegate($alias, array $args = [])
+ {
+ foreach ($this->delegates as $container) {
+ if ($container->has($alias)) {
+ return $container->get($alias, $args);
+ }
+
+ continue;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get a service that has been registered in this container.
+ *
+ * @param string $alias
+ * @param array $args
+ * @return mixed
+ */
+ protected function getFromThisContainer($alias, array $args = [])
+ {
+ if ($this->hasShared($alias, true)) {
+ return $this->inflectors->inflect($this->shared[$alias]);
+ }
+
+ if (array_key_exists($alias, $this->sharedDefinitions)) {
+ $shared = $this->inflectors->inflect($this->sharedDefinitions[$alias]->build());
+ $this->shared[$alias] = $shared;
+ return $shared;
+ }
+
+ if (array_key_exists($alias, $this->definitions)) {
+ return $this->inflectors->inflect(
+ $this->definitions[$alias]->build($args)
+ );
+ }
+
+ return false;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/ContainerAwareInterface.php b/src/composer/vendor/league/container/src/ContainerAwareInterface.php
new file mode 100644
index 00000000..8addd2f9
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ContainerAwareInterface.php
@@ -0,0 +1,20 @@
+container = $container;
+
+ return $this;
+ }
+
+ /**
+ * Get the container.
+ *
+ * @return \League\Container\ContainerInterface
+ */
+ public function getContainer()
+ {
+ return $this->container;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/ContainerInterface.php b/src/composer/vendor/league/container/src/ContainerInterface.php
new file mode 100644
index 00000000..3996e326
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ContainerInterface.php
@@ -0,0 +1,59 @@
+alias = $alias;
+ $this->concrete = $concrete;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withArgument($arg)
+ {
+ $this->arguments[] = $arg;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withArguments(array $args)
+ {
+ foreach ($args as $arg) {
+ $this->withArgument($arg);
+ }
+
+ return $this;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Definition/CallableDefinition.php b/src/composer/vendor/league/container/src/Definition/CallableDefinition.php
new file mode 100644
index 00000000..e8fe2e75
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Definition/CallableDefinition.php
@@ -0,0 +1,23 @@
+arguments : $args;
+ $resolved = $this->resolveArguments($args);
+
+ if (is_array($this->concrete) && is_string($this->concrete[0])) {
+ $this->concrete[0] = ($this->getContainer()->has($this->concrete[0]))
+ ? $this->getContainer()->get($this->concrete[0])
+ : $this->concrete[0];
+ }
+
+ return call_user_func_array($this->concrete, $resolved);
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Definition/ClassDefinition.php b/src/composer/vendor/league/container/src/Definition/ClassDefinition.php
new file mode 100644
index 00000000..07448a2e
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Definition/ClassDefinition.php
@@ -0,0 +1,67 @@
+methods[] = [
+ 'method' => $method,
+ 'arguments' => $args
+ ];
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function withMethodCalls(array $methods = [])
+ {
+ foreach ($methods as $method => $args) {
+ $this->withMethodCall($method, $args);
+ }
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function build(array $args = [])
+ {
+ $args = (empty($args)) ? $this->arguments : $args;
+ $resolved = $this->resolveArguments($args);
+ $reflection = new ReflectionClass($this->concrete);
+ $instance = $reflection->newInstanceArgs($resolved);
+
+ return $this->invokeMethods($instance);
+ }
+
+ /**
+ * Invoke methods on resolved instance.
+ *
+ * @param object $instance
+ * @return object
+ */
+ protected function invokeMethods($instance)
+ {
+ foreach ($this->methods as $method) {
+ $args = $this->resolveArguments($method['arguments']);
+ call_user_func_array([$instance, $method['method']], $args);
+ }
+
+ return $instance;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Definition/ClassDefinitionInterface.php b/src/composer/vendor/league/container/src/Definition/ClassDefinitionInterface.php
new file mode 100644
index 00000000..9f7e0b36
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Definition/ClassDefinitionInterface.php
@@ -0,0 +1,23 @@
+setContainer($this->getContainer());
+ }
+
+ if (is_string($concrete) && class_exists($concrete)) {
+ return (new ClassDefinition($alias, $concrete))->setContainer($this->getContainer());
+ }
+
+ // if the item is not defineable we just return the value to be stored
+ // in the container as an arbitrary value/instance
+ return $concrete;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Definition/DefinitionFactoryInterface.php b/src/composer/vendor/league/container/src/Definition/DefinitionFactoryInterface.php
new file mode 100644
index 00000000..7430b5cc
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Definition/DefinitionFactoryInterface.php
@@ -0,0 +1,17 @@
+container = $container;
+
+ return $this;
+ }
+
+ /**
+ * Get the container.
+ *
+ * @return \League\Container\ImmutableContainerInterface
+ */
+ public function getContainer()
+ {
+ return $this->container;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/ImmutableContainerInterface.php b/src/composer/vendor/league/container/src/ImmutableContainerInterface.php
new file mode 100644
index 00000000..cd52a615
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ImmutableContainerInterface.php
@@ -0,0 +1,10 @@
+methods[$name] = $args;
+
+ return $this;
+ }
+
+ /**
+ * Defines multiple methods to be invoked on the subject object.
+ *
+ * @param array $methods
+ * @return $this
+ */
+ public function invokeMethods(array $methods)
+ {
+ foreach ($methods as $name => $args) {
+ $this->invokeMethod($name, $args);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Defines a property to be set on the subject object.
+ *
+ * @param string $property
+ * @param mixed $value
+ * @return $this
+ */
+ public function setProperty($property, $value)
+ {
+ $this->properties[$property] = $value;
+
+ return $this;
+ }
+
+ /**
+ * Defines multiple properties to be set on the subject object.
+ *
+ * @param array $properties
+ * @return $this
+ */
+ public function setProperties(array $properties)
+ {
+ foreach ($properties as $property => $value) {
+ $this->setProperty($property, $value);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Apply inflections to an object.
+ *
+ * @param object $object
+ * @return void
+ */
+ public function inflect($object)
+ {
+ $properties = $this->resolveArguments(array_values($this->properties));
+ $properties = array_combine(array_keys($this->properties), $properties);
+
+ foreach ($properties as $property => $value) {
+ $object->{$property} = $value;
+ }
+
+ foreach ($this->methods as $method => $args) {
+ $args = $this->resolveArguments($args);
+
+ call_user_func_array([$object, $method], $args);
+ }
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Inflector/InflectorAggregate.php b/src/composer/vendor/league/container/src/Inflector/InflectorAggregate.php
new file mode 100644
index 00000000..f8552337
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Inflector/InflectorAggregate.php
@@ -0,0 +1,53 @@
+inflectors[$type] = $inflector;
+
+ return $inflector;
+ }
+
+ $this->inflectors[$type] = $callback;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function inflect($object)
+ {
+ foreach ($this->inflectors as $type => $inflector) {
+ if (! $object instanceof $type) {
+ continue;
+ }
+
+ if ($inflector instanceof Inflector) {
+ $inflector->setContainer($this->getContainer());
+ $inflector->inflect($object);
+ continue;
+ }
+
+ // must be dealing with a callable as the inflector
+ call_user_func_array($inflector, [$object]);
+ }
+
+ return $object;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/Inflector/InflectorAggregateInterface.php b/src/composer/vendor/league/container/src/Inflector/InflectorAggregateInterface.php
new file mode 100644
index 00000000..8266bc4e
--- /dev/null
+++ b/src/composer/vendor/league/container/src/Inflector/InflectorAggregateInterface.php
@@ -0,0 +1,25 @@
+has($alias)) {
+ throw new NotFoundException(
+ sprintf('Alias (%s) is not an existing class and therefore cannot be resolved', $alias)
+ );
+ }
+
+ $reflector = new ReflectionClass($alias);
+ $construct = $reflector->getConstructor();
+
+ if ($construct === null) {
+ return new $alias;
+ }
+
+ return $reflector->newInstanceArgs(
+ $this->reflectArguments($construct, $args)
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function has($alias)
+ {
+ return class_exists($alias);
+ }
+
+ /**
+ * Invoke a callable via the container.
+ *
+ * @param callable $callable
+ * @param array $args
+ * @return mixed
+ */
+ public function call(callable $callable, array $args = [])
+ {
+ if (is_string($callable) && strpos($callable, '::') !== false) {
+ $callable = explode('::', $callable);
+ }
+
+ if (is_array($callable)) {
+ $reflection = new ReflectionMethod($callable[0], $callable[1]);
+
+ if ($reflection->isStatic()) {
+ $callable[0] = null;
+ }
+
+ return $reflection->invokeArgs($callable[0], $this->reflectArguments($reflection, $args));
+ }
+
+ $reflection = new ReflectionFunction($callable);
+
+ return $reflection->invokeArgs($this->reflectArguments($reflection, $args));
+ }
+}
diff --git a/src/composer/vendor/league/container/src/ServiceProvider/AbstractServiceProvider.php b/src/composer/vendor/league/container/src/ServiceProvider/AbstractServiceProvider.php
new file mode 100644
index 00000000..96cc7037
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ServiceProvider/AbstractServiceProvider.php
@@ -0,0 +1,27 @@
+provides));
+ }
+
+ return $this->provides;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/ServiceProvider/AbstractSignatureServiceProvider.php b/src/composer/vendor/league/container/src/ServiceProvider/AbstractSignatureServiceProvider.php
new file mode 100644
index 00000000..9e36b553
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ServiceProvider/AbstractSignatureServiceProvider.php
@@ -0,0 +1,31 @@
+signature = $signature;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getSignature()
+ {
+ return (is_null($this->signature)) ? get_class($this) : $this->signature;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/ServiceProvider/BootableServiceProviderInterface.php b/src/composer/vendor/league/container/src/ServiceProvider/BootableServiceProviderInterface.php
new file mode 100644
index 00000000..580580ff
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ServiceProvider/BootableServiceProviderInterface.php
@@ -0,0 +1,14 @@
+setContainer($this->getContainer());
+ }
+
+ if ($provider instanceof BootableServiceProviderInterface) {
+ $provider->boot();
+ }
+
+ if ($provider instanceof ServiceProviderInterface) {
+ foreach ($provider->provides() as $service) {
+ $this->providers[$service] = $provider;
+ }
+
+ return $this;
+ }
+
+ throw new \InvalidArgumentException(
+ 'A service provider must be a fully qualified class name or instance ' .
+ 'of (\League\Container\ServiceProvider\ServiceProviderInterface)'
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function provides($service)
+ {
+ return array_key_exists($service, $this->providers);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function register($service)
+ {
+ if (! array_key_exists($service, $this->providers)) {
+ throw new \InvalidArgumentException(
+ sprintf('(%s) is not provided by a service provider', $service)
+ );
+ }
+
+ $provider = $this->providers[$service];
+ $signature = get_class($provider);
+
+ if ($provider instanceof SignatureServiceProviderInterface) {
+ $signature = $provider->getSignature();
+ }
+
+ // ensure that the provider hasn't already been invoked by any other service request
+ if (in_array($signature, $this->registered)) {
+ return;
+ }
+
+ $provider->register();
+
+ $this->registered[] = $signature;
+ }
+}
diff --git a/src/composer/vendor/league/container/src/ServiceProvider/ServiceProviderAggregateInterface.php b/src/composer/vendor/league/container/src/ServiceProvider/ServiceProviderAggregateInterface.php
new file mode 100644
index 00000000..0825ff38
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ServiceProvider/ServiceProviderAggregateInterface.php
@@ -0,0 +1,32 @@
+container property or the `getContainer` method
+ * from the ContainerAwareTrait.
+ *
+ * @return void
+ */
+ public function register();
+}
diff --git a/src/composer/vendor/league/container/src/ServiceProvider/SignatureServiceProviderInterface.php b/src/composer/vendor/league/container/src/ServiceProvider/SignatureServiceProviderInterface.php
new file mode 100644
index 00000000..5022219b
--- /dev/null
+++ b/src/composer/vendor/league/container/src/ServiceProvider/SignatureServiceProviderInterface.php
@@ -0,0 +1,24 @@
+copy($myObject);
+```
+
+
+## Why?
+
+- How do you create copies of your objects?
+
+```php
+$myCopy = clone $myObject;
+```
+
+- How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)?
+
+You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior yourself.
+
+- But how do you handle **cycles** in the association graph?
+
+Now you're in for a big mess :(
+
+
+
+### Using simply `clone`
+
+
+
+### Overridding `__clone()`
+
+
+
+### With `DeepCopy`
+
+
+
+## How it works
+
+DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it keeps a hash map of all instances and thus preserves the object graph.
+
+## Going further
+
+You can add filters to customize the copy process.
+
+The method to add a filter is `$deepCopy->addFilter($filter, $matcher)`,
+with `$filter` implementing `DeepCopy\Filter\Filter`
+and `$matcher` implementing `DeepCopy\Matcher\Matcher`.
+
+We provide some generic filters and matchers.
+
+### Matchers
+
+ - `DeepCopy\Matcher` applies on a object attribute.
+ - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements.
+
+#### Property name
+
+The `PropertyNameMatcher` will match a property by its name:
+
+```php
+use DeepCopy\Matcher\PropertyNameMatcher;
+
+$matcher = new PropertyNameMatcher('id');
+// will apply a filter to any property of any objects named "id"
+```
+
+#### Specific property
+
+The `PropertyMatcher` will match a specific property of a specific class:
+
+```php
+use DeepCopy\Matcher\PropertyMatcher;
+
+$matcher = new PropertyMatcher('MyClass', 'id');
+// will apply a filter to the property "id" of any objects of the class "MyClass"
+```
+
+#### Type
+
+The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of [gettype()](http://php.net/manual/en/function.gettype.php) function):
+
+```php
+use DeepCopy\TypeMatcher\TypeMatcher;
+
+$matcher = new TypeMatcher('Doctrine\Common\Collections\Collection');
+// will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection
+```
+
+### Filters
+
+ - `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher`.
+ - `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher`.
+
+#### `SetNullFilter`
+
+Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have any ID:
+
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\Filter\SetNullFilter;
+use DeepCopy\Matcher\PropertyNameMatcher;
+
+$myObject = MyClass::load(123);
+echo $myObject->id; // 123
+
+$deepCopy = new DeepCopy();
+$deepCopy->addFilter(new SetNullFilter(), new PropertyNameMatcher('id'));
+$myCopy = $deepCopy->copy($myObject);
+
+echo $myCopy->id; // null
+```
+
+#### `KeepFilter`
+
+If you want a property to remain untouched (for example, an association to an object):
+
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\Filter\KeepFilter;
+use DeepCopy\Matcher\PropertyMatcher;
+
+$deepCopy = new DeepCopy();
+$deepCopy->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category'));
+$myCopy = $deepCopy->copy($myObject);
+
+// $myCopy->category has not been touched
+```
+
+#### `ReplaceFilter`
+
+ 1. If you want to replace the value of a property:
+
+ ```php
+ use DeepCopy\DeepCopy;
+ use DeepCopy\Filter\ReplaceFilter;
+ use DeepCopy\Matcher\PropertyMatcher;
+
+ $deepCopy = new DeepCopy();
+ $callback = function ($currentValue) {
+ return $currentValue . ' (copy)'
+ };
+ $deepCopy->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title'));
+ $myCopy = $deepCopy->copy($myObject);
+
+ // $myCopy->title will contain the data returned by the callback, e.g. 'The title (copy)'
+ ```
+
+ 2. If you want to replace whole element:
+
+ ```php
+ use DeepCopy\DeepCopy;
+ use DeepCopy\TypeFilter\ReplaceFilter;
+ use DeepCopy\TypeMatcher\TypeMatcher;
+
+ $deepCopy = new DeepCopy();
+ $callback = function (MyClass $myClass) {
+ return get_class($myClass);
+ };
+ $deepCopy->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass'));
+ $myCopy = $deepCopy->copy(array(new MyClass, 'some string', new MyClass));
+
+ // $myCopy will contain ['MyClass', 'some stirng', 'MyClass']
+ ```
+
+
+The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable.
+
+#### `ShallowCopyFilter`
+
+Stop *DeepCopy* from recursively copying element, using standard `clone` instead:
+
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\TypeFilter\ShallowCopyFilter;
+use DeepCopy\TypeMatcher\TypeMatcher;
+use Mockery as m;
+
+$this->deepCopy = new DeepCopy();
+$this->deepCopy->addTypeFilter(
+ new ShallowCopyFilter,
+ new TypeMatcher(m\MockInterface::class)
+);
+
+$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class));
+// all mocks will be just cloned, not deep-copied
+```
+
+#### `DoctrineCollectionFilter`
+
+If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`:
+
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter;
+use DeepCopy\Matcher\PropertyTypeMatcher;
+
+$deepCopy = new DeepCopy();
+$deepCopy->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection'));
+$myCopy = $deepCopy->copy($myObject);
+```
+
+#### `DoctrineEmptyCollectionFilter`
+
+If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the `DoctrineEmptyCollectionFilter`
+
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter;
+use DeepCopy\Matcher\PropertyMatcher;
+
+$deepCopy = new DeepCopy();
+$deepCopy->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty'));
+$myCopy = $deepCopy->copy($myObject);
+
+// $myCopy->myProperty will return an empty collection
+```
+
+## Contributing
+
+DeepCopy is distributed under the MIT license.
+
+### Tests
+
+Running the tests is simple:
+
+```php
+phpunit
+```
diff --git a/src/composer/vendor/myclabs/deep-copy/composer.json b/src/composer/vendor/myclabs/deep-copy/composer.json
new file mode 100644
index 00000000..d20287ab
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/composer.json
@@ -0,0 +1,21 @@
+{
+ "name": "myclabs/deep-copy",
+ "type": "library",
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": ["clone", "copy", "duplicate", "object", "object graph"],
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "license": "MIT",
+ "autoload": {
+ "psr-4": { "DeepCopy\\": "src/DeepCopy/" }
+ },
+ "autoload-dev": {
+ "psr-4": { "DeepCopyTest\\": "tests/DeepCopyTest/" }
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/doc/clone.png b/src/composer/vendor/myclabs/deep-copy/doc/clone.png
new file mode 100644
index 00000000..376afd49
Binary files /dev/null and b/src/composer/vendor/myclabs/deep-copy/doc/clone.png differ
diff --git a/src/composer/vendor/myclabs/deep-copy/doc/deep-clone.png b/src/composer/vendor/myclabs/deep-copy/doc/deep-clone.png
new file mode 100644
index 00000000..2b37a6d7
Binary files /dev/null and b/src/composer/vendor/myclabs/deep-copy/doc/deep-clone.png differ
diff --git a/src/composer/vendor/myclabs/deep-copy/doc/deep-copy.png b/src/composer/vendor/myclabs/deep-copy/doc/deep-copy.png
new file mode 100644
index 00000000..68c508ae
Binary files /dev/null and b/src/composer/vendor/myclabs/deep-copy/doc/deep-copy.png differ
diff --git a/src/composer/vendor/myclabs/deep-copy/doc/graph.png b/src/composer/vendor/myclabs/deep-copy/doc/graph.png
new file mode 100644
index 00000000..4d5c9428
Binary files /dev/null and b/src/composer/vendor/myclabs/deep-copy/doc/graph.png differ
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
new file mode 100644
index 00000000..aee9e729
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
@@ -0,0 +1,246 @@
+useCloneMethod = $useCloneMethod;
+
+ $this->addTypeFilter(new SplDoublyLinkedList($this), new TypeMatcher('\SplDoublyLinkedList'));
+ }
+
+ /**
+ * Cloning uncloneable properties won't throw exception.
+ * @param $skipUncloneable
+ * @return $this
+ */
+ public function skipUncloneable($skipUncloneable = true)
+ {
+ $this->skipUncloneable = $skipUncloneable;
+ return $this;
+ }
+
+ /**
+ * Perform a deep copy of the object.
+ * @param mixed $object
+ * @return mixed
+ */
+ public function copy($object)
+ {
+ $this->hashMap = [];
+
+ return $this->recursiveCopy($object);
+ }
+
+ public function addFilter(Filter $filter, Matcher $matcher)
+ {
+ $this->filters[] = [
+ 'matcher' => $matcher,
+ 'filter' => $filter,
+ ];
+ }
+
+ public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher)
+ {
+ $this->typeFilters[] = [
+ 'matcher' => $matcher,
+ 'filter' => $filter,
+ ];
+ }
+
+
+ private function recursiveCopy($var)
+ {
+ // Matches Type Filter
+ if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) {
+ return $filter->apply($var);
+ }
+
+ // Resource
+ if (is_resource($var)) {
+ return $var;
+ }
+ // Array
+ if (is_array($var)) {
+ return $this->copyArray($var);
+ }
+ // Scalar
+ if (! is_object($var)) {
+ return $var;
+ }
+ // Object
+ return $this->copyObject($var);
+ }
+
+ /**
+ * Copy an array
+ * @param array $array
+ * @return array
+ */
+ private function copyArray(array $array)
+ {
+ foreach ($array as $key => $value) {
+ $array[$key] = $this->recursiveCopy($value);
+ }
+
+ return $array;
+ }
+
+ /**
+ * Copy an object
+ * @param object $object
+ * @return object
+ */
+ private function copyObject($object)
+ {
+ $objectHash = spl_object_hash($object);
+
+ if (isset($this->hashMap[$objectHash])) {
+ return $this->hashMap[$objectHash];
+ }
+
+ $reflectedObject = new \ReflectionObject($object);
+
+ if (false === $isCloneable = $reflectedObject->isCloneable() and $this->skipUncloneable) {
+ $this->hashMap[$objectHash] = $object;
+ return $object;
+ }
+
+ if (false === $isCloneable) {
+ throw new CloneException(sprintf(
+ 'Class "%s" is not cloneable.',
+ $reflectedObject->getName()
+ ));
+ }
+
+ $newObject = clone $object;
+ $this->hashMap[$objectHash] = $newObject;
+ if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) {
+ return $object;
+ }
+
+ if ($newObject instanceof \DateTimeInterface) {
+ return $newObject;
+ }
+ foreach (ReflectionHelper::getProperties($reflectedObject) as $property) {
+ $this->copyObjectProperty($newObject, $property);
+ }
+
+ return $newObject;
+ }
+
+ private function copyObjectProperty($object, ReflectionProperty $property)
+ {
+ // Ignore static properties
+ if ($property->isStatic()) {
+ return;
+ }
+
+ // Apply the filters
+ foreach ($this->filters as $item) {
+ /** @var Matcher $matcher */
+ $matcher = $item['matcher'];
+ /** @var Filter $filter */
+ $filter = $item['filter'];
+
+ if ($matcher->matches($object, $property->getName())) {
+ $filter->apply(
+ $object,
+ $property->getName(),
+ function ($object) {
+ return $this->recursiveCopy($object);
+ }
+ );
+ // If a filter matches, we stop processing this property
+ return;
+ }
+ }
+
+ $property->setAccessible(true);
+ $propertyValue = $property->getValue($object);
+
+ // Copy the property
+ $property->setValue($object, $this->recursiveCopy($propertyValue));
+ }
+
+ /**
+ * Returns first filter that matches variable, NULL if no such filter found.
+ * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and
+ * 'matcher' with value of type {@see TypeMatcher}
+ * @param mixed $var
+ * @return TypeFilter|null
+ */
+ private function getFirstMatchedTypeFilter(array $filterRecords, $var)
+ {
+ $matched = $this->first(
+ $filterRecords,
+ function (array $record) use ($var) {
+ /* @var TypeMatcher $matcher */
+ $matcher = $record['matcher'];
+
+ return $matcher->matches($var);
+ }
+ );
+
+ return isset($matched) ? $matched['filter'] : null;
+ }
+
+ /**
+ * Returns first element that matches predicate, NULL if no such element found.
+ * @param array $elements
+ * @param callable $predicate Predicate arguments are: element.
+ * @return mixed|null
+ */
+ private function first(array $elements, callable $predicate)
+ {
+ foreach ($elements as $element) {
+ if (call_user_func($predicate, $element)) {
+ return $element;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
new file mode 100644
index 00000000..dd3b617b
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
@@ -0,0 +1,6 @@
+setAccessible(true);
+ $oldCollection = $reflectionProperty->getValue($object);
+
+ $newCollection = $oldCollection->map(
+ function ($item) use ($objectCopier) {
+ return $objectCopier($item);
+ }
+ );
+
+ $reflectionProperty->setValue($object, $newCollection);
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
new file mode 100644
index 00000000..f9b3f7ac
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
@@ -0,0 +1,24 @@
+setAccessible(true);
+
+ $reflectionProperty->setValue($object, new ArrayCollection());
+ }
+}
\ No newline at end of file
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
new file mode 100644
index 00000000..48076a1b
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
@@ -0,0 +1,17 @@
+callback = $callable;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function apply($object, $property, $objectCopier)
+ {
+ $reflectionProperty = new \ReflectionProperty($object, $property);
+ $reflectionProperty->setAccessible(true);
+
+ $value = call_user_func($this->callback, $reflectionProperty->getValue($object));
+
+ $reflectionProperty->setValue($object, $value);
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
new file mode 100644
index 00000000..d48f15b6
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
@@ -0,0 +1,22 @@
+setAccessible(true);
+ $reflectionProperty->setValue($object, null);
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
new file mode 100644
index 00000000..91eb7c90
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
@@ -0,0 +1,16 @@
+class = $class;
+ $this->property = $property;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function matches($object, $property)
+ {
+ return ($object instanceof $this->class) && ($property == $this->property);
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php
new file mode 100644
index 00000000..9d9575f0
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php
@@ -0,0 +1,30 @@
+property = $property;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function matches($object, $property)
+ {
+ return $property == $this->property;
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
new file mode 100644
index 00000000..6935541d
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
@@ -0,0 +1,38 @@
+propertyType = $propertyType;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function matches($object, $property)
+ {
+ $reflectionProperty = new ReflectionProperty($object, $property);
+ $reflectionProperty->setAccessible(true);
+
+ return $reflectionProperty->getValue($object) instanceof $this->propertyType;
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php
new file mode 100644
index 00000000..a094e729
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php
@@ -0,0 +1,39 @@
+getProperties() does not return private properties from ancestor classes.
+ *
+ * @author muratyaman@gmail.com
+ * @see http://php.net/manual/en/reflectionclass.getproperties.php
+ *
+ * @param \ReflectionClass $ref
+ * @return \ReflectionProperty[]
+ */
+ public static function getProperties(\ReflectionClass $ref)
+ {
+ $props = $ref->getProperties();
+ $propsArr = array();
+
+ foreach ($props as $prop) {
+ $propertyName = $prop->getName();
+ $propsArr[$propertyName] = $prop;
+ }
+
+ if ($parentClass = $ref->getParentClass()) {
+ $parentPropsArr = self::getProperties($parentClass);
+ foreach ($propsArr as $key => $property) {
+ $parentPropsArr[$key] = $property;
+ }
+
+ return $parentPropsArr;
+ }
+
+ return $propsArr;
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php
new file mode 100644
index 00000000..0e42b0fe
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php
@@ -0,0 +1,27 @@
+callback = $callable;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function apply($element)
+ {
+ return call_user_func($this->callback, $element);
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
new file mode 100644
index 00000000..408d18bb
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
@@ -0,0 +1,14 @@
+deepCopy = $deepCopy;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function apply($element)
+ {
+ $newElement = clone $element;
+
+ if ($element instanceof \SplDoublyLinkedList) {
+ // Replace each element in the list with a deep copy of itself
+ for ($i = 1; $i <= $newElement->count(); $i++) {
+ $newElement->push($this->deepCopy->copy($newElement->shift()));
+ }
+ }
+
+ return $newElement;
+
+ }
+}
diff --git a/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php
new file mode 100644
index 00000000..a37a8ba8
--- /dev/null
+++ b/src/composer/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php
@@ -0,0 +1,12 @@
+type = $type;
+ }
+
+ /**
+ * @param $element
+ * @return boolean
+ */
+ public function matches($element)
+ {
+ return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/.gitignore b/src/composer/vendor/phpdocumentor/reflection-common/.gitignore
new file mode 100644
index 00000000..c56f6719
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/.gitignore
@@ -0,0 +1,4 @@
+composer.phar
+vendor/
+build/
+
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/LICENSE b/src/composer/vendor/phpdocumentor/reflection-common/LICENSE
new file mode 100644
index 00000000..ed6926c1
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 phpDocumentor
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/README.md b/src/composer/vendor/phpdocumentor/reflection-common/README.md
new file mode 100644
index 00000000..52b12bc0
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/README.md
@@ -0,0 +1 @@
+# ReflectionCommon
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/composer.json b/src/composer/vendor/phpdocumentor/reflection-common/composer.json
new file mode 100644
index 00000000..90eee0f0
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/composer.json
@@ -0,0 +1,29 @@
+{
+ "name": "phpdocumentor/reflection-common",
+ "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"],
+ "homepage": "http://www.phpdoc.org",
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "require": {
+ "php": ">=5.5"
+ },
+ "autoload" : {
+ "psr-4" : {
+ "phpDocumentor\\Reflection\\": ["src"]
+ }
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/composer.lock b/src/composer/vendor/phpdocumentor/reflection-common/composer.lock
new file mode 100644
index 00000000..e01dc3c1
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/composer.lock
@@ -0,0 +1,974 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "49ee00389e4ccd00d7e93a147103b2ab",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119",
+ "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "2.0.*@ALPHA"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Instantiator\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2014-10-13 12:58:55"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "dflydev/markdown": "~1.0",
+ "erusev/parsedown": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "mike.vanriel@naenius.com"
+ }
+ ],
+ "time": "2015-02-03 12:10:50"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373",
+ "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "phpdocumentor/reflection-docblock": "~2.0",
+ "sebastian/comparator": "~1.1"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2015-04-27 22:15:08"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f",
+ "reference": "6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "~1.3",
+ "sebastian/environment": "~1.0",
+ "sebastian/version": "~1.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2015-06-01 07:35:26"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb",
+ "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2015-04-02 05:19:05"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+ "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Text/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ ""
+ ],
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2014-01-30 17:20:04"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+ "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "PHP/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ ""
+ ],
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2013-08-02 07:42:54"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "eab81d02569310739373308137284e0158424330"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330",
+ "reference": "eab81d02569310739373308137284e0158424330",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2015-04-08 04:46:07"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.6.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/816d12536a7a032adc3b68737f82cfbbf98b79c1",
+ "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.3",
+ "phpspec/prophecy": "~1.3,>=1.3.1",
+ "phpunit/php-code-coverage": "~2.0,>=2.0.11",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "~1.0",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "~1.2",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.6.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2015-05-29 06:00:03"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7",
+ "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "~1.0,>=1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2015-05-29 05:19:18"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2015-01-29 16:28:08"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "http://www.github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-02-22 15:13:53"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2015-01-01 10:01:08"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "84839970d05254c73cde183a721c7af13aede943"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943",
+ "reference": "84839970d05254c73cde183a721c7af13aede943",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2015-01-27 07:23:06"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+ "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2014-10-06 09:23:50"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2015-01-24 09:48:32"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
+ "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2015-02-24 06:35:25"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Yaml.git",
+ "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3",
+ "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-05-02 15:21:08"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": []
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/phpunit.xml.dist b/src/composer/vendor/phpdocumentor/reflection-common/phpunit.xml.dist
new file mode 100644
index 00000000..31811501
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/phpunit.xml.dist
@@ -0,0 +1,26 @@
+
+
+
+
+
+ ./tests/unit/
+
+
+
+
+ src
+
+
+
+
+
+
+
+
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/src/Element.php b/src/composer/vendor/phpdocumentor/reflection-common/src/Element.php
new file mode 100644
index 00000000..712e30e8
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/src/Element.php
@@ -0,0 +1,32 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+/**
+ * Interface for files processed by the ProjectFactory
+ */
+interface File
+{
+ /**
+ * Returns the content of the file as a string.
+ *
+ * @return string
+ */
+ public function getContents();
+
+ /**
+ * Returns md5 hash of the file.
+ *
+ * @return string
+ */
+ public function md5();
+
+ /**
+ * Returns an relative path to the file.
+ *
+ * @return string
+ */
+ public function path();
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/src/Fqsen.php b/src/composer/vendor/phpdocumentor/reflection-common/src/Fqsen.php
new file mode 100644
index 00000000..c7be3f15
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/src/Fqsen.php
@@ -0,0 +1,78 @@
+fqsen = $fqsen;
+
+ if (isset($matches[2])) {
+ $this->name = $matches[2];
+ } else {
+ $matches = explode('\\', $fqsen);
+ $this->name = trim(end($matches), '()');
+ }
+ }
+
+ /**
+ * converts this class to string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->fqsen;
+ }
+
+ /**
+ * Returns the name of the element without path.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/src/Location.php b/src/composer/vendor/phpdocumentor/reflection-common/src/Location.php
new file mode 100644
index 00000000..57603219
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/src/Location.php
@@ -0,0 +1,57 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+/**
+ * The location where an element occurs within a file.
+ */
+final class Location
+{
+ /** @var int */
+ private $lineNumber = 0;
+
+ /** @var int */
+ private $columnNumber = 0;
+
+ /**
+ * Initializes the location for an element using its line number in the file and optionally the column number.
+ *
+ * @param int $lineNumber
+ * @param int $columnNumber
+ */
+ public function __construct($lineNumber, $columnNumber = 0)
+ {
+ $this->lineNumber = $lineNumber;
+ $this->columnNumber = $columnNumber;
+ }
+
+ /**
+ * Returns the line number that is covered by this location.
+ *
+ * @return integer
+ */
+ public function getLineNumber()
+ {
+ return $this->lineNumber;
+ }
+
+ /**
+ * Returns the column number (character position on a line) for this location object.
+ *
+ * @return integer
+ */
+ public function getColumnNumber()
+ {
+ return $this->columnNumber;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-common/src/Project.php b/src/composer/vendor/phpdocumentor/reflection-common/src/Project.php
new file mode 100644
index 00000000..3ed1e393
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-common/src/Project.php
@@ -0,0 +1,25 @@
+assertEquals($name, $instance->getName());
+ }
+
+ /**
+ * Data provider for ValidFormats tests. Contains a complete list from psr-5 draft.
+ *
+ * @return array
+ */
+ public function validFqsenProvider()
+ {
+ return [
+ ['\\', ''],
+ ['\My\Space', 'Space'],
+ ['\My\Space\myFunction()', 'myFunction'],
+ ['\My\Space\MY_CONSTANT', 'MY_CONSTANT'],
+ ['\My\Space\MY_CONSTANT2', 'MY_CONSTANT2'],
+ ['\My\Space\MyClass', 'MyClass'],
+ ['\My\Space\MyInterface', 'MyInterface'],
+ ['\My\Space\MyTrait', 'MyTrait'],
+ ['\My\Space\MyClass::myMethod()', 'myMethod'],
+ ['\My\Space\MyClass::$my_property', 'my_property'],
+ ['\My\Space\MyClass::MY_CONSTANT', 'MY_CONSTANT'],
+ ];
+ }
+
+ /**
+ * @param string $fqsen
+ * @covers ::__construct
+ * @dataProvider invalidFqsenProvider
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInValidFormats($fqsen)
+ {
+ new Fqsen($fqsen);
+ }
+
+ /**
+ * Data provider for invalidFormats tests. Contains a complete list from psr-5 draft.
+ *
+ * @return array
+ */
+ public function invalidFqsenProvider()
+ {
+ return [
+ ['\My\*'],
+ ['\My\Space\.()'],
+ ['My\Space'],
+ ];
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ */
+ public function testToString()
+ {
+ $className = new Fqsen('\\phpDocumentor\\Application');
+
+ $this->assertEquals('\\phpDocumentor\\Application', (string)$className);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/.gitignore b/src/composer/vendor/phpdocumentor/reflection-docblock/.gitignore
new file mode 100644
index 00000000..3ce5adbb
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/.gitignore
@@ -0,0 +1,2 @@
+.idea
+vendor
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml b/src/composer/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml
new file mode 100644
index 00000000..5061d523
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml
@@ -0,0 +1,32 @@
+before_commands:
+ - "composer install --no-dev --prefer-source"
+
+tools:
+ external_code_coverage: true
+ php_code_sniffer:
+ enabled: true
+ config:
+ standard: PSR2
+ filter:
+ paths: ["src/*", "tests/*"]
+ php_cpd:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_loc:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_mess_detector:
+ enabled: true
+ config:
+ ruleset: phpmd.xml.dist
+ design_rules: { eval_expression: false }
+ filter:
+ paths: ["src/*"]
+ php_pdepend:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_analyzer:
+ enabled: true
+ filter:
+ paths: ["src/*", "tests/*"]
+ sensiolabs_security_checker: true
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/.travis.yml b/src/composer/vendor/phpdocumentor/reflection-docblock/.travis.yml
new file mode 100644
index 00000000..920958df
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/.travis.yml
@@ -0,0 +1,36 @@
+language: php
+php:
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+ - nightly
+
+matrix:
+ allow_failures:
+ - php:
+ - hhvm
+ - nightly
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+script:
+ - vendor/bin/phpunit --coverage-clover=coverage.clover -v
+ - composer update --no-interaction --prefer-source
+ - vendor/bin/phpunit -v
+
+before_script:
+ - composer install --no-interaction
+
+after_script:
+ - wget https://scrutinizer-ci.com/ocular.phar
+ - php ocular.phar code-coverage:upload --format=php-clover coverage.clover
+
+notifications:
+ irc: "irc.freenode.org#phpdocumentor"
+ email:
+ - mike.vanriel@naenius.com
+ - ashnazg@php.net
+ - boen.robot@gmail.com
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/LICENSE b/src/composer/vendor/phpdocumentor/reflection-docblock/LICENSE
new file mode 100644
index 00000000..792e4040
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2010 Mike van Riel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/README.md b/src/composer/vendor/phpdocumentor/reflection-docblock/README.md
new file mode 100644
index 00000000..a1984a15
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/README.md
@@ -0,0 +1,69 @@
+The ReflectionDocBlock Component [](https://travis-ci.org/phpDocumentor/ReflectionDocBlock)
+================================
+
+Introduction
+------------
+
+The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser
+that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest).
+
+With this component, a library can provide support for annotations via DocBlocks
+or otherwise retrieve information that is embedded in a DocBlock.
+
+> **Note**: *this is a core component of phpDocumentor and is constantly being
+> optimized for performance.*
+
+Installation
+------------
+
+You can install the component in the following ways:
+
+* Use the official Github repository (https://github.com/phpDocumentor/ReflectionDocBlock)
+* Via Composer (http://packagist.org/packages/phpdocumentor/reflection-docblock)
+
+Usage
+-----
+
+In order to parse the DocBlock one needs a DocBlockFactory that can be
+instantiated using its `createInstance` factory method like this:
+
+```php
+$factory = \phpDocumentor\Reflection\DocBlockFactory::createInstance();
+```
+
+Then we can use the `create` method of the factory to interpret the DocBlock.
+Please note that it is also possible to provide a class that has the
+`getDocComment()` method, such as an object of type `ReflectionClass`, the
+create method will read that if it exists.
+
+```php
+$docComment = <<create($docComment);
+```
+
+The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock`
+whose methods can be queried as shown in the following example.
+
+```php
+// Should contain the summary for this DocBlock
+$summary = $docblock->getSummary();
+
+// Contains an object of type \phpDocumentor\Reflection\DocBlock\Description;
+// you can either cast it to string or use the render method to get a string
+// representation of the Description.
+$description = $docblock->getDescription();
+```
+
+> For more examples it would be best to review the scripts in the `/examples`
+> folder.
+
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/composer.json b/src/composer/vendor/phpdocumentor/reflection-docblock/composer.json
new file mode 100644
index 00000000..85be2fdd
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/composer.json
@@ -0,0 +1,28 @@
+{
+ "name": "phpdocumentor/reflection-docblock",
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]}
+ },
+ "autoload-dev": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]}
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/composer.lock b/src/composer/vendor/phpdocumentor/reflection-docblock/composer.lock
new file mode 100644
index 00000000..b4da3c1b
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/composer.lock
@@ -0,0 +1,1120 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "9dfabded4193c3fd2ec85874de3b2e3c",
+ "content-hash": "69f6ae6608b8524fa04ddb0264bbf091",
+ "packages": [
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/9969bd1c9661a73fdab104df7dbf132639d5c4d8",
+ "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-06-12 22:21:38"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-06-10 07:14:17"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab",
+ "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2015-05-12 15:19:25"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14 21:17:01"
+ },
+ {
+ "name": "hamcrest/hamcrest-php",
+ "version": "v1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c",
+ "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "1.3.3",
+ "satooshi/php-coveralls": "dev-master"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "hamcrest"
+ ],
+ "files": [
+ "hamcrest/Hamcrest.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD"
+ ],
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
+ ],
+ "time": "2015-05-11 14:41:42"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "0.9.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/padraic/mockery.git",
+ "reference": "70bba85e4aabc9449626651f48b9018ede04f86b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/padraic/mockery/zipball/70bba85e4aabc9449626651f48b9018ede04f86b",
+ "reference": "70bba85e4aabc9449626651f48b9018ede04f86b",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "~1.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.9.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Mockery": "library/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "http://blog.astrumfutura.com"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "http://davedevelopment.co.uk"
+ }
+ ],
+ "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
+ "homepage": "http://github.com/padraic/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "time": "2015-04-02 19:54:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44",
+ "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "~1.3",
+ "sebastian/environment": "~1.0",
+ "sebastian/version": "~1.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2015-06-19 07:11:55"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb",
+ "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "File/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ ""
+ ],
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2013-10-10 15:34:57"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21 13:50:34"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d",
+ "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2015-06-13 07:35:30"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9",
+ "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2015-06-19 03:43:16"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2e8580deebb7d1ac92ac878595e6bffe01069c2a",
+ "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.3",
+ "phpunit/php-code-coverage": "~2.0",
+ "phpunit/php-file-iterator": "~1.3.2",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "~1.0.2",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.0",
+ "sebastian/diff": "~1.1",
+ "sebastian/environment": "~1.1",
+ "sebastian/exporter": "~1.1",
+ "sebastian/global-state": "~1.0",
+ "sebastian/recursion-context": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2015-01-27 16:06:15"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/92408bb1968a81b3217a6fdf6c1a198da83caa35",
+ "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "~1.0,>=1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2015-06-11 15:55:48"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2015-01-29 16:28:08"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "http://www.github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-02-22 15:13:53"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2015-01-01 10:01:08"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "84839970d05254c73cde183a721c7af13aede943"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943",
+ "reference": "84839970d05254c73cde183a721c7af13aede943",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2015-01-27 07:23:06"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+ "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2014-10-06 09:23:50"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2015-01-24 09:48:32"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2015-06-21 13:59:46"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v2.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Yaml.git",
+ "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160",
+ "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-06-10 15:30:22"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "phpdocumentor/reflection-common": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.5"
+ },
+ "platform-dev": []
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php
new file mode 100644
index 00000000..6d67dea4
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php
@@ -0,0 +1,27 @@
+create($docComment);
+
+// Should contain the first line of the DocBlock
+$summary = $docblock->getSummary();
+
+// Contains an object of type Description; you can either cast it to string or use
+// the render method to get a string representation of the Description.
+//
+// In subsequent examples we will be fiddling a bit more with the Description.
+$description = $docblock->getDescription();
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php
new file mode 100644
index 00000000..23995889
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php
@@ -0,0 +1,24 @@
+create($docComment);
+
+// You can check if a DocBlock has one or more see tags
+$hasSeeTag = $docblock->hasTag('see');
+
+// Or we can get a complete list of all tags
+$tags = $docblock->getTags();
+
+// But we can also grab all tags of a specific type, such as `see`
+$seeTags = $docblock->getTagsByName('see');
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php
new file mode 100644
index 00000000..6bc10baf
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php
@@ -0,0 +1,27 @@
+create($docComment);
+
+// Create the serializer that will reconstitute the DocBlock back to its original form.
+$serializer = new Serializer();
+
+// Reconstitution is performed by the `getDocComment()` method.
+$reconstitutedDocComment = $serializer->getDocComment($docblock);
+
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php
new file mode 100644
index 00000000..026d6069
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php
@@ -0,0 +1,135 @@
+ Important: Tag classes that act as Factories using the `create` method should implement the TagFactory interface.
+ */
+final class MyTag extends BaseTag implements StaticMethod
+{
+ /**
+ * A required property that is used by Formatters to reconstitute the complete tag line.
+ *
+ * @see Formatter
+ *
+ * @var string
+ */
+ protected $name = 'my-tag';
+
+ /**
+ * The constructor for this Tag; this should contain all properties for this object.
+ *
+ * @param Description $description An example of how to add a Description to the tag; the Description is often
+ * an optional variable so passing null is allowed in this instance (though you can
+ * also construct an empty description object).
+ *
+ * @see BaseTag for the declaration of the description property and getDescription method.
+ */
+ public function __construct(Description $description = null)
+ {
+ $this->description = $description;
+ }
+
+ /**
+ * A static Factory that creates a new instance of the current Tag.
+ *
+ * In this example the MyTag tag can be created by passing a description text as $body. Because we have added
+ * a $descriptionFactory that is type-hinted as DescriptionFactory we can now construct a new Description object
+ * and pass that to the constructor.
+ *
+ * > You could directly instantiate a Description object here but that won't be parsed for inline tags and Types
+ * > won't be resolved. The DescriptionFactory will take care of those actions.
+ *
+ * The `create` method's interface states that this method only features a single parameter (`$body`) but the
+ * {@see TagFactory} will read the signature of this method and if it has more parameters then it will try
+ * to find declarations for it in the ServiceLocator of the TagFactory (see {@see TagFactory::$serviceLocator}).
+ *
+ * > Important: all properties following the `$body` should default to `null`, otherwise PHP will error because
+ * > it no longer matches the interface. This is why you often see the default tags check that an optional argument
+ * > is not null nonetheless.
+ *
+ * @param string $body
+ * @param DescriptionFactory $descriptionFactory
+ * @param Context|null $context The Context is used to resolve Types and FQSENs, although optional
+ * it is highly recommended to pass it. If you omit it then it is assumed that
+ * the DocBlock is in the global namespace and has no `use` statements.
+ *
+ * @see Tag for the interface declaration of the `create` method.
+ * @see Tag::create() for more information on this method's workings.
+ *
+ * @return MyTag
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, Context $context = null)
+ {
+ Assert::string($body);
+ Assert::notNull($descriptionFactory);
+
+ return new static($descriptionFactory->create($body, $context));
+ }
+
+ /**
+ * Returns a rendition of the original tag line.
+ *
+ * This method is used to reconstitute a DocBlock into its original form by the {@see Serializer}. It should
+ * feature all parts of the tag so that the serializer can put it back together.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string)$this->description;
+ }
+}
+
+$docComment = << MyTag::class];
+
+// Do pass the list of custom tags to the Factory for the DocBlockFactory.
+$factory = DocBlockFactory::createInstance($customTags);
+// You can also add Tags later using `$factory->registerTagHandler()` with a tag name and Tag class name.
+
+// Create the DocBlock
+$docblock = $factory->create($docComment);
+
+// Take a look: the $customTagObjects now contain an array with your newly added tag
+$customTagObjects = $docblock->getTagsByName('my-tag');
+
+// As an experiment: let's reconstitute the DocBlock and observe that because we added a __toString() method
+// to the tag class that we can now also see it.
+$serializer = new Serializer();
+$reconstitutedDocComment = $serializer->getDocComment($docblock);
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php
new file mode 100644
index 00000000..5ec772fe
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php
@@ -0,0 +1,47 @@
+create($docComment);
+
+// Escaping is automatic so this happens in the DescriptionFactory.
+$description = $docblock->getDescription();
+
+// This is the rendition that we will receive of the Description.
+$receivedDocComment = <<render();
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist b/src/composer/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist
new file mode 100644
index 00000000..9abf85cf
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+
+
+
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist b/src/composer/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist
new file mode 100644
index 00000000..3c2e9a37
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist
@@ -0,0 +1,33 @@
+
+
+
+
+
+ ./tests/unit
+
+
+ ./tests/integration
+
+
+
+
+ ./src/
+
+
+ ./vendor/
+
+
+
+
+
+
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php
new file mode 100644
index 00000000..39911406
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php
@@ -0,0 +1,220 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+use Webmozart\Assert\Assert;
+
+final class DocBlock
+{
+ /** @var string The opening line for this docblock. */
+ private $summary = '';
+
+ /** @var DocBlock\Description The actual description for this docblock. */
+ private $description = null;
+
+ /** @var Tag[] An array containing all the tags in this docblock; except inline. */
+ private $tags = array();
+
+ /** @var Types\Context Information about the context of this DocBlock. */
+ private $context = null;
+
+ /** @var Location Information about the location of this DocBlock. */
+ private $location = null;
+
+ /** @var bool Is this DocBlock (the start of) a template? */
+ private $isTemplateStart = false;
+
+ /** @var bool Does this DocBlock signify the end of a DocBlock template? */
+ private $isTemplateEnd = false;
+
+ /**
+ * @param string $summary
+ * @param DocBlock\Description $description
+ * @param DocBlock\Tag[] $tags
+ * @param Types\Context $context The context in which the DocBlock occurs.
+ * @param Location $location The location within the file that this DocBlock occurs in.
+ * @param bool $isTemplateStart
+ * @param bool $isTemplateEnd
+ */
+ public function __construct(
+ $summary = '',
+ DocBlock\Description $description = null,
+ array $tags = [],
+ Types\Context $context = null,
+ Location $location = null,
+ $isTemplateStart = false,
+ $isTemplateEnd = false
+ )
+ {
+ Assert::string($summary);
+ Assert::boolean($isTemplateStart);
+ Assert::boolean($isTemplateEnd);
+ Assert::allIsInstanceOf($tags, Tag::class);
+
+ $this->summary = $summary;
+ $this->description = $description ?: new DocBlock\Description('');
+ foreach ($tags as $tag) {
+ $this->addTag($tag);
+ }
+
+ $this->context = $context;
+ $this->location = $location;
+
+ $this->isTemplateEnd = $isTemplateEnd;
+ $this->isTemplateStart = $isTemplateStart;
+ }
+
+ /**
+ * @return string
+ */
+ public function getSummary()
+ {
+ return $this->summary;
+ }
+
+ /**
+ * @return DocBlock\Description
+ */
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ /**
+ * Returns the current context.
+ *
+ * @return Types\Context
+ */
+ public function getContext()
+ {
+ return $this->context;
+ }
+
+ /**
+ * Returns the current location.
+ *
+ * @return Location
+ */
+ public function getLocation()
+ {
+ return $this->location;
+ }
+
+ /**
+ * Returns whether this DocBlock is the start of a Template section.
+ *
+ * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker
+ * (`#@+`) that is appended directly after the opening `/**` of a DocBlock.
+ *
+ * An example of such an opening is:
+ *
+ * ```
+ * /**#@+
+ * * My DocBlock
+ * * /
+ * ```
+ *
+ * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all
+ * elements that follow until another DocBlock is found that contains the closing marker (`#@-`).
+ *
+ * @see self::isTemplateEnd() for the check whether a closing marker was provided.
+ *
+ * @return boolean
+ */
+ public function isTemplateStart()
+ {
+ return $this->isTemplateStart;
+ }
+
+ /**
+ * Returns whether this DocBlock is the end of a Template section.
+ *
+ * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality.
+ *
+ * @return boolean
+ */
+ public function isTemplateEnd()
+ {
+ return $this->isTemplateEnd;
+ }
+
+ /**
+ * Returns the tags for this DocBlock.
+ *
+ * @return Tag[]
+ */
+ public function getTags()
+ {
+ return $this->tags;
+ }
+
+ /**
+ * Returns an array of tags matching the given name. If no tags are found
+ * an empty array is returned.
+ *
+ * @param string $name String to search by.
+ *
+ * @return Tag[]
+ */
+ public function getTagsByName($name)
+ {
+ Assert::string($name);
+
+ $result = array();
+
+ /** @var Tag $tag */
+ foreach ($this->getTags() as $tag) {
+ if ($tag->getName() != $name) {
+ continue;
+ }
+
+ $result[] = $tag;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Checks if a tag of a certain type is present in this DocBlock.
+ *
+ * @param string $name Tag name to check for.
+ *
+ * @return bool
+ */
+ public function hasTag($name)
+ {
+ Assert::string($name);
+
+ /** @var Tag $tag */
+ foreach ($this->getTags() as $tag) {
+ if ($tag->getName() == $name) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Adds a tag to this DocBlock.
+ *
+ * @param Tag $tag The tag to add.
+ *
+ * @return void
+ */
+ private function addTag(Tag $tag)
+ {
+ $this->tags[] = $tag;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php
new file mode 100644
index 00000000..d1d7fc64
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php
@@ -0,0 +1,103 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
+use Webmozart\Assert\Assert;
+
+/**
+ * Object representing to description for a DocBlock.
+ *
+ * A Description object can consist of plain text but can also include tags. A Description Formatter can then combine
+ * a body template with sprintf-style placeholders together with formatted tags in order to reconstitute a complete
+ * description text using the format that you would prefer.
+ *
+ * Because parsing a Description text can be a verbose process this is handled by the {@see DescriptionFactory}. It is
+ * thus recommended to use that to create a Description object, like this:
+ *
+ * $description = $descriptionFactory->create('This is a {@see Description}', $context);
+ *
+ * The description factory will interpret the given body and create a body template and list of tags from them, and pass
+ * that onto the constructor if this class.
+ *
+ * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace
+ * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial
+ * > type names and FQSENs.
+ *
+ * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this:
+ *
+ * $description = new Description(
+ * 'This is a %1$s',
+ * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ]
+ * );
+ *
+ * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object
+ * is mainly responsible for rendering.
+ *
+ * @see DescriptionFactory to create a new Description.
+ * @see Description\Formatter for the formatting of the body and tags.
+ */
+class Description
+{
+ /** @var string */
+ private $bodyTemplate;
+
+ /** @var Tag[] */
+ private $tags;
+
+ /**
+ * Initializes a Description with its body (template) and a listing of the tags used in the body template.
+ *
+ * @param string $bodyTemplate
+ * @param Tag[] $tags
+ */
+ public function __construct($bodyTemplate, array $tags = [])
+ {
+ Assert::string($bodyTemplate);
+
+ $this->bodyTemplate = $bodyTemplate;
+ $this->tags = $tags;
+ }
+
+ /**
+ * Renders this description as a string where the provided formatter will format the tags in the expected string
+ * format.
+ *
+ * @param Formatter|null $formatter
+ *
+ * @return string
+ */
+ public function render(Formatter $formatter = null)
+ {
+ if ($formatter === null) {
+ $formatter = new PassthroughFormatter();
+ }
+
+ $tags = [];
+ foreach ($this->tags as $tag) {
+ $tags[] = '{' . $formatter->format($tag) . '}';
+ }
+ return vsprintf($this->bodyTemplate, $tags);
+ }
+
+ /**
+ * Returns a plain string representation of this description.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->render();
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php
new file mode 100644
index 00000000..f34d0f7e
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php
@@ -0,0 +1,192 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+
+/**
+ * Creates a new Description object given a body of text.
+ *
+ * Descriptions in phpDocumentor are somewhat complex entities as they can contain one or more tags inside their
+ * body that can be replaced with a readable output. The replacing is done by passing a Formatter object to the
+ * Description object's `render` method.
+ *
+ * In addition to the above does a Description support two types of escape sequences:
+ *
+ * 1. `{@}` to escape the `@` character to prevent it from being interpreted as part of a tag, i.e. `{{@}link}`
+ * 2. `{}` to escape the `}` character, this can be used if you want to use the `}` character in the description
+ * of an inline tag.
+ *
+ * If a body consists of multiple lines then this factory will also remove any superfluous whitespace at the beginning
+ * of each line while maintaining any indentation that is used. This will prevent formatting parsers from tripping
+ * over unexpected spaces as can be observed with tag descriptions.
+ */
+class DescriptionFactory
+{
+ /** @var TagFactory */
+ private $tagFactory;
+
+ /**
+ * Initializes this factory with the means to construct (inline) tags.
+ *
+ * @param TagFactory $tagFactory
+ */
+ public function __construct(TagFactory $tagFactory)
+ {
+ $this->tagFactory = $tagFactory;
+ }
+
+ /**
+ * Returns the parsed text of this description.
+ *
+ * @param string $contents
+ * @param TypeContext $context
+ *
+ * @return Description
+ */
+ public function create($contents, TypeContext $context = null)
+ {
+ list($text, $tags) = $this->parse($this->lex($contents), $context);
+
+ return new Description($text, $tags);
+ }
+
+ /**
+ * Strips the contents from superfluous whitespace and splits the description into a series of tokens.
+ *
+ * @param string $contents
+ *
+ * @return string[] A series of tokens of which the description text is composed.
+ */
+ private function lex($contents)
+ {
+ $contents = $this->removeSuperfluousStartingWhitespace($contents);
+
+ // performance optimalization; if there is no inline tag, don't bother splitting it up.
+ if (strpos($contents, '{@') === false) {
+ return [$contents];
+ }
+
+ return preg_split(
+ '/\{
+ # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally.
+ (?!@\})
+ # We want to capture the whole tag line, but without the inline tag delimiters.
+ (\@
+ # Match everything up to the next delimiter.
+ [^{}]*
+ # Nested inline tag content should not be captured, or it will appear in the result separately.
+ (?:
+ # Match nested inline tags.
+ (?:
+ # Because we did not catch the tag delimiters earlier, we must be explicit with them here.
+ # Notice that this also matches "{}", as a way to later introduce it as an escape sequence.
+ \{(?1)?\}
+ |
+ # Make sure we match hanging "{".
+ \{
+ )
+ # Match content after the nested inline tag.
+ [^{}]*
+ )* # If there are more inline tags, match them as well. We use "*" since there may not be any
+ # nested inline tags.
+ )
+ \}/Sux',
+ $contents,
+ null,
+ PREG_SPLIT_DELIM_CAPTURE
+ );
+ }
+
+ /**
+ * Parses the stream of tokens in to a new set of tokens containing Tags.
+ *
+ * @param string[] $tokens
+ * @param TypeContext $context
+ *
+ * @return string[]|Tag[]
+ */
+ private function parse($tokens, TypeContext $context)
+ {
+ $count = count($tokens);
+ $tagCount = 0;
+ $tags = [];
+
+ for ($i = 1; $i < $count; $i += 2) {
+ $tags[] = $this->tagFactory->create($tokens[$i], $context);
+ $tokens[$i] = '%' . ++$tagCount . '$s';
+ }
+
+ //In order to allow "literal" inline tags, the otherwise invalid
+ //sequence "{@}" is changed to "@", and "{}" is changed to "}".
+ //"%" is escaped to "%%" because of vsprintf.
+ //See unit tests for examples.
+ for ($i = 0; $i < $count; $i += 2) {
+ $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]);
+ }
+
+ return [implode('', $tokens), $tags];
+ }
+
+ /**
+ * Removes the superfluous from a multi-line description.
+ *
+ * When a description has more than one line then it can happen that the second and subsequent lines have an
+ * additional indentation. This is commonly in use with tags like this:
+ *
+ * {@}since 1.1.0 This is an example
+ * description where we have an
+ * indentation in the second and
+ * subsequent lines.
+ *
+ * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent
+ * lines and this may cause rendering issues when, for example, using a Markdown converter.
+ *
+ * @param string $contents
+ *
+ * @return string
+ */
+ private function removeSuperfluousStartingWhitespace($contents)
+ {
+ $lines = explode("\n", $contents);
+
+ // if there is only one line then we don't have lines with superfluous whitespace and
+ // can use the contents as-is
+ if (count($lines) <= 1) {
+ return $contents;
+ }
+
+ // determine how many whitespace characters need to be stripped
+ $startingSpaceCount = 9999999;
+ for ($i = 1; $i < count($lines); $i++) {
+ // lines with a no length do not count as they are not indented at all
+ if (strlen(trim($lines[$i])) === 0) {
+ continue;
+ }
+
+ // determine the number of prefixing spaces by checking the difference in line length before and after
+ // an ltrim
+ $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i])));
+ }
+
+ // strip the number of spaces from each line
+ if ($startingSpaceCount > 0) {
+ for ($i = 1; $i < count($lines); $i++) {
+ $lines[$i] = substr($lines[$i], $startingSpaceCount);
+ }
+ }
+
+ return implode("\n", $lines);
+ }
+
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php
new file mode 100644
index 00000000..3cc5dab3
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php
@@ -0,0 +1,170 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Example;
+
+/**
+ * Class used to find an example file's location based on a given ExampleDescriptor.
+ */
+class ExampleFinder
+{
+ /** @var string */
+ private $sourceDirectory = '';
+
+ /** @var string[] */
+ private $exampleDirectories = array();
+
+ /**
+ * Attempts to find the example contents for the given descriptor.
+ *
+ * @param Example $example
+ *
+ * @return string
+ */
+ public function find(Example $example)
+ {
+ $filename = $example->getFilePath();
+
+ $file = $this->getExampleFileContents($filename);
+ if (!$file) {
+ return "** File not found : {$filename} **";
+ }
+
+ return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount()));
+ }
+
+ /**
+ * Registers the project's root directory where an 'examples' folder can be expected.
+ *
+ * @param string $directory
+ *
+ * @return void
+ */
+ public function setSourceDirectory($directory = '')
+ {
+ $this->sourceDirectory = $directory;
+ }
+
+ /**
+ * Returns the project's root directory where an 'examples' folder can be expected.
+ *
+ * @return string
+ */
+ public function getSourceDirectory()
+ {
+ return $this->sourceDirectory;
+ }
+
+ /**
+ * Registers a series of directories that may contain examples.
+ *
+ * @param string[] $directories
+ */
+ public function setExampleDirectories(array $directories)
+ {
+ $this->exampleDirectories = $directories;
+ }
+
+ /**
+ * Returns a series of directories that may contain examples.
+ *
+ * @return string[]
+ */
+ public function getExampleDirectories()
+ {
+ return $this->exampleDirectories;
+ }
+
+ /**
+ * Attempts to find the requested example file and returns its contents or null if no file was found.
+ *
+ * This method will try several methods in search of the given example file, the first one it encounters is
+ * returned:
+ *
+ * 1. Iterates through all examples folders for the given filename
+ * 2. Checks the source folder for the given filename
+ * 3. Checks the 'examples' folder in the current working directory for examples
+ * 4. Checks the path relative to the current working directory for the given filename
+ *
+ * @param string $filename
+ *
+ * @return string|null
+ */
+ private function getExampleFileContents($filename)
+ {
+ $normalizedPath = null;
+
+ foreach ($this->exampleDirectories as $directory) {
+ $exampleFileFromConfig = $this->constructExamplePath($directory, $filename);
+ if (is_readable($exampleFileFromConfig)) {
+ $normalizedPath = $exampleFileFromConfig;
+ break;
+ }
+ }
+
+ if (!$normalizedPath) {
+ if (is_readable($this->getExamplePathFromSource($filename))) {
+ $normalizedPath = $this->getExamplePathFromSource($filename);
+ } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) {
+ $normalizedPath = $this->getExamplePathFromExampleDirectory($filename);
+ } elseif (is_readable($filename)) {
+ $normalizedPath = $filename;
+ }
+ }
+
+ return $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : null;
+ }
+
+ /**
+ * Get example filepath based on the example directory inside your project.
+ *
+ * @param string $file
+ *
+ * @return string
+ */
+ private function getExamplePathFromExampleDirectory($file)
+ {
+ return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file;
+ }
+
+ /**
+ * Returns a path to the example file in the given directory..
+ *
+ * @param string $directory
+ * @param string $file
+ *
+ * @return string
+ */
+ private function constructExamplePath($directory, $file)
+ {
+ return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file;
+ }
+
+ /**
+ * Get example filepath based on sourcecode.
+ *
+ * @param string $file
+ *
+ * @return string
+ */
+ private function getExamplePathFromSource($file)
+ {
+ return sprintf(
+ '%s%s%s',
+ trim($this->getSourceDirectory(), '\\/'),
+ DIRECTORY_SEPARATOR,
+ trim($file, '"')
+ );
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
new file mode 100644
index 00000000..7f1c89d3
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
@@ -0,0 +1,143 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock;
+use Webmozart\Assert\Assert;
+
+/**
+ * Converts a DocBlock back from an object to a complete DocComment including Asterisks.
+ */
+class Serializer
+{
+ /** @var string The string to indent the comment with. */
+ protected $indentString = ' ';
+
+ /** @var int The number of times the indent string is repeated. */
+ protected $indent = 0;
+
+ /** @var bool Whether to indent the first line with the given indent amount and string. */
+ protected $isFirstLineIndented = true;
+
+ /** @var int|null The max length of a line. */
+ protected $lineLength = null;
+
+ /**
+ * Create a Serializer instance.
+ *
+ * @param int $indent The number of times the indent string is repeated.
+ * @param string $indentString The string to indent the comment with.
+ * @param bool $indentFirstLine Whether to indent the first line.
+ * @param int|null $lineLength The max length of a line or NULL to disable line wrapping.
+ */
+ public function __construct($indent = 0, $indentString = ' ', $indentFirstLine = true, $lineLength = null)
+ {
+ Assert::integer($indent);
+ Assert::string($indentString);
+ Assert::boolean($indentFirstLine);
+ Assert::nullOrInteger($lineLength);
+
+ $this->indent = $indent;
+ $this->indentString = $indentString;
+ $this->isFirstLineIndented = $indentFirstLine;
+ $this->lineLength = $lineLength;
+ }
+
+ /**
+ * Generate a DocBlock comment.
+ *
+ * @param DocBlock $docblock The DocBlock to serialize.
+ *
+ * @return string The serialized doc block.
+ */
+ public function getDocComment(DocBlock $docblock)
+ {
+ $indent = str_repeat($this->indentString, $this->indent);
+ $firstIndent = $this->isFirstLineIndented ? $indent : '';
+ // 3 === strlen(' * ')
+ $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null;
+
+ $text = $this->removeTrailingSpaces(
+ $indent,
+ $this->addAsterisksForEachLine(
+ $indent,
+ $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength)
+ )
+ );
+
+ $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n";
+ $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment);
+ $comment .= $indent . ' */';
+
+ return $comment;
+ }
+
+ /**
+ * @param $indent
+ * @param $text
+ * @return mixed
+ */
+ private function removeTrailingSpaces($indent, $text)
+ {
+ return str_replace("\n{$indent} * \n", "\n{$indent} *\n", $text);
+ }
+
+ /**
+ * @param $indent
+ * @param $text
+ * @return mixed
+ */
+ private function addAsterisksForEachLine($indent, $text)
+ {
+ return str_replace("\n", "\n{$indent} * ", $text);
+ }
+
+ /**
+ * @param DocBlock $docblock
+ * @param $wrapLength
+ * @return string
+ */
+ private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, $wrapLength)
+ {
+ $text = $docblock->getSummary() . ((string)$docblock->getDescription() ? "\n\n" . $docblock->getDescription()
+ : '');
+ if ($wrapLength !== null) {
+ $text = wordwrap($text, $wrapLength);
+ return $text;
+ }
+ return $text;
+ }
+
+ /**
+ * @param DocBlock $docblock
+ * @param $wrapLength
+ * @param $indent
+ * @param $comment
+ * @return string
+ */
+ private function addTagBlock(DocBlock $docblock, $wrapLength, $indent, $comment)
+ {
+ foreach ($docblock->getTags() as $tag) {
+ $formatter = new DocBlock\Tags\Formatter\PassthroughFormatter();
+ $tagText = $formatter->format($tag);
+ if ($wrapLength !== null) {
+ $tagText = wordwrap($tagText, $wrapLength);
+ }
+ $tagText = str_replace("\n", "\n{$indent} * ", $tagText);
+
+ $comment .= "{$indent} * {$tagText}\n";
+ }
+
+ return $comment;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php
new file mode 100644
index 00000000..0a656466
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php
@@ -0,0 +1,314 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Factory\StaticMethod;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Creates a Tag object given the contents of a tag.
+ *
+ * This Factory is capable of determining the appropriate class for a tag and instantiate it using its `create`
+ * factory method. The `create` factory method of a Tag can have a variable number of arguments; this way you can
+ * pass the dependencies that you need to construct a tag object.
+ *
+ * > Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise
+ * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to
+ * > verify that a dependency is actually passed.
+ *
+ * This Factory also features a Service Locator component that is used to pass the right dependencies to the
+ * `create` method of a tag; each dependency should be registered as a service or as a parameter.
+ *
+ * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass
+ * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface.
+ */
+final class StandardTagFactory implements TagFactory
+{
+ /** PCRE regular expression matching a tag name. */
+ const REGEX_TAGNAME = '[\w\-\_\\\\]+';
+
+ /**
+ * @var string[] An array with a tag as a key, and an FQCN to a class that handles it as an array value.
+ */
+ private $tagHandlerMappings = [
+ 'author' => '\phpDocumentor\Reflection\DocBlock\Tags\Author',
+ 'covers' => '\phpDocumentor\Reflection\DocBlock\Tags\Covers',
+ 'deprecated' => '\phpDocumentor\Reflection\DocBlock\Tags\Deprecated',
+ // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example',
+ 'link' => '\phpDocumentor\Reflection\DocBlock\Tags\Link',
+ 'method' => '\phpDocumentor\Reflection\DocBlock\Tags\Method',
+ 'param' => '\phpDocumentor\Reflection\DocBlock\Tags\Param',
+ 'property-read' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyRead',
+ 'property' => '\phpDocumentor\Reflection\DocBlock\Tags\Property',
+ 'property-write' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite',
+ 'return' => '\phpDocumentor\Reflection\DocBlock\Tags\Return_',
+ 'see' => '\phpDocumentor\Reflection\DocBlock\Tags\See',
+ 'since' => '\phpDocumentor\Reflection\DocBlock\Tags\Since',
+ 'source' => '\phpDocumentor\Reflection\DocBlock\Tags\Source',
+ 'throw' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws',
+ 'throws' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws',
+ 'uses' => '\phpDocumentor\Reflection\DocBlock\Tags\Uses',
+ 'var' => '\phpDocumentor\Reflection\DocBlock\Tags\Var_',
+ 'version' => '\phpDocumentor\Reflection\DocBlock\Tags\Version'
+ ];
+
+ /**
+ * @var \ReflectionParameter[][] a lazy-loading cache containing parameters for each tagHandler that has been used.
+ */
+ private $tagHandlerParameterCache = [];
+
+ /**
+ * @var FqsenResolver
+ */
+ private $fqsenResolver;
+
+ /**
+ * @var mixed[] an array representing a simple Service Locator where we can store parameters and
+ * services that can be inserted into the Factory Methods of Tag Handlers.
+ */
+ private $serviceLocator = [];
+
+ /**
+ * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers.
+ *
+ * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property
+ * is used.
+ *
+ * @param FqsenResolver $fqsenResolver
+ * @param string[] $tagHandlers
+ *
+ * @see self::registerTagHandler() to add a new tag handler to the existing default list.
+ */
+ public function __construct(FqsenResolver $fqsenResolver, array $tagHandlers = null)
+ {
+ $this->fqsenResolver = $fqsenResolver;
+ if ($tagHandlers !== null) {
+ $this->tagHandlerMappings = $tagHandlers;
+ }
+
+ $this->addService($fqsenResolver, FqsenResolver::class);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function create($tagLine, TypeContext $context = null)
+ {
+ if (! $context) {
+ $context = new TypeContext('');
+ }
+
+ list($tagName, $tagBody) = $this->extractTagParts($tagLine);
+
+ return $this->createTag($tagBody, $tagName, $context);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function addParameter($name, $value)
+ {
+ $this->serviceLocator[$name] = $value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function addService($service, $alias = null)
+ {
+ $this->serviceLocator[$alias ?: get_class($service)] = $service;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function registerTagHandler($tagName, $handler)
+ {
+ Assert::stringNotEmpty($tagName);
+ Assert::stringNotEmpty($handler);
+ Assert::classExists($handler);
+ Assert::implementsInterface($handler, StaticMethod::class);
+
+ if (strpos($tagName, '\\') && $tagName[0] !== '\\') {
+ throw new \InvalidArgumentException(
+ 'A namespaced tag must have a leading backslash as it must be fully qualified'
+ );
+ }
+
+ $this->tagHandlerMappings[$tagName] = $handler;
+ }
+
+ /**
+ * Extracts all components for a tag.
+ *
+ * @param string $tagLine
+ *
+ * @return string[]
+ */
+ private function extractTagParts($tagLine)
+ {
+ $matches = array();
+ if (! preg_match('/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us', $tagLine, $matches)) {
+ throw new \InvalidArgumentException(
+ 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors'
+ );
+ }
+
+ if (count($matches) < 3) {
+ $matches[] = '';
+ }
+
+ return array_slice($matches, 1);
+ }
+
+ /**
+ * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the
+ * body was invalid.
+ *
+ * @param string $body
+ * @param string $name
+ * @param TypeContext $context
+ *
+ * @return Tag|null
+ */
+ private function createTag($body, $name, TypeContext $context)
+ {
+ $handlerClassName = $this->findHandlerClassName($name, $context);
+ $arguments = $this->getArgumentsForParametersFromWiring(
+ $this->fetchParametersForHandlerFactoryMethod($handlerClassName),
+ $this->getServiceLocatorWithDynamicParameters($context, $name, $body)
+ )
+ ;
+
+ return call_user_func_array([$handlerClassName, 'create'], $arguments);
+ }
+
+ /**
+ * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`).
+ *
+ * @param string $tagName
+ * @param TypeContext $context
+ *
+ * @return string
+ */
+ private function findHandlerClassName($tagName, TypeContext $context)
+ {
+ $handlerClassName = Generic::class;
+ if (isset($this->tagHandlerMappings[$tagName])) {
+ $handlerClassName = $this->tagHandlerMappings[$tagName];
+ } elseif ($this->isAnnotation($tagName)) {
+ // TODO: Annotation support is planned for a later stage and as such is disabled for now
+ // $tagName = (string)$this->fqsenResolver->resolve($tagName, $context);
+ // if (isset($this->annotationMappings[$tagName])) {
+ // $handlerClassName = $this->annotationMappings[$tagName];
+ // }
+ }
+
+ return $handlerClassName;
+ }
+
+ /**
+ * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters.
+ *
+ * @param \ReflectionParameter[] $parameters
+ * @param mixed[] $locator
+ *
+ * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters
+ * is provided with this method.
+ */
+ private function getArgumentsForParametersFromWiring($parameters, $locator)
+ {
+ $arguments = [];
+ foreach ($parameters as $index => $parameter) {
+ $typeHint = $parameter->getClass() ? $parameter->getClass()->getName() : null;
+ if (isset($locator[$typeHint])) {
+ $arguments[] = $locator[$typeHint];
+ continue;
+ }
+
+ $parameterName = $parameter->getName();
+ if (isset($locator[$parameterName])) {
+ $arguments[] = $locator[$parameterName];
+ continue;
+ }
+
+ $arguments[] = null;
+ }
+
+ return $arguments;
+ }
+
+ /**
+ * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given
+ * tag handler class name.
+ *
+ * @param string $handlerClassName
+ *
+ * @return \ReflectionParameter[]
+ */
+ private function fetchParametersForHandlerFactoryMethod($handlerClassName)
+ {
+ if (! isset($this->tagHandlerParameterCache[$handlerClassName])) {
+ $methodReflection = new \ReflectionMethod($handlerClassName, 'create');
+ $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters();
+ }
+
+ return $this->tagHandlerParameterCache[$handlerClassName];
+ }
+
+ /**
+ * Returns a copy of this class' Service Locator with added dynamic parameters, such as the tag's name, body and
+ * Context.
+ *
+ * @param TypeContext $context The Context (namespace and aliasses) that may be passed and is used to resolve FQSENs.
+ * @param string $tagName The name of the tag that may be passed onto the factory method of the Tag class.
+ * @param string $tagBody The body of the tag that may be passed onto the factory method of the Tag class.
+ *
+ * @return mixed[]
+ */
+ private function getServiceLocatorWithDynamicParameters(TypeContext $context, $tagName, $tagBody)
+ {
+ $locator = array_merge(
+ $this->serviceLocator,
+ [
+ 'name' => $tagName,
+ 'body' => $tagBody,
+ TypeContext::class => $context
+ ]
+ );
+
+ return $locator;
+ }
+
+ /**
+ * Returns whether the given tag belongs to an annotation.
+ *
+ * @param string $tagContent
+ *
+ * @todo this method should be populated once we implement Annotation notation support.
+ *
+ * @return bool
+ */
+ private function isAnnotation($tagContent)
+ {
+ // 1. Contains a namespace separator
+ // 2. Contains parenthesis
+ // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part
+ // of the annotation class name matches the found tag name
+
+ return false;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php
new file mode 100644
index 00000000..e7653678
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php
@@ -0,0 +1,26 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+interface Tag
+{
+ public function getName();
+
+ public static function create($body);
+
+ public function render(Formatter $formatter = null);
+
+ public function __toString();
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php
new file mode 100644
index 00000000..3c1d1132
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php
@@ -0,0 +1,93 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+
+interface TagFactory
+{
+ /**
+ * Adds a parameter to the service locator that can be injected in a tag's factory method.
+ *
+ * When calling a tag's "create" method we always check the signature for dependencies to inject. One way is to
+ * typehint a parameter in the signature so that we can use that interface or class name to inject a dependency
+ * (see {@see addService()} for more information on that).
+ *
+ * Another way is to check the name of the argument against the names in the Service Locator. With this method
+ * you can add a variable that will be inserted when a tag's create method is not typehinted and has a matching
+ * name.
+ *
+ * Be aware that there are two reserved names:
+ *
+ * - name, representing the name of the tag.
+ * - body, representing the complete body of the tag.
+ *
+ * These parameters are injected at the last moment and will override any existing parameter with those names.
+ *
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return void
+ */
+ public function addParameter($name, $value);
+
+ /**
+ * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided.
+ *
+ * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter
+ * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint.
+ *
+ * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the
+ * interface is passed as alias then every time that interface is requested the provided service will be returned.
+ *
+ * @param object $service
+ * @param string $alias
+ *
+ * @return void
+ */
+ public function addService($service);
+
+ /**
+ * Factory method responsible for instantiating the correct sub type.
+ *
+ * @param string $tagLine The text for this tag, including description.
+ * @param TypeContext $context
+ *
+ * @throws \InvalidArgumentException if an invalid tag line was presented.
+ *
+ * @return Tag A new tag object.
+ */
+ public function create($tagLine, TypeContext $context = null);
+
+ /**
+ * Registers a handler for tags.
+ *
+ * If you want to use your own tags then you can use this method to instruct the TagFactory to register the name
+ * of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement the {@see Tag} interface (and thus
+ * the create method).
+ *
+ * @param string $tagName Name of tag to register a handler for. When registering a namespaced tag, the full
+ * name, along with a prefixing slash MUST be provided.
+ * @param string $handler FQCN of handler.
+ *
+ * @throws \InvalidArgumentException if the tag name is not a string
+ * @throws \InvalidArgumentException if the tag name is namespaced (contains backslashes) but does not start with
+ * a backslash
+ * @throws \InvalidArgumentException if the handler is not a string
+ * @throws \InvalidArgumentException if the handler is not an existing class
+ * @throws \InvalidArgumentException if the handler does not implement the {@see Tag} interface
+ *
+ * @return void
+ */
+ public function registerTagHandler($tagName, $handler);
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php
new file mode 100644
index 00000000..41a27886
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php
@@ -0,0 +1,100 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for an {@}author tag in a Docblock.
+ */
+final class Author extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string register that this is the author tag. */
+ protected $name = 'author';
+
+ /** @var string The name of the author */
+ private $authorName = '';
+
+ /** @var string The email of the author */
+ private $authorEmail = '';
+
+ /**
+ * Initializes this tag with the author name and e-mail.
+ *
+ * @param string $authorName
+ * @param string $authorEmail
+ */
+ public function __construct($authorName, $authorEmail)
+ {
+ Assert::string($authorName);
+ Assert::string($authorEmail);
+ if ($authorEmail && !filter_var($authorEmail, FILTER_VALIDATE_EMAIL)) {
+ throw new \InvalidArgumentException('The author tag does not have a valid e-mail address');
+ }
+
+ $this->authorName = $authorName;
+ $this->authorEmail = $authorEmail;
+ }
+
+ /**
+ * Gets the author's name.
+ *
+ * @return string The author's name.
+ */
+ public function getAuthorName()
+ {
+ return $this->authorName;
+ }
+
+ /**
+ * Returns the author's email.
+ *
+ * @return string The author's email.
+ */
+ public function getEmail()
+ {
+ return $this->authorEmail;
+ }
+
+ /**
+ * Returns this tag in string form.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->authorName . '<' . $this->authorEmail . '>';
+ }
+
+ /**
+ * Attempts to create a new Author object based on †he tag body.
+ *
+ * @param string $body
+ *
+ * @return static
+ */
+ public static function create($body)
+ {
+ Assert::string($body);
+
+ $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches);
+ if (!$splitTagContent) {
+ return null;
+ }
+
+ $authorName = trim($matches[1]);
+ $email = isset($matches[2]) ? trim($matches[2]) : '';
+
+ return new static($authorName, $email);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php
new file mode 100644
index 00000000..14bb7177
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php
@@ -0,0 +1,52 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock;
+use phpDocumentor\Reflection\DocBlock\Description;
+
+/**
+ * Parses a tag definition for a DocBlock.
+ */
+abstract class BaseTag implements DocBlock\Tag
+{
+ /** @var string Name of the tag */
+ protected $name = '';
+
+ /** @var Description|null Description of the tag. */
+ protected $description;
+
+ /**
+ * Gets the name of this tag.
+ *
+ * @return string The name of this tag.
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ public function render(Formatter $formatter = null)
+ {
+ if ($formatter === null) {
+ $formatter = new Formatter\PassthroughFormatter();
+ }
+
+ return $formatter->format($this);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php
new file mode 100644
index 00000000..31b4f82c
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php
@@ -0,0 +1,84 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\FqsenResolver;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a @covers tag in a Docblock.
+ */
+final class Covers extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'covers';
+
+ /** @var Fqsen */
+ private $refers = null;
+
+ /**
+ * Initializes this tag.
+ *
+ * @param Fqsen $refers
+ * @param Description $description
+ */
+ public function __construct(Fqsen $refers, Description $description = null)
+ {
+ $this->refers = $refers;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ DescriptionFactory $descriptionFactory = null,
+ FqsenResolver $resolver = null,
+ TypeContext $context = null
+ )
+ {
+ Assert::string($body);
+ Assert::notEmpty($body);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ return new static(
+ $resolver->resolve($parts[0], $context),
+ $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context)
+ );
+ }
+
+ /**
+ * Returns the structural element this tag refers to.
+ *
+ * @return Fqsen
+ */
+ public function getReference()
+ {
+ return $this->refers;
+ }
+
+ /**
+ * Returns a string representation of this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->refers . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php
new file mode 100644
index 00000000..7c1039fa
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php
@@ -0,0 +1,97 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}deprecated tag in a Docblock.
+ */
+final class Deprecated extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'deprecated';
+
+ /**
+ * PCRE regular expression matching a version vector.
+ * Assumes the "x" modifier.
+ */
+ const REGEX_VECTOR = '(?:
+ # Normal release vectors.
+ \d\S*
+ |
+ # VCS version vectors. Per PHPCS, they are expected to
+ # follow the form of the VCS name, followed by ":", followed
+ # by the version vector itself.
+ # By convention, popular VCSes like CVS, SVN and GIT use "$"
+ # around the actual version vector.
+ [^\s\:]+\:\s*\$[^\$]+\$
+ )';
+
+ /** @var string The version vector. */
+ private $version = '';
+
+ public function __construct($version = null, Description $description = null)
+ {
+ Assert::nullOrStringNotEmpty($version);
+
+ $this->version = $version;
+ $this->description = $description;
+ }
+
+ /**
+ * @return static
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::nullOrString($body);
+ if (empty($body)) {
+ return new static();
+ }
+
+ $matches = [];
+ if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) {
+ return new static(
+ null,
+ null !== $descriptionFactory ? $descriptionFactory->create($body, $context) : null
+ );
+ }
+
+ return new static(
+ $matches[1],
+ $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context)
+ );
+ }
+
+ /**
+ * Gets the version section of the tag.
+ *
+ * @return string
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->version . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php
new file mode 100644
index 00000000..571ef8df
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php
@@ -0,0 +1,158 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a {@}example tag in a Docblock.
+ */
+final class Example extends BaseTag
+{
+ /**
+ * @var string Path to a file to use as an example. May also be an absolute URI.
+ */
+ private $filePath = '';
+
+ /**
+ * @var bool Whether the file path component represents an URI. This determines how the file portion
+ * appears at {@link getContent()}.
+ */
+ private $isURI = false;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->description) {
+ $filePath = '"' . $this->filePath . '"';
+ if ($this->isURI) {
+ $filePath = $this->isUriRelative($this->filePath)
+ ? str_replace('%2F', '/', rawurlencode($this->filePath))
+ :$this->filePath;
+ }
+
+ $this->description = $filePath . ' ' . parent::getContent();
+ }
+
+ return $this->description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create($body)
+ {
+ // File component: File path in quotes or File URI / Source information
+ if (! preg_match('/^(?:\"([^\"]+)\"|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) {
+ return null;
+ }
+
+ $filePath = null;
+ $fileUri = null;
+ if ('' !== $matches[1]) {
+ $filePath = $matches[1];
+ } else {
+ $fileUri = $matches[2];
+ }
+
+ $startingLine = 1;
+ $lineCount = null;
+ $description = null;
+
+ // Starting line / Number of lines / Description
+ if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $matches[3], $matches)) {
+ $startingLine = (int)$matches[1];
+ if (isset($matches[2]) && $matches[2] !== '') {
+ $lineCount = (int)$matches[2];
+ }
+ $description = $matches[3];
+ }
+
+ return new static($filePath, $fileUri, $startingLine, $lineCount, $description);
+ }
+
+ /**
+ * Returns the file path.
+ *
+ * @return string Path to a file to use as an example.
+ * May also be an absolute URI.
+ */
+ public function getFilePath()
+ {
+ return $this->filePath;
+ }
+
+ /**
+ * Sets the file path.
+ *
+ * @param string $filePath The new file path to use for the example.
+ *
+ * @return $this
+ */
+ public function setFilePath($filePath)
+ {
+ $this->isURI = false;
+ $this->filePath = trim($filePath);
+
+ $this->description = null;
+ return $this;
+ }
+
+ /**
+ * Sets the file path as an URI.
+ *
+ * This function is equivalent to {@link setFilePath()}, except that it
+ * converts an URI to a file path before that.
+ *
+ * There is no getFileURI(), as {@link getFilePath()} is compatible.
+ *
+ * @param string $uri The new file URI to use as an example.
+ *
+ * @return $this
+ */
+ public function setFileURI($uri)
+ {
+ $this->isURI = true;
+ $this->description = null;
+
+ $this->filePath = $this->isUriRelative($uri)
+ ? rawurldecode(str_replace(array('/', '\\'), '%2F', $uri))
+ : $this->filePath = $uri;
+
+ return $this;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->filePath . ($this->description ? ' ' . $this->description->render() : '');
+ }
+
+ /**
+ * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute).
+ *
+ * @param string $uri
+ *
+ * @return bool
+ */
+ private function isUriRelative($uri)
+ {
+ return false === strpos($uri, ':');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php
new file mode 100644
index 00000000..98aea455
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php
@@ -0,0 +1,18 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Factory;
+
+interface StaticMethod
+{
+ public static function create($body);
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php
new file mode 100644
index 00000000..b9ca0b8a
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php
@@ -0,0 +1,18 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Factory;
+
+interface Strategy
+{
+ public function create($body);
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php
new file mode 100644
index 00000000..64b2c603
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php
@@ -0,0 +1,27 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+interface Formatter
+{
+ /**
+ * Formats a tag into a string representation according to a specific format, such as Markdown.
+ *
+ * @param Tag $tag
+ *
+ * @return string
+ */
+ public function format(Tag $tag);
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php
new file mode 100644
index 00000000..aa97572c
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+class PassthroughFormatter implements Formatter
+{
+ /**
+ * Formats the given tag to return a simple plain text version.
+ *
+ * @param Tag $tag
+ *
+ * @return string
+ */
+ public function format(Tag $tag)
+ {
+ return '@' . $tag->getName() . ' ' . (string)$tag;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php
new file mode 100644
index 00000000..e4c53e00
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php
@@ -0,0 +1,91 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Parses a tag definition for a DocBlock.
+ */
+class Generic extends BaseTag implements Factory\StaticMethod
+{
+ /**
+ * Parses a tag and populates the member variables.
+ *
+ * @param string $name Name of the tag.
+ * @param Description $description The contents of the given tag.
+ */
+ public function __construct($name, Description $description = null)
+ {
+ $this->validateTagName($name);
+
+ $this->name = $name;
+ $this->description = $description;
+ }
+
+ /**
+ * Creates a new tag that represents any unknown tag type.
+ *
+ * @param string $body
+ * @param string $name
+ * @param DescriptionFactory $descriptionFactory
+ * @param TypeContext $context
+ *
+ * @return static
+ */
+ public static function create(
+ $body,
+ $name = '',
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::stringNotEmpty($name);
+ Assert::notNull($descriptionFactory);
+
+ $description = $descriptionFactory && $body ? $descriptionFactory->create($body, $context) : null;
+
+ return new static($name, $description);
+ }
+
+ /**
+ * Returns the tag as a serialized string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->description ? $this->description->render() : '');
+ }
+
+ /**
+ * Validates if the tag name matches the expected format, otherwise throws an exception.
+ *
+ * @param string $name
+ *
+ * @return void
+ */
+ private function validateTagName($name)
+ {
+ if (! preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) {
+ throw new \InvalidArgumentException(
+ 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, '
+ . 'hyphens and backslashes.'
+ );
+ }
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php
new file mode 100644
index 00000000..9c0e367e
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php
@@ -0,0 +1,77 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a @link tag in a Docblock.
+ */
+final class Link extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'link';
+
+ /** @var string */
+ private $link = '';
+
+ /**
+ * Initializes a link to a URL.
+ *
+ * @param string $link
+ * @param Description $description
+ */
+ public function __construct($link, Description $description = null)
+ {
+ Assert::string($link);
+
+ $this->link = $link;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::string($body);
+ Assert::notNull($descriptionFactory);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+ $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null;
+
+ return new static($parts[0], $description);
+ }
+
+ /**
+ * Gets the link
+ *
+ * @return string
+ */
+ public function getLink()
+ {
+ return $this->link;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->link . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php
new file mode 100644
index 00000000..d600aaaa
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php
@@ -0,0 +1,230 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\Types\Void_;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for an {@}method in a Docblock.
+ */
+final class Method extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'method';
+
+ /** @var string */
+ private $methodName = '';
+
+ /** @var string[] */
+ private $arguments = [];
+
+ /** @var bool */
+ private $isStatic = false;
+
+ /** @var Type */
+ private $returnType;
+
+ public function __construct(
+ $methodName,
+ array $arguments = [],
+ Type $returnType = null,
+ $static = false,
+ Description $description = null
+ ) {
+ Assert::stringNotEmpty($methodName);
+ Assert::boolean($static);
+
+ if ($returnType === null) {
+ $returnType = new Void_();
+ }
+
+ $this->methodName = $methodName;
+ $this->arguments = $this->filterArguments($arguments);
+ $this->returnType = $returnType;
+ $this->isStatic = $static;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([ $typeResolver, $descriptionFactory ]);
+
+ // 1. none or more whitespace
+ // 2. optionally the keyword "static" followed by whitespace
+ // 3. optionally a word with underscores followed by whitespace : as
+ // type for the return value
+ // 4. then optionally a word with underscores followed by () and
+ // whitespace : as method name as used by phpDocumentor
+ // 5. then a word with underscores, followed by ( and any character
+ // until a ) and whitespace : as method name with signature
+ // 6. any remaining text : as description
+ if (!preg_match(
+ '/^
+ # Static keyword
+ # Declares a static method ONLY if type is also present
+ (?:
+ (static)
+ \s+
+ )?
+ # Return type
+ (?:
+ (
+ (?:[\w\|_\\\\]+)
+ # array notation
+ (?:\[\])*
+ )?
+ \s+
+ )?
+ # Legacy method name (not captured)
+ (?:
+ [\w_]+\(\)\s+
+ )?
+ # Method name
+ ([\w\|_\\\\]+)
+ # Arguments
+ (?:
+ \(([^\)]*)\)
+ )?
+ \s*
+ # Description
+ (.*)
+ $/sux',
+ $body,
+ $matches
+ )) {
+ return null;
+ }
+
+ list(, $static, $returnType, $methodName, $arguments, $description) = $matches;
+
+ $static = $static === 'static';
+ $returnType = $typeResolver->resolve($returnType, $context);
+ $description = $descriptionFactory->create($description, $context);
+
+ if ('' !== $arguments) {
+ $arguments = explode(',', $arguments);
+ foreach($arguments as &$argument) {
+ $argument = explode(' ', self::stripRestArg(trim($argument)), 2);
+ if ($argument[0][0] === '$') {
+ $argumentName = substr($argument[0], 1);
+ $argumentType = new Void_();
+ } else {
+ $argumentType = $typeResolver->resolve($argument[0], $context);
+ $argumentName = '';
+ if (isset($argument[1])) {
+ $argument[1] = self::stripRestArg($argument[1]);
+ $argumentName = substr($argument[1], 1);
+ }
+ }
+
+ $argument = [ 'name' => $argumentName, 'type' => $argumentType];
+ }
+ } else {
+ $arguments = [];
+ }
+
+ return new static($methodName, $arguments, $returnType, $static, $description);
+ }
+
+ /**
+ * Retrieves the method name.
+ *
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getArguments()
+ {
+ return $this->arguments;
+ }
+
+ /**
+ * Checks whether the method tag describes a static method or not.
+ *
+ * @return bool TRUE if the method declaration is for a static method, FALSE otherwise.
+ */
+ public function isStatic()
+ {
+ return $this->isStatic;
+ }
+
+ /**
+ * @return Type
+ */
+ public function getReturnType()
+ {
+ return $this->returnType;
+ }
+
+ public function __toString()
+ {
+ $arguments = [];
+ foreach ($this->arguments as $argument) {
+ $arguments[] = $argument['type'] . ' $' . $argument['name'];
+ }
+
+ return ($this->isStatic() ? 'static ' : '')
+ . (string)$this->returnType . ' '
+ . $this->methodName
+ . '(' . implode(', ', $arguments) . ')'
+ . ($this->description ? ' ' . $this->description->render() : '');
+ }
+
+ private function filterArguments($arguments)
+ {
+ foreach ($arguments as &$argument) {
+ if (is_string($argument)) {
+ $argument = [ 'name' => $argument ];
+ }
+ if (! isset($argument['type'])) {
+ $argument['type'] = new Void_();
+ }
+ $keys = array_keys($argument);
+ if ($keys !== [ 'name', 'type' ]) {
+ throw new \InvalidArgumentException(
+ 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true)
+ );
+ }
+ }
+
+ return $arguments;
+ }
+
+ private static function stripRestArg($argument)
+ {
+ if (strpos($argument, '...') === 0) {
+ $argument = trim(substr($argument, 3));
+ }
+
+ return $argument;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php
new file mode 100644
index 00000000..1a51dc0d
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php
@@ -0,0 +1,141 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for the {@}param tag in a Docblock.
+ */
+final class Param extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'param';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ private $variableName = '';
+
+ /** @var bool determines whether this is a variadic argument */
+ private $isVariadic = false;
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param bool $isVariadic
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, $isVariadic = false, Description $description = null)
+ {
+ Assert::string($variableName);
+ Assert::boolean($isVariadic);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->isVariadic = $isVariadic;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+ $isVariadic = false;
+
+ // if the first item that is encountered is not a variable; it is a type
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ array_shift($parts);
+ }
+
+ // if the next item starts with a $ or ...$ it must be the variable name
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 3) === '...') {
+ $isVariadic = true;
+ $variableName = substr($variableName, 3);
+ }
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $isVariadic, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns whether this tag is variadic.
+ *
+ * @return boolean
+ */
+ public function isVariadic()
+ {
+ return $this->isVariadic;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . ($this->isVariadic() ? '...' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php
new file mode 100644
index 00000000..3c597133
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}property tag in a Docblock.
+ */
+class Property extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'property';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // if the first item that is encountered is not a variable; it is a type
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ array_shift($parts);
+ }
+
+ // if the next item starts with a $ or ...$ it must be the variable name
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php
new file mode 100644
index 00000000..bf2b8056
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}property-read tag in a Docblock.
+ */
+class PropertyRead extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'property-read';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // if the first item that is encountered is not a variable; it is a type
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ array_shift($parts);
+ }
+
+ // if the next item starts with a $ or ...$ it must be the variable name
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php
new file mode 100644
index 00000000..db37e0fb
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}property-write tag in a Docblock.
+ */
+class PropertyWrite extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'property-write';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // if the first item that is encountered is not a variable; it is a type
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ array_shift($parts);
+ }
+
+ // if the next item starts with a $ or ...$ it must be the variable name
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php
new file mode 100644
index 00000000..09a5870e
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php
@@ -0,0 +1,73 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}return tag in a Docblock.
+ */
+final class Return_ extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'return';
+
+ /** @var Type */
+ private $type;
+
+ public function __construct(Type $type, Description $description = null)
+ {
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ )
+ {
+ Assert::string($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context);
+ $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context);
+
+ return new static($type, $description);
+ }
+
+ /**
+ * Returns the type section of the variable.
+ *
+ * @return Type
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ public function __toString()
+ {
+ return $this->type . ' ' . $this->description;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php
new file mode 100644
index 00000000..64ee3d8e
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php
@@ -0,0 +1,81 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for an {@}see tag in a Docblock.
+ */
+class See extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'see';
+
+ /** @var Fqsen */
+ protected $refers = null;
+
+ /**
+ * Initializes this tag.
+ *
+ * @param Fqsen $refers
+ * @param Description $description
+ */
+ public function __construct(Fqsen $refers, Description $description = null)
+ {
+ $this->refers = $refers;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ FqsenResolver $resolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::allNotNull([$resolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+ $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null;
+
+ return new static($resolver->resolve($parts[0], $context), $description);
+ }
+
+ /**
+ * Returns the structural element this tag refers to.
+ *
+ * @return Fqsen
+ */
+ public function getReference()
+ {
+ return $this->refers;
+ }
+
+ /**
+ * Returns a string representation of this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->refers . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php
new file mode 100644
index 00000000..3d002ed3
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php
@@ -0,0 +1,94 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}since tag in a Docblock.
+ */
+final class Since extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'since';
+
+ /**
+ * PCRE regular expression matching a version vector.
+ * Assumes the "x" modifier.
+ */
+ const REGEX_VECTOR = '(?:
+ # Normal release vectors.
+ \d\S*
+ |
+ # VCS version vectors. Per PHPCS, they are expected to
+ # follow the form of the VCS name, followed by ":", followed
+ # by the version vector itself.
+ # By convention, popular VCSes like CVS, SVN and GIT use "$"
+ # around the actual version vector.
+ [^\s\:]+\:\s*\$[^\$]+\$
+ )';
+
+ /** @var string The version vector. */
+ private $version = '';
+
+ public function __construct($version = null, Description $description = null)
+ {
+ Assert::nullOrStringNotEmpty($version);
+
+ $this->version = $version;
+ $this->description = $description;
+ }
+
+ /**
+ * @return static
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::nullOrString($body);
+ if (empty($body)) {
+ return new static();
+ }
+
+ $matches = [];
+ if (! preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) {
+ return null;
+ }
+
+ return new static(
+ $matches[1],
+ $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context)
+ );
+ }
+
+ /**
+ * Gets the version section of the tag.
+ *
+ * @return string
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->version . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php
new file mode 100644
index 00000000..b0646b96
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php
@@ -0,0 +1,96 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}source tag in a Docblock.
+ */
+final class Source extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'source';
+
+ /** @var int The starting line, relative to the structural element's location. */
+ private $startingLine = 1;
+
+ /** @var int|null The number of lines, relative to the starting line. NULL means "to the end". */
+ private $lineCount = null;
+
+ public function __construct($startingLine, $lineCount = null, Description $description = null)
+ {
+ Assert::integerish($startingLine);
+ Assert::nullOrIntegerish($lineCount);
+
+ $this->startingLine = (int)$startingLine;
+ $this->lineCount = $lineCount !== null ? (int)$lineCount : null;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::stringNotEmpty($body);
+ Assert::notNull($descriptionFactory);
+
+ $startingLine = 1;
+ $lineCount = null;
+ $description = null;
+
+ // Starting line / Number of lines / Description
+ if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) {
+ $startingLine = (int)$matches[1];
+ if (isset($matches[2]) && $matches[2] !== '') {
+ $lineCount = (int)$matches[2];
+ }
+ $description = $matches[3];
+ }
+
+ return new static($startingLine, $lineCount, $descriptionFactory->create($description, $context));
+ }
+
+ /**
+ * Gets the starting line.
+ *
+ * @return int The starting line, relative to the structural element's
+ * location.
+ */
+ public function getStartingLine()
+ {
+ return $this->startingLine;
+ }
+
+ /**
+ * Returns the number of lines.
+ *
+ * @return int|null The number of lines, relative to the starting line. NULL
+ * means "to the end".
+ */
+ public function getLineCount()
+ {
+ return $this->lineCount;
+ }
+
+ public function __toString()
+ {
+ return $this->startingLine
+ . ($this->lineCount !== null ? ' ' . $this->lineCount : '')
+ . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php
new file mode 100644
index 00000000..349e773b
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php
@@ -0,0 +1,72 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}throws tag in a Docblock.
+ */
+final class Throws extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'throws';
+
+ /** @var Type */
+ private $type;
+
+ public function __construct(Type $type, Description $description = null)
+ {
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context);
+ $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context);
+
+ return new static($type, $description);
+ }
+
+ /**
+ * Returns the type section of the variable.
+ *
+ * @return Type
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ public function __toString()
+ {
+ return $this->type . ' ' . $this->description;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php
new file mode 100644
index 00000000..00dc3e3b
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php
@@ -0,0 +1,83 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}uses tag in a Docblock.
+ */
+final class Uses extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'uses';
+
+ /** @var Fqsen */
+ protected $refers = null;
+
+ /**
+ * Initializes this tag.
+ *
+ * @param Fqsen $refers
+ * @param Description $description
+ */
+ public function __construct(Fqsen $refers, Description $description = null)
+ {
+ $this->refers = $refers;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ FqsenResolver $resolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::allNotNull([$resolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ return new static(
+ $resolver->resolve($parts[0], $context),
+ $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context)
+ );
+ }
+
+ /**
+ * Returns the structural element this tag refers to.
+ *
+ * @return Fqsen
+ */
+ public function getReference()
+ {
+ return $this->refers;
+ }
+
+ /**
+ * Returns a string representation of this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->refers . ' ' . $this->description->render();
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php
new file mode 100644
index 00000000..e23c694b
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}var tag in a Docblock.
+ */
+class Var_ extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'var';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // if the first item that is encountered is not a variable; it is a type
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ array_shift($parts);
+ }
+
+ // if the next item starts with a $ or ...$ it must be the variable name
+ if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php
new file mode 100644
index 00000000..3e0e5bef
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php
@@ -0,0 +1,94 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}version tag in a Docblock.
+ */
+final class Version extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'version';
+
+ /**
+ * PCRE regular expression matching a version vector.
+ * Assumes the "x" modifier.
+ */
+ const REGEX_VECTOR = '(?:
+ # Normal release vectors.
+ \d\S*
+ |
+ # VCS version vectors. Per PHPCS, they are expected to
+ # follow the form of the VCS name, followed by ":", followed
+ # by the version vector itself.
+ # By convention, popular VCSes like CVS, SVN and GIT use "$"
+ # around the actual version vector.
+ [^\s\:]+\:\s*\$[^\$]+\$
+ )';
+
+ /** @var string The version vector. */
+ private $version = '';
+
+ public function __construct($version = null, Description $description = null)
+ {
+ Assert::nullOrStringNotEmpty($version);
+
+ $this->version = $version;
+ $this->description = $description;
+ }
+
+ /**
+ * @return static
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::nullOrString($body);
+ if (empty($body)) {
+ return new static();
+ }
+
+ $matches = [];
+ if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) {
+ return null;
+ }
+
+ return new static(
+ $matches[1],
+ $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context)
+ );
+ }
+
+ /**
+ * Gets the version section of the tag.
+ *
+ * @return string
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->version . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php
new file mode 100644
index 00000000..9ec2455d
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php
@@ -0,0 +1,277 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\TagFactory;
+use Webmozart\Assert\Assert;
+
+final class DocBlockFactory implements DocBlockFactoryInterface
+{
+ /** @var DocBlock\DescriptionFactory */
+ private $descriptionFactory;
+
+ /** @var DocBlock\TagFactory */
+ private $tagFactory;
+
+ /**
+ * Initializes this factory with the required subcontractors.
+ *
+ * @param DescriptionFactory $descriptionFactory
+ * @param TagFactory $tagFactory
+ */
+ public function __construct(DescriptionFactory $descriptionFactory, TagFactory $tagFactory)
+ {
+ $this->descriptionFactory = $descriptionFactory;
+ $this->tagFactory = $tagFactory;
+ }
+
+ /**
+ * Factory method for easy instantiation.
+ *
+ * @param string[] $additionalTags
+ *
+ * @return DocBlockFactory
+ */
+ public static function createInstance(array $additionalTags = [])
+ {
+ $fqsenResolver = new FqsenResolver();
+ $tagFactory = new StandardTagFactory($fqsenResolver);
+ $descriptionFactory = new DescriptionFactory($tagFactory);
+
+ $tagFactory->addService($descriptionFactory);
+ $tagFactory->addService(new TypeResolver($fqsenResolver));
+
+ $docBlockFactory = new self($descriptionFactory, $tagFactory);
+ foreach ($additionalTags as $tagName => $tagHandler) {
+ $docBlockFactory->registerTagHandler($tagName, $tagHandler);
+ }
+
+ return $docBlockFactory;
+ }
+
+ /**
+ * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the
+ * getDocComment method (such as a ReflectionClass object).
+ * @param Types\Context $context
+ * @param Location $location
+ *
+ * @return DocBlock
+ */
+ public function create($docblock, Types\Context $context = null, Location $location = null)
+ {
+ if (is_object($docblock)) {
+ if (!method_exists($docblock, 'getDocComment')) {
+ $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method';
+ throw new \InvalidArgumentException($exceptionMessage);
+ }
+
+ $docblock = $docblock->getDocComment();
+ }
+
+ Assert::stringNotEmpty($docblock);
+
+ if ($context === null) {
+ $context = new Types\Context('');
+ }
+
+ $parts = $this->splitDocBlock($this->stripDocComment($docblock));
+ list($templateMarker, $summary, $description, $tags) = $parts;
+
+ return new DocBlock(
+ $summary,
+ $description ? $this->descriptionFactory->create($description, $context) : null,
+ array_filter($this->parseTagBlock($tags, $context), function($tag) {
+ return $tag instanceof Tag;
+ }),
+ $context,
+ $location,
+ $templateMarker === '#@+',
+ $templateMarker === '#@-'
+ );
+ }
+
+ public function registerTagHandler($tagName, $handler)
+ {
+ $this->tagFactory->registerTagHandler($tagName, $handler);
+ }
+
+ /**
+ * Strips the asterisks from the DocBlock comment.
+ *
+ * @param string $comment String containing the comment text.
+ *
+ * @return string
+ */
+ private function stripDocComment($comment)
+ {
+ $comment = trim(preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', '$1', $comment));
+
+ // reg ex above is not able to remove */ from a single line docblock
+ if (substr($comment, -2) == '*/') {
+ $comment = trim(substr($comment, 0, -2));
+ }
+
+ return str_replace(array("\r\n", "\r"), "\n", $comment);
+ }
+
+ /**
+ * Splits the DocBlock into a template marker, summary, description and block of tags.
+ *
+ * @param string $comment Comment to split into the sub-parts.
+ *
+ * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split.
+ * @author Mike van Riel for extending the regex with template marker support.
+ *
+ * @return string[] containing the template marker (if any), summary, description and a string containing the tags.
+ */
+ private function splitDocBlock($comment)
+ {
+ // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This
+ // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the
+ // performance impact of running a regular expression
+ if (strpos($comment, '@') === 0) {
+ return array('', '', '', $comment);
+ }
+
+ // clears all extra horizontal whitespace from the line endings to prevent parsing issues
+ $comment = preg_replace('/\h*$/Sum', '', $comment);
+
+ /*
+ * Splits the docblock into a template marker, summary, description and tags section.
+ *
+ * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may
+ * occur after it and will be stripped).
+ * - The short description is started from the first character until a dot is encountered followed by a
+ * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing
+ * errors). This is optional.
+ * - The long description, any character until a new line is encountered followed by an @ and word
+ * characters (a tag). This is optional.
+ * - Tags; the remaining characters
+ *
+ * Big thanks to RichardJ for contributing this Regular Expression
+ */
+ preg_match(
+ '/
+ \A
+ # 1. Extract the template marker
+ (?:(\#\@\+|\#\@\-)\n?)?
+
+ # 2. Extract the summary
+ (?:
+ (?! @\pL ) # The summary may not start with an @
+ (
+ [^\n.]+
+ (?:
+ (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines
+ [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line
+ [^\n.]+ # Include anything else
+ )*
+ \.?
+ )?
+ )
+
+ # 3. Extract the description
+ (?:
+ \s* # Some form of whitespace _must_ precede a description because a summary must be there
+ (?! @\pL ) # The description may not start with an @
+ (
+ [^\n]+
+ (?: \n+
+ (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line
+ [^\n]+ # Include anything else
+ )*
+ )
+ )?
+
+ # 4. Extract the tags (anything that follows)
+ (\s+ [\s\S]*)? # everything that follows
+ /ux',
+ $comment,
+ $matches
+ );
+ array_shift($matches);
+
+ while (count($matches) < 4) {
+ $matches[] = '';
+ }
+
+ return $matches;
+ }
+
+ /**
+ * Creates the tag objects.
+ *
+ * @param string $tags Tag block to parse.
+ * @param Types\Context $context Context of the parsed Tag
+ *
+ * @return DocBlock\Tag[]
+ */
+ private function parseTagBlock($tags, Types\Context $context)
+ {
+ $tags = $this->filterTagBlock($tags);
+ if (!$tags) {
+ return [];
+ }
+
+ $result = $this->splitTagBlockIntoTagLines($tags);
+ foreach ($result as $key => $tagLine) {
+ $result[$key] = $this->tagFactory->create(trim($tagLine), $context);
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param string $tags
+ *
+ * @return string[]
+ */
+ private function splitTagBlockIntoTagLines($tags)
+ {
+ $result = array();
+ foreach (explode("\n", $tags) as $tag_line) {
+ if (isset($tag_line[0]) && ($tag_line[0] === '@')) {
+ $result[] = $tag_line;
+ } else {
+ $result[count($result) - 1] .= "\n" . $tag_line;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param $tags
+ * @return string
+ */
+ private function filterTagBlock($tags)
+ {
+ $tags = trim($tags);
+ if (!$tags) {
+ return null;
+ }
+
+ if ('@' !== $tags[0]) {
+ // @codeCoverageIgnoreStart
+ // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that
+ // we didn't foresee.
+ throw new \LogicException('A tag block started with text instead of an at-sign(@): ' . $tags);
+ // @codeCoverageIgnoreEnd
+ }
+
+ return $tags;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php
new file mode 100644
index 00000000..b3533429
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php
@@ -0,0 +1,23 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+
+/**
+ * @coversNothing
+ */
+class InterpretingDocBlocksTest extends \PHPUnit_Framework_TestCase
+{
+ public function testInterpretingASimpleDocBlock()
+ {
+ /**
+ * @var DocBlock $docblock
+ * @var string $summary
+ * @var Description $description
+ */
+ include(__DIR__ . '/../../examples/01-interpreting-a-simple-docblock.php');
+
+ $descriptionText = <<assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is an example of a summary.', $summary);
+ $this->assertInstanceOf(Description::class, $description);
+ $this->assertSame($descriptionText, $description->render());
+ $this->assertEmpty($docblock->getTags());
+ }
+
+ public function testInterpretingTags()
+ {
+ /**
+ * @var DocBlock $docblock
+ * @var boolean $hasSeeTag
+ * @var Tag[] $tags
+ * @var See[] $seeTags
+ */
+ include(__DIR__ . '/../../examples/02-interpreting-tags.php');
+
+ $this->assertTrue($hasSeeTag);
+ $this->assertCount(1, $tags);
+ $this->assertCount(1, $seeTags);
+
+ $this->assertInstanceOf(See::class, $tags[0]);
+ $this->assertInstanceOf(See::class, $seeTags[0]);
+
+ $seeTag = $seeTags[0];
+ $this->assertSame('\\' . StandardTagFactory::class, (string)$seeTag->getReference());
+ $this->assertSame('', (string)$seeTag->getDescription());
+ }
+
+ public function testDescriptionsCanEscapeAtSignsAndClosingBraces()
+ {
+ /**
+ * @var string $docComment
+ * @var DocBlock $docblock
+ * @var Description $description
+ * @var string $receivedDocComment
+ * @var string $foundDescription
+ */
+
+ include(__DIR__ . '/../../examples/playing-with-descriptions/02-escaping.php');
+ $this->assertSame(<<<'DESCRIPTION'
+You can escape the @-sign by surrounding it with braces, for example: @. And escape a closing brace within an
+inline tag by adding an opening brace in front of it like this: }.
+
+Here are example texts where you can see how they could be used in a real life situation:
+
+ This is a text with an {@internal inline tag where a closing brace (}) is shown}.
+ Or an {@internal inline tag with a literal {@link} in it}.
+
+Do note that an {@internal inline tag that has an opening brace ({) does not break out}.
+DESCRIPTION
+ ,
+ $foundDescription
+ )
+ ;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php
new file mode 100644
index 00000000..92ac22ed
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php
@@ -0,0 +1,35 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+
+/**
+ * @coversNothing
+ */
+class ReconstitutingADocBlockTest extends \PHPUnit_Framework_TestCase
+{
+ public function testReconstituteADocBlock()
+ {
+ /**
+ * @var string $docComment
+ * @var string $reconstitutedDocComment
+ */
+ include(__DIR__ . '/../../examples/03-reconstituting-a-docblock.php');
+
+ $this->assertSame($docComment, $reconstitutedDocComment);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php
new file mode 100644
index 00000000..984811b1
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php
@@ -0,0 +1,39 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+
+/**
+ * @coversNothing
+ */
+class UsingTagsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testAddingYourOwnTagUsingAStaticMethodAsFactory()
+ {
+ /**
+ * @var object[] $customTagObjects
+ * @var string $docComment
+ * @var string $reconstitutedDocComment
+ */
+ include(__DIR__ . '/../../examples/04-adding-your-own-tag.php');
+
+ $this->assertInstanceOf(\MyTag::class, $customTagObjects[0]);
+ $this->assertSame('my-tag', $customTagObjects[0]->getName());
+ $this->assertSame('I have a description', (string)$customTagObjects[0]->getDescription());
+ $this->assertSame($docComment, $reconstitutedDocComment);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php
new file mode 100644
index 00000000..d3043f9a
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php
@@ -0,0 +1,174 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Tags\Link;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @covers ::
+ */
+class DescriptionFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @dataProvider provideSimpleExampleDescriptions
+ */
+ public function testDescriptionCanParseASimpleString($contents)
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->never();
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, new Context(''));
+
+ $this->assertSame($contents, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @dataProvider provideEscapeSequences
+ */
+ public function testEscapeSequences($contents, $expected)
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->never();
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, new Context(''));
+
+ $this->assertSame($expected, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Link
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testDescriptionCanParseAStringWithInlineTag()
+ {
+ $contents = 'This is text for a {@link http://phpdoc.org/ description} that uses an inline tag.';
+ $context = new Context('');
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')
+ ->once()
+ ->with('@link http://phpdoc.org/ description', $context)
+ ->andReturn(new Link('http://phpdoc.org/', new Description('description')))
+ ;
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, $context);
+
+ $this->assertSame($contents, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Link
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testDescriptionCanParseAStringStartingWithInlineTag()
+ {
+ $contents = '{@link http://phpdoc.org/ This} is text for a description that starts with an inline tag.';
+ $context = new Context('');
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')
+ ->once()
+ ->with('@link http://phpdoc.org/ This', $context)
+ ->andReturn(new Link('http://phpdoc.org/', new Description('This')))
+ ;
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, $context);
+
+ $this->assertSame($contents, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testIfSuperfluousStartingSpacesAreRemoved()
+ {
+ $factory = new DescriptionFactory(m::mock(TagFactory::class));
+ $descriptionText = <<create($descriptionText, new Context(''));
+
+ $this->assertSame($expectedDescription, $description->render());
+ }
+
+ /**
+ * Provides a series of example strings that the parser should correctly interpret and return.
+ *
+ * @return string[][]
+ */
+ public function provideSimpleExampleDescriptions()
+ {
+ return [
+ ['This is text for a description.'],
+ ['This is text for a description containing { that is literal.'],
+ ['This is text for a description containing } that is literal.'],
+ ['This is text for a description with {just a text} that is not a tag.'],
+ ];
+ }
+
+ public function provideEscapeSequences()
+ {
+ return [
+ ['This is text for a description with a {@}.', 'This is text for a description with a @.'],
+ ['This is text for a description with a {}.', 'This is text for a description with a }.'],
+ ];
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php
new file mode 100644
index 00000000..b5917a9e
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php
@@ -0,0 +1,75 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Description
+ */
+class DescriptionTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::render
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ */
+ public function testDescriptionCanRenderUsingABodyWithPlaceholdersAndTags()
+ {
+ $body = 'This is a %1$s body.';
+ $expected = 'This is a {@internal significant } body.';
+ $tags = [new Generic('internal', new Description('significant '))];
+
+ $fixture = new Description($body, $tags);
+
+ // without formatter (thus the PassthroughFormatter by default)
+ $this->assertSame($expected, $fixture->render());
+
+ // with a custom formatter
+ $formatter = m::mock(PassthroughFormatter::class);
+ $formatter->shouldReceive('format')->with($tags[0])->andReturn('@internal significant ');
+ $this->assertSame($expected, $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::render
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ */
+ public function testDescriptionCanBeCastToString()
+ {
+ $body = 'This is a %1$s body.';
+ $expected = 'This is a {@internal significant } body.';
+ $tags = [new Generic('internal', new Description('significant '))];
+
+ $fixture = new Description($body, $tags);
+
+ $this->assertSame($expected, (string)$fixture);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testBodyTemplateMustBeAString()
+ {
+ new Description([]);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php
new file mode 100644
index 00000000..cb2b400f
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php
@@ -0,0 +1,201 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Serializer
+ * @covers ::
+ */
+class SerializerTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testReconstructsADocCommentFromADocBlock()
+ {
+ $expected = <<<'DOCCOMMENT'
+/**
+ * This is a summary
+ *
+ * This is a description
+ *
+ * @unknown-tag Test description for the unknown tag
+ */
+DOCCOMMENT;
+
+ $fixture = new Serializer();
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testAddPrefixToDocBlock()
+ {
+ $expected = <<<'DOCCOMMENT'
+aa/**
+aa * This is a summary
+aa *
+aa * This is a description
+aa *
+aa * @unknown-tag Test description for the unknown tag
+aa */
+DOCCOMMENT;
+
+ $fixture = new Serializer(2, 'a');
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testAddPrefixToDocBlockExceptFirstLine()
+ {
+ $expected = <<<'DOCCOMMENT'
+/**
+aa * This is a summary
+aa *
+aa * This is a description
+aa *
+aa * @unknown-tag Test description for the unknown tag
+aa */
+DOCCOMMENT;
+
+ $fixture = new Serializer(2, 'a', false);
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testWordwrapsAroundTheGivenAmountOfCharacters()
+ {
+ $expected = <<<'DOCCOMMENT'
+/**
+ * This is a
+ * summary
+ *
+ * This is a
+ * description
+ *
+ * @unknown-tag
+ * Test
+ * description
+ * for the
+ * unknown tag
+ */
+DOCCOMMENT;
+
+ $fixture = new Serializer(0, '', true, 15);
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfIndentIsNotAnInteger()
+ {
+ new Serializer([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfIndentStringIsNotAString()
+ {
+ new Serializer(0, []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfIndentFirstLineIsNotABoolean()
+ {
+ new Serializer(0, '', []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfLineLengthIsNotNullNorAnInteger()
+ {
+ new Serializer(0, '', false, []);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php
new file mode 100644
index 00000000..0247da04
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php
@@ -0,0 +1,361 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Tags\Author;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+use phpDocumentor\Reflection\DocBlock\Tags\Return_;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\DocBlock\StandardTagFactory
+ * @covers ::
+ */
+class StandardTagFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreatingAGenericTag()
+ {
+ $expectedTagName = 'unknown-tag';
+ $expectedDescriptionText = 'This is a description';
+ $expectedDescription = new Description($expectedDescriptionText);
+ $context = new Context('');
+
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory
+ ->shouldReceive('create')
+ ->once()
+ ->with($expectedDescriptionText, $context)
+ ->andReturn($expectedDescription)
+ ;
+
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+ $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
+
+ /** @var Generic $tag */
+ $tag = $tagFactory->create('@' . $expectedTagName . ' This is a description', $context);
+
+ $this->assertInstanceOf(Generic::class, $tag);
+ $this->assertSame($expectedTagName, $tag->getName());
+ $this->assertSame($expectedDescription, $tag->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ */
+ public function testCreatingASpecificTag()
+ {
+ $context = new Context('');
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+
+ /** @var Author $tag */
+ $tag = $tagFactory->create('@author Mike van Riel ', $context);
+
+ $this->assertInstanceOf(Author::class, $tag);
+ $this->assertSame('author', $tag->getName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\See
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ */
+ public function testAnEmptyContextIsCreatedIfNoneIsProvided()
+ {
+ $fqsen = '\Tag';
+ $resolver = m::mock(FqsenResolver::class)
+ ->shouldReceive('resolve')
+ ->with('Tag', m::type(Context::class))
+ ->andReturn(new Fqsen($fqsen))
+ ->getMock()
+ ;
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldIgnoreMissing();
+
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
+
+ /** @var See $tag */
+ $tag = $tagFactory->create('@see Tag');
+
+ $this->assertInstanceOf(See::class, $tag);
+ $this->assertSame($fqsen, (string)$tag->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ */
+ public function testPassingYourOwnSetOfTagHandlers()
+ {
+ $context = new Context('');
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class), ['user' => Author::class]);
+
+ /** @var Author $tag */
+ $tag = $tagFactory->create('@user Mike van Riel ', $context);
+
+ $this->assertInstanceOf(Author::class, $tag);
+ $this->assertSame('author', $tag->getName());
+ }
+
+ /**
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage The tag "@user/myuser" does not seem to be wellformed, please check it for errors
+ */
+ public function testExceptionIsThrownIfProvidedTagIsNotWellformed()
+ {
+ $this->markTestIncomplete(
+ 'For some reason this test fails; once I have access to a RegEx analyzer I will have to test the regex'
+ )
+ ;
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+ $tagFactory->create('@user[myuser');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addParameter
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ */
+ public function testAddParameterToServiceLocator()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addParameter('myParam', 'myValue');
+
+ $this->assertAttributeSame(
+ [FqsenResolver::class => $resolver, 'myParam' => 'myValue'],
+ 'serviceLocator',
+ $tagFactory
+ )
+ ;
+ }
+
+ /**
+ * @covers ::addService
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ */
+ public function testAddServiceToServiceLocator()
+ {
+ $service = new PassthroughFormatter();
+
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addService($service);
+
+ $this->assertAttributeSame(
+ [FqsenResolver::class => $resolver, PassthroughFormatter::class => $service],
+ 'serviceLocator',
+ $tagFactory
+ )
+ ;
+ }
+
+ /**
+ * @covers ::addService
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ */
+ public function testInjectConcreteServiceForInterfaceToServiceLocator()
+ {
+ $interfaceName = Formatter::class;
+ $service = new PassthroughFormatter();
+
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addService($service, $interfaceName);
+
+ $this->assertAttributeSame(
+ [FqsenResolver::class => $resolver, $interfaceName => $service],
+ 'serviceLocator',
+ $tagFactory
+ )
+ ;
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::create
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
+ */
+ public function testRegisteringAHandlerForANewTag()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', Author::class);
+
+ // Assert by trying to create one
+ $tag = $tagFactory->create('@my-tag Mike van Riel ');
+ $this->assertInstanceOf(Author::class, $tag);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedTagNameIsNotAString()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler([], Author::class);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedTagNameIsEmpty()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('', Author::class);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedTagNameIsNamespaceButNotFullyQualified()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('Name\Spaced\Tag', Author::class);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAString()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', []);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerIsEmpty()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', '');
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAnExistingClassName()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', 'IDoNotExist');
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerDoesNotImplementTheTagInterface()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', 'stdClass');
+ }
+
+ /**
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\Docblock\Description
+ * @uses phpDocumentor\Reflection\Docblock\Tags\Return_
+ * @uses phpDocumentor\Reflection\Docblock\Tags\BaseTag
+ */
+ public function testReturntagIsMappedCorrectly()
+ {
+ $context = new Context('');
+
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory
+ ->shouldReceive('create')
+ ->once()
+ ->with('', $context)
+ ->andReturn(new Description(''))
+ ;
+
+ $typeResolver = new TypeResolver();
+
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+ $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
+ $tagFactory->addService($typeResolver, TypeResolver::class);
+
+
+ /** @var Return_ $tag */
+ $tag = $tagFactory->create('@return mixed', $context);
+
+ $this->assertInstanceOf(Return_::class, $tag);
+ $this->assertSame('return', $tag->getName());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php
new file mode 100644
index 00000000..a54954f8
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php
@@ -0,0 +1,148 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Author
+ * @covers ::
+ */
+class AuthorTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $this->assertSame('author', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $this->assertSame('@author Mike van Riel', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getAuthorName
+ */
+ public function testHasTheAuthorName()
+ {
+ $expected = 'Mike van Riel';
+
+ $fixture = new Author($expected, 'mike@phpdoc.org');
+
+ $this->assertSame($expected, $fixture->getAuthorName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getAuthorName
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfAuthorNameIsNotAString()
+ {
+ new Author([], 'mike@phpdoc.org');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getEmail
+ */
+ public function testHasTheAuthorMailAddress()
+ {
+ $expected = 'mike@phpdoc.org';
+
+ $fixture = new Author('Mike van Riel', $expected);
+
+ $this->assertSame($expected, $fixture->getEmail());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfEmailIsNotAString()
+ {
+ new Author('Mike van Riel', []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfEmailIsNotValid()
+ {
+ new Author('Mike van Riel', 'mike');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $this->assertSame('Mike van Riel', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::
+ */
+ public function testFactoryMethod()
+ {
+ $fixture = Author::create('Mike van Riel ');
+
+ $this->assertSame('Mike van Riel', (string)$fixture);
+ $this->assertSame('Mike van Riel', $fixture->getAuthorName());
+ $this->assertSame('mike@phpdoc.org', $fixture->getEmail());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::
+ */
+ public function testFactoryMethodReturnsNullIfItCouldNotReadBody()
+ {
+ $this->assertNull(Author::create('dfgr<'));
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php
new file mode 100644
index 00000000..a2b5e4b3
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php
@@ -0,0 +1,155 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Covers
+ * @covers ::
+ */
+class CoversTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('covers', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('@covers \DateTime Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReference
+ */
+ public function testHasReferenceToFqsen()
+ {
+ $expected = new Fqsen('\DateTime');
+
+ $fixture = new Covers($expected);
+
+ $this->assertSame($expected, $fixture->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Covers(new Fqsen('\DateTime'), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('\DateTime Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\FqsenResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = m::mock(FqsenResolver::class);
+ $context = new Context('');
+
+ $fqsen = new Fqsen('\DateTime');
+ $description = new Description('My Description');
+
+ $descriptionFactory
+ ->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+ $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
+
+ $fixture = Covers::create('DateTime My Description', $descriptionFactory, $resolver, $context);
+
+ $this->assertSame('\DateTime My Description', (string)$fixture);
+ $this->assertSame($fqsen, $fixture->getReference());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Covers::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Covers::create(''));
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php
new file mode 100644
index 00000000..8be9ad7e
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php
@@ -0,0 +1,166 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Deprecated
+ * @covers ::
+ */
+class DeprecatedTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $this->assertSame('deprecated', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $this->assertSame('@deprecated 1.0 Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVersion
+ */
+ public function testHasVersionNumber()
+ {
+ $expected = '1.0';
+
+ $fixture = new Deprecated($expected);
+
+ $this->assertSame($expected, $fixture->getVersion());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Deprecated('1.0', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $this->assertSame('1.0 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $version = '1.0';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Deprecated::create('1.0 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1.0 My Description', (string)$fixture);
+ $this->assertSame($version, $fixture->getVersion());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptyDeprecatedTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Deprecated::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame(null, $fixture->getVersion());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfVersionIsNotString()
+ {
+ $this->assertNull(Deprecated::create([]));
+ }
+
+ /**
+ * @covers ::create
+ */
+ public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
+ {
+ $this->assertEquals(new Deprecated(), Deprecated::create('dkhf<'));
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php
new file mode 100644
index 00000000..045a197f
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php
@@ -0,0 +1,41 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ */
+class PassthroughFormatterTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::format
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testFormatterCallsToStringAndReturnsAStandardRepresentation()
+ {
+ $expected = '@unknown-tag This is a description';
+
+ $fixture = new PassthroughFormatter();
+
+ $this->assertSame(
+ $expected,
+ $fixture->format(new Generic('unknown-tag', new Description('This is a description')))
+ );
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php
new file mode 100644
index 00000000..02fa5300
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php
@@ -0,0 +1,146 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @generic http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @covers ::
+ */
+class GenericTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $this->assertSame('generic', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $this->assertSame('@generic Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Generic('generic', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $this->assertSame('Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $generics = 'generic';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Generic::create('My Description', 'generic', $descriptionFactory, $context);
+
+ $this->assertSame('My Description', (string)$fixture);
+ $this->assertSame($generics, $fixture->getName());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfNameIsNotString()
+ {
+ Generic::create('', []);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfNameIsNotEmpty()
+ {
+ Generic::create('', '');
+ }
+
+ /**
+ * @covers ::create
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfNameContainsIllegalCharacters()
+ {
+ Generic::create('', 'name/myname');
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php
new file mode 100644
index 00000000..9940aec7
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php
@@ -0,0 +1,158 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Link
+ * @covers ::
+ */
+class LinkTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $this->assertSame('link', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $this->assertSame('@link http://this.is.my/link Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getLink
+ */
+ public function testHasLinkUrl()
+ {
+ $expected = 'http://this.is.my/link';
+
+ $fixture = new Link($expected);
+
+ $this->assertSame($expected, $fixture->getLink());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Link('http://this.is.my/link', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $this->assertSame('http://this.is.my/link Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $links = 'http://this.is.my/link';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Link::create('http://this.is.my/link My Description', $descriptionFactory, $context);
+
+ $this->assertSame('http://this.is.my/link My Description', (string)$fixture);
+ $this->assertSame($links, $fixture->getLink());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptyLinkTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Link::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame('', $fixture->getLink());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfVersionIsNotString()
+ {
+ $this->assertNull(Link::create([]));
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php
new file mode 100644
index 00000000..5d6e981e
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php
@@ -0,0 +1,437 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Compound;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\Integer;
+use phpDocumentor\Reflection\Types\Object_;
+use phpDocumentor\Reflection\Types\String_;
+use phpDocumentor\Reflection\Types\Void_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Method
+ * @covers ::
+ */
+class MethodTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Method('myMethod');
+
+ $this->assertSame('method', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $arguments = [
+ ['name' => 'argument1', 'type' => new String_()],
+ ['name' => 'argument2', 'type' => new Object_()]
+ ];
+ $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description'));
+
+ $this->assertSame(
+ '@method static void myMethod(string $argument1, object $argument2) My Description',
+ $fixture->render()
+ );
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Method('myMethod');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getMethodName
+ */
+ public function testHasMethodName()
+ {
+ $expected = 'myMethod';
+
+ $fixture = new Method($expected);
+
+ $this->assertSame($expected, $fixture->getMethodName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getArguments
+ */
+ public function testHasArguments()
+ {
+ $arguments = [
+ [ 'name' => 'argument1', 'type' => new String_() ]
+ ];
+
+ $fixture = new Method('myMethod', $arguments);
+
+ $this->assertSame($arguments, $fixture->getArguments());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getArguments
+ */
+ public function testArgumentsMayBePassedAsString()
+ {
+ $arguments = ['argument1'];
+ $expected = [
+ [ 'name' => $arguments[0], 'type' => new Void_() ]
+ ];
+
+ $fixture = new Method('myMethod', $arguments);
+
+ $this->assertEquals($expected, $fixture->getArguments());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getArguments
+ */
+ public function testArgumentTypeCanBeInferredAsVoid()
+ {
+ $arguments = [ [ 'name' => 'argument1' ] ];
+ $expected = [
+ [ 'name' => $arguments[0]['name'], 'type' => new Void_() ]
+ ];
+
+ $fixture = new Method('myMethod', $arguments);
+
+ $this->assertEquals($expected, $fixture->getArguments());
+ }
+
+ /**
+ * @covers ::create
+ */
+ public function testRestArgumentIsParsedAsRegularArg()
+ {
+ $expected = [
+ [ 'name' => 'arg1', 'type' => new Void_() ],
+ [ 'name' => 'rest', 'type' => new Void_() ],
+ [ 'name' => 'rest2', 'type' => new Array_() ],
+ ];
+
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+ $description = new Description('');
+ $descriptionFactory->shouldReceive('create')->with('', $context)->andReturn($description);
+
+ $fixture = Method::create(
+ 'void myMethod($arg1, ...$rest, array ... $rest2)',
+ $resolver,
+ $descriptionFactory,
+ $context
+ );
+
+ $this->assertEquals($expected, $fixture->getArguments());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReturnType
+ */
+ public function testHasReturnType()
+ {
+ $expected = new String_();
+
+ $fixture = new Method('myMethod', [], $expected);
+
+ $this->assertSame($expected, $fixture->getReturnType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReturnType
+ */
+ public function testReturnTypeCanBeInferredAsVoid()
+ {
+ $fixture = new Method('myMethod', []);
+
+ $this->assertEquals(new Void_(), $fixture->getReturnType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isStatic
+ */
+ public function testMethodCanBeStatic()
+ {
+ $expected = false;
+ $fixture = new Method('myMethod', [], null, $expected);
+ $this->assertSame($expected, $fixture->isStatic());
+
+ $expected = true;
+ $fixture = new Method('myMethod', [], null, $expected);
+ $this->assertSame($expected, $fixture->isStatic());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Method('myMethod', [], null, false, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $arguments = [
+ ['name' => 'argument1', 'type' => new String_()],
+ ['name' => 'argument2', 'type' => new Object_()]
+ ];
+ $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description'));
+
+ $this->assertSame(
+ 'static void myMethod(string $argument1, object $argument2) My Description',
+ (string)$fixture
+ );
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $expectedArguments = [
+ [ 'name' => 'argument1', 'type' => new String_() ],
+ [ 'name' => 'argument2', 'type' => new Void_() ]
+ ];
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Method::create(
+ 'static void myMethod(string $argument1, $argument2) My Description',
+ $resolver,
+ $descriptionFactory,
+ $context
+ );
+
+ $this->assertSame('static void myMethod(string $argument1, void $argument2) My Description', (string)$fixture);
+ $this->assertSame('myMethod', $fixture->getMethodName());
+ $this->assertEquals($expectedArguments, $fixture->getArguments());
+ $this->assertInstanceOf(Void_::class, $fixture->getReturnType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ public function collectionReturnTypesProvider()
+ {
+ return [
+ ['int[]', Array_::class, Integer::class, Compound::class],
+ ['int[][]', Array_::class, Array_::class, Compound::class],
+ ['Object[]', Array_::class, Object_::class, Compound::class],
+ ['array[]', Array_::class, Array_::class, Compound::class],
+ ];
+ }
+
+ /**
+ * @dataProvider collectionReturnTypesProvider
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\Types\Array_
+ * @uses \phpDocumentor\Reflection\Types\Compound
+ * @uses \phpDocumentor\Reflection\Types\Integer
+ * @uses \phpDocumentor\Reflection\Types\Object_
+ * @param string $returnType
+ * @param string $expectedType
+ * @param string $expectedValueType
+ * @param string null $expectedKeyType
+ */
+ public function testCollectionReturnTypes(
+ $returnType,
+ $expectedType,
+ $expectedValueType = null,
+ $expectedKeyType = null
+ ) { $resolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->with('', null)->andReturn(new Description(''));
+
+ $fixture = Method::create("$returnType myMethod(\$arg)", $resolver, $descriptionFactory);
+ $returnType = $fixture->getReturnType();
+ $this->assertInstanceOf($expectedType, $returnType);
+
+ if ($returnType instanceof Array_) {
+ $this->assertInstanceOf($expectedValueType, $returnType->getValueType());
+ $this->assertInstanceOf($expectedKeyType, $returnType->getKeyType());
+ }
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Method::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsEmpty()
+ {
+ Method::create('');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodReturnsNullIfBodyIsIncorrect()
+ {
+ $this->assertNull(Method::create('body('));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Method::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Method::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfBodyIsNotString()
+ {
+ new Method([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfBodyIsEmpty()
+ {
+ new Method('');
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfStaticIsNotBoolean()
+ {
+ new Method('body', [], null, []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfArgumentRecordContainsInvalidEntry()
+ {
+ new Method('body', [ [ 'name' => 'myName', 'unknown' => 'nah' ] ]);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testCreateMethodParenthesisMissing()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Method::create(
+ 'static void myMethod My Description',
+ $resolver,
+ $descriptionFactory,
+ $context
+ );
+
+ $this->assertSame('static void myMethod() My Description', (string)$fixture);
+ $this->assertSame('myMethod', $fixture->getMethodName());
+ $this->assertEquals([], $fixture->getArguments());
+ $this->assertInstanceOf(Void_::class, $fixture->getReturnType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php
new file mode 100644
index 00000000..0c718ab7
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php
@@ -0,0 +1,228 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Param
+ * @covers ::
+ */
+class ParamTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Param('myParameter', null, false, new Description('Description'));
+
+ $this->assertSame('param', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::isVariadic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Param('myParameter', new String_(), true, new Description('Description'));
+ $this->assertSame('@param string ...$myParameter Description', $fixture->render());
+
+ $fixture = new Param('myParameter', new String_(), false, new Description('Description'));
+ $this->assertSame('@param string $myParameter Description', $fixture->render());
+
+ $fixture = new Param('myParameter', null, false, new Description('Description'));
+ $this->assertSame('@param $myParameter Description', $fixture->render());
+
+ $fixture = new Param('myParameter');
+ $this->assertSame('@param $myParameter', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Param('myParameter');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myParameter';
+
+ $fixture = new Param($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Param('myParameter', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isVariadic
+ */
+ public function testIfParameterIsVariadic()
+ {
+ $fixture = new Param('myParameter', new String_(), false);
+ $this->assertFalse($fixture->isVariadic());
+
+ $fixture = new Param('myParameter', new String_(), true);
+ $this->assertTrue($fixture->isVariadic());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Param('1.0', null, false, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isVariadic
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Param('myParameter', new String_(), true, new Description('Description'));
+
+ $this->assertSame('string ...$myParameter Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Param::create('string ...$myParameter My Description', $typeResolver, $descriptionFactory, $context);
+
+ $this->assertSame('string ...$myParameter My Description', (string)$fixture);
+ $this->assertSame('myParameter', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertTrue($fixture->isVariadic());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Param::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Param::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Param::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Param::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new Param([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariadicIsNotBoolean()
+ {
+ new Param('', null, []);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php
new file mode 100644
index 00000000..c3fb7700
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php
@@ -0,0 +1,201 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead
+ * @covers ::
+ */
+class PropertyReadTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new PropertyRead('myProperty', null, new Description('Description'));
+
+ $this->assertSame('property-read', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new PropertyRead('myProperty', new String_(), new Description('Description'));
+ $this->assertSame('@property-read string $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyRead('myProperty', null, new Description('Description'));
+ $this->assertSame('@property-read $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyRead('myProperty');
+ $this->assertSame('@property-read $myProperty', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new PropertyRead('myProperty');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myProperty';
+
+ $fixture = new PropertyRead($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new PropertyRead('myProperty', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new PropertyRead('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new PropertyRead('myProperty', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myProperty Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = PropertyRead::create('string $myProperty My Description', $typeResolver, $descriptionFactory,
+ $context);
+
+ $this->assertSame('string $myProperty My Description', (string)$fixture);
+ $this->assertSame('myProperty', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ PropertyRead::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ PropertyRead::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ PropertyRead::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ PropertyRead::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new PropertyRead([]);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php
new file mode 100644
index 00000000..908dfb28
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php
@@ -0,0 +1,200 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Property
+ * @covers ::
+ */
+class PropertyTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Property('myProperty', null, new Description('Description'));
+
+ $this->assertSame('property', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Property('myProperty', new String_(), new Description('Description'));
+ $this->assertSame('@property string $myProperty Description', $fixture->render());
+
+ $fixture = new Property('myProperty', null, new Description('Description'));
+ $this->assertSame('@property $myProperty Description', $fixture->render());
+
+ $fixture = new Property('myProperty');
+ $this->assertSame('@property $myProperty', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Property('myProperty');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myProperty';
+
+ $fixture = new Property($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Property('myProperty', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Property('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Property('myProperty', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myProperty Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Property::create('string $myProperty My Description', $typeResolver, $descriptionFactory, $context);
+
+ $this->assertSame('string $myProperty My Description', (string)$fixture);
+ $this->assertSame('myProperty', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Property::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Property::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Property::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Property::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new Property([]);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php
new file mode 100644
index 00000000..5ea6524c
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php
@@ -0,0 +1,201 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite
+ * @covers ::
+ */
+class PropertyWriteTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new PropertyWrite('myProperty', null, new Description('Description'));
+
+ $this->assertSame('property-write', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description'));
+ $this->assertSame('@property-write string $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyWrite('myProperty', null, new Description('Description'));
+ $this->assertSame('@property-write $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyWrite('myProperty');
+ $this->assertSame('@property-write $myProperty', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new PropertyWrite('myProperty');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myProperty';
+
+ $fixture = new PropertyWrite($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new PropertyWrite('myProperty', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new PropertyWrite('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myProperty Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = PropertyWrite::create('string $myProperty My Description', $typeResolver, $descriptionFactory,
+ $context);
+
+ $this->assertSame('string $myProperty My Description', (string)$fixture);
+ $this->assertSame('myProperty', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ PropertyWrite::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ PropertyWrite::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ PropertyWrite::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ PropertyWrite::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new PropertyWrite([]);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php
new file mode 100644
index 00000000..2bc54391
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php
@@ -0,0 +1,170 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Return_
+ * @covers ::
+ */
+class ReturnTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $this->assertSame('return', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $this->assertSame('@return string Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Return_($expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Return_(new String_(), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $this->assertSame('string Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $type = new String_();
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Return_::create('string My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('string My Description', (string)$fixture);
+ $this->assertEquals($type, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Return_::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Return_::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Return_::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Return_::create('body', new TypeResolver());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php
new file mode 100644
index 00000000..8d3e3e8c
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php
@@ -0,0 +1,173 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\See
+ * @covers ::
+ */
+class SeeTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('see', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('@see \DateTime Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReference
+ */
+ public function testHasReferenceToFqsen()
+ {
+ $expected = new Fqsen('\DateTime');
+
+ $fixture = new See($expected);
+
+ $this->assertSame($expected, $fixture->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new See(new Fqsen('\DateTime'), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('\DateTime Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\FqsenResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = m::mock(FqsenResolver::class);
+ $context = new Context('');
+
+ $fqsen = new Fqsen('\DateTime');
+ $description = new Description('My Description');
+
+ $descriptionFactory
+ ->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+ $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
+
+ $fixture = See::create('DateTime My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('\DateTime My Description', (string)$fixture);
+ $this->assertSame($fqsen, $fixture->getReference());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(See::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(See::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ See::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ See::create('body', new FqsenResolver());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php
new file mode 100644
index 00000000..3f42db5d
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php
@@ -0,0 +1,166 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Since
+ * @covers ::
+ */
+class SinceTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $this->assertSame('since', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $this->assertSame('@since 1.0 Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVersion
+ */
+ public function testHasVersionNumber()
+ {
+ $expected = '1.0';
+
+ $fixture = new Since($expected);
+
+ $this->assertSame($expected, $fixture->getVersion());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Since('1.0', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $this->assertSame('1.0 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $version = '1.0';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Since::create('1.0 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1.0 My Description', (string)$fixture);
+ $this->assertSame($version, $fixture->getVersion());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptySinceTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Since::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame(null, $fixture->getVersion());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfSinceIsNotString()
+ {
+ $this->assertNull(Since::create([]));
+ }
+
+ /**
+ * @covers ::create
+ */
+ public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
+ {
+ $this->assertNull(Since::create('dkhf<'));
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php
new file mode 100644
index 00000000..cbf01f65
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php
@@ -0,0 +1,199 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Source
+ * @covers ::
+ */
+class SourceTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Source(1, null, new Description('Description'));
+
+ $this->assertSame('source', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Source(1, 10, new Description('Description'));
+ $this->assertSame('@source 1 10 Description', $fixture->render());
+
+ $fixture = new Source(1, null, new Description('Description'));
+ $this->assertSame('@source 1 Description', $fixture->render());
+
+ $fixture = new Source(1);
+ $this->assertSame('@source 1', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Source(1);
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getStartingLine
+ */
+ public function testHasStartingLine()
+ {
+ $expected = 1;
+
+ $fixture = new Source($expected);
+
+ $this->assertSame($expected, $fixture->getStartingLine());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getLineCount
+ */
+ public function testHasLineCount()
+ {
+ $expected = 2;
+
+ $fixture = new Source(1, $expected);
+
+ $this->assertSame($expected, $fixture->getLineCount());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Source('1', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Source(1, 10, new Description('Description'));
+
+ $this->assertSame('1 10 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Source::create('1 10 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1 10 My Description', (string)$fixture);
+ $this->assertSame(1, $fixture->getStartingLine());
+ $this->assertSame(10, $fixture->getLineCount());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Source::create('', $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Source::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Source::create('1');
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfStartingLineIsNotInteger()
+ {
+ new Source('blabla');
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfLineCountIsNotIntegerOrNull()
+ {
+ new Source('1', []);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php
new file mode 100644
index 00000000..657d6ca5
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php
@@ -0,0 +1,170 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Throws
+ * @covers ::
+ */
+class ThrowsTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $this->assertSame('throws', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $this->assertSame('@throws string Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Throws($expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Throws(new String_(), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $this->assertSame('string Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $type = new String_();
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Throws::create('string My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('string My Description', (string)$fixture);
+ $this->assertEquals($type, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Throws::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Throws::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Throws::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Throws::create('body', new TypeResolver());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php
new file mode 100644
index 00000000..419f7e36
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php
@@ -0,0 +1,174 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Uses
+ * @covers ::
+ */
+class UsesTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('uses', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('@uses \DateTime Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReference
+ */
+ public function testHasReferenceToFqsen()
+ {
+ $expected = new Fqsen('\DateTime');
+
+ $fixture = new Uses($expected);
+
+ $this->assertSame($expected, $fixture->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Uses(new Fqsen('\DateTime'), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('\DateTime Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\FqsenResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = m::mock(FqsenResolver::class);
+ $context = new Context('');
+
+ $fqsen = new Fqsen('\DateTime');
+ $description = new Description('My Description');
+
+ $descriptionFactory
+ ->shouldReceive('create')->with('My Description', $context)->andReturn($description)
+ ;
+ $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
+
+ $fixture = Uses::create('DateTime My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('\DateTime My Description', (string)$fixture);
+ $this->assertSame($fqsen, $fixture->getReference());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Uses::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Uses::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Uses::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Uses::create('body', new FqsenResolver());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php
new file mode 100644
index 00000000..34f290ad
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php
@@ -0,0 +1,200 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Var_
+ * @covers ::
+ */
+class VarTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Var_('myVariable', null, new Description('Description'));
+
+ $this->assertSame('var', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Var_('myVariable', new String_(), new Description('Description'));
+ $this->assertSame('@var string $myVariable Description', $fixture->render());
+
+ $fixture = new Var_('myVariable', null, new Description('Description'));
+ $this->assertSame('@var $myVariable Description', $fixture->render());
+
+ $fixture = new Var_('myVariable');
+ $this->assertSame('@var $myVariable', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Var_('myVariable');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myVariable';
+
+ $fixture = new Var_($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Var_('myVariable', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Var_('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Var_('myVariable', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myVariable Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Var_::create('string $myVariable My Description', $typeResolver, $descriptionFactory, $context);
+
+ $this->assertSame('string $myVariable My Description', (string)$fixture);
+ $this->assertSame('myVariable', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Var_::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Var_::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Var_::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Var_::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new Var_([]);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php
new file mode 100644
index 00000000..5c487fd3
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php
@@ -0,0 +1,166 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Version
+ * @covers ::
+ */
+class VersionTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $this->assertSame('version', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $this->assertSame('@version 1.0 Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVersion
+ */
+ public function testHasVersionNumber()
+ {
+ $expected = '1.0';
+
+ $fixture = new Version($expected);
+
+ $this->assertSame($expected, $fixture->getVersion());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Version('1.0', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $this->assertSame('1.0 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $version = '1.0';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Version::create('1.0 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1.0 My Description', (string)$fixture);
+ $this->assertSame($version, $fixture->getVersion());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptyVersionTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Version::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame(null, $fixture->getVersion());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfVersionIsNotString()
+ {
+ $this->assertNull(Version::create([]));
+ }
+
+ /**
+ * @covers ::create
+ */
+ public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
+ {
+ $this->assertNull(Version::create('dkhf<'));
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php
new file mode 100644
index 00000000..f1261b65
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php
@@ -0,0 +1,290 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\TagFactory;
+use phpDocumentor\Reflection\DocBlock\Tags\Param;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\DocBlockFactory
+ * @covers ::
+ * @uses \Webmozart\Assert\Assert
+ * @uses phpDocumentor\Reflection\DocBlock
+ */
+class DocBlockFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::createInstance
+ * @uses \phpDocumentor\Reflection\DocBlock\StandardTagFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ */
+ public function testCreateFactoryUsingFactoryMethod()
+ {
+ $fixture = DocBlockFactory::createInstance();
+
+ $this->assertInstanceOf(DocBlockFactory::class, $fixture);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreateDocBlockFromReflection()
+ {
+ $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
+
+ $docBlock = '/** This is a DocBlock */';
+ $classReflector = m::mock(\ReflectionClass::class);
+ $classReflector->shouldReceive('getDocComment')->andReturn($docBlock);
+ $docblock = $fixture->create($classReflector);
+
+ $this->assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is a DocBlock', $docblock->getSummary());
+ $this->assertEquals(new Description(''), $docblock->getDescription());
+ $this->assertSame([], $docblock->getTags());
+ $this->assertEquals(new Context(''), $docblock->getContext());
+ $this->assertNull($docblock->getLocation());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreateDocBlockFromStringWithDocComment()
+ {
+ $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
+
+ $docblock = $fixture->create('/** This is a DocBlock */');
+
+ $this->assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is a DocBlock', $docblock->getSummary());
+ $this->assertEquals(new Description(''), $docblock->getDescription());
+ $this->assertSame([], $docblock->getTags());
+ $this->assertEquals(new Context(''), $docblock->getContext());
+ $this->assertNull($docblock->getLocation());
+ }
+
+ /**
+ * @covers ::create
+ * @covers ::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreateDocBlockFromStringWithoutDocComment()
+ {
+ $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
+
+ $docblock = $fixture->create('This is a DocBlock');
+
+ $this->assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is a DocBlock', $docblock->getSummary());
+ $this->assertEquals(new Description(''), $docblock->getDescription());
+ $this->assertSame([], $docblock->getTags());
+ $this->assertEquals(new Context(''), $docblock->getContext());
+ $this->assertNull($docblock->getLocation());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @dataProvider provideSummaryAndDescriptions
+ */
+ public function testSummaryAndDescriptionAreSeparated($given, $summary, $description)
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $docblock = $fixture->create($given);
+
+ $this->assertSame($summary, $docblock->getSummary());
+ $this->assertEquals(new Description($description), $docblock->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDescriptionsRetainFormatting()
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $given = <<create($given);
+
+ $this->assertEquals(new Description($description), $docblock->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testTagsAreInterpretedUsingFactory()
+ {
+ $tagString = << This is with
+ multiline description.
+TAG;
+
+ $tag = m::mock(Tag::class);
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->with($tagString, m::type(Context::class))->andReturn($tag);
+
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $given = << This is with
+ * multiline description.
+ */
+DOCBLOCK;
+
+ $docblock = $fixture->create($given, new Context(''));
+
+ $this->assertEquals([$tag], $docblock->getTags());
+ }
+
+ public function provideSummaryAndDescriptions()
+ {
+ return [
+ ['This is a DocBlock', 'This is a DocBlock', ''],
+ [
+ 'This is a DocBlock. This should still be summary.',
+ 'This is a DocBlock. This should still be summary.',
+ ''
+ ],
+ [
+ <<shouldReceive('create')->with(m::any(), $context)->andReturn(new Param('param'));
+ $docblock = $fixture->create('/** @param MyType $param */', $context);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ *
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testTagsAreFilteredForNullValues()
+ {
+ $tagString = << This is with
+ multiline description.
+TAG;
+
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->with($tagString, m::any())->andReturn(null);
+
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $given = << This is with
+ * multiline description.
+ */
+DOCBLOCK;
+
+ $docblock = $fixture->create($given, new Context(''));
+
+ $this->assertEquals([], $docblock->getTags());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php
new file mode 100644
index 00000000..4a8d4ded
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php
@@ -0,0 +1,252 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use Mockery as m;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\DocBlock
+ * @covers ::
+ * @uses \Webmozart\Assert\Assert
+ */
+class DocBlockTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::getSummary
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockCanHaveASummary()
+ {
+ $summary = 'This is a summary';
+
+ $fixture = new DocBlock($summary);
+
+ $this->assertSame($summary, $fixture->getSummary());
+ }
+
+ /**
+ * @covers ::__construct
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfSummaryIsNotAString()
+ {
+ new DocBlock([]);
+ }
+
+ /**
+ * @covers ::__construct
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTemplateStartIsNotABoolean()
+ {
+ new DocBlock('', null, [], null, null, ['is not boolean']);
+ }
+
+ /**
+ * @covers ::__construct
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTemplateEndIsNotABoolean()
+ {
+ new DocBlock('', null, [], null, null, false, ['is not boolean']);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDescription
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockCanHaveADescription()
+ {
+ $description = new DocBlock\Description('');
+
+ $fixture = new DocBlock('', $description);
+
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTags
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ */
+ public function testDocBlockCanHaveTags()
+ {
+ $tags = [
+ m::mock(DocBlock\Tag::class)
+ ];
+
+ $fixture = new DocBlock('', null, $tags);
+
+ $this->assertSame($tags, $fixture->getTags());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTags
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testDocBlockAllowsOnlyTags()
+ {
+ $tags = [
+ null
+ ];
+
+ $fixture = new DocBlock('', null, $tags);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTagsByName
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock::getTags
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ */
+ public function testFindTagsInDocBlockByName()
+ {
+ $tag1 = m::mock(DocBlock\Tag::class);
+ $tag2 = m::mock(DocBlock\Tag::class);
+ $tag3 = m::mock(DocBlock\Tag::class);
+ $tags = [$tag1, $tag2, $tag3];
+
+ $tag1->shouldReceive('getName')->andReturn('abc');
+ $tag2->shouldReceive('getName')->andReturn('abcd');
+ $tag3->shouldReceive('getName')->andReturn('ab');
+
+ $fixture = new DocBlock('', null, $tags);
+
+ $this->assertSame([$tag2], $fixture->getTagsByName('abcd'));
+ $this->assertSame([], $fixture->getTagsByName('Ebcd'));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTagsByName
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfNameForTagsIsNotString()
+ {
+ $fixture = new DocBlock();
+ $fixture->getTagsByName([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::hasTag
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock::getTags
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ */
+ public function testCheckIfThereAreTagsWithAGivenName()
+ {
+ $tag1 = m::mock(DocBlock\Tag::class);
+ $tag2 = m::mock(DocBlock\Tag::class);
+ $tag3 = m::mock(DocBlock\Tag::class);
+ $tags = [$tag1, $tag2, $tag3];
+
+ $tag1->shouldReceive('getName')->twice()->andReturn('abc');
+ $tag2->shouldReceive('getName')->twice()->andReturn('abcd');
+ $tag3->shouldReceive('getName')->once();
+
+ $fixture = new DocBlock('', null, $tags);
+
+ $this->assertTrue($fixture->hasTag('abcd'));
+ $this->assertFalse($fixture->hasTag('Ebcd'));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::hasTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfNameForCheckingTagsIsNotString()
+ {
+ $fixture = new DocBlock();
+ $fixture->hasTag([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getContext
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testDocBlockKnowsInWhichNamespaceItIsAndWhichAliasesThereAre()
+ {
+ $context = new Context('');
+
+ $fixture = new DocBlock('', null, [], $context);
+
+ $this->assertSame($context, $fixture->getContext());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getLocation
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Location
+ */
+ public function testDocBlockKnowsAtWhichLineItIs()
+ {
+ $location = new Location(10);
+
+ $fixture = new DocBlock('', null, [], null, $location);
+
+ $this->assertSame($location, $fixture->getLocation());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isTemplateStart
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockKnowsIfItIsTheStartOfADocBlockTemplate()
+ {
+ $fixture = new DocBlock('', null, [], null, null, true);
+
+ $this->assertTrue($fixture->isTemplateStart());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isTemplateEnd
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockKnowsIfItIsTheEndOfADocBlockTemplate()
+ {
+ $fixture = new DocBlock('', null, [], null, null, false, true);
+
+ $this->assertTrue($fixture->isTemplateEnd());
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/.gitignore b/src/composer/vendor/phpdocumentor/type-resolver/.gitignore
new file mode 100644
index 00000000..82cfc4e9
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/.gitignore
@@ -0,0 +1,3 @@
+.idea
+composer.lock
+vendor
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/.scrutinizer.yml b/src/composer/vendor/phpdocumentor/type-resolver/.scrutinizer.yml
new file mode 100644
index 00000000..7d7372a8
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/.scrutinizer.yml
@@ -0,0 +1,31 @@
+before_commands:
+ - "composer install --no-dev --prefer-source"
+
+tools:
+ external_code_coverage: true
+ php_code_sniffer:
+ config:
+ standard: PSR2
+ filter:
+ paths: ["src/*", "tests/*"]
+ php_cpd:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_loc:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_mess_detector:
+ enabled: true
+ config:
+ ruleset: phpmd.xml.dist
+ design_rules: { eval_expression: false }
+ filter:
+ paths: ["src/*"]
+ php_pdepend:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_analyzer:
+ enabled: true
+ filter:
+ paths: ["src/*", "tests/*"]
+ sensiolabs_security_checker: true
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/.travis.yml b/src/composer/vendor/phpdocumentor/type-resolver/.travis.yml
new file mode 100644
index 00000000..c882b141
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/.travis.yml
@@ -0,0 +1,34 @@
+language: php
+php:
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+ - nightly
+
+matrix:
+ allow_failures:
+ - php:
+ - hhvm
+ - nightly
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+script:
+ - vendor/bin/phpunit --coverage-clover=coverage.clover -v
+ - composer update --no-interaction --prefer-source
+ - vendor/bin/phpunit -v
+
+before_script:
+ - composer install --no-interaction
+
+after_script:
+ - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
+
+notifications:
+ irc: "irc.freenode.org#phpdocumentor"
+ email:
+ - me@mikevanriel.com
+ - ashnazg@php.net
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/LICENSE b/src/composer/vendor/phpdocumentor/type-resolver/LICENSE
new file mode 100644
index 00000000..792e4040
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2010 Mike van Riel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/README.md b/src/composer/vendor/phpdocumentor/type-resolver/README.md
new file mode 100644
index 00000000..ca8147bc
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/README.md
@@ -0,0 +1,169 @@
+TypeResolver and FqsenResolver
+==============================
+
+The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs
+but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN).
+
+PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits
+called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods,
+properties and class constants but also functions and global constants.
+
+This package provides two Resolvers that are capable of
+
+1. Returning a series of Value Object for given expression while resolving any partial class names, and
+2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural
+ Element names.
+
+## Installing
+
+The easiest way to install this library is with [Composer](https://getcomposer.org) using the following command:
+
+ $ composer require phpdocumentor/type-resolver
+
+## Examples
+
+Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and
+check which type of action that your want to accomplish.
+
+## On Types and Element Names
+
+This component can be used in one of two ways
+
+1. To resolve a Type or
+2. To resolve a Fully Qualified Structural Element Name
+
+The big difference between these two is in the number of things it can resolve.
+
+The TypeResolver can resolve:
+
+- a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`).
+- a composite such as an array of string (`@var string[]`).
+- a compound such as a string or integer (`@var string|integer`).
+- an object or interface such as the TypeResolver class (`@var TypeResolver`
+ or `@var \phpDocumentor\Reflection\TypeResolver`)
+
+ > please note that if you want to pass partial class names that additional steps are necessary, see the
+ > chapter `Resolving partial classes and FQSENs` for more information.
+
+Where the FqsenResolver can resolve:
+
+- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`)
+- Function expressions (i.e. `@see \MyNamespace\myFunction()`)
+- Class expressions (i.e. `@see \MyNamespace\MyClass`)
+- Interface expressions (i.e. `@see \MyNamespace\MyInterface`)
+- Trait expressions (i.e. `@see \MyNamespace\MyTrait`)
+- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`)
+- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`)
+- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`)
+
+## Resolving a type
+
+In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver`
+and call its `resolve` method like this:
+
+ $typeResolver = new \phpDocumentor\Reflection\TypeResolver();
+ $type = $typeResolver->resolve('string|integer');
+
+In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two
+elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type
+`\phpDocumentor\Reflection\Types\Integer`.
+
+The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but
+in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver
+in which namespace the given expression occurs and which namespace aliases (or imports) apply.
+
+## Resolving an FQSEN
+
+A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using
+the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this:
+
+ $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver();
+ $fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()');
+
+In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class
+name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`.
+
+The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural
+Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will
+inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply.
+
+## Resolving partial Classes and Structural Element Names
+
+Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class
+names.
+
+For example, you have this file:
+
+```php
+ '\phpDocumentor\Reflection\Types']
+ );
+
+Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector
+object or by providing the namespace that you'd like to extract and the source code of the file in which the given
+type expression occurs.
+
+ $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
+ $context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct'));
+
+or
+
+ $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
+ $context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php'));
+
+### Using the Context
+
+After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver
+class as second argument and the Resolvers will take this into account when resolving partial names.
+
+To obtain the resolved class name for the `@var` tag in the example above you can do:
+
+ $typeResolver = new \phpDocumentor\Reflection\TypeResolver();
+ $type = $typeResolver->resolve('Types\Context', $context);
+
+When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call
+the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be
+`phpDocumentor\Reflection\Types\Context`.
+
+> Why is the FQSEN wrapped in another object `Object_`?
+>
+> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common
+> type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it
+> is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN.
+
+Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To
+resolve that you can do the following:
+
+ $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver();
+ $type = $fqsenResolver->resolve('Classy::otherFunction()', $context);
+
+Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the
+`resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to
+`\My\Example\Classy::otherFunction()`.
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/composer.json b/src/composer/vendor/phpdocumentor/type-resolver/composer.json
new file mode 100644
index 00000000..abaa965d
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "phpdocumentor/type-resolver",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {"name": "Mike van Riel", "email": "me@mikevanriel.com"}
+ ],
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]}
+ },
+ "autoload-dev": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]}
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.2||^4.8.24",
+ "mockery/mockery": "^0.9.4"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php b/src/composer/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php
new file mode 100644
index 00000000..682b1d3d
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php
@@ -0,0 +1,13 @@
+resolve('string|integer'));
+
+// Will return the string "string|int"
+var_dump((string)$typeResolver->resolve('string|integer'));
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php b/src/composer/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php
new file mode 100644
index 00000000..70aa5e42
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php
@@ -0,0 +1,12 @@
+ 'Mockery' ]);
+var_dump((string)$typeResolver->resolve('Types\Resolver|m\MockInterface', $context));
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php b/src/composer/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php
new file mode 100644
index 00000000..4f4282eb
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php
@@ -0,0 +1,17 @@
+resolve('Types\Resolver::resolveFqsen()', $context));
+
+// Property named: \phpDocumentor\Types\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php b/src/composer/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php
new file mode 100644
index 00000000..957c97dd
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php
@@ -0,0 +1,30 @@
+createFromReflector(new ReflectionClass('My\\Example\\Classy'));
+
+// Class named: \phpDocumentor\Reflection\Types\Resolver
+var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
+
+// String
+var_dump((string)$typeResolver->resolve('string', $context));
+
+// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
+
+// Class named: \My\Example\string
+// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume
+// that the given value is not a type but most definitely a reference to another element. This is
+// because conflicts between type keywords and class names can exist and if you know a reference
+// is not a type but an element you can force that keywords are resolved.
+var_dump((string)$fqsenResolver->resolve('string', $context));
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php b/src/composer/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php
new file mode 100644
index 00000000..10c0c883
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php
@@ -0,0 +1,30 @@
+createFromReflector(new ReflectionMethod('My\\Example\\Classy', '__construct'));
+
+// Class named: \phpDocumentor\Reflection\Types\Resolver
+var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
+
+// String
+var_dump((string)$typeResolver->resolve('string', $context));
+
+// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
+
+// Class named: \My\Example\string
+// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume
+// that the given value is not a type but most definitely a reference to another element. This is
+// because conflicts between type keywords and class names can exist and if you know a reference
+// is not a type but an element you can force that keywords are resolved.
+var_dump((string)$fqsenResolver->resolve('string', $context));
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php b/src/composer/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php
new file mode 100644
index 00000000..a93728c8
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php
@@ -0,0 +1,22 @@
+createForNamespace('My\Example', file_get_contents('Classy.php'));
+
+// Class named: \phpDocumentor\Reflection\Types\Resolver
+var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
+
+// String
+var_dump((string)$typeResolver->resolve('string', $context));
+
+// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/examples/Classy.php b/src/composer/vendor/phpdocumentor/type-resolver/examples/Classy.php
new file mode 100644
index 00000000..0705266f
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/examples/Classy.php
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+
+
+
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/phpunit.xml.dist b/src/composer/vendor/phpdocumentor/type-resolver/phpunit.xml.dist
new file mode 100644
index 00000000..3246bef4
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/phpunit.xml.dist
@@ -0,0 +1,31 @@
+
+
+
+
+
+ ./tests/unit
+
+
+
+
+ ./src/
+
+
+ ./examples/
+ ./vendor/
+
+
+
+
+
+
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/src/composer/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php
new file mode 100644
index 00000000..a0e0041c
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php
@@ -0,0 +1,76 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\Types\Context;
+
+class FqsenResolver
+{
+ /** @var string Definition of the NAMESPACE operator in PHP */
+ const OPERATOR_NAMESPACE = '\\';
+
+ public function resolve($fqsen, Context $context = null)
+ {
+ if ($context === null) {
+ $context = new Context('');
+ }
+
+ if ($this->isFqsen($fqsen)) {
+ return new Fqsen($fqsen);
+ }
+
+ return $this->resolvePartialStructuralElementName($fqsen, $context);
+ }
+
+ /**
+ * Tests whether the given type is a Fully Qualified Structural Element Name.
+ *
+ * @param string $type
+ *
+ * @return bool
+ */
+ private function isFqsen($type)
+ {
+ return strpos($type, self::OPERATOR_NAMESPACE) === 0;
+ }
+
+ /**
+ * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation
+ * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context.
+ *
+ * @param string $type
+ * @param Context $context
+ *
+ * @return Fqsen
+ */
+ private function resolvePartialStructuralElementName($type, Context $context)
+ {
+ $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2);
+
+ $namespaceAliases = $context->getNamespaceAliases();
+
+ // if the first segment is not an alias; prepend namespace name and return
+ if (!isset($namespaceAliases[$typeParts[0]])) {
+ $namespace = $context->getNamespace();
+ if ('' !== $namespace) {
+ $namespace .= self::OPERATOR_NAMESPACE;
+ }
+
+ return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type);
+ }
+
+ $typeParts[0] = $namespaceAliases[$typeParts[0]];
+
+ return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts));
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Type.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Type.php
new file mode 100644
index 00000000..33ca5595
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Type.php
@@ -0,0 +1,18 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+interface Type
+{
+ public function __toString();
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/src/composer/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
new file mode 100644
index 00000000..3a68a4d3
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
@@ -0,0 +1,266 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Compound;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\Object_;
+
+final class TypeResolver
+{
+ /** @var string Definition of the ARRAY operator for types */
+ const OPERATOR_ARRAY = '[]';
+
+ /** @var string Definition of the NAMESPACE operator in PHP */
+ const OPERATOR_NAMESPACE = '\\';
+
+ /** @var string[] List of recognized keywords and unto which Value Object they map */
+ private $keywords = array(
+ 'string' => 'phpDocumentor\Reflection\Types\String_',
+ 'int' => 'phpDocumentor\Reflection\Types\Integer',
+ 'integer' => 'phpDocumentor\Reflection\Types\Integer',
+ 'bool' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'boolean' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'float' => 'phpDocumentor\Reflection\Types\Float_',
+ 'double' => 'phpDocumentor\Reflection\Types\Float_',
+ 'object' => 'phpDocumentor\Reflection\Types\Object_',
+ 'mixed' => 'phpDocumentor\Reflection\Types\Mixed',
+ 'array' => 'phpDocumentor\Reflection\Types\Array_',
+ 'resource' => 'phpDocumentor\Reflection\Types\Resource',
+ 'void' => 'phpDocumentor\Reflection\Types\Void_',
+ 'null' => 'phpDocumentor\Reflection\Types\Null_',
+ 'scalar' => 'phpDocumentor\Reflection\Types\Scalar',
+ 'callback' => 'phpDocumentor\Reflection\Types\Callable_',
+ 'callable' => 'phpDocumentor\Reflection\Types\Callable_',
+ 'false' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'true' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'self' => 'phpDocumentor\Reflection\Types\Self_',
+ '$this' => 'phpDocumentor\Reflection\Types\This',
+ 'static' => 'phpDocumentor\Reflection\Types\Static_'
+ );
+
+ /** @var FqsenResolver */
+ private $fqsenResolver;
+
+ /**
+ * Initializes this TypeResolver with the means to create and resolve Fqsen objects.
+ *
+ * @param FqsenResolver $fqsenResolver
+ */
+ public function __construct(FqsenResolver $fqsenResolver = null)
+ {
+ $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver();
+ }
+
+ /**
+ * Analyzes the given type and returns the FQCN variant.
+ *
+ * When a type is provided this method checks whether it is not a keyword or
+ * Fully Qualified Class Name. If so it will use the given namespace and
+ * aliases to expand the type to a FQCN representation.
+ *
+ * This method only works as expected if the namespace and aliases are set;
+ * no dynamic reflection is being performed here.
+ *
+ * @param string $type The relative or absolute type.
+ * @param Context $context
+ *
+ * @uses Context::getNamespace() to determine with what to prefix the type name.
+ * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be
+ * replaced with another namespace.
+ *
+ * @return Type|null
+ */
+ public function resolve($type, Context $context = null)
+ {
+ if (!is_string($type)) {
+ throw new \InvalidArgumentException(
+ 'Attempted to resolve type but it appeared not to be a string, received: ' . var_export($type, true)
+ );
+ }
+
+ $type = trim($type);
+ if (!$type) {
+ throw new \InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty');
+ }
+
+ if ($context === null) {
+ $context = new Context('');
+ }
+
+ switch (true) {
+ case $this->isKeyword($type):
+ return $this->resolveKeyword($type);
+ case ($this->isCompoundType($type)):
+ return $this->resolveCompoundType($type, $context);
+ case $this->isTypedArray($type):
+ return $this->resolveTypedArray($type, $context);
+ case $this->isFqsen($type):
+ return $this->resolveTypedObject($type);
+ case $this->isPartialStructuralElementName($type):
+ return $this->resolveTypedObject($type, $context);
+ // @codeCoverageIgnoreStart
+ default:
+ // I haven't got the foggiest how the logic would come here but added this as a defense.
+ throw new \RuntimeException(
+ 'Unable to resolve type "' . $type . '", there is no known method to resolve it'
+ );
+ }
+ // @codeCoverageIgnoreEnd
+ }
+
+ /**
+ * Adds a keyword to the list of Keywords and associates it with a specific Value Object.
+ *
+ * @param string $keyword
+ * @param string $typeClassName
+ *
+ * @return void
+ */
+ public function addKeyword($keyword, $typeClassName)
+ {
+ if (!class_exists($typeClassName)) {
+ throw new \InvalidArgumentException(
+ 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class'
+ . ' but we could not find the class ' . $typeClassName
+ );
+ }
+
+ if (!in_array(Type::class, class_implements($typeClassName))) {
+ throw new \InvalidArgumentException(
+ 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"'
+ );
+ }
+
+ $this->keywords[$keyword] = $typeClassName;
+ }
+
+ /**
+ * Detects whether the given type represents an array.
+ *
+ * @param string $type A relative or absolute type as defined in the phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ private function isTypedArray($type)
+ {
+ return substr($type, -2) === self::OPERATOR_ARRAY;
+ }
+
+ /**
+ * Detects whether the given type represents a PHPDoc keyword.
+ *
+ * @param string $type A relative or absolute type as defined in the phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ private function isKeyword($type)
+ {
+ return in_array(strtolower($type), array_keys($this->keywords), true);
+ }
+
+ /**
+ * Detects whether the given type represents a relative structural element name.
+ *
+ * @param string $type A relative or absolute type as defined in the phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ private function isPartialStructuralElementName($type)
+ {
+ return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type);
+ }
+
+ /**
+ * Tests whether the given type is a Fully Qualified Structural Element Name.
+ *
+ * @param string $type
+ *
+ * @return bool
+ */
+ private function isFqsen($type)
+ {
+ return strpos($type, self::OPERATOR_NAMESPACE) === 0;
+ }
+
+ /**
+ * Tests whether the given type is a compound type (i.e. `string|int`).
+ *
+ * @param string $type
+ *
+ * @return bool
+ */
+ private function isCompoundType($type)
+ {
+ return strpos($type, '|') !== false;
+ }
+
+ /**
+ * Resolves the given typed array string (i.e. `string[]`) into an Array object with the right types set.
+ *
+ * @param string $type
+ * @param Context $context
+ *
+ * @return Array_
+ */
+ private function resolveTypedArray($type, Context $context)
+ {
+ return new Array_($this->resolve(substr($type, 0, -2), $context));
+ }
+
+ /**
+ * Resolves the given keyword (such as `string`) into a Type object representing that keyword.
+ *
+ * @param string $type
+ *
+ * @return Type
+ */
+ private function resolveKeyword($type)
+ {
+ $className = $this->keywords[strtolower($type)];
+
+ return new $className();
+ }
+
+ /**
+ * Resolves the given FQSEN string into an FQSEN object.
+ *
+ * @param string $type
+ *
+ * @return Object_
+ */
+ private function resolveTypedObject($type, Context $context = null)
+ {
+ return new Object_($this->fqsenResolver->resolve($type, $context));
+ }
+
+ /**
+ * Resolves a compound type (i.e. `string|int`) into the appropriate Type objects or FQSEN.
+ *
+ * @param string $type
+ * @param Context $context
+ *
+ * @return Compound
+ */
+ private function resolveCompoundType($type, Context $context)
+ {
+ $types = [];
+
+ foreach (explode('|', $type) as $part) {
+ $types[] = $this->resolve($part, $context);
+ }
+
+ return new Compound($types);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Array_.php
new file mode 100644
index 00000000..45276c6b
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Array_.php
@@ -0,0 +1,87 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Represents an array type as described in the PSR-5, the PHPDoc Standard.
+ *
+ * An array can be represented in two forms:
+ *
+ * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed'.
+ * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a
+ * type name.
+ */
+final class Array_ implements Type
+{
+ /** @var Type */
+ private $valueType;
+
+ /** @var Type */
+ private $keyType;
+
+ /**
+ * Initializes this representation of an array with the given Type or Fqsen.
+ *
+ * @param Type $valueType
+ * @param Type $keyType
+ */
+ public function __construct(Type $valueType = null, Type $keyType = null)
+ {
+ if ($keyType === null) {
+ $keyType = new Compound([ new String_(), new Integer() ]);
+ }
+ if ($valueType === null) {
+ $valueType = new Mixed();
+ }
+
+ $this->valueType = $valueType;
+ $this->keyType = $keyType;
+ }
+
+ /**
+ * Returns the type for the keys of this array.
+ *
+ * @return Type
+ */
+ public function getKeyType()
+ {
+ return $this->keyType;
+ }
+
+ /**
+ * Returns the value for the keys of this array.
+ *
+ * @return Type
+ */
+ public function getValueType()
+ {
+ return $this->valueType;
+ }
+
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if ($this->valueType instanceof Mixed) {
+ return 'array';
+ }
+
+ return $this->valueType . '[]';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php
new file mode 100644
index 00000000..f82b19e5
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Boolean type.
+ */
+final class Boolean implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'bool';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php
new file mode 100644
index 00000000..68ebfbd0
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Callable type.
+ */
+final class Callable_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'callable';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Compound.php
new file mode 100644
index 00000000..3e5ebb5c
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Compound.php
@@ -0,0 +1,82 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Compound Type.
+ *
+ * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated
+ * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type
+ * may contain a value with any of the given types.
+ */
+final class Compound implements Type
+{
+ /** @var Type[] */
+ private $types = [];
+
+ /**
+ * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface.
+ *
+ * @param Type[] $types
+ */
+ public function __construct(array $types)
+ {
+ foreach ($types as $type) {
+ if (!$type instanceof Type) {
+ throw new \InvalidArgumentException('A compound type can only have other types as elements');
+ }
+ }
+
+ $this->types = $types;
+ }
+
+ /**
+ * Returns the type at the given index.
+ *
+ * @param integer $index
+ *
+ * @return Type|null
+ */
+ public function get($index)
+ {
+ if (!$this->has($index)) {
+ return null;
+ }
+
+ return $this->types[$index];
+ }
+
+ /**
+ * Tests if this compound type has a type with the given index.
+ *
+ * @param integer $index
+ *
+ * @return bool
+ */
+ public function has($index)
+ {
+ return isset($this->types[$index]);
+ }
+
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return implode('|', $this->types);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Context.php
new file mode 100644
index 00000000..b4aa8f21
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Context.php
@@ -0,0 +1,84 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+/**
+ * Provides information about the Context in which the DocBlock occurs that receives this context.
+ *
+ * A DocBlock does not know of its own accord in which namespace it occurs and which namespace aliases are applicable
+ * for the block of code in which it is in. This information is however necessary to resolve Class names in tags since
+ * you can provide a short form or make use of namespace aliases.
+ *
+ * The phpDocumentor Reflection component knows how to create this class but if you use the DocBlock parser from your
+ * own application it is possible to generate a Context class using the ContextFactory; this will analyze the file in
+ * which an associated class resides for its namespace and imports.
+ *
+ * @see ContextFactory::createFromClassReflector()
+ * @see ContextFactory::createForNamespace()
+ */
+final class Context
+{
+ /** @var string The current namespace. */
+ private $namespace = '';
+
+ /** @var array List of namespace aliases => Fully Qualified Namespace. */
+ private $namespaceAliases = [];
+
+ /**
+ * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN)
+ * format (without a preceding `\`).
+ *
+ * @param string $namespace The namespace where this DocBlock resides in.
+ * @param array $namespaceAliases List of namespace aliases => Fully Qualified Namespace.
+ */
+ public function __construct($namespace, array $namespaceAliases = [])
+ {
+ $this->namespace = ('global' !== $namespace && 'default' !== $namespace)
+ ? trim((string)$namespace, '\\')
+ : '';
+
+ foreach ($namespaceAliases as $alias => $fqnn) {
+ if ($fqnn[0] === '\\') {
+ $fqnn = substr($fqnn, 1);
+ }
+ if ($fqnn[count($fqnn)-1] === '\\') {
+ $fqnn = substr($fqnn, 0, -1);
+ }
+
+ $namespaceAliases[$alias] = $fqnn;
+ }
+
+ $this->namespaceAliases = $namespaceAliases;
+ }
+
+ /**
+ * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in.
+ *
+ * @return string
+ */
+ public function getNamespace()
+ {
+ return $this->namespace;
+ }
+
+ /**
+ * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent
+ * the alias for the imported Namespace.
+ *
+ * @return string[]
+ */
+ public function getNamespaceAliases()
+ {
+ return $this->namespaceAliases;
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php
new file mode 100644
index 00000000..147df694
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php
@@ -0,0 +1,210 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+/**
+ * Convenience class to create a Context for DocBlocks when not using the Reflection Component of phpDocumentor.
+ *
+ * For a DocBlock to be able to resolve types that use partial namespace names or rely on namespace imports we need to
+ * provide a bit of context so that the DocBlock can read that and based on it decide how to resolve the types to
+ * Fully Qualified names.
+ *
+ * @see Context for more information.
+ */
+final class ContextFactory
+{
+ /** The literal used at the end of a use statement. */
+ const T_LITERAL_END_OF_USE = ';';
+
+ /** The literal used between sets of use statements */
+ const T_LITERAL_USE_SEPARATOR = ',';
+
+ /**
+ * Build a Context given a Class Reflection.
+ *
+ * @param \ReflectionClass $reflector
+ *
+ * @see Context for more information on Contexts.
+ *
+ * @return Context
+ */
+ public function createFromReflector(\Reflector $reflector)
+ {
+ if (method_exists($reflector, 'getDeclaringClass')) {
+ $reflector = $reflector->getDeclaringClass();
+ }
+
+ $fileName = $reflector->getFileName();
+ $namespace = $reflector->getNamespaceName();
+
+ if (file_exists($fileName)) {
+ return $this->createForNamespace($namespace, file_get_contents($fileName));
+ }
+
+ return new Context($namespace, []);
+ }
+
+ /**
+ * Build a Context for a namespace in the provided file contents.
+ *
+ * @param string $namespace It does not matter if a `\` precedes the namespace name, this method first normalizes.
+ * @param string $fileContents the file's contents to retrieve the aliases from with the given namespace.
+ *
+ * @see Context for more information on Contexts.
+ *
+ * @return Context
+ */
+ public function createForNamespace($namespace, $fileContents)
+ {
+ $namespace = trim($namespace, '\\');
+ $useStatements = [];
+ $currentNamespace = '';
+ $tokens = new \ArrayIterator(token_get_all($fileContents));
+
+ while ($tokens->valid()) {
+ switch ($tokens->current()[0]) {
+ case T_NAMESPACE:
+ $currentNamespace = $this->parseNamespace($tokens);
+ break;
+ case T_CLASS:
+ // Fast-forward the iterator through the class so that any
+ // T_USE tokens found within are skipped - these are not
+ // valid namespace use statements so should be ignored.
+ $braceLevel = 0;
+ $firstBraceFound = false;
+ while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) {
+ if ($tokens->current() === '{'
+ || $tokens->current()[0] === T_CURLY_OPEN
+ || $tokens->current()[0] === T_DOLLAR_OPEN_CURLY_BRACES) {
+ if (!$firstBraceFound) {
+ $firstBraceFound = true;
+ }
+ $braceLevel++;
+ }
+
+ if ($tokens->current() === '}') {
+ $braceLevel--;
+ }
+ $tokens->next();
+ }
+ break;
+ case T_USE:
+ if ($currentNamespace === $namespace) {
+ $useStatements = array_merge($useStatements, $this->parseUseStatement($tokens));
+ }
+ break;
+ }
+ $tokens->next();
+ }
+
+ return new Context($namespace, $useStatements);
+ }
+
+ /**
+ * Deduce the name from tokens when we are at the T_NAMESPACE token.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return string
+ */
+ private function parseNamespace(\ArrayIterator $tokens)
+ {
+ // skip to the first string or namespace separator
+ $this->skipToNextStringOrNamespaceSeparator($tokens);
+
+ $name = '';
+ while ($tokens->valid() && ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR)
+ ) {
+ $name .= $tokens->current()[1];
+ $tokens->next();
+ }
+
+ return $name;
+ }
+
+ /**
+ * Deduce the names of all imports when we are at the T_USE token.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return string[]
+ */
+ private function parseUseStatement(\ArrayIterator $tokens)
+ {
+ $uses = [];
+ $continue = true;
+
+ while ($continue) {
+ $this->skipToNextStringOrNamespaceSeparator($tokens);
+
+ list($alias, $fqnn) = $this->extractUseStatement($tokens);
+ $uses[$alias] = $fqnn;
+ if ($tokens->current()[0] === self::T_LITERAL_END_OF_USE) {
+ $continue = false;
+ }
+ }
+
+ return $uses;
+ }
+
+ /**
+ * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return void
+ */
+ private function skipToNextStringOrNamespaceSeparator(\ArrayIterator $tokens)
+ {
+ while ($tokens->valid() && ($tokens->current()[0] !== T_STRING) && ($tokens->current()[0] !== T_NS_SEPARATOR)) {
+ $tokens->next();
+ }
+ }
+
+ /**
+ * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of
+ * a USE statement yet.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return string
+ */
+ private function extractUseStatement(\ArrayIterator $tokens)
+ {
+ $result = [''];
+ while ($tokens->valid()
+ && ($tokens->current()[0] !== self::T_LITERAL_USE_SEPARATOR)
+ && ($tokens->current()[0] !== self::T_LITERAL_END_OF_USE)
+ ) {
+ if ($tokens->current()[0] === T_AS) {
+ $result[] = '';
+ }
+ if ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) {
+ $result[count($result) - 1] .= $tokens->current()[1];
+ }
+ $tokens->next();
+ }
+
+ if (count($result) == 1) {
+ $backslashPos = strrpos($result[0], '\\');
+
+ if (false !== $backslashPos) {
+ $result[] = substr($result[0], $backslashPos + 1);
+ } else {
+ $result[] = $result[0];
+ }
+ }
+
+ return array_reverse($result);
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Float_.php
new file mode 100644
index 00000000..e58d8966
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Float_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Float.
+ */
+final class Float_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'float';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Integer.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Integer.php
new file mode 100644
index 00000000..be4555ef
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Integer.php
@@ -0,0 +1,28 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+final class Integer implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'int';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php
new file mode 100644
index 00000000..79695f45
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing an unknown, or mixed, type.
+ */
+final class Mixed implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'mixed';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Null_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Null_.php
new file mode 100644
index 00000000..203b4227
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Null_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a null value or type.
+ */
+final class Null_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'null';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Object_.php
new file mode 100644
index 00000000..b337c715
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Object_.php
@@ -0,0 +1,70 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing an object.
+ *
+ * An object can be either typed or untyped. When an object is typed it means that it has an identifier, the FQSEN,
+ * pointing to an element in PHP. Object types that are untyped do not refer to a specific class but represent objects
+ * in general.
+ */
+final class Object_ implements Type
+{
+ /** @var Fqsen|null */
+ private $fqsen;
+
+ /**
+ * Initializes this object with an optional FQSEN, if not provided this object is considered 'untyped'.
+ *
+ * @param Fqsen $fqsen
+ */
+ public function __construct(Fqsen $fqsen = null)
+ {
+ if (strpos((string)$fqsen, '::') !== false || strpos((string)$fqsen, '()') !== false) {
+ throw new \InvalidArgumentException(
+ 'Object types can only refer to a class, interface or trait but a method, function, constant or '
+ . 'property was received: ' . (string)$fqsen
+ );
+ }
+
+ $this->fqsen = $fqsen;
+ }
+
+ /**
+ * Returns the FQSEN associated with this object.
+ *
+ * @return Fqsen|null
+ */
+ public function getFqsen()
+ {
+ return $this->fqsen;
+ }
+
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if ($this->fqsen) {
+ return (string)$this->fqsen;
+ }
+
+ return 'object';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Resource.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Resource.php
new file mode 100644
index 00000000..2c2526b7
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Resource.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'resource' Type.
+ */
+final class Resource implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'resource';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php
new file mode 100644
index 00000000..1e2a6602
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'scalar' pseudo-type, which is either a string, integer, float or boolean.
+ */
+final class Scalar implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'scalar';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Self_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Self_.php
new file mode 100644
index 00000000..1ba3fc5a
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Self_.php
@@ -0,0 +1,33 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'self' type.
+ *
+ * Self, as a Type, represents the class in which the associated element was defined.
+ */
+final class Self_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'self';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Static_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Static_.php
new file mode 100644
index 00000000..9eb67299
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Static_.php
@@ -0,0 +1,38 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'static' type.
+ *
+ * Self, as a Type, represents the class in which the associated element was called. This differs from self as self does
+ * not take inheritance into account but static means that the return type is always that of the class of the called
+ * element.
+ *
+ * See the documentation on late static binding in the PHP Documentation for more information on the difference between
+ * static and self.
+ */
+final class Static_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'static';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/String_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/String_.php
new file mode 100644
index 00000000..8db59685
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/String_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the type 'string'.
+ */
+final class String_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'string';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/This.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/This.php
new file mode 100644
index 00000000..c098a939
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/This.php
@@ -0,0 +1,34 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the '$this' pseudo-type.
+ *
+ * $this, as a Type, represents the instance of the class associated with the element as it was called. $this is
+ * commonly used when documenting fluent interfaces since it represents that the same object is returned.
+ */
+final class This implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return '$this';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Void_.php b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Void_.php
new file mode 100644
index 00000000..3d1be272
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/src/Types/Void_.php
@@ -0,0 +1,34 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the pseudo-type 'void'.
+ *
+ * Void is generally only used when working with return types as it signifies that the method intentionally does not
+ * return any value.
+ */
+final class Void_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'void';
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php b/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php
new file mode 100644
index 00000000..f226f8ed
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php
@@ -0,0 +1,395 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use Mockery as m;
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Compound;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\Object_;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\TypeResolver
+ */
+class TypeResolverTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @param string $keyword
+ * @param string $expectedClass
+ *
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\Object_
+ *
+ * @dataProvider provideKeywords
+ */
+ public function testResolvingKeywords($keyword, $expectedClass)
+ {
+ $fixture = new TypeResolver();
+
+ $resolvedType = $fixture->resolve($keyword, new Context(''));
+
+ $this->assertInstanceOf($expectedClass, $resolvedType);
+ }
+
+ /**
+ * @param string $fqsen
+ *
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ *
+ * @dataProvider provideFqcn
+ */
+ public function testResolvingFQSENs($fqsen)
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Object_ $resolvedType */
+ $resolvedType = $fixture->resolve($fqsen, new Context(''));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
+ $this->assertSame($fqsen, (string)$resolvedType);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingRelativeQSENsBasedOnNamespace()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Object_ $resolvedType */
+ $resolvedType = $fixture->resolve('DocBlock', new Context('phpDocumentor\Reflection'));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
+ $this->assertSame('\phpDocumentor\Reflection\DocBlock', (string)$resolvedType);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingRelativeQSENsBasedOnNamespaceAlias()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Object_ $resolvedType */
+ $resolvedType = $fixture->resolve(
+ 'm\MockInterface',
+ new Context('phpDocumentor\Reflection', ['m' => '\Mockery'])
+ );
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
+ $this->assertSame('\Mockery\MockInterface', (string)$resolvedType);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\String_
+ */
+ public function testResolvingTypedArrays()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Array_ $resolvedType */
+ $resolvedType = $fixture->resolve('string[]', new Context(''));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType);
+ $this->assertSame('string[]', (string)$resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $resolvedType->getValueType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\String_
+ */
+ public function testResolvingNestedTypedArrays()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Array_ $resolvedType */
+ $resolvedType = $fixture->resolve('string[][]', new Context(''));
+
+ /** @var Array_ $childValueType */
+ $childValueType = $resolvedType->getValueType();
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType);
+
+ $this->assertSame('string[][]', (string)$resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $childValueType);
+
+ $this->assertSame('string[]', (string)$childValueType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $childValueType->getKeyType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $childValueType->getValueType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Compound
+ * @uses phpDocumentor\Reflection\Types\String_
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingCompoundTypes()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Compound $resolvedType */
+ $resolvedType = $fixture->resolve('string|Reflection\DocBlock', new Context('phpDocumentor'));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
+ $this->assertSame('string|\phpDocumentor\Reflection\DocBlock', (string)$resolvedType);
+
+ /** @var String $secondType */
+ $firstType = $resolvedType->get(0);
+
+ /** @var Object_ $secondType */
+ $secondType = $resolvedType->get(1);
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $firstType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $secondType->getFqsen());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Compound
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingCompoundTypedArrayTypes()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Compound $resolvedType */
+ $resolvedType = $fixture->resolve('\stdClass[]|Reflection\DocBlock[]', new Context('phpDocumentor'));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
+ $this->assertSame('\stdClass[]|\phpDocumentor\Reflection\DocBlock[]', (string)$resolvedType);
+
+ /** @var Array_ $secondType */
+ $firstType = $resolvedType->get(0);
+
+ /** @var Array_ $secondType */
+ $secondType = $resolvedType->get(1);
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $firstType->getValueType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType->getValueType());
+ }
+
+ /**
+ * This test asserts that the parameter order is correct.
+ *
+ * When you pass two arrays separated by the compound operator (i.e. 'integer[]|string[]') then we always split the
+ * expression in its compound parts and then we parse the types with the array operators. If we were to switch the
+ * order around then 'integer[]|string[]' would read as an array of string or integer array; which is something
+ * other than what we intend.
+ *
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Compound
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\Integer
+ * @uses phpDocumentor\Reflection\Types\String_
+ */
+ public function testResolvingCompoundTypesWithTwoArrays()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Compound $resolvedType */
+ $resolvedType = $fixture->resolve('integer[]|string[]', new Context(''));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
+ $this->assertSame('int[]|string[]', (string)$resolvedType);
+
+ /** @var Array_ $firstType */
+ $firstType = $resolvedType->get(0);
+
+ /** @var Array_ $secondType */
+ $secondType = $resolvedType->get(1);
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Integer', $firstType->getValueType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $secondType->getValueType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addKeyword
+ * @uses phpDocumentor\Reflection\TypeResolver::resolve
+ * @uses phpDocumentor\Reflection\TypeResolver::
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testAddingAKeyword()
+ {
+ // Assign
+ $typeMock = m::mock(Type::class);
+
+ // Act
+ $fixture = new TypeResolver();
+ $fixture->addKeyword('mock', get_class($typeMock));
+
+ // Assert
+ $result = $fixture->resolve('mock', new Context(''));
+ $this->assertInstanceOf(get_class($typeMock), $result);
+ $this->assertNotSame($typeMock, $result);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addKeyword
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @expectedException \InvalidArgumentException
+ */
+ public function testAddingAKeywordFailsIfTypeClassDoesNotExist()
+ {
+ $fixture = new TypeResolver();
+ $fixture->addKeyword('mock', 'IDoNotExist');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addKeyword
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @expectedException \InvalidArgumentException
+ */
+ public function testAddingAKeywordFailsIfTypeClassDoesNotImplementTypeInterface()
+ {
+ $fixture = new TypeResolver();
+ $fixture->addKeyword('mock', 'stdClass');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @uses phpDocumentor\Reflection\Types\Context
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTypeIsEmpty()
+ {
+ $fixture = new TypeResolver();
+ $fixture->resolve(' ', new Context(''));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @uses phpDocumentor\Reflection\Types\Context
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTypeIsNotAString()
+ {
+ $fixture = new TypeResolver();
+ $fixture->resolve(['a'], new Context(''));
+ }
+
+ /**
+ * Returns a list of keywords and expected classes that are created from them.
+ *
+ * @return string[][]
+ */
+ public function provideKeywords()
+ {
+ return [
+ ['string', 'phpDocumentor\Reflection\Types\String_'],
+ ['int', 'phpDocumentor\Reflection\Types\Integer'],
+ ['integer', 'phpDocumentor\Reflection\Types\Integer'],
+ ['float', 'phpDocumentor\Reflection\Types\Float_'],
+ ['double', 'phpDocumentor\Reflection\Types\Float_'],
+ ['bool', 'phpDocumentor\Reflection\Types\Boolean'],
+ ['boolean', 'phpDocumentor\Reflection\Types\Boolean'],
+ ['resource', 'phpDocumentor\Reflection\Types\Resource'],
+ ['null', 'phpDocumentor\Reflection\Types\Null_'],
+ ['callable', 'phpDocumentor\Reflection\Types\Callable_'],
+ ['callback', 'phpDocumentor\Reflection\Types\Callable_'],
+ ['array', 'phpDocumentor\Reflection\Types\Array_'],
+ ['scalar', 'phpDocumentor\Reflection\Types\Scalar'],
+ ['object', 'phpDocumentor\Reflection\Types\Object_'],
+ ['mixed', 'phpDocumentor\Reflection\Types\Mixed'],
+ ['void', 'phpDocumentor\Reflection\Types\Void_'],
+ ['$this', 'phpDocumentor\Reflection\Types\This'],
+ ['static', 'phpDocumentor\Reflection\Types\Static_'],
+ ['self', 'phpDocumentor\Reflection\Types\Self_'],
+ ];
+ }
+
+ /**
+ * Provides a list of FQSENs to test the resolution patterns with.
+ *
+ * @return string[][]
+ */
+ public function provideFqcn()
+ {
+ return [
+ 'namespace' => ['\phpDocumentor\Reflection'],
+ 'class' => ['\phpDocumentor\Reflection\DocBlock'],
+ ];
+ }
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php b/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php
new file mode 100644
index 00000000..20d63c95
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php
@@ -0,0 +1,188 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types {
+
+// Added imports on purpose as mock for the unit tests, please do not remove.
+ use Mockery as m;
+ use phpDocumentor\Reflection\DocBlock,
+ phpDocumentor\Reflection\DocBlock\Tag;
+ use phpDocumentor;
+ use \ReflectionClass; // yes, the slash is part of the test
+
+ /**
+ * @coversDefaultClass \phpDocumentor\Reflection\Types\ContextFactory
+ * @covers ::
+ */
+ class ContextFactoryTest extends \PHPUnit_Framework_TestCase
+ {
+ /**
+ * @covers ::createFromReflector
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsNamespaceFromClassReflection()
+ {
+ $fixture = new ContextFactory();
+ $context = $fixture->createFromReflector(new ReflectionClass($this));
+
+ $this->assertSame(__NAMESPACE__, $context->getNamespace());
+ }
+
+ /**
+ * @covers ::createFromReflector
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsAliasesFromClassReflection()
+ {
+ $fixture = new ContextFactory();
+ $expected = [
+ 'm' => 'Mockery',
+ 'DocBlock' => 'phpDocumentor\Reflection\DocBlock',
+ 'Tag' => 'phpDocumentor\Reflection\DocBlock\Tag',
+ 'phpDocumentor' => 'phpDocumentor',
+ 'ReflectionClass' => 'ReflectionClass'
+ ];
+ $context = $fixture->createFromReflector(new ReflectionClass($this));
+
+ $this->assertSame($expected, $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsNamespaceFromProvidedNamespaceAndContent()
+ {
+ $fixture = new ContextFactory();
+ $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__));
+
+ $this->assertSame(__NAMESPACE__, $context->getNamespace());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsAliasesFromProvidedNamespaceAndContent()
+ {
+ $fixture = new ContextFactory();
+ $expected = [
+ 'm' => 'Mockery',
+ 'DocBlock' => 'phpDocumentor\Reflection\DocBlock',
+ 'Tag' => 'phpDocumentor\Reflection\DocBlock\Tag',
+ 'phpDocumentor' => 'phpDocumentor',
+ 'ReflectionClass' => 'ReflectionClass'
+ ];
+ $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__));
+
+ $this->assertSame($expected, $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testTraitUseIsNotDetectedAsNamespaceUse()
+ {
+ $php = "createForNamespace('Foo', $php);
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testAllOpeningBracesAreCheckedWhenSearchingForEndOfClass()
+ {
+ $php = 'createForNamespace('Foo', $php);
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createFromReflector
+ */
+ public function testEmptyFileName()
+ {
+ $fixture = new ContextFactory();
+ $context = $fixture->createFromReflector(new \ReflectionClass('stdClass'));
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createFromReflector
+ */
+ public function testEvalDClass()
+ {
+ eval(<<createFromReflector(new \ReflectionClass('Foo\Bar'));
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+ }
+}
+
+namespace phpDocumentor\Reflection\Types\Mock {
+ // the following import should not show in the tests above
+ use phpDocumentor\Reflection\DocBlock\Description;
+}
diff --git a/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php b/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php
new file mode 100644
index 00000000..165f415d
--- /dev/null
+++ b/src/composer/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php
@@ -0,0 +1,61 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use Mockery as m;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\Types\Context
+ */
+class ContextTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespace
+ */
+ public function testProvidesANormalizedNamespace()
+ {
+ $fixture = new Context('\My\Space');
+ $this->assertSame('My\Space', $fixture->getNamespace());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespace
+ */
+ public function testInterpretsNamespaceNamedGlobalAsRootNamespace()
+ {
+ $fixture = new Context('global');
+ $this->assertSame('', $fixture->getNamespace());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespace
+ */
+ public function testInterpretsNamespaceNamedDefaultAsRootNamespace()
+ {
+ $fixture = new Context('default');
+ $this->assertSame('', $fixture->getNamespace());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespaceAliases
+ */
+ public function testProvidesNormalizedNamespaceAliases()
+ {
+ $fixture = new Context('', ['Space' => '\My\Space']);
+ $this->assertSame(['Space' => 'My\Space'], $fixture->getNamespaceAliases());
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/.gitignore b/src/composer/vendor/phpspec/prophecy/.gitignore
new file mode 100644
index 00000000..0c93fcf3
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/.gitignore
@@ -0,0 +1,4 @@
+*.tgz
+*.phar
+/composer.lock
+/vendor
diff --git a/src/composer/vendor/phpspec/prophecy/.travis.yml b/src/composer/vendor/phpspec/prophecy/.travis.yml
new file mode 100644
index 00000000..e75c39ef
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/.travis.yml
@@ -0,0 +1,29 @@
+language: php
+
+php: [5.3, 5.4, 5.5, 5.6, 7.0, hhvm]
+
+sudo: false
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+branches:
+ except:
+ - /^bugfix\/.*$/
+ - /^feature\/.*$/
+ - /^optimization\/.*$/
+
+matrix:
+ fast_finish: true
+ include:
+ - php: '7.0'
+ env: PHPDOCUMENTOR_REFLECTION_DOCBLOCK="^2.0"
+
+before_script:
+ - if [ -n "$PHPDOCUMENTOR_REFLECTION_DOCBLOCK" ]; then
+ composer require "phpdocumentor/reflection-docblock:${PHPDOCUMENTOR_REFLECTION_DOCBLOCK}" --no-update;
+ fi;
+ - travis_retry composer update --no-interaction
+
+script: vendor/bin/phpspec run -fpretty -v
diff --git a/src/composer/vendor/phpspec/prophecy/CHANGES.md b/src/composer/vendor/phpspec/prophecy/CHANGES.md
new file mode 100644
index 00000000..444c1fa6
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/CHANGES.md
@@ -0,0 +1,147 @@
+1.6.1 / 2016-06-07
+==================
+
+ * Ignored empty method names in invalid `@method` phpdoc
+ * Fixed the mocking of SplFileObject
+ * Added compatibility with phpdocumentor/reflection-docblock 3
+
+1.6.0 / 2016-02-15
+==================
+
+ * Add Variadics support (thanks @pamil)
+ * Add ProphecyComparator for comparing objects that need revealing (thanks @jon-acker)
+ * Add ApproximateValueToken (thanks @dantleech)
+ * Add support for 'self' and 'parent' return type (thanks @bendavies)
+ * Add __invoke to allowed reflectable methods list (thanks @ftrrtf)
+ * Updated ExportUtil to reflect the latest changes by Sebastian (thanks @jakari)
+ * Specify the required php version for composer (thanks @jakzal)
+ * Exclude 'args' in the generated backtrace (thanks @oradwell)
+ * Fix code generation for scalar parameters (thanks @trowski)
+ * Fix missing sprintf in InvalidArgumentException __construct call (thanks @emmanuelballery)
+ * Fix phpdoc for magic methods (thanks @Tobion)
+ * Fix PhpDoc for interfaces usage (thanks @ImmRanneft)
+ * Prevent final methods from being manually extended (thanks @kamioftea)
+ * Enhance exception for invalid argument to ThrowPromise (thanks @Tobion)
+
+1.5.0 / 2015-04-27
+==================
+
+ * Add support for PHP7 scalar type hints (thanks @trowski)
+ * Add support for PHP7 return types (thanks @trowski)
+ * Update internal test suite to support PHP7
+
+1.4.1 / 2015-04-27
+==================
+
+ * Fixed bug in closure-based argument tokens (#181)
+
+1.4.0 / 2015-03-27
+==================
+
+ * Fixed errors in return type phpdocs (thanks @sobit)
+ * Fixed stringifying of hash containing one value (thanks @avant1)
+ * Improved clarity of method call expectation exception (thanks @dantleech)
+ * Add ability to specify which argument is returned in willReturnArgument (thanks @coderbyheart)
+ * Add more information to MethodNotFound exceptions (thanks @ciaranmcnulty)
+ * Support for mocking classes with methods that return references (thanks @edsonmedina)
+ * Improved object comparison (thanks @whatthejeff)
+ * Adopted '^' in composer dependencies (thanks @GrahamCampbell)
+ * Fixed non-typehinted arguments being treated as optional (thanks @whatthejeff)
+ * Magic methods are now filtered for keywords (thanks @seagoj)
+ * More readable errors for failure when expecting single calls (thanks @dantleech)
+
+1.3.1 / 2014-11-17
+==================
+
+ * Fix the edge case when failed predictions weren't recorded for `getCheckedPredictions()`
+
+1.3.0 / 2014-11-14
+==================
+
+ * Add a way to get checked predictions with `MethodProphecy::getCheckedPredictions()`
+ * Fix HHVM compatibility
+ * Remove dead code (thanks @stof)
+ * Add support for DirectoryIterators (thanks @shanethehat)
+
+1.2.0 / 2014-07-18
+==================
+
+ * Added support for doubling magic methods documented in the class phpdoc (thanks @armetiz)
+ * Fixed a segfault appearing in some cases (thanks @dmoreaulf)
+ * Fixed the doubling of methods with typehints on non-existent classes (thanks @gquemener)
+ * Added support for internal classes using keywords as method names (thanks @milan)
+ * Added IdenticalValueToken and Argument::is (thanks @florianv)
+ * Removed the usage of scalar typehints in HHVM as HHVM 3 does not support them anymore in PHP code (thanks @whatthejeff)
+
+1.1.2 / 2014-01-24
+==================
+
+ * Spy automatically promotes spied method call to an expected one
+
+1.1.1 / 2014-01-15
+==================
+
+ * Added support for HHVM
+
+1.1.0 / 2014-01-01
+==================
+
+ * Changed the generated class names to use a static counter instead of a random number
+ * Added a clss patch for ReflectionClass::newInstance to make its argument optional consistently (thanks @docteurklein)
+ * Fixed mirroring of classes with typehints on non-existent classes (thanks @docteurklein)
+ * Fixed the support of array callables in CallbackPromise and CallbackPrediction (thanks @ciaranmcnulty)
+ * Added support for properties in ObjectStateToken (thanks @adrienbrault)
+ * Added support for mocking classes with a final constructor (thanks @ciaranmcnulty)
+ * Added ArrayEveryEntryToken and Argument::withEveryEntry() (thanks @adrienbrault)
+ * Added an exception when trying to prophesize on a final method instead of ignoring silently (thanks @docteurklein)
+ * Added StringContainToken and Argument::containingString() (thanks @peterjmit)
+ * Added ``shouldNotHaveBeenCalled`` on the MethodProphecy (thanks @ciaranmcnulty)
+ * Fixed the comparison of objects in ExactValuetoken (thanks @sstok)
+ * Deprecated ``shouldNotBeenCalled`` in favor of ``shouldNotHaveBeenCalled``
+
+1.0.4 / 2013-08-10
+==================
+
+ * Better randomness for generated class names (thanks @sstok)
+ * Add support for interfaces into TypeToken and Argument::type() (thanks @sstok)
+ * Add support for old-style (method name === class name) constructors (thanks @l310 for report)
+
+1.0.3 / 2013-07-04
+==================
+
+ * Support callable typehints (thanks @stof)
+ * Do not attempt to autoload arrays when generating code (thanks @MarcoDeBortoli)
+ * New ArrayEntryToken (thanks @kagux)
+
+1.0.2 / 2013-05-19
+==================
+
+ * Logical `AND` token added (thanks @kagux)
+ * Logical `NOT` token added (thanks @kagux)
+ * Add support for setting custom constructor arguments
+ * Properly stringify hashes
+ * Record calls that throw exceptions
+ * Migrate spec suite to PhpSpec 2.0
+
+1.0.1 / 2013-04-30
+==================
+
+ * Fix broken UnexpectedCallException message
+ * Trim AggregateException message
+
+1.0.0 / 2013-04-29
+==================
+
+ * Improve exception messages
+
+1.0.0-BETA2 / 2013-04-03
+========================
+
+ * Add more debug information to CallTimes and Call prediction exception messages
+ * Fix MethodNotFoundException wrong namespace (thanks @gunnarlium)
+ * Fix some typos in the exception messages (thanks @pborreli)
+
+1.0.0-BETA1 / 2013-03-25
+========================
+
+ * Initial release
diff --git a/src/composer/vendor/phpspec/prophecy/CONTRIBUTING.md b/src/composer/vendor/phpspec/prophecy/CONTRIBUTING.md
new file mode 100644
index 00000000..72d8e933
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/CONTRIBUTING.md
@@ -0,0 +1,21 @@
+Contributing
+------------
+
+Prophecy is an open source, community-driven project. If you'd like to contribute,
+feel free to do this, but remember to follow these few simple rules:
+
+- Make your feature addition or bug fix,
+- Add either specs or examples for any changes you're making (bugfixes or additions)
+ (please look into `spec/` folder for some examples). This is important so we don't break
+ it in a future version unintentionally,
+- Commit your code, but do not mess with `CHANGES.md`,
+
+Running tests
+-------------
+
+Make sure that you don't break anything with your changes by running:
+
+```bash
+$> composer install --prefer-dist
+$> vendor/bin/phpspec run
+```
diff --git a/src/composer/vendor/phpspec/prophecy/LICENSE b/src/composer/vendor/phpspec/prophecy/LICENSE
new file mode 100644
index 00000000..c8b36471
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2013 Konstantin Kudryashov
+ Marcello Duarte
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/composer/vendor/phpspec/prophecy/README.md b/src/composer/vendor/phpspec/prophecy/README.md
new file mode 100644
index 00000000..65ec16c4
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/README.md
@@ -0,0 +1,391 @@
+# Prophecy
+
+[](https://packagist.org/packages/phpspec/prophecy)
+[](https://travis-ci.org/phpspec/prophecy)
+
+Prophecy is a highly opinionated yet very powerful and flexible PHP object mocking
+framework. Though initially it was created to fulfil phpspec2 needs, it is flexible
+enough to be used inside any testing framework out there with minimal effort.
+
+## A simple example
+
+```php
+prophet->prophesize('App\Security\Hasher');
+ $user = new App\Entity\User($hasher->reveal());
+
+ $hasher->generateHash($user, 'qwerty')->willReturn('hashed_pass');
+
+ $user->setPassword('qwerty');
+
+ $this->assertEquals('hashed_pass', $user->getPassword());
+ }
+
+ protected function setup()
+ {
+ $this->prophet = new \Prophecy\Prophet;
+ }
+
+ protected function tearDown()
+ {
+ $this->prophet->checkPredictions();
+ }
+}
+```
+
+## Installation
+
+### Prerequisites
+
+Prophecy requires PHP 5.3.3 or greater.
+
+### Setup through composer
+
+First, add Prophecy to the list of dependencies inside your `composer.json`:
+
+```json
+{
+ "require-dev": {
+ "phpspec/prophecy": "~1.0"
+ }
+}
+```
+
+Then simply install it with composer:
+
+```bash
+$> composer install --prefer-dist
+```
+
+You can read more about Composer on its [official webpage](http://getcomposer.org).
+
+## How to use it
+
+First of all, in Prophecy every word has a logical meaning, even the name of the library
+itself (Prophecy). When you start feeling that, you'll become very fluid with this
+tool.
+
+For example, Prophecy has been named that way because it concentrates on describing the future
+behavior of objects with very limited knowledge about them. But as with any other prophecy,
+those object prophecies can't create themselves - there should be a Prophet:
+
+```php
+$prophet = new Prophecy\Prophet;
+```
+
+The Prophet creates prophecies by *prophesizing* them:
+
+```php
+$prophecy = $prophet->prophesize();
+```
+
+The result of the `prophesize()` method call is a new object of class `ObjectProphecy`. Yes,
+that's your specific object prophecy, which describes how your object would behave
+in the near future. But first, you need to specify which object you're talking about,
+right?
+
+```php
+$prophecy->willExtend('stdClass');
+$prophecy->willImplement('SessionHandlerInterface');
+```
+
+There are 2 interesting calls - `willExtend` and `willImplement`. The first one tells
+object prophecy that our object should extend specific class, the second one says that
+it should implement some interface. Obviously, objects in PHP can implement multiple
+interfaces, but extend only one parent class.
+
+### Dummies
+
+Ok, now we have our object prophecy. What can we do with it? First of all, we can get
+our object *dummy* by revealing its prophecy:
+
+```php
+$dummy = $prophecy->reveal();
+```
+
+The `$dummy` variable now holds a special dummy object. Dummy objects are objects that extend
+and/or implement preset classes/interfaces by overriding all their public methods. The key
+point about dummies is that they do not hold any logic - they just do nothing. Any method
+of the dummy will always return `null` and the dummy will never throw any exceptions.
+Dummy is your friend if you don't care about the actual behavior of this double and just need
+a token object to satisfy a method typehint.
+
+You need to understand one thing - a dummy is not a prophecy. Your object prophecy is still
+assigned to `$prophecy` variable and in order to manipulate with your expectations, you
+should work with it. `$dummy` is a dummy - a simple php object that tries to fulfil your
+prophecy.
+
+### Stubs
+
+Ok, now we know how to create basic prophecies and reveal dummies from them. That's
+awesome if we don't care about our _doubles_ (objects that reflect originals)
+interactions. If we do, we need to use *stubs* or *mocks*.
+
+A stub is an object double, which doesn't have any expectations about the object behavior,
+but when put in specific environment, behaves in specific way. Ok, I know, it's cryptic,
+but bear with me for a minute. Simply put, a stub is a dummy, which depending on the called
+method signature does different things (has logic). To create stubs in Prophecy:
+
+```php
+$prophecy->read('123')->willReturn('value');
+```
+
+Oh wow. We've just made an arbitrary call on the object prophecy? Yes, we did. And this
+call returned us a new object instance of class `MethodProphecy`. Yep, that's a specific
+method with arguments prophecy. Method prophecies give you the ability to create method
+promises or predictions. We'll talk about method predictions later in the _Mocks_ section.
+
+#### Promises
+
+Promises are logical blocks, that represent your fictional methods in prophecy terms
+and they are handled by the `MethodProphecy::will(PromiseInterface $promise)` method.
+As a matter of fact, the call that we made earlier (`willReturn('value')`) is a simple
+shortcut to:
+
+```php
+$prophecy->read('123')->will(new Prophecy\Promise\ReturnPromise(array('value')));
+```
+
+This promise will cause any call to our double's `read()` method with exactly one
+argument - `'123'` to always return `'value'`. But that's only for this
+promise, there's plenty others you can use:
+
+- `ReturnPromise` or `->willReturn(1)` - returns a value from a method call
+- `ReturnArgumentPromise` or `->willReturnArgument($index)` - returns the nth method argument from call
+- `ThrowPromise` or `->willThrow` - causes the method to throw specific exception
+- `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic
+
+Keep in mind, that you can always add even more promises by implementing
+`Prophecy\Promise\PromiseInterface`.
+
+#### Method prophecies idempotency
+
+Prophecy enforces same method prophecies and, as a consequence, same promises and
+predictions for the same method calls with the same arguments. This means:
+
+```php
+$methodProphecy1 = $prophecy->read('123');
+$methodProphecy2 = $prophecy->read('123');
+$methodProphecy3 = $prophecy->read('321');
+
+$methodProphecy1 === $methodProphecy2;
+$methodProphecy1 !== $methodProphecy3;
+```
+
+That's interesting, right? Now you might ask me how would you define more complex
+behaviors where some method call changes behavior of others. In PHPUnit or Mockery
+you do that by predicting how many times your method will be called. In Prophecy,
+you'll use promises for that:
+
+```php
+$user->getName()->willReturn(null);
+
+// For PHP 5.4
+$user->setName('everzet')->will(function () {
+ $this->getName()->willReturn('everzet');
+});
+
+// For PHP 5.3
+$user->setName('everzet')->will(function ($args, $user) {
+ $user->getName()->willReturn('everzet');
+});
+
+// Or
+$user->setName('everzet')->will(function ($args) use ($user) {
+ $user->getName()->willReturn('everzet');
+});
+```
+
+And now it doesn't matter how many times or in which order your methods are called.
+What matters is their behaviors and how well you faked it.
+
+#### Arguments wildcarding
+
+The previous example is awesome (at least I hope it is for you), but that's not
+optimal enough. We hardcoded `'everzet'` in our expectation. Isn't there a better
+way? In fact there is, but it involves understanding what this `'everzet'`
+actually is.
+
+You see, even if method arguments used during method prophecy creation look
+like simple method arguments, in reality they are not. They are argument token
+wildcards. As a matter of fact, `->setName('everzet')` looks like a simple call just
+because Prophecy automatically transforms it under the hood into:
+
+```php
+$user->setName(new Prophecy\Argument\Token\ExactValueToken('everzet'));
+```
+
+Those argument tokens are simple PHP classes, that implement
+`Prophecy\Argument\Token\TokenInterface` and tell Prophecy how to compare real arguments
+with your expectations. And yes, those classnames are damn big. That's why there's a
+shortcut class `Prophecy\Argument`, which you can use to create tokens like that:
+
+```php
+use Prophecy\Argument;
+
+$user->setName(Argument::exact('everzet'));
+```
+
+`ExactValueToken` is not very useful in our case as it forced us to hardcode the username.
+That's why Prophecy comes bundled with a bunch of other tokens:
+
+- `IdenticalValueToken` or `Argument::is($value)` - checks that the argument is identical to a specific value
+- `ExactValueToken` or `Argument::exact($value)` - checks that the argument matches a specific value
+- `TypeToken` or `Argument::type($typeOrClass)` - checks that the argument matches a specific type or
+ classname
+- `ObjectStateToken` or `Argument::which($method, $value)` - checks that the argument method returns
+ a specific value
+- `CallbackToken` or `Argument::that(callback)` - checks that the argument matches a custom callback
+- `AnyValueToken` or `Argument::any()` - matches any argument
+- `AnyValuesToken` or `Argument::cetera()` - matches any arguments to the rest of the signature
+- `StringContainsToken` or `Argument::containingString($value)` - checks that the argument contains a specific string value
+
+And you can add even more by implementing `TokenInterface` with your own custom classes.
+
+So, let's refactor our initial `{set,get}Name()` logic with argument tokens:
+
+```php
+use Prophecy\Argument;
+
+$user->getName()->willReturn(null);
+
+// For PHP 5.4
+$user->setName(Argument::type('string'))->will(function ($args) {
+ $this->getName()->willReturn($args[0]);
+});
+
+// For PHP 5.3
+$user->setName(Argument::type('string'))->will(function ($args, $user) {
+ $user->getName()->willReturn($args[0]);
+});
+
+// Or
+$user->setName(Argument::type('string'))->will(function ($args) use ($user) {
+ $user->getName()->willReturn($args[0]);
+});
+```
+
+That's it. Now our `{set,get}Name()` prophecy will work with any string argument provided to it.
+We've just described how our stub object should behave, even though the original object could have
+no behavior whatsoever.
+
+One last bit about arguments now. You might ask, what happens in case of:
+
+```php
+use Prophecy\Argument;
+
+$user->getName()->willReturn(null);
+
+// For PHP 5.4
+$user->setName(Argument::type('string'))->will(function ($args) {
+ $this->getName()->willReturn($args[0]);
+});
+
+// For PHP 5.3
+$user->setName(Argument::type('string'))->will(function ($args, $user) {
+ $user->getName()->willReturn($args[0]);
+});
+
+// Or
+$user->setName(Argument::type('string'))->will(function ($args) use ($user) {
+ $user->getName()->willReturn($args[0]);
+});
+
+$user->setName(Argument::any())->will(function () {
+});
+```
+
+Nothing. Your stub will continue behaving the way it did before. That's because of how
+arguments wildcarding works. Every argument token type has a different score level, which
+wildcard then uses to calculate the final arguments match score and use the method prophecy
+promise that has the highest score. In this case, `Argument::type()` in case of success
+scores `5` and `Argument::any()` scores `3`. So the type token wins, as does the first
+`setName()` method prophecy and its promise. The simple rule of thumb - more precise token
+always wins.
+
+#### Getting stub objects
+
+Ok, now we know how to define our prophecy method promises, let's get our stub from
+it:
+
+```php
+$stub = $prophecy->reveal();
+```
+
+As you might see, the only difference between how we get dummies and stubs is that with
+stubs we describe every object conversation instead of just agreeing with `null` returns
+(object being *dummy*). As a matter of fact, after you define your first promise
+(method call), Prophecy will force you to define all the communications - it throws
+the `UnexpectedCallException` for any call you didn't describe with object prophecy before
+calling it on a stub.
+
+### Mocks
+
+Now we know how to define doubles without behavior (dummies) and doubles with behavior, but
+no expectations (stubs). What's left is doubles for which we have some expectations. These
+are called mocks and in Prophecy they look almost exactly the same as stubs, except that
+they define *predictions* instead of *promises* on method prophecies:
+
+```php
+$entityManager->flush()->shouldBeCalled();
+```
+
+#### Predictions
+
+The `shouldBeCalled()` method here assigns `CallPrediction` to our method prophecy.
+Predictions are a delayed behavior check for your prophecies. You see, during the entire lifetime
+of your doubles, Prophecy records every single call you're making against it inside your
+code. After that, Prophecy can use this collected information to check if it matches defined
+predictions. You can assign predictions to method prophecies using the
+`MethodProphecy::should(PredictionInterface $prediction)` method. As a matter of fact,
+the `shouldBeCalled()` method we used earlier is just a shortcut to:
+
+```php
+$entityManager->flush()->should(new Prophecy\Prediction\CallPrediction());
+```
+
+It checks if your method of interest (that matches both the method name and the arguments wildcard)
+was called 1 or more times. If the prediction failed then it throws an exception. When does this
+check happen? Whenever you call `checkPredictions()` on the main Prophet object:
+
+```php
+$prophet->checkPredictions();
+```
+
+In PHPUnit, you would want to put this call into the `tearDown()` method. If no predictions
+are defined, it would do nothing. So it won't harm to call it after every test.
+
+There are plenty more predictions you can play with:
+
+- `CallPrediction` or `shouldBeCalled()` - checks that the method has been called 1 or more times
+- `NoCallsPrediction` or `shouldNotBeCalled()` - checks that the method has not been called
+- `CallTimesPrediction` or `shouldBeCalledTimes($count)` - checks that the method has been called
+ `$count` times
+- `CallbackPrediction` or `should($callback)` - checks the method against your own custom callback
+
+Of course, you can always create your own custom prediction any time by implementing
+`PredictionInterface`.
+
+### Spies
+
+The last bit of awesomeness in Prophecy is out-of-the-box spies support. As I said in the previous
+section, Prophecy records every call made during the double's entire lifetime. This means
+you don't need to record predictions in order to check them. You can also do it
+manually by using the `MethodProphecy::shouldHave(PredictionInterface $prediction)` method:
+
+```php
+$em = $prophet->prophesize('Doctrine\ORM\EntityManager');
+
+$controller->createUser($em->reveal());
+
+$em->flush()->shouldHaveBeenCalled();
+```
+
+Such manipulation with doubles is called spying. And with Prophecy it just works.
diff --git a/src/composer/vendor/phpspec/prophecy/composer.json b/src/composer/vendor/phpspec/prophecy/composer.json
new file mode 100644
index 00000000..23131b20
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "phpspec/prophecy",
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"],
+ "homepage": "https://github.com/phpspec/prophecy",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+
+ "require": {
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "doctrine/instantiator": "^1.0.2",
+ "sebastian/recursion-context": "^1.0"
+ },
+
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
new file mode 100644
index 00000000..5d6a2da3
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
@@ -0,0 +1,146 @@
+beConstructedWith(array(42, 'zet', $object));
+
+ $class = get_class($object->getWrappedObject());
+ $hash = spl_object_hash($object->getWrappedObject());
+
+ $this->__toString()->shouldReturn("exact(42), exact(\"zet\"), exact($class:$hash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_generates_string_representation_from_all_tokens_imploded($token1, $token2, $token3)
+ {
+ $token1->__toString()->willReturn('token_1');
+ $token2->__toString()->willReturn('token_2');
+ $token3->__toString()->willReturn('token_3');
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->__toString()->shouldReturn('token_1, token_2, token_3');
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token
+ */
+ function it_exposes_list_of_tokens($token)
+ {
+ $this->beConstructedWith(array($token));
+
+ $this->getTokens()->shouldReturn(array($token));
+ }
+
+ function it_returns_score_of_1_if_there_are_no_tokens_and_arguments()
+ {
+ $this->beConstructedWith(array());
+
+ $this->scoreArguments(array())->shouldReturn(1);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_should_return_match_score_based_on_all_tokens_score($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(5);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj))->shouldReturn(18);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_returns_false_if_there_is_less_arguments_than_tokens($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(5);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument(null)->willReturn(false);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_returns_false_if_there_is_less_tokens_than_arguments($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(5);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj, 4))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_should_return_false_if_one_of_the_tokens_returns_false($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(false);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_should_calculate_score_until_last_token($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+
+ $token2->scoreArgument(2)->willReturn(7);
+ $token2->isLast()->willReturn(true);
+
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj))->shouldReturn(10);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
new file mode 100644
index 00000000..a43e923c
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
@@ -0,0 +1,28 @@
+shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function its_string_representation_is_star()
+ {
+ $this->__toString()->shouldReturn('*');
+ }
+
+ function it_scores_any_argument_as_3()
+ {
+ $this->scoreArgument(42)->shouldReturn(3);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
new file mode 100644
index 00000000..c29076f5
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
@@ -0,0 +1,28 @@
+shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_last()
+ {
+ $this->shouldBeLast();
+ }
+
+ function its_string_representation_is_star_with_followup()
+ {
+ $this->__toString()->shouldReturn('* [, ...]');
+ }
+
+ function it_scores_any_argument_as_2()
+ {
+ $this->scoreArgument(42)->shouldReturn(2);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
new file mode 100644
index 00000000..8799d6d5
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
@@ -0,0 +1,55 @@
+beConstructedWith(10.12345678, 4);
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Argument\Token\ApproximateValueToken');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_10_if_rounded_argument_matches_rounded_value()
+ {
+ $this->scoreArgument(10.12345)->shouldReturn(10);
+ }
+
+ function it_does_not_score_if_rounded_argument_does_not_match_rounded_value()
+ {
+ $this->scoreArgument(10.1234)->shouldReturn(false);
+ }
+
+ function it_uses_a_default_precision_of_zero()
+ {
+ $this->beConstructedWith(10.7);
+ $this->scoreArgument(11.4)->shouldReturn(10);
+ }
+
+ function it_does_not_score_if_rounded_argument_is_not_numeric()
+ {
+ $this->scoreArgument('hello')->shouldReturn(false);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldBe('≅10.1235');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
new file mode 100644
index 00000000..5d040d59
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
@@ -0,0 +1,64 @@
+beConstructedWith(2);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_6_if_argument_array_has_proper_count()
+ {
+ $this->scoreArgument(array(1,2))->shouldReturn(6);
+ }
+
+ /**
+ * @param \Countable $countable
+ */
+ function it_scores_6_if_argument_countable_object_has_proper_count($countable)
+ {
+ $countable->count()->willReturn(2);
+ $this->scoreArgument($countable)->shouldReturn(6);
+ }
+
+ function it_does_not_score_if_argument_is_neither_array_nor_countable_object()
+ {
+ $this->scoreArgument('string')->shouldBe(false);
+ $this->scoreArgument(5)->shouldBe(false);
+ $this->scoreArgument(new \stdClass)->shouldBe(false);
+ }
+
+ function it_does_not_score_if_argument_array_has_wrong_count()
+ {
+ $this->scoreArgument(array(1))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Countable $countable
+ */
+ function it_does_not_score_if_argument_countable_object_has_wrong_count($countable)
+ {
+ $countable->count()->willReturn(3);
+ $this->scoreArgument($countable)->shouldReturn(false);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldBe('count(2)');
+ }
+
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
new file mode 100644
index 00000000..8ff0f158
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
@@ -0,0 +1,229 @@
+beConstructedWith($key, $value);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_holds_key_and_value($key, $value)
+ {
+ $this->getKey()->shouldBe($key);
+ $this->getValue()->shouldBe($value);
+ }
+
+ function its_string_representation_tells_that_its_an_array_containing_the_key_value_pair($key, $value)
+ {
+ $key->__toString()->willReturn('key');
+ $value->__toString()->willReturn('value');
+ $this->__toString()->shouldBe('[..., key => value, ...]');
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $key
+ * @param \stdClass $object
+ */
+ function it_wraps_non_token_value_into_ExactValueToken($key, $object)
+ {
+ $this->beConstructedWith($key, $object);
+ $this->getValue()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
+ }
+
+ /**
+ * @param \stdClass $object
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ */
+ function it_wraps_non_token_key_into_ExactValueToken($object, $value)
+ {
+ $this->beConstructedWith($object, $value);
+ $this->getKey()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
+ }
+
+ function it_scores_array_half_of_combined_scores_from_key_and_value_tokens($key, $value)
+ {
+ $key->scoreArgument('key')->willReturn(4);
+ $value->scoreArgument('value')->willReturn(6);
+ $this->scoreArgument(array('key'=>'value'))->shouldBe(5);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \Iterator $object
+ */
+ function it_scores_traversable_object_half_of_combined_scores_from_key_and_value_tokens($key, $value, $object)
+ {
+ $object->current()->will(function () use ($object) {
+ $object->valid()->willReturn(false);
+
+ return 'value';
+ });
+ $object->key()->willReturn('key');
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $key->scoreArgument('key')->willReturn(6);
+ $value->scoreArgument('value')->willReturn(2);
+ $this->scoreArgument($object)->shouldBe(4);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\AnyValuesToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayAccess $object
+ */
+ function it_throws_exception_during_scoring_of_array_accessible_object_if_key_is_not_ExactValueToken($key, $value, $object)
+ {
+ $key->__toString()->willReturn('any_token');
+ $this->beConstructedWith($key,$value);
+ $errorMessage = 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
+ 'But you used `any_token`.';
+ $this->shouldThrow(new InvalidArgumentException($errorMessage))->duringScoreArgument($object);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\ExactValueToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayAccess $object
+ */
+ function it_scores_array_accessible_object_half_of_combined_scores_from_key_and_value_tokens($key, $value, $object)
+ {
+ $object->offsetExists('key')->willReturn(true);
+ $object->offsetGet('key')->willReturn('value');
+ $key->getValue()->willReturn('key');
+ $key->scoreArgument('key')->willReturn(3);
+ $value->scoreArgument('value')->willReturn(1);
+ $this->scoreArgument($object)->shouldBe(2);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\AnyValuesToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayIterator $object
+ */
+ function it_accepts_any_key_token_type_to_score_object_that_is_both_traversable_and_array_accessible($key, $value, $object)
+ {
+ $this->beConstructedWith($key, $value);
+ $object->current()->will(function () use ($object) {
+ $object->valid()->willReturn(false);
+
+ return 'value';
+ });
+ $object->key()->willReturn('key');
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $this->shouldNotThrow(new InvalidArgumentException)->duringScoreArgument($object);
+ }
+
+ function it_does_not_score_if_argument_is_neither_array_nor_traversable_nor_array_accessible()
+ {
+ $this->scoreArgument('string')->shouldBe(false);
+ $this->scoreArgument(new \stdClass)->shouldBe(false);
+ }
+
+ function it_does_not_score_empty_array()
+ {
+ $this->scoreArgument(array())->shouldBe(false);
+ }
+
+ function it_does_not_score_array_if_key_and_value_tokens_do_not_score_same_entry($key, $value)
+ {
+ $argument = array(1 => 'foo', 2 => 'bar');
+ $key->scoreArgument(1)->willReturn(true);
+ $key->scoreArgument(2)->willReturn(false);
+ $value->scoreArgument('foo')->willReturn(false);
+ $value->scoreArgument('bar')->willReturn(true);
+ $this->scoreArgument($argument)->shouldBe(false);
+ }
+
+ /**
+ * @param \Iterator $object
+ */
+ function it_does_not_score_traversable_object_without_entries($object)
+ {
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(false);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \Iterator $object
+ */
+ function it_does_not_score_traversable_object_if_key_and_value_tokens_do_not_score_same_entry($key, $value, $object)
+ {
+ $object->current()->willReturn('foo');
+ $object->current()->will(function () use ($object) {
+ $object->valid()->willReturn(false);
+
+ return 'bar';
+ });
+ $object->key()->willReturn(1);
+ $object->key()->willReturn(2);
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $key->scoreArgument(1)->willReturn(true);
+ $key->scoreArgument(2)->willReturn(false);
+ $value->scoreArgument('foo')->willReturn(false);
+ $value->scoreArgument('bar')->willReturn(true);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\ExactValueToken $key
+ * @param \ArrayAccess $object
+ */
+ function it_does_not_score_array_accessible_object_if_it_has_no_offset_with_key_token_value($key, $object)
+ {
+ $object->offsetExists('key')->willReturn(false);
+ $key->getValue()->willReturn('key');
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\ExactValueToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayAccess $object
+ */
+ function it_does_not_score_array_accessible_object_if_key_and_value_tokens_do_not_score_same_entry($key, $value, $object)
+ {
+ $object->offsetExists('key')->willReturn(true);
+ $object->offsetGet('key')->willReturn('value');
+ $key->getValue()->willReturn('key');
+ $value->scoreArgument('value')->willReturn(false);
+ $key->scoreArgument('key')->willReturn(true);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ function its_score_is_capped_at_8($key, $value)
+ {
+ $key->scoreArgument('key')->willReturn(10);
+ $value->scoreArgument('value')->willReturn(10);
+ $this->scoreArgument(array('key'=>'value'))->shouldBe(8);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
new file mode 100644
index 00000000..8662e7d1
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
@@ -0,0 +1,109 @@
+beConstructedWith($value);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_holds_value($value)
+ {
+ $this->getValue()->shouldBe($value);
+ }
+
+ function its_string_representation_tells_that_its_an_array_containing_only_value($value)
+ {
+ $value->__toString()->willReturn('value');
+ $this->__toString()->shouldBe('[value, ..., value]');
+ }
+
+ /**
+ * @param \stdClass $stdClass
+ */
+ function it_wraps_non_token_value_into_ExactValueToken($stdClass)
+ {
+ $this->beConstructedWith($stdClass);
+ $this->getValue()->shouldHaveType('Prophecy\Argument\Token\ExactValueToken');
+ }
+
+ function it_does_not_score_if_argument_is_neither_array_nor_traversable()
+ {
+ $this->scoreArgument('string')->shouldBe(false);
+ $this->scoreArgument(new \stdClass)->shouldBe(false);
+ }
+
+ function it_does_not_score_empty_array()
+ {
+ $this->scoreArgument(array())->shouldBe(false);
+ }
+
+ /**
+ * @param \Iterator $object
+ */
+ function it_does_not_score_traversable_object_without_entries($object)
+ {
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(false);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ function it_scores_avg_of_scores_from_value_tokens($value)
+ {
+ $value->scoreArgument('value1')->willReturn(6);
+ $value->scoreArgument('value2')->willReturn(3);
+ $this->scoreArgument(array('value1', 'value2'))->shouldBe(4.5);
+ }
+
+ function it_scores_false_if_entry_scores_false($value)
+ {
+ $value->scoreArgument('value1')->willReturn(6);
+ $value->scoreArgument('value2')->willReturn(false);
+ $this->scoreArgument(array('value1', 'value2'))->shouldBe(false);
+ }
+
+ function it_does_not_score_array_keys($value)
+ {
+ $value->scoreArgument('value')->willReturn(6);
+ $value->scoreArgument('key')->shouldNotBeCalled(0);
+ $this->scoreArgument(array('key' => 'value'))->shouldBe(6);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \Iterator $object
+ */
+ function it_scores_traversable_object_from_value_token($value, $object)
+ {
+ $object->current()->will(function ($args, $object) {
+ $object->valid()->willReturn(false);
+
+ return 'value';
+ });
+ $object->key()->willReturn('key');
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $value->scoreArgument('value')->willReturn(2);
+ $this->scoreArgument($object)->shouldBe(2);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
new file mode 100644
index 00000000..4395bf09
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
@@ -0,0 +1,42 @@
+beConstructedWith('get_class');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_7_if_argument_matches_callback()
+ {
+ $this->beConstructedWith(function ($argument) { return 2 === $argument; });
+
+ $this->scoreArgument(2)->shouldReturn(7);
+ }
+
+ function it_does_not_scores_if_argument_does_not_match_callback()
+ {
+ $this->beConstructedWith(function ($argument) { return 2 === $argument; });
+
+ $this->scoreArgument(5)->shouldReturn(false);
+ }
+
+ function its_string_representation_should_tell_that_its_callback()
+ {
+ $this->__toString()->shouldReturn('callback()');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
new file mode 100644
index 00000000..9e46e021
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
@@ -0,0 +1,155 @@
+beConstructedWith(42);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_holds_value()
+ {
+ $this->getValue()->shouldReturn(42);
+ }
+
+ function it_scores_10_if_value_is_equal_to_argument()
+ {
+ $this->scoreArgument(42)->shouldReturn(10);
+ $this->scoreArgument('42')->shouldReturn(10);
+ }
+
+ function it_scores_10_if_value_is_an_object_and_equal_to_argument()
+ {
+ $value = new \DateTime();
+ $value2 = clone $value;
+
+ $this->beConstructedWith($value);
+ $this->scoreArgument($value2)->shouldReturn(10);
+ }
+
+ function it_does_not_scores_if_value_is_not_equal_to_argument()
+ {
+ $this->scoreArgument(50)->shouldReturn(false);
+ $this->scoreArgument(new \stdClass())->shouldReturn(false);
+ }
+
+ function it_does_not_scores_if_value_an_object_and_is_not_equal_to_argument()
+ {
+ $value = new ExactValueTokenFixtureB('ABC');
+ $value2 = new ExactValueTokenFixtureB('CBA');
+
+ $this->beConstructedWith($value);
+ $this->scoreArgument($value2)->shouldReturn(false);
+ }
+
+ function it_does_not_scores_if_value_type_and_is_not_equal_to_argument()
+ {
+ $this->beConstructedWith(false);
+ $this->scoreArgument(0)->shouldReturn(false);
+ }
+
+ function it_generates_proper_string_representation_for_integer()
+ {
+ $this->beConstructedWith(42);
+ $this->__toString()->shouldReturn('exact(42)');
+ }
+
+ function it_generates_proper_string_representation_for_string()
+ {
+ $this->beConstructedWith('some string');
+ $this->__toString()->shouldReturn('exact("some string")');
+ }
+
+ function it_generates_single_line_representation_for_multiline_string()
+ {
+ $this->beConstructedWith("some\nstring");
+ $this->__toString()->shouldReturn('exact("some\\nstring")');
+ }
+
+ function it_generates_proper_string_representation_for_double()
+ {
+ $this->beConstructedWith(42.3);
+ $this->__toString()->shouldReturn('exact(42.3)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_true()
+ {
+ $this->beConstructedWith(true);
+ $this->__toString()->shouldReturn('exact(true)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_false()
+ {
+ $this->beConstructedWith(false);
+ $this->__toString()->shouldReturn('exact(false)');
+ }
+
+ function it_generates_proper_string_representation_for_null()
+ {
+ $this->beConstructedWith(null);
+ $this->__toString()->shouldReturn('exact(null)');
+ }
+
+ function it_generates_proper_string_representation_for_empty_array()
+ {
+ $this->beConstructedWith(array());
+ $this->__toString()->shouldReturn('exact([])');
+ }
+
+ function it_generates_proper_string_representation_for_array()
+ {
+ $this->beConstructedWith(array('zet', 42));
+ $this->__toString()->shouldReturn('exact(["zet", 42])');
+ }
+
+ function it_generates_proper_string_representation_for_resource()
+ {
+ $resource = fopen(__FILE__, 'r');
+ $this->beConstructedWith($resource);
+ $this->__toString()->shouldReturn('exact(stream:'.$resource.')');
+ }
+
+ /**
+ * @param \stdClass $object
+ */
+ function it_generates_proper_string_representation_for_object($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ );
+
+ $this->beConstructedWith($object);
+ $this->__toString()->shouldReturn("exact($objHash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
+ }
+}
+
+class ExactValueTokenFixtureA
+{
+ public $errors;
+}
+
+class ExactValueTokenFixtureB extends ExactValueTokenFixtureA
+{
+ public $errors;
+ public $value = null;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
new file mode 100644
index 00000000..00c3a215
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
@@ -0,0 +1,152 @@
+beConstructedWith(42);
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Argument\Token\IdenticalValueToken');
+ }
+
+ function it_scores_11_if_string_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith('foo');
+ $this->scoreArgument('foo')->shouldReturn(11);
+ }
+
+ function it_scores_11_if_boolean_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(false);
+ $this->scoreArgument(false)->shouldReturn(11);
+ }
+
+ function it_scores_11_if_integer_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(31);
+ $this->scoreArgument(31)->shouldReturn(11);
+ }
+
+ function it_scores_11_if_float_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(31.12);
+ $this->scoreArgument(31.12)->shouldReturn(11);
+ }
+
+ function it_scores_11_if_array_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(array('foo' => 'bar'));
+ $this->scoreArgument(array('foo' => 'bar'))->shouldReturn(11);
+ }
+
+ function it_scores_11_if_object_value_is_identical_to_argument()
+ {
+ $object = new \stdClass();
+
+ $this->beConstructedWith($object);
+ $this->scoreArgument($object)->shouldReturn(11);
+ }
+
+ function it_scores_false_if_value_is_not_identical_to_argument()
+ {
+ $this->beConstructedWith(new \stdClass());
+ $this->scoreArgument('foo')->shouldReturn(false);
+ }
+
+ function it_scores_false_if_object_value_is_not_the_same_instance_than_argument()
+ {
+ $this->beConstructedWith(new \stdClass());
+ $this->scoreArgument(new \stdClass())->shouldReturn(false);
+ }
+
+ function it_scores_false_if_integer_value_is_not_identical_to_boolean_argument()
+ {
+ $this->beConstructedWith(1);
+ $this->scoreArgument(true)->shouldReturn(false);
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_generates_proper_string_representation_for_integer()
+ {
+ $this->beConstructedWith(42);
+ $this->__toString()->shouldReturn('identical(42)');
+ }
+
+ function it_generates_proper_string_representation_for_string()
+ {
+ $this->beConstructedWith('some string');
+ $this->__toString()->shouldReturn('identical("some string")');
+ }
+
+ function it_generates_single_line_representation_for_multiline_string()
+ {
+ $this->beConstructedWith("some\nstring");
+ $this->__toString()->shouldReturn('identical("some\\nstring")');
+ }
+
+ function it_generates_proper_string_representation_for_double()
+ {
+ $this->beConstructedWith(42.3);
+ $this->__toString()->shouldReturn('identical(42.3)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_true()
+ {
+ $this->beConstructedWith(true);
+ $this->__toString()->shouldReturn('identical(true)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_false()
+ {
+ $this->beConstructedWith(false);
+ $this->__toString()->shouldReturn('identical(false)');
+ }
+
+ function it_generates_proper_string_representation_for_null()
+ {
+ $this->beConstructedWith(null);
+ $this->__toString()->shouldReturn('identical(null)');
+ }
+
+ function it_generates_proper_string_representation_for_empty_array()
+ {
+ $this->beConstructedWith(array());
+ $this->__toString()->shouldReturn('identical([])');
+ }
+
+ function it_generates_proper_string_representation_for_array()
+ {
+ $this->beConstructedWith(array('zet', 42));
+ $this->__toString()->shouldReturn('identical(["zet", 42])');
+ }
+
+ function it_generates_proper_string_representation_for_resource()
+ {
+ $resource = fopen(__FILE__, 'r');
+ $this->beConstructedWith($resource);
+ $this->__toString()->shouldReturn('identical(stream:'.$resource.')');
+ }
+
+ function it_generates_proper_string_representation_for_object($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ );
+
+ $this->beConstructedWith($object);
+ $this->__toString()->shouldReturn("identical($objHash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
new file mode 100644
index 00000000..bb5e3840
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
@@ -0,0 +1,78 @@
+beConstructedWith(array());
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->beConstructedWith(array());
+ $this->shouldNotBeLast();
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_generates_string_representation_from_all_tokens_imploded($token1, $token2, $token3)
+ {
+ $token1->__toString()->willReturn('token_1');
+ $token2->__toString()->willReturn('token_2');
+ $token3->__toString()->willReturn('token_3');
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->__toString()->shouldReturn('bool(token_1 AND token_2 AND token_3)');
+ }
+
+ function it_wraps_non_token_arguments_into_ExactValueToken()
+ {
+ $this->beConstructedWith(array(15, '1985'));
+ $this->__toString()->shouldReturn("bool(exact(15) AND exact(\"1985\"))");
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ */
+ function it_scores_the_maximum_score_from_all_scores_returned_by_tokens($token1, $token2)
+ {
+ $token1->scoreArgument(1)->willReturn(10);
+ $token2->scoreArgument(1)->willReturn(5);
+ $this->beConstructedWith(array($token1, $token2));
+ $this->scoreArgument(1)->shouldReturn(10);
+ }
+
+ function it_does_not_score_if_there_are_no_arguments_or_tokens()
+ {
+ $this->beConstructedWith(array());
+ $this->scoreArgument('any')->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ */
+ function it_does_not_score_if_either_of_tokens_does_not_score($token1, $token2)
+ {
+ $token1->scoreArgument(1)->willReturn(10);
+ $token1->scoreArgument(2)->willReturn(false);
+
+ $token2->scoreArgument(1)->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(10);
+
+ $this->beConstructedWith(array($token1, $token2));
+
+ $this->scoreArgument(1)->shouldReturn(false);
+ $this->scoreArgument(2)->shouldReturn(false);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
new file mode 100644
index 00000000..7ce7f3d8
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
@@ -0,0 +1,65 @@
+beConstructedWith($token);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_holds_originating_token($token)
+ {
+ $this->getOriginatingToken()->shouldReturn($token);
+ }
+
+ function it_has_simple_string_representation($token)
+ {
+ $token->__toString()->willReturn('value');
+ $this->__toString()->shouldBe('not(value)');
+ }
+
+ function it_wraps_non_token_argument_into_ExactValueToken()
+ {
+ $this->beConstructedWith(5);
+ $token = $this->getOriginatingToken();
+ $token->shouldhaveType('Prophecy\Argument\Token\ExactValueToken');
+ $token->getValue()->shouldBe(5);
+ }
+
+ function it_scores_4_if_preset_token_does_not_match_the_argument($token)
+ {
+ $token->scoreArgument('argument')->willReturn(false);
+ $this->scoreArgument('argument')->shouldBe(4);
+ }
+
+ function it_does_not_score_if_preset_token_matches_argument($token)
+ {
+ $token->scoreArgument('argument')->willReturn(5);
+ $this->scoreArgument('argument')->shouldBe(false);
+ }
+
+ function it_is_last_if_preset_token_is_last($token)
+ {
+ $token->isLast()->willReturn(true);
+ $this->shouldBeLast();
+ }
+
+ function it_is_not_last_if_preset_token_is_not_last($token)
+ {
+ $token->isLast()->willReturn(false);
+ $this->shouldNotBeLast();
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
new file mode 100644
index 00000000..a783a15f
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
@@ -0,0 +1,101 @@
+beConstructedWith('getName', 'stdClass');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ /**
+ * @param \ReflectionClass $reflection
+ */
+ function it_scores_8_if_argument_object_has_specific_method_state($reflection)
+ {
+ $reflection->getName()->willReturn('stdClass');
+
+ $this->scoreArgument($reflection)->shouldReturn(8);
+ }
+
+ /**
+ * @param \stdClass $class
+ */
+ function it_scores_8_if_argument_object_has_specific_property_state($class)
+ {
+ $class->getName = 'stdClass';
+
+ $this->scoreArgument($class)->shouldReturn(8);
+ }
+
+ function it_does_not_score_if_argument_method_state_does_not_match()
+ {
+ $value = new ObjectStateTokenFixtureB('ABC');
+ $value2 = new ObjectStateTokenFixtureB('CBA');
+
+ $this->beConstructedWith('getSelf', $value);
+ $this->scoreArgument($value2)->shouldReturn(false);
+ }
+
+ /**
+ * @param \stdClass $class
+ */
+ function it_does_not_score_if_argument_property_state_does_not_match($class)
+ {
+ $class->getName = 'SplFileInfo';
+
+ $this->scoreArgument($class)->shouldReturn(false);
+ }
+
+ /**
+ * @param \spec\Prophecy\Argument\Token\ObjectStateTokenFixtureA $class
+ */
+ function it_does_not_score_if_argument_object_does_not_have_method_or_property($class)
+ {
+ $this->scoreArgument($class)->shouldReturn(false);
+ }
+
+ function it_does_not_score_if_argument_is_not_object()
+ {
+ $this->scoreArgument(42)->shouldReturn(false);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldReturn('state(getName(), "stdClass")');
+ }
+}
+
+class ObjectStateTokenFixtureA
+{
+ public $errors;
+}
+
+class ObjectStateTokenFixtureB extends ObjectStateTokenFixtureA
+{
+ public $errors;
+ public $value = null;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ public function getSelf()
+ {
+ return $this;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
new file mode 100644
index 00000000..c7fd2652
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
@@ -0,0 +1,49 @@
+beConstructedWith('a substring');
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Argument\Token\StringContainsToken');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_holds_value()
+ {
+ $this->getValue()->shouldReturn('a substring');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_6_if_the_argument_contains_the_value()
+ {
+ $this->scoreArgument('Argument containing a substring')->shouldReturn(6);
+ }
+
+ function it_does_not_score_if_the_argument_does_not_contain_the_value()
+ {
+ $this->scoreArgument('Argument will not match')->shouldReturn(false);
+ }
+
+ function its_string_representation_shows_substring()
+ {
+ $this->__toString()->shouldReturn('contains("a substring")');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
new file mode 100644
index 00000000..ae3e26e4
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
@@ -0,0 +1,62 @@
+beConstructedWith('integer');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_5_if_argument_matches_simple_type()
+ {
+ $this->beConstructedWith('integer');
+
+ $this->scoreArgument(42)->shouldReturn(5);
+ }
+
+ function it_does_not_scores_if_argument_does_not_match_simple_type()
+ {
+ $this->beConstructedWith('integer');
+
+ $this->scoreArgument(42.0)->shouldReturn(false);
+ }
+
+ /**
+ * @param \ReflectionObject $object
+ */
+ function it_scores_5_if_argument_is_an_instance_of_specified_class($object)
+ {
+ $this->beConstructedWith('ReflectionClass');
+
+ $this->scoreArgument($object)->shouldReturn(5);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldReturn('type(integer)');
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $interface
+ */
+ function it_scores_5_if_argument_is_an_instance_of_specified_interface($interface)
+ {
+ $this->beConstructedWith('Prophecy\Argument\Token\TokenInterface');
+
+ $this->scoreArgument($interface)->shouldReturn(5);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
new file mode 100644
index 00000000..64232a4d
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
@@ -0,0 +1,107 @@
+exact(42);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ExactValueToken');
+ $token->getValue()->shouldReturn(42);
+ }
+
+ function it_has_a_shortcut_for_any_argument_token()
+ {
+ $token = $this->any();
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValueToken');
+ }
+
+ function it_has_a_shortcut_for_multiple_arguments_token()
+ {
+ $token = $this->cetera();
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValuesToken');
+ }
+
+ function it_has_a_shortcut_for_type_token()
+ {
+ $token = $this->type('integer');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\TypeToken');
+ }
+
+ function it_has_a_shortcut_for_callback_token()
+ {
+ $token = $this->that('get_class');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\CallbackToken');
+ }
+
+ function it_has_a_shortcut_for_object_state_token()
+ {
+ $token = $this->which('getName', 'everzet');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ObjectStateToken');
+ }
+
+ function it_has_a_shortcut_for_logical_and_token()
+ {
+ $token = $this->allOf('integer', 5);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalAndToken');
+ }
+
+ function it_has_a_shortcut_for_array_count_token()
+ {
+ $token = $this->size(5);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayCountToken');
+ }
+
+ function it_has_a_shortcut_for_array_entry_token()
+ {
+ $token = $this->withEntry('key', 'value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
+ }
+
+ function it_has_a_shortcut_for_array_every_entry_token()
+ {
+ $token = $this->withEveryEntry('value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEveryEntryToken');
+ }
+
+ function it_has_a_shortcut_for_identical_value_token()
+ {
+ $token = $this->is('value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\IdenticalValueToken');
+ }
+
+ function it_has_a_shortcut_for_array_entry_token_matching_any_key()
+ {
+ $token = $this->containing('value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
+ $token->getKey()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
+ }
+
+ function it_has_a_shortcut_for_array_entry_token_matching_any_value()
+ {
+ $token = $this->withKey('key');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
+ $token->getValue()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
+ }
+
+ function it_has_a_shortcut_for_logical_not_token()
+ {
+ $token = $this->not('kagux');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalNotToken');
+ }
+
+ function it_has_a_shortcut_for_string_contains_token()
+ {
+ $token = $this->containingString('string');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\StringContainsToken');
+ }
+
+ function it_has_a_shortcut_for_approximate_token()
+ {
+ $token = $this->approximate(10);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ApproximateValueToken');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
new file mode 100644
index 00000000..acf8d783
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
@@ -0,0 +1,195 @@
+scoreArguments(array(5, 2, 3))->willReturn(10);
+ $objectProphecy->getMethodProphecies()->willReturn(array());
+
+ $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3));
+
+ $calls = $this->findCalls('setValues', $wildcard);
+ $calls->shouldHaveCount(1);
+
+ $calls[0]->shouldBeAnInstanceOf('Prophecy\Call\Call');
+ $calls[0]->getMethodName()->shouldReturn('setValues');
+ $calls[0]->getArguments()->shouldReturn(array(5, 2, 3));
+ $calls[0]->getReturnValue()->shouldReturn(null);
+ }
+
+ function it_returns_null_for_any_call_through_makeCall_if_no_method_prophecies_added(
+ $objectProphecy
+ )
+ {
+ $objectProphecy->getMethodProphecies()->willReturn(array());
+
+ $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3))->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Prophecy\MethodProphecy $method3
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments1
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments3
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_executes_promise_of_method_prophecy_that_matches_signature_passed_to_makeCall(
+ $objectProphecy, $method1, $method2, $method3, $arguments1, $arguments2, $arguments3,
+ $promise
+ )
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments1);
+ $arguments1->scoreArguments(array('world', 'everything'))->willReturn(false);
+
+ $method2->getMethodName()->willReturn('setTitle');
+ $method2->getArgumentsWildcard()->willReturn($arguments2);
+ $arguments2->scoreArguments(array('world', 'everything'))->willReturn(false);
+
+ $method3->getMethodName()->willReturn('getName');
+ $method3->getArgumentsWildcard()->willReturn($arguments3);
+ $method3->getPromise()->willReturn($promise);
+ $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
+
+ $objectProphecy->getMethodProphecies()->willReturn(array(
+ 'method1' => array($method1),
+ 'method2' => array($method2, $method3)
+ ));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array($method1, $method3));
+ $objectProphecy->reveal()->willReturn(new \stdClass());
+
+ $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method3)->willReturn(42);
+
+ $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))->shouldReturn(42);
+
+ $calls = $this->findCalls('getName', $arguments3);
+ $calls->shouldHaveCount(1);
+ $calls[0]->getReturnValue()->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Prophecy\MethodProphecy $method3
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments1
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments3
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_executes_promise_of_method_prophecy_that_matches_with_highest_score_to_makeCall(
+ $objectProphecy, $method1, $method2, $method3, $arguments1, $arguments2, $arguments3,
+ $promise
+ )
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments1);
+ $arguments1->scoreArguments(array('world', 'everything'))->willReturn(50);
+
+ $method2->getMethodName()->willReturn('getName');
+ $method2->getArgumentsWildcard()->willReturn($arguments2);
+ $method2->getPromise()->willReturn($promise);
+ $arguments2->scoreArguments(array('world', 'everything'))->willReturn(300);
+
+ $method3->getMethodName()->willReturn('getName');
+ $method3->getArgumentsWildcard()->willReturn($arguments3);
+ $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
+
+ $objectProphecy->getMethodProphecies()->willReturn(array(
+ 'method1' => array($method1),
+ 'method2' => array($method2, $method3)
+ ));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array(
+ $method1, $method2, $method3
+ ));
+ $objectProphecy->reveal()->willReturn(new \stdClass());
+
+ $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method2)
+ ->willReturn('second');
+
+ $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
+ ->shouldReturn('second');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_exception_if_call_does_not_match_any_of_defined_method_prophecies(
+ $objectProphecy, $method, $arguments
+ )
+ {
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->scoreArguments(array('world', 'everything'))->willReturn(false);
+ $arguments->__toString()->willReturn('arg1, arg2');
+
+ $objectProphecy->getMethodProphecies()->willReturn(array('method1' => array($method)));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
+
+ $this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException')
+ ->duringMakeCall($objectProphecy, 'getName', array('world', 'everything'));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_returns_null_if_method_prophecy_that_matches_makeCall_arguments_has_no_promise(
+ $objectProphecy, $method, $arguments
+ )
+ {
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $method->getPromise()->willReturn(null);
+ $arguments->scoreArguments(array('world', 'everything'))->willReturn(100);
+
+ $objectProphecy->getMethodProphecies()->willReturn(array($method));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
+
+ $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
+ ->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ */
+ function it_finds_recorded_calls_by_a_method_name_and_arguments_wildcard(
+ $objectProphecy, $wildcard
+ )
+ {
+ $objectProphecy->getMethodProphecies()->willReturn(array());
+
+ $this->makeCall($objectProphecy, 'getName', array('world'));
+ $this->makeCall($objectProphecy, 'getName', array('everything'));
+ $this->makeCall($objectProphecy, 'setName', array(42));
+
+ $wildcard->scoreArguments(array('world'))->willReturn(false);
+ $wildcard->scoreArguments(array('everything'))->willReturn(10);
+
+ $calls = $this->findCalls('getName', $wildcard);
+
+ $calls->shouldHaveCount(1);
+ $calls[0]->getMethodName()->shouldReturn('getName');
+ $calls[0]->getArguments()->shouldReturn(array('everything'));
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
new file mode 100644
index 00000000..d1a85391
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
@@ -0,0 +1,54 @@
+beConstructedWith('setValues', array(5, 2), 42, $exception, 'some_file.php', 23);
+ }
+
+ function it_exposes_method_name_through_getter()
+ {
+ $this->getMethodName()->shouldReturn('setValues');
+ }
+
+ function it_exposes_arguments_through_getter()
+ {
+ $this->getArguments()->shouldReturn(array(5, 2));
+ }
+
+ function it_exposes_return_value_through_getter()
+ {
+ $this->getReturnValue()->shouldReturn(42);
+ }
+
+ function it_exposes_exception_through_getter($exception)
+ {
+ $this->getException()->shouldReturn($exception);
+ }
+
+ function it_exposes_file_and_line_through_getter()
+ {
+ $this->getFile()->shouldReturn('some_file.php');
+ $this->getLine()->shouldReturn(23);
+ }
+
+ function it_returns_shortpath_to_callPlace()
+ {
+ $this->getCallPlace()->shouldReturn('some_file.php:23');
+ }
+
+ function it_returns_unknown_as_callPlace_if_no_file_or_line_provided()
+ {
+ $this->beConstructedWith('setValues', array(), 0, null, null, null);
+
+ $this->getCallPlace()->shouldReturn('unknown');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
new file mode 100644
index 00000000..c174e73c
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
@@ -0,0 +1,39 @@
+shouldHaveType('SebastianBergmann\Comparator\Comparator');
+ }
+
+ function it_accepts_only_closures()
+ {
+ $this->accepts(123, 321)->shouldReturn(false);
+ $this->accepts('string', 'string')->shouldReturn(false);
+ $this->accepts(false, true)->shouldReturn(false);
+ $this->accepts(true, false)->shouldReturn(false);
+ $this->accepts((object)array(), (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, (object)array())->shouldReturn(false);
+
+ $this->accepts(function(){}, function(){})->shouldReturn(true);
+ }
+
+ function it_asserts_that_all_closures_are_different()
+ {
+ $this->shouldThrow()->duringAssertEquals(function(){}, function(){});
+ }
+
+ function it_asserts_that_all_closures_are_different_even_if_its_the_same_closure()
+ {
+ $closure = function(){};
+
+ $this->shouldThrow()->duringAssertEquals($closure, $closure);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
new file mode 100644
index 00000000..6b13336d
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
@@ -0,0 +1,20 @@
+shouldHaveType('SebastianBergmann\Comparator\Factory');
+ }
+
+ function it_should_have_ClosureComparator_registered()
+ {
+ $comparator = $this->getInstance()->getComparatorFor(function(){}, function(){});
+ $comparator->shouldHaveType('Prophecy\Comparator\ClosureComparator');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
new file mode 100644
index 00000000..06bf6f17
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
@@ -0,0 +1,39 @@
+shouldHaveType('SebastianBergmann\Comparator\ObjectComparator');
+ }
+
+ function it_accepts_only_prophecy_objects()
+ {
+ $this->accepts(123, 321)->shouldReturn(false);
+ $this->accepts('string', 'string')->shouldReturn(false);
+ $this->accepts(false, true)->shouldReturn(false);
+ $this->accepts(true, false)->shouldReturn(false);
+ $this->accepts((object)array(), (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, function(){})->shouldReturn(false);
+
+ $prophet = new Prophet();
+ $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
+
+ $this->accepts($prophecy, $prophecy)->shouldReturn(true);
+ }
+
+ function it_asserts_that_an_object_is_equal_to_its_revealed_prophecy()
+ {
+ $prophet = new Prophet();
+ $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
+
+ $this->shouldNotThrow()->duringAssertEquals($prophecy->reveal(), $prophecy);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
new file mode 100644
index 00000000..2d7d934d
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
@@ -0,0 +1,59 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_100()
+ {
+ $this->getPriority()->shouldReturn(100);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_anything($node)
+ {
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg2
+ */
+ function it_makes_all_constructor_arguments_optional($class, $method, $arg1, $arg2)
+ {
+ $class->hasMethod('__construct')->willReturn(true);
+ $class->getMethod('__construct')->willReturn($method);
+ $method->getArguments()->willReturn(array($arg1, $arg2));
+
+ $arg1->setDefault(null)->shouldBeCalled();
+ $arg2->setDefault(null)->shouldBeCalled();
+
+ $method->setCode(Argument::type('string'))->shouldBeCalled();
+
+ $this->apply($class);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_creates_new_constructor_if_object_has_none($class)
+ {
+ $class->hasMethod('__construct')->willReturn(false);
+ $class->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))
+ ->shouldBeCalled();
+
+ $this->apply($class);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
new file mode 100644
index 00000000..8c348b86
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
@@ -0,0 +1,37 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_minus_50()
+ {
+ $this->getPriority()->shouldReturn(-50);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $getterMethod
+ */
+ function it_uses_parent_code_for_setTraceOptions($node, $method, $getterMethod)
+ {
+ $node->hasMethod('setTraceOptions')->willReturn(true);
+ $node->getMethod('setTraceOptions')->willReturn($method);
+ $node->hasMethod('getTraceOptions')->willReturn(true);
+ $node->getMethod('getTraceOptions')->willReturn($getterMethod);
+
+ $method->useParentCode()->shouldBeCalled();
+ $getterMethod->useParentCode()->shouldBeCalled();
+
+ $this->apply($node);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
new file mode 100644
index 00000000..200d9619
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
@@ -0,0 +1,44 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_49()
+ {
+ $this->getPriority()->shouldReturn(49);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3
+ */
+ function it_will_remove_echo_and_eval_methods($node, $method1, $method2, $method3)
+ {
+ $node->removeMethod('eval')->shouldBeCalled();
+ $node->removeMethod('echo')->shouldBeCalled();
+
+ $method1->getName()->willReturn('echo');
+ $method2->getName()->willReturn('eval');
+ $method3->getName()->willReturn('notKeyword');
+
+ $node->getMethods()->willReturn(array(
+ 'echo' => $method1,
+ 'eval' => $method2,
+ 'notKeyword' => $method3,
+ ));
+
+ $this->apply($node);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
new file mode 100644
index 00000000..edd8b80d
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
@@ -0,0 +1,125 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_anything($node)
+ {
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_discovers_api_using_phpdoc($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApi');
+
+ $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_ignores_existing_methods($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiExtended');
+
+ $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
+ $node->addMethod(new MethodNode('definedMethod'))->shouldNotBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_ignores_empty_methods_from_phpdoc($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiInvalidMethodDefinition');
+
+ $node->addMethod(new MethodNode(''))->shouldNotBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_discovers_api_using_phpdoc_from_interface($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented');
+
+ $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+
+ function it_has_50_priority()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+}
+
+/**
+ * @method void undefinedMethod()
+ */
+class MagicalApi
+{
+ /**
+ * @return void
+ */
+ public function definedMethod()
+ {
+
+ }
+}
+
+/**
+ * @method void invalidMethodDefinition
+ * @method void
+ * @method
+ */
+class MagicalApiInvalidMethodDefinition
+{
+}
+
+/**
+ * @method void undefinedMethod()
+ * @method void definedMethod()
+ */
+class MagicalApiExtended extends MagicalApi
+{
+
+}
+
+/**
+ */
+class MagicalApiImplemented implements MagicalApiInterface
+{
+
+}
+
+/**
+ * @method void implementedMethod()
+ */
+interface MagicalApiInterface
+{
+
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
new file mode 100644
index 00000000..c460814c
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
@@ -0,0 +1,83 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function it_has_priority_of_0()
+ {
+ $this->getPriority()->shouldReturn(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_any_class($node)
+ {
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_forces_class_to_implement_ProphecySubjectInterface($node)
+ {
+ $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->shouldBeCalled();
+
+ $node->addProperty('objectProphecy', 'private')->willReturn(null);
+ $node->getMethods()->willReturn(array());
+ $node->hasMethod(Argument::any())->willReturn(false);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $constructor
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3
+ */
+ function it_forces_all_class_methods_except_constructor_to_proxy_calls_into_prophecy_makeCall(
+ $node, $constructor, $method1, $method2, $method3
+ )
+ {
+ $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->willReturn(null);
+ $node->addProperty('objectProphecy', 'private')->willReturn(null);
+ $node->hasMethod(Argument::any())->willReturn(false);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+
+ $constructor->getName()->willReturn('__construct');
+ $method1->getName()->willReturn('method1');
+ $method2->getName()->willReturn('method2');
+ $method3->getName()->willReturn('method3');
+
+ $node->getMethods()->willReturn(array(
+ 'method1' => $method1,
+ 'method2' => $method2,
+ 'method3' => $method3,
+ ));
+
+ $constructor->setCode(Argument::any())->shouldNotBeCalled();
+
+ $method1->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
+ ->shouldBeCalled();
+ $method2->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
+ ->shouldBeCalled();
+ $method3->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
+ ->shouldBeCalled();
+
+ $this->apply($node);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
new file mode 100644
index 00000000..4116e4df
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
@@ -0,0 +1,47 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_50()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $reflectionClassNode
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $anotherClassNode
+ */
+ function it_supports_ReflectionClass_only($reflectionClassNode, $anotherClassNode)
+ {
+ $reflectionClassNode->getParentClass()->willReturn('ReflectionClass');
+ $anotherClassNode->getParentClass()->willReturn('stdClass');
+
+ $this->supports($reflectionClassNode)->shouldReturn(true);
+ $this->supports($anotherClassNode)->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg2
+ */
+ function it_makes_all_newInstance_arguments_optional($class, $method, $arg1, $arg2)
+ {
+ $class->getMethod('newInstance')->willReturn($method);
+ $method->getArguments()->willReturn(array($arg1));
+ $arg1->setDefault(null)->shouldBeCalled();
+
+ $this->apply($class);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
new file mode 100644
index 00000000..42e854ac
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
@@ -0,0 +1,107 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_50()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_does_not_support_nodes_without_parent_class($node)
+ {
+ $node->getParentClass()->willReturn('stdClass');
+ $this->supports($node)->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_nodes_with_SplFileInfo_as_parent_class($node)
+ {
+ $node->getParentClass()->willReturn('SplFileInfo');
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_nodes_with_derivative_of_SplFileInfo_as_parent_class($node)
+ {
+ $node->getParentClass()->willReturn('SplFileInfo');
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_adds_a_method_to_node_if_not_exists($node)
+ {
+ $node->hasMethod('__construct')->willReturn(false);
+ $node->addMethod(Argument::any())->shouldBeCalled();
+ $node->getParentClass()->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_updates_existing_method_if_found($node, $method)
+ {
+ $node->hasMethod('__construct')->willReturn(true);
+ $node->getMethod('__construct')->willReturn($method);
+ $node->getParentClass()->shouldBeCalled();
+
+ $method->useParentCode()->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_should_not_supply_a_file_for_a_directory_iterator($node, $method)
+ {
+ $node->hasMethod('__construct')->willReturn(true);
+ $node->getMethod('__construct')->willReturn($method);
+ $node->getParentClass()->willReturn('DirectoryIterator');
+
+ $method->setCode(Argument::that(function($value) {
+ return strpos($value, '.php') === false;
+ }))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_should_supply_a_file_for_a_spl_file_object($node, $method)
+ {
+ $node->hasMethod('__construct')->willReturn(true);
+ $node->getMethod('__construct')->willReturn($method);
+ $node->getParentClass()->willReturn('SplFileObject');
+
+ $method->setCode(Argument::that(function($value) {
+ return strpos($value, '.php') !== false;
+ }))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
new file mode 100644
index 00000000..2279b720
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
@@ -0,0 +1,61 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_class_that_implements_only_Traversable($node)
+ {
+ $node->getInterfaces()->willReturn(array('Traversable'));
+
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_does_not_support_class_that_implements_Iterator($node)
+ {
+ $node->getInterfaces()->willReturn(array('Traversable', 'Iterator'));
+
+ $this->supports($node)->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_does_not_support_class_that_implements_IteratorAggregate($node)
+ {
+ $node->getInterfaces()->willReturn(array('Traversable', 'IteratorAggregate'));
+
+ $this->supports($node)->shouldReturn(false);
+ }
+
+ function it_has_100_priority()
+ {
+ $this->getPriority()->shouldReturn(100);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_forces_node_to_implement_IteratorAggregate($node)
+ {
+ $node->addInterface('Iterator')->shouldBeCalled();
+
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+
+ $this->apply($node);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
new file mode 100644
index 00000000..a39fa87f
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
@@ -0,0 +1,122 @@
+beConstructedWith($mirror, $creator, $namer);
+ }
+
+ function it_does_not_have_patches_by_default()
+ {
+ $this->getClassPatches()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $patch
+ */
+ function its_registerClassPatch_adds_a_patch_to_the_doubler($patch)
+ {
+ $this->registerClassPatch($patch);
+ $this->getClassPatches()->shouldReturn(array($patch));
+ }
+
+ /**
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt3
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt4
+ */
+ function its_getClassPatches_sorts_patches_by_priority($alt1, $alt2, $alt3, $alt4)
+ {
+ $alt1->getPriority()->willReturn(2);
+ $alt2->getPriority()->willReturn(50);
+ $alt3->getPriority()->willReturn(10);
+ $alt4->getPriority()->willReturn(0);
+
+ $this->registerClassPatch($alt1);
+ $this->registerClassPatch($alt2);
+ $this->registerClassPatch($alt3);
+ $this->registerClassPatch($alt4);
+
+ $this->getClassPatches()->shouldReturn(array($alt2, $alt3, $alt1, $alt4));
+ }
+
+ /**
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2
+ * @param \ReflectionClass $class
+ * @param \ReflectionClass $interface1
+ * @param \ReflectionClass $interface2
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function its_double_mirrors_alterates_and_instantiates_provided_class(
+ $mirror, $creator, $namer, $alt1, $alt2, $class, $interface1, $interface2, $node
+ )
+ {
+ $mirror->reflect($class, array($interface1, $interface2))->willReturn($node);
+ $alt1->supports($node)->willReturn(true);
+ $alt2->supports($node)->willReturn(false);
+ $alt1->getPriority()->willReturn(1);
+ $alt2->getPriority()->willReturn(2);
+ $namer->name($class, array($interface1, $interface2))->willReturn('SplStack');
+ $class->getName()->willReturn('stdClass');
+ $interface1->getName()->willReturn('ArrayAccess');
+ $interface2->getName()->willReturn('Iterator');
+
+ $alt1->apply($node)->shouldBeCalled();
+ $alt2->apply($node)->shouldNotBeCalled();
+ $creator->create('SplStack', $node)->shouldBeCalled();
+
+ $this->registerClassPatch($alt1);
+ $this->registerClassPatch($alt2);
+
+ $this->double($class, array($interface1, $interface2))
+ ->shouldReturnAnInstanceOf('SplStack');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_double_instantiates_a_class_with_constructor_argument($mirror, $class, $node, $namer)
+ {
+ $class->getName()->willReturn('ReflectionClass');
+ $mirror->reflect($class, array())->willReturn($node);
+ $namer->name($class, array())->willReturn('ReflectionClass');
+
+ $double = $this->double($class, array(), array('stdClass'));
+ $double->shouldBeAnInstanceOf('ReflectionClass');
+ $double->getName()->shouldReturn('stdClass');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_can_instantiate_class_with_final_constructor($mirror, $class, $node, $namer)
+ {
+ $class->getName()->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
+ $mirror->reflect($class, array())->willReturn($node);
+ $namer->name($class, array())->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
+
+ $double = $this->double($class, array());
+
+ $double->shouldBeAnInstanceOf('spec\Prophecy\Doubler\WithFinalConstructor');
+ }
+}
+
+class WithFinalConstructor
+{
+ final public function __construct() {}
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
new file mode 100644
index 00000000..b0830482
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
@@ -0,0 +1,323 @@
+getParentClass()->willReturn('RuntimeException');
+ $class->getInterfaces()->willReturn(array(
+ 'Prophecy\Doubler\Generator\MirroredInterface', 'ArrayAccess', 'ArrayIterator'
+ ));
+ $class->getProperties()->willReturn(array('name' => 'public', 'email' => 'private'));
+ $class->getMethods()->willReturn(array($method1, $method2, $method3));
+
+ $method1->getName()->willReturn('getName');
+ $method1->getVisibility()->willReturn('public');
+ $method1->returnsReference()->willReturn(false);
+ $method1->isStatic()->willReturn(true);
+ $method1->getArguments()->willReturn(array($argument11, $argument12));
+ $method1->hasReturnType()->willReturn(true);
+ $method1->getReturnType()->willReturn('string');
+ $method1->getCode()->willReturn('return $this->name;');
+
+ $method2->getName()->willReturn('getEmail');
+ $method2->getVisibility()->willReturn('protected');
+ $method2->returnsReference()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method2->getArguments()->willReturn(array($argument21));
+ $method2->hasReturnType()->willReturn(false);
+ $method2->getCode()->willReturn('return $this->email;');
+
+ $method3->getName()->willReturn('getRefValue');
+ $method3->getVisibility()->willReturn('public');
+ $method3->returnsReference()->willReturn(true);
+ $method3->isStatic()->willReturn(false);
+ $method3->getArguments()->willReturn(array($argument31));
+ $method3->hasReturnType()->willReturn(false);
+ $method3->getCode()->willReturn('return $this->refValue;');
+
+ $argument11->getName()->willReturn('fullname');
+ $argument11->getTypeHint()->willReturn('array');
+ $argument11->isOptional()->willReturn(true);
+ $argument11->getDefault()->willReturn(null);
+ $argument11->isPassedByReference()->willReturn(false);
+ $argument11->isVariadic()->willReturn(false);
+
+ $argument12->getName()->willReturn('class');
+ $argument12->getTypeHint()->willReturn('ReflectionClass');
+ $argument12->isOptional()->willReturn(false);
+ $argument12->isPassedByReference()->willReturn(false);
+ $argument12->isVariadic()->willReturn(false);
+
+ $argument21->getName()->willReturn('default');
+ $argument21->getTypeHint()->willReturn('string');
+ $argument21->isOptional()->willReturn(true);
+ $argument21->getDefault()->willReturn('ever.zet@gmail.com');
+ $argument21->isPassedByReference()->willReturn(false);
+ $argument21->isVariadic()->willReturn(false);
+
+ $argument31->getName()->willReturn('refValue');
+ $argument31->getTypeHint()->willReturn(null);
+ $argument31->isOptional()->willReturn(false);
+ $argument31->getDefault()->willReturn();
+ $argument31->isPassedByReference()->willReturn(false);
+ $argument31->isVariadic()->willReturn(false);
+
+ $code = $this->generate('CustomClass', $class);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $expected = <<<'PHP'
+namespace {
+class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
+public $name;
+private $email;
+
+public static function getName(array $fullname = NULL, \ReflectionClass $class): string {
+return $this->name;
+}
+protected function getEmail(string $default = 'ever.zet@gmail.com') {
+return $this->email;
+}
+public function &getRefValue( $refValue) {
+return $this->refValue;
+}
+
+}
+}
+PHP;
+ } else {
+ $expected = <<<'PHP'
+namespace {
+class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
+public $name;
+private $email;
+
+public static function getName(array $fullname = NULL, \ReflectionClass $class) {
+return $this->name;
+}
+protected function getEmail(\string $default = 'ever.zet@gmail.com') {
+return $this->email;
+}
+public function &getRefValue( $refValue) {
+return $this->refValue;
+}
+
+}
+}
+PHP;
+ }
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method4
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument3
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument4
+ */
+ function it_generates_proper_php_code_for_variadics(
+ $class, $method1, $method2, $method3, $method4, $argument1, $argument2,
+ $argument3, $argument4
+ )
+ {
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array(
+ $method1, $method2, $method3, $method4
+ ));
+
+ $method1->getName()->willReturn('variadic');
+ $method1->getVisibility()->willReturn('public');
+ $method1->returnsReference()->willReturn(false);
+ $method1->isStatic()->willReturn(false);
+ $method1->getArguments()->willReturn(array($argument1));
+ $method1->hasReturnType()->willReturn(false);
+ $method1->getCode()->willReturn('');
+
+ $method2->getName()->willReturn('variadicByRef');
+ $method2->getVisibility()->willReturn('public');
+ $method2->returnsReference()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method2->getArguments()->willReturn(array($argument2));
+ $method2->hasReturnType()->willReturn(false);
+ $method2->getCode()->willReturn('');
+
+ $method3->getName()->willReturn('variadicWithType');
+ $method3->getVisibility()->willReturn('public');
+ $method3->returnsReference()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+ $method3->getArguments()->willReturn(array($argument3));
+ $method3->hasReturnType()->willReturn(false);
+ $method3->getCode()->willReturn('');
+
+ $method4->getName()->willReturn('variadicWithTypeByRef');
+ $method4->getVisibility()->willReturn('public');
+ $method4->returnsReference()->willReturn(false);
+ $method4->isStatic()->willReturn(false);
+ $method4->getArguments()->willReturn(array($argument4));
+ $method4->hasReturnType()->willReturn(false);
+ $method4->getCode()->willReturn('');
+
+ $argument1->getName()->willReturn('args');
+ $argument1->getTypeHint()->willReturn(null);
+ $argument1->isOptional()->willReturn(false);
+ $argument1->isPassedByReference()->willReturn(false);
+ $argument1->isVariadic()->willReturn(true);
+
+ $argument2->getName()->willReturn('args');
+ $argument2->getTypeHint()->willReturn(null);
+ $argument2->isOptional()->willReturn(false);
+ $argument2->isPassedByReference()->willReturn(true);
+ $argument2->isVariadic()->willReturn(true);
+
+ $argument3->getName()->willReturn('args');
+ $argument3->getTypeHint()->willReturn('\ReflectionClass');
+ $argument3->isOptional()->willReturn(false);
+ $argument3->isPassedByReference()->willReturn(false);
+ $argument3->isVariadic()->willReturn(true);
+
+ $argument4->getName()->willReturn('args');
+ $argument4->getTypeHint()->willReturn('\ReflectionClass');
+ $argument4->isOptional()->willReturn(false);
+ $argument4->isPassedByReference()->willReturn(true);
+ $argument4->isVariadic()->willReturn(true);
+
+ $code = $this->generate('CustomClass', $class);
+ $expected = <<<'PHP'
+namespace {
+class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+public function variadic( ...$args) {
+
+}
+public function variadicByRef( &...$args) {
+
+}
+public function variadicWithType(\\ReflectionClass ...$args) {
+
+}
+public function variadicWithTypeByRef(\\ReflectionClass &...$args) {
+
+}
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument
+ */
+ function it_overrides_properly_methods_with_args_passed_by_reference(
+ $class, $method, $argument
+ )
+ {
+ $class->getParentClass()->willReturn('RuntimeException');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array($method));
+
+ $method->getName()->willReturn('getName');
+ $method->getVisibility()->willReturn('public');
+ $method->isStatic()->willReturn(false);
+ $method->getArguments()->willReturn(array($argument));
+ $method->hasReturnType()->willReturn(false);
+ $method->returnsReference()->willReturn(false);
+ $method->getCode()->willReturn('return $this->name;');
+
+ $argument->getName()->willReturn('fullname');
+ $argument->getTypeHint()->willReturn('array');
+ $argument->isOptional()->willReturn(true);
+ $argument->getDefault()->willReturn(null);
+ $argument->isPassedByReference()->willReturn(true);
+ $argument->isVariadic()->willReturn(false);
+
+ $code = $this->generate('CustomClass', $class);
+ $expected =<<<'PHP'
+namespace {
+class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+public function getName(array &$fullname = NULL) {
+return $this->name;
+}
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_generates_empty_class_for_empty_ClassNode($class)
+ {
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array());
+
+ $code = $this->generate('CustomClass', $class);
+ $expected =<<<'PHP'
+namespace {
+class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_wraps_class_in_namespace_if_it_is_namespaced($class)
+ {
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array());
+
+ $code = $this->generate('My\Awesome\CustomClass', $class);
+ $expected =<<<'PHP'
+namespace My\Awesome {
+class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
new file mode 100644
index 00000000..c7b57009
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
@@ -0,0 +1,44 @@
+beConstructedWith($generator);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_evaluates_code_generated_by_ClassCodeGenerator($generator, $class)
+ {
+ $generator->generate('stdClass', $class)->shouldBeCalled()->willReturn(
+ 'return 42;'
+ );
+
+ $this->create('stdClass', $class)->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_throws_an_exception_if_class_does_not_exist_after_evaluation($generator, $class)
+ {
+ $generator->generate('CustomClass', $class)->shouldBeCalled()->willReturn(
+ 'return 42;'
+ );
+
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Interface1', 'Interface2'));
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\ClassCreatorException')
+ ->duringCreate('CustomClass', $class);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php
new file mode 100644
index 00000000..de804480
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php
@@ -0,0 +1,784 @@
+getName()->willReturn('Custom\ClassName');
+ $class->getParentClass()->willReturn($parent);
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array(
+ $method1, $method2, $method3
+ ));
+
+ $parent->getName()->willReturn('Custom\ParentClassName');
+
+ $method1->getDeclaringClass()->willReturn($class);
+ $method2->getDeclaringClass()->willReturn($class);
+ $method3->getDeclaringClass()->willReturn($class);
+
+ $method1->getName()->willReturn('getName');
+ $method2->getName()->willReturn('getSelf');
+ $method3->getName()->willReturn('getParent');
+
+ $method1->isFinal()->willReturn(false);
+ $method2->isFinal()->willReturn(false);
+ $method3->isFinal()->willReturn(false);
+
+ $method1->isProtected()->willReturn(false);
+ $method2->isProtected()->willReturn(false);
+ $method3->isProtected()->willReturn(false);
+
+ $method1->isStatic()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+
+ $method1->returnsReference()->willReturn(false);
+ $method2->returnsReference()->willReturn(false);
+ $method3->returnsReference()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method1->hasReturnType()->willReturn(true);
+ $method1->getReturnType()->willReturn('string');
+ $method2->hasReturnType()->willReturn(true);
+ $method2->getReturnType()->willReturn('self');
+ $method3->hasReturnType()->willReturn(true);
+ $method3->getReturnType()->willReturn('parent');
+ }
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(3);
+
+ $classNode->hasMethod('getName')->shouldReturn(true);
+ $classNode->hasMethod('getSelf')->shouldReturn(true);
+ $classNode->hasMethod('getParent')->shouldReturn(true);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $classNode->getMethod('getName')->getReturnType()->shouldReturn('string');
+ $classNode->getMethod('getSelf')->getReturnType()->shouldReturn('\Custom\ClassName');
+ $classNode->getMethod('getParent')->getReturnType()->shouldReturn('\Custom\ParentClassName');
+ }
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $parameter
+ */
+ function it_changes_argument_names_if_they_are_varying($class, $method, $parameter)
+ {
+
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+
+ $method->getParameters()->willReturn(array($parameter));
+ $method->getName()->willReturn('methodName');
+ $method->isFinal()->willReturn(false);
+ $method->isProtected()->willReturn(false);
+ $method->isStatic()->willReturn(false);
+ $method->returnsReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $parameter->getName()->willReturn('...');
+ $parameter->isDefaultValueAvailable()->willReturn(true);
+ $parameter->getDefaultValue()->willReturn(null);
+ $parameter->isPassedByReference()->willReturn(false);
+ $parameter->getClass()->willReturn($class);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $parameter->isVariadic()->willReturn(false);
+ }
+
+ $classNode = $this->reflect($class, array());
+
+ $methodNodes = $classNode->getMethods();
+
+ $argumentNodes = $methodNodes['methodName']->getArguments();
+ $argumentNode = $argumentNodes[0];
+
+ $argumentNode->getName()->shouldReturn('__dot_dot_dot__');
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_reflects_protected_abstract_methods($class, $method)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array($method));
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array());
+
+ $method->isProtected()->willReturn(true);
+ $method->isStatic()->willReturn(false);
+ $method->getParameters()->willReturn(array());
+ $method->getName()->willReturn('innerDetail');
+ $method->returnsReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(1);
+
+ $methodNodes['innerDetail']->getVisibility()->shouldReturn('protected');
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_reflects_public_static_methods($class, $method)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array($method));
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array());
+
+ $method->isProtected()->willReturn(true);
+ $method->isStatic()->willReturn(true);
+ $method->getParameters()->willReturn(array());
+ $method->getName()->willReturn('innerDetail');
+ $method->returnsReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(1);
+
+ $methodNodes['innerDetail']->getVisibility()->shouldReturn('protected');
+ $methodNodes['innerDetail']->isStatic()->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $constructMethod
+ * @param ReflectionMethod $destructMethod
+ * @param ReflectionMethod $sleepMethod
+ * @param ReflectionMethod $wakeupMethod
+ * @param ReflectionMethod $toStringMethod
+ * @param ReflectionMethod $callMethod
+ * @param ReflectionMethod $invokeMethod
+ */
+ function it_reflects_allowed_magic_methods($class, $constructMethod, $destructMethod, $sleepMethod, $wakeupMethod, $toStringMethod, $callMethod, $invokeMethod)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array(
+ $constructMethod, $destructMethod, $sleepMethod, $wakeupMethod, $toStringMethod, $callMethod, $invokeMethod
+ ));
+
+ $constructMethod->getName()->willReturn('__construct');
+ $destructMethod->getName()->willReturn('__destruct');
+ $sleepMethod->getName()->willReturn('__sleep');
+ $wakeupMethod->getName()->willReturn('__wakeup');
+ $toStringMethod->getName()->willReturn('__toString');
+ $callMethod->getName()->willReturn('__call');
+ $invokeMethod->getName()->willReturn('__invoke');
+
+ $constructMethod->isFinal()->willReturn(false);
+ $destructMethod->isFinal()->willReturn(false);
+ $sleepMethod->isFinal()->willReturn(false);
+ $wakeupMethod->isFinal()->willReturn(false);
+ $toStringMethod->isFinal()->willReturn(false);
+ $callMethod->isFinal()->willReturn(false);
+ $invokeMethod->isFinal()->willReturn(false);
+
+ $constructMethod->isProtected()->willReturn(false);
+ $destructMethod->isProtected()->willReturn(false);
+ $sleepMethod->isProtected()->willReturn(false);
+ $wakeupMethod->isProtected()->willReturn(false);
+ $toStringMethod->isProtected()->willReturn(false);
+ $callMethod->isProtected()->willReturn(false);
+ $invokeMethod->isProtected()->willReturn(false);
+
+ $constructMethod->isStatic()->willReturn(false);
+ $destructMethod->isStatic()->willReturn(false);
+ $sleepMethod->isStatic()->willReturn(false);
+ $wakeupMethod->isStatic()->willReturn(false);
+ $toStringMethod->isStatic()->willReturn(false);
+ $callMethod->isStatic()->willReturn(false);
+ $invokeMethod->isStatic()->willReturn(false);
+
+ $constructMethod->returnsReference()->willReturn(false);
+ $destructMethod->returnsReference()->willReturn(false);
+ $sleepMethod->returnsReference()->willReturn(false);
+ $wakeupMethod->returnsReference()->willReturn(false);
+ $toStringMethod->returnsReference()->willReturn(false);
+ $callMethod->returnsReference()->willReturn(false);
+ $invokeMethod->returnsReference()->willReturn(false);
+
+ $constructMethod->getParameters()->willReturn(array());
+ $destructMethod->getParameters()->willReturn(array());
+ $sleepMethod->getParameters()->willReturn(array());
+ $wakeupMethod->getParameters()->willReturn(array());
+ $toStringMethod->getParameters()->willReturn(array());
+ $callMethod->getParameters()->willReturn(array());
+ $invokeMethod->getParameters()->willReturn(array());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $constructMethod->hasReturnType()->willReturn(false);
+ $destructMethod->hasReturnType()->willReturn(false);
+ $sleepMethod->hasReturnType()->willReturn(false);
+ $wakeupMethod->hasReturnType()->willReturn(false);
+ $toStringMethod->hasReturnType()->willReturn(false);
+ $callMethod->hasReturnType()->willReturn(false);
+ $invokeMethod->hasReturnType()->willReturn(false);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(7);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ * @param ReflectionParameter $param2
+ * @param ReflectionClass $typeHint
+ * @param ReflectionParameter $param3
+ * @param ReflectionParameter $param4
+ */
+ function it_properly_reads_methods_arguments_with_types(
+ $class, $method, $param1, $param2, $typeHint, $param3, $param4
+ )
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->getName()->willReturn('methodWithArgs');
+ $method->isFinal()->willReturn(false);
+ $method->isProtected()->willReturn(true);
+ $method->isStatic()->willReturn(false);
+ $method->returnsReference()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1, $param2, $param3, $param4));
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $param1->getName()->willReturn('arg_1');
+ $param1->isArray()->willReturn(true);
+ $param1->getClass()->willReturn(null);
+ $param1->isDefaultValueAvailable()->willReturn(true);
+ $param1->isPassedByReference()->willReturn(false);
+ $param1->allowsNull()->willReturn(false);
+ $param1->getDefaultValue()->willReturn(array());
+
+ $param2->getName()->willReturn('arg2');
+ $param2->isArray()->willReturn(false);
+ $param2->getClass()->willReturn($typeHint);
+ $param2->isDefaultValueAvailable()->willReturn(false);
+ $param2->isOptional()->willReturn(false);
+ $param2->isPassedByReference()->willReturn(false);
+ $param2->allowsNull()->willReturn(false);
+ $typeHint->getName()->willReturn('ArrayAccess');
+
+ $param3->getName()->willReturn('arg_3');
+ $param3->isArray()->willReturn(false);
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $param3->isCallable()->willReturn(true);
+ }
+ $param3->getClass()->willReturn(null);
+ $param3->isOptional()->willReturn(false);
+ $param3->isDefaultValueAvailable()->willReturn(false);
+ $param3->isPassedByReference()->willReturn(false);
+ $param3->allowsNull()->willReturn(true);
+
+ $param4->getName()->willReturn('arg_4');
+ $param4->isArray()->willReturn(false);
+ $param4->getClass()->willReturn($typeHint);
+ $param4->isPassedByReference()->willReturn(false);
+ $param4->allowsNull()->willReturn(true);
+
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param1->isVariadic()->willReturn(false);
+ $param2->isVariadic()->willReturn(false);
+ $param3->isVariadic()->willReturn(false);
+ $param4->isVariadic()->willReturn(true);
+ } else {
+ $param4->isOptional()->willReturn(true);
+ $param4->isDefaultValueAvailable()->willReturn(false);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $argNodes = $methodNodes['methodWithArgs']->getArguments();
+
+ $argNodes[0]->getName()->shouldReturn('arg_1');
+ $argNodes[0]->getTypeHint()->shouldReturn('array');
+ $argNodes[0]->isOptional()->shouldReturn(true);
+ $argNodes[0]->getDefault()->shouldReturn(array());
+
+ $argNodes[1]->getName()->shouldReturn('arg2');
+ $argNodes[1]->getTypeHint()->shouldReturn('ArrayAccess');
+ $argNodes[1]->isOptional()->shouldReturn(false);
+
+ $argNodes[2]->getName()->shouldReturn('arg_3');
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $argNodes[2]->getTypeHint()->shouldReturn('callable');
+ $argNodes[2]->isOptional()->shouldReturn(true);
+ $argNodes[2]->getDefault()->shouldReturn(null);
+ } else {
+ $argNodes[2]->isOptional()->shouldReturn(false);
+ }
+
+ $argNodes[3]->getName()->shouldReturn('arg_4');
+ $argNodes[3]->getTypeHint()->shouldReturn('ArrayAccess');
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $argNodes[3]->isVariadic()->shouldReturn(true);
+ } else {
+ $argNodes[3]->isOptional()->shouldReturn(true);
+ $argNodes[3]->getDefault()->shouldReturn(null);
+ }
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ */
+ function it_marks_required_args_without_types_as_not_optional(
+ $class, $method, $param1
+ )
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->getName()->willReturn('methodWithArgs');
+ $method->isFinal()->willReturn(false);
+ $method->isProtected()->willReturn(false);
+ $method->isStatic()->willReturn(false);
+ $method->returnsReference()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1));
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $param1->getName()->willReturn('arg_1');
+ $param1->isArray()->willReturn(false);
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $param1->isCallable()->willReturn(false);
+ }
+ $param1->getClass()->willReturn(null);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $param1->hasType()->willReturn(false);
+ }
+
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param1->isVariadic()->willReturn(false);
+ }
+ $param1->isDefaultValueAvailable()->willReturn(false);
+ $param1->isOptional()->willReturn(false);
+ $param1->isPassedByReference()->willReturn(false);
+ $param1->allowsNull()->willReturn(true);
+ if (defined('HHVM_VERSION')) {
+ $param1->getTypehintText()->willReturn(null);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $argNodes = $methodNodes['methodWithArgs']->getArguments();
+
+ $argNodes[0]->isOptional()->shouldReturn(false);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ * @param ReflectionParameter $param2
+ * @param ReflectionParameter $param3
+ * @param ReflectionClass $typeHint
+ */
+ function it_marks_passed_by_reference_args_as_passed_by_reference(
+ $class, $method, $param1, $param2, $param3, $typeHint
+ )
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->getName()->willReturn('methodWithArgs');
+ $method->isFinal()->willReturn(false);
+ $method->isProtected()->willReturn(false);
+ $method->isStatic()->willReturn(false);
+ $method->returnsReference()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1, $param2, $param3));
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $param1->getName()->willReturn('arg_1');
+ $param1->isArray()->willReturn(false);
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $param1->isCallable()->willReturn(false);
+ }
+ $param1->getClass()->willReturn(null);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param1->isVariadic()->willReturn(false);
+ }
+ $param1->isDefaultValueAvailable()->willReturn(false);
+ $param1->isOptional()->willReturn(true);
+ $param1->isPassedByReference()->willReturn(true);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $param1->hasType()->willReturn(false);
+ }
+
+ $param1->allowsNull()->willReturn(false);
+ if (defined('HHVM_VERSION')) {
+ $param1->getTypehintText()->willReturn(null);
+ }
+
+ $param2->getName()->willReturn('arg2');
+ $param2->isArray()->willReturn(false);
+ $param2->getClass()->willReturn($typeHint);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param2->isVariadic()->willReturn(false);
+ }
+ $param2->isDefaultValueAvailable()->willReturn(false);
+ $param2->isOptional()->willReturn(false);
+ $param2->isPassedByReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $param2->hasType()->willReturn(false);
+ }
+
+ $param2->allowsNull()->willReturn(false);
+ $typeHint->getName()->willReturn('ArrayAccess');
+
+ $param3->getName()->willReturn('arg2');
+ $param3->isArray()->willReturn(false);
+ $param3->getClass()->willReturn($typeHint);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param3->isVariadic()->willReturn(true);
+ } else {
+ $param3->isOptional()->willReturn(true);
+ $param3->isDefaultValueAvailable()->willReturn(false);
+ }
+ $param3->isPassedByReference()->willReturn(true);
+ $param3->allowsNull()->willReturn(true);
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $argNodes = $methodNodes['methodWithArgs']->getArguments();
+
+ $argNodes[0]->isPassedByReference()->shouldReturn(true);
+ $argNodes[1]->isPassedByReference()->shouldReturn(false);
+ $argNodes[2]->isPassedByReference()->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ */
+ function it_throws_an_exception_if_class_is_final($class)
+ {
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(true);
+ $class->getName()->willReturn('Custom\ClassName');
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\ClassMirrorException')
+ ->duringReflect($class, array());
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_ignores_final_methods($class, $method)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->isFinal()->willReturn(true);
+ $method->getName()->willReturn('finalImplementation');
+
+ $classNode = $this->reflect($class, array());
+ $classNode->getMethods()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_marks_final_methods_as_unextendable($class, $method)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->isFinal()->willReturn(true);
+ $method->getName()->willReturn('finalImplementation');
+
+ $classNode = $this->reflect($class, array());
+ $classNode->getUnextendableMethods()->shouldHaveCount(1);
+ $classNode->isExtendable('finalImplementation')->shouldReturn(false);
+ }
+
+ /**
+ * @param ReflectionClass $interface
+ */
+ function it_throws_an_exception_if_interface_provided_instead_of_class($interface)
+ {
+ $interface->isInterface()->willReturn(true);
+ $interface->getName()->willReturn('Custom\ClassName');
+
+ $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')
+ ->duringReflect($interface, array());
+ }
+
+ /**
+ * @param ReflectionClass $interface1
+ * @param ReflectionClass $interface2
+ * @param ReflectionMethod $method1
+ * @param ReflectionMethod $method2
+ * @param ReflectionMethod $method3
+ */
+ function it_reflects_all_interfaces_methods(
+ $interface1, $interface2, $method1, $method2, $method3
+ )
+ {
+ $interface1->getName()->willReturn('MyInterface1');
+ $interface2->getName()->willReturn('MyInterface2');
+
+ $interface1->isInterface()->willReturn(true);
+ $interface2->isInterface()->willReturn(true);
+
+ $interface1->getMethods()->willReturn(array($method1));
+ $interface2->getMethods()->willReturn(array($method2, $method3));
+
+ $method1->getName()->willReturn('getName');
+ $method2->getName()->willReturn('isPublic');
+ $method3->getName()->willReturn('isAbstract');
+
+ $method1->isProtected()->willReturn(false);
+ $method2->isProtected()->willReturn(false);
+ $method3->isProtected()->willReturn(false);
+
+ $method1->returnsReference()->willReturn(false);
+ $method2->returnsReference()->willReturn(false);
+ $method3->returnsReference()->willReturn(false);
+
+ $method1->isStatic()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method1->hasReturnType()->willReturn(false);
+ $method2->hasReturnType()->willReturn(false);
+ $method3->hasReturnType()->willReturn(false);
+ }
+
+ $classNode = $this->reflect(null, array($interface1, $interface2));
+
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('stdClass');
+ $classNode->getInterfaces()->shouldReturn(array(
+ 'Prophecy\Doubler\Generator\ReflectionInterface', 'MyInterface2', 'MyInterface1',
+ ));
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(3);
+
+ $classNode->hasMethod('getName')->shouldReturn(true);
+ $classNode->hasMethod('isPublic')->shouldReturn(true);
+ $classNode->hasMethod('isAbstract')->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method1
+ * @param ReflectionMethod $method2
+ * @param ReflectionMethod $method3
+ */
+ function it_ignores_virtually_private_methods($class, $method1, $method2, $method3)
+ {
+ $class->getName()->willReturn('SomeClass');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method1, $method2, $method3));
+
+ $method1->getName()->willReturn('_getName');
+ $method2->getName()->willReturn('__toString');
+ $method3->getName()->willReturn('isAbstract');
+
+ $method1->isFinal()->willReturn(false);
+ $method2->isFinal()->willReturn(false);
+ $method3->isFinal()->willReturn(false);
+
+ $method1->isProtected()->willReturn(false);
+ $method2->isProtected()->willReturn(false);
+ $method3->isProtected()->willReturn(false);
+
+ $method1->isStatic()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+
+ $method1->returnsReference()->willReturn(false);
+ $method2->returnsReference()->willReturn(false);
+ $method3->returnsReference()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method1->hasReturnType()->willReturn(false);
+ $method2->hasReturnType()->willReturn(false);
+ $method3->hasReturnType()->willReturn(false);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(2);
+
+ $classNode->hasMethod('isAbstract')->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_does_not_throw_exception_for_virtually_private_finals($class, $method)
+ {
+ $class->getName()->willReturn('SomeClass');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->getName()->willReturn('__toString');
+ $method->isFinal()->willReturn(true);
+
+ $this->shouldNotThrow()->duringReflect($class, array());
+ }
+
+ /**
+ * @param ReflectionClass $class
+ */
+ function it_throws_an_exception_if_class_provided_in_interfaces_list($class)
+ {
+ $class->getName()->willReturn('MyClass');
+ $class->isInterface()->willReturn(false);
+
+ $this->shouldThrow('InvalidArgumentException')
+ ->duringReflect(null, array($class));
+ }
+
+ function it_throws_an_exception_if_not_reflection_provided_as_interface()
+ {
+ $this->shouldThrow('InvalidArgumentException')
+ ->duringReflect(null, array(null));
+ }
+
+ function it_doesnt_fail_to_typehint_nonexistent_FQCN()
+ {
+ $classNode = $this->reflect(new ReflectionClass('spec\Prophecy\Doubler\Generator\OptionalDepsClass'), array());
+ $method = $classNode->getMethod('iHaveAStrangeTypeHintedArg');
+ $arguments = $method->getArguments();
+ $arguments[0]->getTypeHint()->shouldBe('I\Simply\Am\Nonexistent');
+ }
+
+ function it_doesnt_fail_to_typehint_nonexistent_RQCN()
+ {
+ $classNode = $this->reflect(new ReflectionClass('spec\Prophecy\Doubler\Generator\OptionalDepsClass'), array());
+ $method = $classNode->getMethod('iHaveAnEvenStrangerTypeHintedArg');
+ $arguments = $method->getArguments();
+ $arguments[0]->getTypeHint()->shouldBe('I\Simply\Am\Not');
+ }
+
+ function it_doesnt_use_scalar_typehints()
+ {
+ $classNode = $this->reflect(new ReflectionClass('ReflectionMethod'), array());
+ $method = $classNode->getMethod('export');
+ $arguments = $method->getArguments();
+ $arguments[0]->getTypeHint()->shouldReturn(null);
+ $arguments[1]->getTypeHint()->shouldReturn(null);
+ $arguments[2]->getTypeHint()->shouldReturn(null);
+ }
+}
+
+class OptionalDepsClass
+{
+ public function iHaveAStrangeTypeHintedArg(\I\Simply\Am\Nonexistent $class)
+ {
+ }
+
+ public function iHaveAnEvenStrangerTypeHintedArg(Simply\Am\Not $class)
+ {
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
new file mode 100644
index 00000000..2c8d1886
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
@@ -0,0 +1,92 @@
+beConstructedWith('name');
+ }
+
+ function it_is_not_be_passed_by_reference_by_default()
+ {
+ $this->shouldNotBePassedByReference();
+ }
+
+ function it_is_passed_by_reference_if_marked()
+ {
+ $this->setAsPassedByReference();
+ $this->shouldBePassedByReference();
+ }
+
+ function it_is_not_variadic_by_default()
+ {
+ $this->shouldNotBeVariadic();
+ }
+
+ function it_is_variadic_if_marked()
+ {
+ $this->setAsVariadic();
+ $this->shouldBeVariadic();
+ }
+
+ function it_does_not_have_default_by_default()
+ {
+ $this->shouldNotHaveDefault();
+ }
+
+ function it_does_not_have_default_if_variadic()
+ {
+ $this->setDefault(null);
+ $this->setAsVariadic();
+ $this->shouldNotHaveDefault();
+ }
+
+ function it_does_have_default_if_not_variadic()
+ {
+ $this->setDefault(null);
+ $this->setAsVariadic(false);
+ $this->hasDefault()->shouldReturn(true);
+ }
+
+ function it_has_name_with_which_it_was_been_constructed()
+ {
+ $this->getName()->shouldReturn('name');
+ }
+
+ function it_has_no_typehint_by_default()
+ {
+ $this->getTypeHint()->shouldReturn(null);
+ }
+
+ function its_typeHint_is_mutable()
+ {
+ $this->setTypeHint('array');
+ $this->getTypeHint()->shouldReturn('array');
+ }
+
+ function it_does_not_have_default_value_by_default()
+ {
+ $this->getDefault()->shouldReturn(null);
+ }
+
+ function it_is_not_optional_by_default()
+ {
+ $this->isOptional()->shouldReturn(false);
+ }
+
+ function its_default_is_mutable()
+ {
+ $this->setDefault(array());
+ $this->getDefault()->shouldReturn(array());
+ }
+
+ function it_is_marked_as_optional_when_default_is_set()
+ {
+ $this->setDefault(null);
+ $this->isOptional()->shouldReturn(true);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
new file mode 100644
index 00000000..be7e1026
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
@@ -0,0 +1,200 @@
+getParentClass()->shouldReturn('stdClass');
+ }
+
+ function its_parentClass_is_mutable()
+ {
+ $this->setParentClass('Exception');
+ $this->getParentClass()->shouldReturn('Exception');
+ }
+
+ function its_parentClass_is_set_to_stdClass_if_user_set_null()
+ {
+ $this->setParentClass(null);
+ $this->getParentClass()->shouldReturn('stdClass');
+ }
+
+ function it_does_not_implement_any_interface_by_default()
+ {
+ $this->getInterfaces()->shouldHaveCount(0);
+ }
+
+ function its_addInterface_adds_item_to_the_list_of_implemented_interfaces()
+ {
+ $this->addInterface('MyInterface');
+ $this->getInterfaces()->shouldHaveCount(1);
+ }
+
+ function its_hasInterface_returns_true_if_class_implements_interface()
+ {
+ $this->addInterface('MyInterface');
+ $this->hasInterface('MyInterface')->shouldReturn(true);
+ }
+
+ function its_hasInterface_returns_false_if_class_does_not_implements_interface()
+ {
+ $this->hasInterface('MyInterface')->shouldReturn(false);
+ }
+
+ function it_supports_implementation_of_multiple_interfaces()
+ {
+ $this->addInterface('MyInterface');
+ $this->addInterface('MySecondInterface');
+ $this->getInterfaces()->shouldHaveCount(2);
+ }
+
+ function it_ignores_same_interfaces_added_twice()
+ {
+ $this->addInterface('MyInterface');
+ $this->addInterface('MyInterface');
+
+ $this->getInterfaces()->shouldHaveCount(1);
+ $this->getInterfaces()->shouldReturn(array('MyInterface'));
+ }
+
+ function it_does_not_have_methods_by_default()
+ {
+ $this->getMethods()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ */
+ function it_can_has_methods($method1, $method2)
+ {
+ $method1->getName()->willReturn('__construct');
+ $method2->getName()->willReturn('getName');
+
+ $this->addMethod($method1);
+ $this->addMethod($method2);
+
+ $this->getMethods()->shouldReturn(array(
+ '__construct' => $method1,
+ 'getName' => $method2
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function its_hasMethod_returns_true_if_method_exists($method)
+ {
+ $method->getName()->willReturn('getName');
+
+ $this->addMethod($method);
+
+ $this->hasMethod('getName')->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function its_getMethod_returns_method_by_name($method)
+ {
+ $method->getName()->willReturn('getName');
+
+ $this->addMethod($method);
+
+ $this->getMethod('getName')->shouldReturn($method);
+ }
+
+ function its_hasMethod_returns_false_if_method_does_not_exists()
+ {
+ $this->hasMethod('getName')->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function its_hasMethod_returns_false_if_method_has_been_removed($method)
+ {
+ $method->getName()->willReturn('getName');
+ $this->addMethod($method);
+ $this->removeMethod('getName');
+
+ $this->hasMethod('getName')->shouldReturn(false);
+ }
+
+
+ function it_does_not_have_properties_by_default()
+ {
+ $this->getProperties()->shouldHaveCount(0);
+ }
+
+ function it_is_able_to_have_properties()
+ {
+ $this->addProperty('title');
+ $this->addProperty('text', 'private');
+ $this->getProperties()->shouldReturn(array(
+ 'title' => 'public',
+ 'text' => 'private'
+ ));
+ }
+
+ function its_addProperty_does_not_accept_unsupported_visibility()
+ {
+ $this->shouldThrow('InvalidArgumentException')->duringAddProperty('title', 'town');
+ }
+
+ function its_addProperty_lowercases_visibility_before_setting()
+ {
+ $this->addProperty('text', 'PRIVATE');
+ $this->getProperties()->shouldReturn(array('text' => 'private'));
+ }
+
+ function its_has_no_unextendable_methods_by_default()
+ {
+ $this->getUnextendableMethods()->shouldHaveCount(0);
+ }
+
+ function its_addUnextendableMethods_adds_an_unextendable_method()
+ {
+ $this->addUnextendableMethod('testMethod');
+ $this->getUnextendableMethods()->shouldHaveCount(1);
+ }
+
+ function its_methods_are_extendable_by_default()
+ {
+ $this->isExtendable('testMethod')->shouldReturn(true);
+ }
+
+ function its_unextendable_methods_are_not_extendable()
+ {
+ $this->addUnextendableMethod('testMethod');
+ $this->isExtendable('testMethod')->shouldReturn(false);
+ }
+
+ function its_addUnextendableMethods_doesnt_create_duplicates()
+ {
+ $this->addUnextendableMethod('testMethod');
+ $this->addUnextendableMethod('testMethod');
+ $this->getUnextendableMethods()->shouldHaveCount(1);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_throws_an_exception_when_adding_a_method_that_isnt_extendable($method)
+ {
+ $this->addUnextendableMethod('testMethod');
+ $method->getName()->willReturn('testMethod');
+
+ $expectedException = new MethodNotExtendableException(
+ "Method `testMethod` is not extendable, so can not be added.",
+ "stdClass",
+ "testMethod"
+ );
+ $this->shouldThrow($expectedException)->duringAddMethod($method);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
new file mode 100644
index 00000000..49bd9f59
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
@@ -0,0 +1,141 @@
+beConstructedWith('getTitle');
+ }
+
+ function it_has_a_name()
+ {
+ $this->getName()->shouldReturn('getTitle');
+ }
+
+ function it_has_public_visibility_by_default()
+ {
+ $this->getVisibility()->shouldReturn('public');
+ }
+
+ function its_visibility_is_mutable()
+ {
+ $this->setVisibility('private');
+ $this->getVisibility()->shouldReturn('private');
+ }
+
+ function it_is_not_static_by_default()
+ {
+ $this->shouldNotBeStatic();
+ }
+
+ function it_does_not_return_a_reference_by_default()
+ {
+ $this->returnsReference()->shouldReturn(false);
+ }
+
+ function it_should_be_settable_as_returning_a_reference_through_setter()
+ {
+ $this->setReturnsReference();
+ $this->returnsReference()->shouldReturn(true);
+ }
+
+ function it_should_be_settable_as_static_through_setter()
+ {
+ $this->setStatic();
+ $this->shouldBeStatic();
+ }
+
+ function it_accepts_only_supported_visibilities()
+ {
+ $this->shouldThrow('InvalidArgumentException')->duringSetVisibility('stealth');
+ }
+
+ function it_lowercases_visibility_before_setting_it()
+ {
+ $this->setVisibility('Public');
+ $this->getVisibility()->shouldReturn('public');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2
+ */
+ function its_useParentCode_causes_method_to_call_parent($argument1, $argument2)
+ {
+ $argument1->getName()->willReturn('objectName');
+ $argument2->getName()->willReturn('default');
+
+ $argument1->isVariadic()->willReturn(false);
+ $argument2->isVariadic()->willReturn(true);
+
+ $this->addArgument($argument1);
+ $this->addArgument($argument2);
+
+ $this->useParentCode();
+
+ $this->getCode()->shouldReturn(
+ 'return parent::getTitle($objectName, ...$default);'
+ );
+ }
+
+ function its_code_is_mutable()
+ {
+ $this->setCode('echo "code";');
+ $this->getCode()->shouldReturn('echo "code";');
+ }
+
+ function its_reference_returning_methods_will_generate_exceptions()
+ {
+ $this->setCode('echo "code";');
+ $this->setReturnsReference();
+ $this->getCode()->shouldReturn("throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), 'getTitle');");
+ }
+
+ function its_setCode_provided_with_null_cleans_method_body()
+ {
+ $this->setCode(null);
+ $this->getCode()->shouldReturn('');
+ }
+
+ function it_is_constructable_with_code()
+ {
+ $this->beConstructedWith('getTitle', 'die();');
+ $this->getCode()->shouldReturn('die();');
+ }
+
+ function it_does_not_have_arguments_by_default()
+ {
+ $this->getArguments()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2
+ */
+ function it_supports_adding_arguments($argument1, $argument2)
+ {
+ $this->addArgument($argument1);
+ $this->addArgument($argument2);
+
+ $this->getArguments()->shouldReturn(array($argument1, $argument2));
+ }
+
+ function it_does_not_have_return_type_by_default()
+ {
+ $this->hasReturnType()->shouldReturn(false);
+ }
+
+ function it_setReturnType_sets_return_type()
+ {
+ $returnType = 'string';
+
+ $this->setReturnType($returnType);
+
+ $this->hasReturnType()->shouldReturn(true);
+ $this->getReturnType()->shouldReturn($returnType);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
new file mode 100644
index 00000000..7026126f
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
@@ -0,0 +1,96 @@
+beConstructedWith($doubler);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ */
+ function it_returns_anonymous_double_instance_by_default($doubler, $double)
+ {
+ $doubler->double(null, array())->willReturn($double);
+
+ $this->getInstance()->shouldReturn($double);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ * @param \ReflectionClass $class
+ */
+ function it_returns_class_double_instance_if_set($doubler, $double, $class)
+ {
+ $doubler->double($class, array())->willReturn($double);
+
+ $this->setParentClass($class);
+
+ $this->getInstance()->shouldReturn($double);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double1
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double2
+ */
+ function it_returns_same_double_instance_if_called_2_times(
+ $doubler, $double1, $double2
+ )
+ {
+ $doubler->double(null, array())->willReturn($double1);
+ $doubler->double(null, array())->willReturn($double2);
+
+ $this->getInstance()->shouldReturn($double2);
+ $this->getInstance()->shouldReturn($double2);
+ }
+
+ function its_setParentClass_throws_ClassNotFoundException_if_class_not_found()
+ {
+ $this->shouldThrow('Prophecy\Exception\Doubler\ClassNotFoundException')
+ ->duringSetParentClass('SomeUnexistingClass');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ */
+ function its_setParentClass_throws_exception_if_prophecy_is_already_created(
+ $doubler, $double
+ )
+ {
+ $doubler->double(null, array())->willReturn($double);
+
+ $this->getInstance();
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
+ ->duringSetParentClass('stdClass');
+ }
+
+ function its_addInterface_throws_InterfaceNotFoundException_if_no_interface_found()
+ {
+ $this->shouldThrow('Prophecy\Exception\Doubler\InterfaceNotFoundException')
+ ->duringAddInterface('SomeUnexistingInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ */
+ function its_addInterface_throws_exception_if_prophecy_is_already_created(
+ $doubler, $double
+ )
+ {
+ $doubler->double(null, array())->willReturn($double);
+
+ $this->getInstance();
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
+ ->duringAddInterface('ArrayAccess');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
new file mode 100644
index 00000000..a3e74919
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
@@ -0,0 +1,72 @@
+getName()->willReturn('stdClass');
+ $this->name($class, array())->shouldStartWith('Double\stdClass\\');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ */
+ function its_name_generates_name_based_on_namespaced_class_reflection($class)
+ {
+ $class->getName()->willReturn('Some\Custom\Class');
+ $this->name($class, array())->shouldStartWith('Double\Some\Custom\Class\P');
+ }
+
+ /**
+ * @param \ReflectionClass $interface1
+ * @param \ReflectionClass $interface2
+ */
+ function its_name_generates_name_based_on_interface_shortnames($interface1, $interface2)
+ {
+ $interface1->getShortName()->willReturn('HandlerInterface');
+ $interface2->getShortName()->willReturn('LoaderInterface');
+
+ $this->name(null, array($interface1, $interface2))->shouldStartWith(
+ 'Double\HandlerInterface\LoaderInterface\P'
+ );
+ }
+
+ function it_generates_proper_name_for_no_class_and_interfaces_list()
+ {
+ $this->name(null, array())->shouldStartWith('Double\stdClass\P');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ * @param \ReflectionClass $interface1
+ * @param \ReflectionClass $interface2
+ */
+ function its_name_generates_name_based_only_on_class_if_its_available(
+ $class, $interface1, $interface2
+ )
+ {
+ $class->getName()->willReturn('Some\Custom\Class');
+ $interface1->getShortName()->willReturn('HandlerInterface');
+ $interface2->getShortName()->willReturn('LoaderInterface');
+
+ $this->name($class, array($interface1, $interface2))->shouldStartWith(
+ 'Double\Some\Custom\Class\P'
+ );
+ }
+
+ public function getMatchers()
+ {
+ return array(
+ 'startWith' => function ($subject, $string) {
+ return 0 === strpos($subject, $string);
+ },
+ );
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
new file mode 100644
index 00000000..6fd1a5c3
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
@@ -0,0 +1,32 @@
+beConstructedWith('msg', $objectProphecy, 'getName', array('arg1', 'arg2'));
+ }
+
+ function it_is_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
+ }
+
+ function it_exposes_method_name_through_getter()
+ {
+ $this->getMethodName()->shouldReturn('getName');
+ }
+
+ function it_exposes_arguments_through_getter()
+ {
+ $this->getArguments()->shouldReturn(array('arg1', 'arg2'));
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
new file mode 100644
index 00000000..58241385
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
@@ -0,0 +1,28 @@
+beConstructedWith('', $node);
+ }
+
+ function it_is_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
+ }
+
+ function it_contains_a_reflected_node($node)
+ {
+ $this->getClassNode()->shouldReturn($node);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
new file mode 100644
index 00000000..21e31a34
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
@@ -0,0 +1,27 @@
+beConstructedWith('', $class);
+ }
+
+ function it_is_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
+ }
+
+ function it_contains_a_reflected_class_link($class)
+ {
+ $this->getReflectedClass()->shouldReturn($class);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
new file mode 100644
index 00000000..251512b9
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
@@ -0,0 +1,25 @@
+beConstructedWith('msg', 'CustomClass');
+ }
+
+ function it_is_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoubleException');
+ }
+
+ function its_getClassname_returns_classname()
+ {
+ $this->getClassname()->shouldReturn('CustomClass');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
new file mode 100644
index 00000000..6fe5a19a
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
@@ -0,0 +1,14 @@
+shouldBeAnInstanceOf('RuntimeException');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
new file mode 100644
index 00000000..ad1a439e
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
@@ -0,0 +1,24 @@
+beConstructedWith('msg', 'CustomInterface');
+ }
+
+ function it_extends_ClassNotFoundException()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\ClassNotFoundException');
+ }
+
+ function its_getClassname_returns_classname()
+ {
+ $this->getClassname()->shouldReturn('CustomInterface');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php
new file mode 100644
index 00000000..5028b026
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php
@@ -0,0 +1,29 @@
+beConstructedWith('', 'User', 'getName');
+ }
+
+ function it_is_DoubleException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException');
+ }
+
+ function it_has_MethodName()
+ {
+ $this->getMethodName()->shouldReturn('getName');
+ }
+
+ function it_has_classname()
+ {
+ $this->getClassName()->shouldReturn('User');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
new file mode 100644
index 00000000..a889dd7e
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
@@ -0,0 +1,40 @@
+beConstructedWith('', 'User', 'getName', array(1, 2, 3));
+ }
+
+ function it_is_DoubleException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException');
+ }
+
+ function it_has_MethodName()
+ {
+ $this->getMethodName()->shouldReturn('getName');
+ }
+
+ function it_has_classnamej()
+ {
+ $this->getClassname()->shouldReturn('User');
+ }
+
+ function it_has_an_arguments_list()
+ {
+ $this->getArguments()->shouldReturn(array(1, 2, 3));
+ }
+
+ function it_has_a_default_null_argument_list()
+ {
+ $this->beConstructedWith('', 'User', 'getName');
+ $this->getArguments()->shouldReturn(null);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
new file mode 100644
index 00000000..22a5ebdb
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
@@ -0,0 +1,57 @@
+beConstructedWith(null);
+ }
+
+ function it_is_prediction_exception()
+ {
+ $this->shouldBeAnInstanceOf('RuntimeException');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\PredictionException');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ */
+ function it_can_store_objectProphecy_link($object)
+ {
+ $this->setObjectProphecy($object);
+ $this->getObjectProphecy()->shouldReturn($object);
+ }
+
+ function it_should_not_have_exceptions_at_the_beginning()
+ {
+ $this->getExceptions()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Exception\Prediction\PredictionException $exception
+ */
+ function it_should_append_exception_through_append_method($exception)
+ {
+ $exception->getMessage()->willReturn('Exception #1');
+
+ $this->append($exception);
+
+ $this->getExceptions()->shouldReturn(array($exception));
+ }
+
+ /**
+ * @param \Prophecy\Exception\Prediction\PredictionException $exception
+ */
+ function it_should_update_message_during_append($exception)
+ {
+ $exception->getMessage()->willReturn('Exception #1');
+
+ $this->append($exception);
+
+ $this->getMessage()->shouldReturn(" Exception #1");
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
new file mode 100644
index 00000000..473f1a2d
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
@@ -0,0 +1,29 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy);
+ }
+
+ function it_is_PredictionException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
+ }
+
+ function it_extends_MethodProphecyException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
new file mode 100644
index 00000000..adad975b
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
@@ -0,0 +1,31 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy, 5, array($call1, $call2));
+ }
+
+ function it_extends_UnexpectedCallsException()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\UnexpectedCallsException');
+ }
+
+ function it_should_expose_expectedCount_through_getter()
+ {
+ $this->getExpectedCount()->shouldReturn(5);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
new file mode 100644
index 00000000..c0fe24d7
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
@@ -0,0 +1,36 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy, array($call1, $call2));
+ }
+
+ function it_is_PredictionException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
+ }
+
+ function it_extends_MethodProphecyException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
+ }
+
+ function it_should_expose_calls_list_through_getter($call1, $call2)
+ {
+ $this->getCalls()->shouldReturn(array($call1, $call2));
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
new file mode 100644
index 00000000..97cf9e10
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
@@ -0,0 +1,30 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy);
+ }
+
+ function it_extends_DoubleException()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
+ }
+
+ function it_holds_a_stub_reference($methodProphecy)
+ {
+ $this->getMethodProphecy()->shouldReturn($methodProphecy);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
new file mode 100644
index 00000000..bcacfedc
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
@@ -0,0 +1,27 @@
+beConstructedWith('message', $objectProphecy);
+ }
+
+ function it_should_be_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ProphecyException');
+ }
+
+ function it_holds_double_reference($objectProphecy)
+ {
+ $this->getObjectProphecy()->shouldReturn($objectProphecy);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
new file mode 100644
index 00000000..3da8c599
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
@@ -0,0 +1,42 @@
+shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ */
+ function it_does_nothing_if_there_is_more_than_one_call_been_made($object, $method, $call)
+ {
+ $this->check(array($call), $object, $method)->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_NoCallsException_if_no_calls_found($object, $method, $arguments)
+ {
+ $method->getObjectProphecy()->willReturn($object);
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->__toString()->willReturn('123');
+ $object->reveal()->willReturn(new \stdClass());
+ $object->findProphecyMethodCalls('getName', Argument::any())->willReturn(array());
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\NoCallsException')
+ ->duringCheck(array(), $object, $method);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
new file mode 100644
index 00000000..c6708927
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
@@ -0,0 +1,54 @@
+beConstructedWith(2);
+ }
+
+ function it_is_prediction()
+ {
+ $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_does_nothing_if_there_were_exact_amount_of_calls_being_made(
+ $object, $method, $call1, $call2
+ )
+ {
+ $this->check(array($call1, $call2), $object, $method)->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_UnexpectedCallsCountException_if_calls_found(
+ $object, $method, $call, $arguments
+ )
+ {
+ $method->getObjectProphecy()->willReturn($object);
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->__toString()->willReturn('123');
+
+ $call->getMethodName()->willReturn('getName');
+ $call->getArguments()->willReturn(array(5, 4, 'three'));
+ $call->getCallPlace()->willReturn('unknown');
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsCountException')
+ ->duringCheck(array($call), $object, $method);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
new file mode 100644
index 00000000..7fe475ef
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
@@ -0,0 +1,36 @@
+beConstructedWith('get_class');
+ }
+
+ function it_is_prediction()
+ {
+ $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ */
+ function it_proxies_call_to_callback($object, $method, $call)
+ {
+ $returnFirstCallCallback = function ($calls, $object, $method) {
+ throw new RuntimeException;
+ };
+
+ $this->beConstructedWith($returnFirstCallCallback);
+
+ $this->shouldThrow('RuntimeException')->duringCheck(array($call), $object, $method);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
new file mode 100644
index 00000000..a3ef9bcb
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
@@ -0,0 +1,43 @@
+shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_does_nothing_if_there_is_no_calls_made($object, $method)
+ {
+ $this->check(array(), $object, $method)->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_UnexpectedCallsException_if_calls_found($object, $method, $call, $arguments)
+ {
+ $method->getObjectProphecy()->willReturn($object);
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->__toString()->willReturn('123');
+
+ $call->getMethodName()->willReturn('getName');
+ $call->getArguments()->willReturn(array(5, 4, 'three'));
+ $call->getCallPlace()->willReturn('unknown');
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsException')
+ ->duringCheck(array($call), $object, $method);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
new file mode 100644
index 00000000..5d99b1b1
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
@@ -0,0 +1,110 @@
+beConstructedWith('get_class');
+ }
+
+ function it_is_promise()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_closure_callback($object, $method)
+ {
+ $firstArgumentCallback = function ($args) {
+ return $args[0];
+ };
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_static_array_callback($object, $method)
+ {
+ $firstArgumentCallback = array('spec\Prophecy\Promise\ClassCallback', 'staticCallbackMethod');
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_instance_array_callback($object, $method)
+ {
+ $class = new ClassCallback();
+ $firstArgumentCallback = array($class, 'callbackMethod');
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_string_function_callback($object, $method)
+ {
+ $firstArgumentCallback = 'spec\Prophecy\Promise\functionCallbackFirstArgument';
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+}
+
+/**
+ * Class used to test callbackpromise
+ *
+ * @param array
+ * @return string
+ */
+class ClassCallback
+{
+ /**
+ * @param array $args
+ */
+ function callbackMethod($args)
+ {
+ return $args[0];
+ }
+
+ /**
+ * @param array $args
+ */
+ static function staticCallbackMethod($args)
+ {
+ return $args[0];
+ }
+}
+
+/**
+ * Callback function used to test callbackpromise
+ *
+ * @param array
+ * @return string
+ */
+function functionCallbackFirstArgument($args)
+{
+ return $args[0];
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
new file mode 100644
index 00000000..4acb7bb0
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
@@ -0,0 +1,41 @@
+shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_return_first_argument_if_provided($object, $method)
+ {
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_return_null_if_no_arguments_provided($object, $method)
+ {
+ $this->execute(array(), $object, $method)->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_return_nth_argument_if_provided($object, $method)
+ {
+ $this->beConstructedWith(1);
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('two');
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
new file mode 100644
index 00000000..18bfd87a
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
@@ -0,0 +1,61 @@
+beConstructedWith(array(42));
+ }
+
+ function it_is_promise()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_returns_value_it_was_constructed_with($object, $method)
+ {
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_always_returns_last_value_left_in_the_return_values($object, $method)
+ {
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_consequently_returns_multiple_values_it_was_constructed_with($object, $method)
+ {
+ $this->beConstructedWith(array(42, 24, 12));
+
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ $this->execute(array(), $object, $method)->shouldReturn(24);
+ $this->execute(array(), $object, $method)->shouldReturn(12);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_returns_null_if_constructed_with_empty_array($object, $method)
+ {
+ $this->beConstructedWith(array());
+
+ $this->execute(array(), $object, $method)->shouldReturn(null);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
new file mode 100644
index 00000000..5f448979
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
@@ -0,0 +1,58 @@
+beConstructedWith('RuntimeException');
+ }
+
+ function it_is_promise()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_instantiates_and_throws_exception_from_provided_classname($object, $method)
+ {
+ $this->beConstructedWith('InvalidArgumentException');
+
+ $this->shouldThrow('InvalidArgumentException')
+ ->duringExecute(array(), $object, $method);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_instantiates_exceptions_with_required_arguments($object, $method)
+ {
+ $this->beConstructedWith('spec\Prophecy\Promise\RequiredArgumentException');
+
+ $this->shouldThrow('spec\Prophecy\Promise\RequiredArgumentException')
+ ->duringExecute(array(), $object, $method);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_throws_provided_exception($object, $method)
+ {
+ $this->beConstructedWith($exc = new \RuntimeException('Some exception'));
+
+ $this->shouldThrow($exc)->duringExecute(array(), $object, $method);
+ }
+}
+
+class RequiredArgumentException extends \Exception
+{
+ final public function __construct($message, $code) {}
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
new file mode 100644
index 00000000..41ee8cde
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
@@ -0,0 +1,384 @@
+reveal()->willReturn($reflection);
+
+ $this->beConstructedWith($objectProphecy, 'getName', null);
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Prophecy\MethodProphecy');
+ }
+
+ function its_constructor_throws_MethodNotFoundException_for_unexisting_method($objectProphecy)
+ {
+ $this->shouldThrow('Prophecy\Exception\Doubler\MethodNotFoundException')->during(
+ '__construct', array($objectProphecy, 'getUnexisting', null)
+ );
+ }
+
+ /**
+ * @param ClassWithFinalMethod $subject
+ */
+ function its_constructor_throws_MethodProphecyException_for_final_methods($objectProphecy, $subject)
+ {
+ $objectProphecy->reveal()->willReturn($subject);
+
+ $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->during(
+ '__construct', array($objectProphecy, 'finalMethod', null)
+ );
+ }
+
+ function its_constructor_transforms_array_passed_as_3rd_argument_to_ArgumentsWildcard(
+ $objectProphecy
+ )
+ {
+ $this->beConstructedWith($objectProphecy, 'getName', array(42, 33));
+
+ $wildcard = $this->getArgumentsWildcard();
+ $wildcard->shouldNotBe(null);
+ $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
+ }
+
+ function its_constructor_does_not_touch_third_argument_if_it_is_null($objectProphecy)
+ {
+ $this->beConstructedWith($objectProphecy, 'getName', null);
+
+ $wildcard = $this->getArgumentsWildcard();
+ $wildcard->shouldBe(null);
+ }
+
+ /**
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_records_promise_through_will_method($promise, $objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->will($promise);
+ $this->getPromise()->shouldReturn($promise);
+ }
+
+ /**
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_adds_itself_to_ObjectProphecy_during_call_to_will($objectProphecy, $promise)
+ {
+ $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
+
+ $this->will($promise);
+ }
+
+ function it_adds_ReturnPromise_during_willReturn_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willReturn(42);
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnPromise');
+ }
+
+ function it_adds_ThrowPromise_during_willThrow_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willThrow('RuntimeException');
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ThrowPromise');
+ }
+
+ function it_adds_ReturnArgumentPromise_during_willReturnArgument_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willReturnArgument();
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
+ }
+
+ function it_adds_ReturnArgumentPromise_during_willReturnArgument_call_with_index_argument($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willReturnArgument(1);
+ $promise = $this->getPromise();
+ $promise->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
+ $promise->execute(array('one', 'two'), $objectProphecy, $this)->shouldReturn('two');
+ }
+
+ function it_adds_CallbackPromise_during_will_call_with_callback_argument($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $callback = function () {};
+
+ $this->will($callback);
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\CallbackPromise');
+ }
+
+ /**
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ */
+ function it_records_prediction_through_should_method($prediction, $objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('should', array($prediction));
+ $this->getPrediction()->shouldReturn($prediction);
+ }
+
+ function it_adds_CallbackPrediction_during_should_call_with_callback_argument($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $callback = function () {};
+
+ $this->callOnWrappedObject('should', array($callback));
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallbackPrediction');
+ }
+
+ /**
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ */
+ function it_adds_itself_to_ObjectProphecy_during_call_to_should($objectProphecy, $prediction)
+ {
+ $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
+
+ $this->callOnWrappedObject('should', array($prediction));
+ }
+
+ function it_adds_CallPrediction_during_shouldBeCalled_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('shouldBeCalled', array());
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallPrediction');
+ }
+
+ function it_adds_NoCallsPrediction_during_shouldNotBeCalled_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('shouldNotBeCalled', array());
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\NoCallsPrediction');
+ }
+
+ function it_adds_CallTimesPrediction_during_shouldBeCalledTimes_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('shouldBeCalledTimes', array(5));
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallTimesPrediction');
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_checks_prediction_via_shouldHave_method_call(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_sets_return_promise_during_shouldHave_call_if_none_was_set_before(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+
+ $this->getPromise()->shouldReturnAnInstanceOf('Prophecy\Promise\ReturnPromise');
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_does_not_set_return_promise_during_shouldHave_call_if_it_was_set_before(
+ $objectProphecy, $arguments, $prediction, $call1, $call2, $promise
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->will($promise);
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+
+ $this->getPromise()->shouldReturn($promise);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction1
+ * @param \Prophecy\Prediction\PredictionInterface $prediction2
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_records_checked_predictions(
+ $objectProphecy, $arguments, $prediction1, $prediction2, $call1, $call2, $promise
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction1->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
+ $prediction2->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->will($promise);
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction1));
+ $this->callOnWrappedObject('shouldHave', array($prediction2));
+
+ $this->getCheckedPredictions()->shouldReturn(array($prediction1, $prediction2));
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_records_even_failed_checked_predictions(
+ $objectProphecy, $arguments, $prediction, $call1, $call2, $promise
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willThrow(new \RuntimeException());
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->will($promise);
+ $this->withArguments($arguments);
+
+ try {
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+ } catch (\Exception $e) {}
+
+ $this->getCheckedPredictions()->shouldReturn(array($prediction));
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_checks_prediction_via_shouldHave_method_call_with_callback(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $callback = function ($calls, $object, $method) {
+ throw new \RuntimeException;
+ };
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->withArguments($arguments);
+ $this->shouldThrow('RuntimeException')->duringShouldHave($callback);
+ }
+
+ function it_does_nothing_during_checkPrediction_if_no_prediction_set()
+ {
+ $this->checkPrediction()->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_checks_set_prediction_during_checkPrediction(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('should', array($prediction));
+ $this->checkPrediction();
+ }
+
+ function it_links_back_to_ObjectProphecy_through_getter($objectProphecy)
+ {
+ $this->getObjectProphecy()->shouldReturn($objectProphecy);
+ }
+
+ function it_has_MethodName()
+ {
+ $this->getMethodName()->shouldReturn('getName');
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ */
+ function it_contains_ArgumentsWildcard_it_was_constructed_with($objectProphecy, $wildcard)
+ {
+ $this->beConstructedWith($objectProphecy, 'getName', $wildcard);
+
+ $this->getArgumentsWildcard()->shouldReturn($wildcard);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ */
+ function its_ArgumentWildcard_is_mutable_through_setter($wildcard)
+ {
+ $this->withArguments($wildcard);
+
+ $this->getArgumentsWildcard()->shouldReturn($wildcard);
+ }
+
+ function its_withArguments_transforms_passed_array_into_ArgumentsWildcard()
+ {
+ $this->withArguments(array(42, 33));
+
+ $wildcard = $this->getArgumentsWildcard();
+ $wildcard->shouldNotBe(null);
+ $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
+ }
+
+ function its_withArguments_throws_exception_if_wrong_arguments_provided()
+ {
+ $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')->duringWithArguments(42);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
new file mode 100644
index 00000000..7e249d9b
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
@@ -0,0 +1,319 @@
+beConstructedWith($lazyDouble);
+
+ $lazyDouble->getInstance()->willReturn($double);
+ }
+
+ function it_implements_ProphecyInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Prophecy\ProphecyInterface');
+ }
+
+ function it_sets_parentClass_during_willExtend_call($lazyDouble)
+ {
+ $lazyDouble->setParentClass('123')->shouldBeCalled();
+
+ $this->willExtend('123');
+ }
+
+ function it_adds_interface_during_willImplement_call($lazyDouble)
+ {
+ $lazyDouble->addInterface('222')->shouldBeCalled();
+
+ $this->willImplement('222');
+ }
+
+ function it_sets_constructor_arguments_during_willBeConstructedWith_call($lazyDouble)
+ {
+ $lazyDouble->setArguments(array(1, 2, 5))->shouldBeCalled();
+
+ $this->willBeConstructedWith(array(1, 2, 5));
+ }
+
+ function it_does_not_have_method_prophecies_by_default()
+ {
+ $this->getMethodProphecies()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_should_get_method_prophecies_by_method_name($method1, $method2, $arguments)
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments);
+ $method2->getMethodName()->willReturn('setName');
+ $method2->getArgumentsWildcard()->willReturn($arguments);
+
+ $this->addMethodProphecy($method1);
+ $this->addMethodProphecy($method2);
+
+ $methods = $this->getMethodProphecies('setName');
+ $methods->shouldHaveCount(1);
+ $methods[0]->getMethodName()->shouldReturn('setName');
+ }
+
+ function it_should_return_empty_array_if_no_method_prophecies_found()
+ {
+ $methods = $this->getMethodProphecies('setName');
+ $methods->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Call\CallCenter $callCenter
+ */
+ function it_should_proxy_makeProphecyMethodCall_to_CallCenter($lazyDouble, $callCenter)
+ {
+ $this->beConstructedWith($lazyDouble, $callCenter);
+
+ $callCenter->makeCall($this->getWrappedObject(), 'setName', array('everzet'))->willReturn(42);
+
+ $this->makeProphecyMethodCall('setName', array('everzet'))->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Call\CallCenter $callCenter
+ * @param \Prophecy\Prophecy\RevealerInterface $revealer
+ */
+ function it_should_reveal_arguments_and_return_values_from_callCenter(
+ $lazyDouble, $callCenter, $revealer
+ )
+ {
+ $this->beConstructedWith($lazyDouble, $callCenter, $revealer);
+
+ $revealer->reveal(array('question'))->willReturn(array('life'));
+ $revealer->reveal('answer')->willReturn(42);
+
+ $callCenter->makeCall($this->getWrappedObject(), 'setName', array('life'))->willReturn('answer');
+
+ $this->makeProphecyMethodCall('setName', array('question'))->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Call\CallCenter $callCenter
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ * @param \Prophecy\Call\Call $call
+ */
+ function it_should_proxy_getProphecyMethodCalls_to_CallCenter(
+ $lazyDouble, $callCenter, $wildcard, $call
+ )
+ {
+ $this->beConstructedWith($lazyDouble, $callCenter);
+
+ $callCenter->findCalls('setName', $wildcard)->willReturn(array($call));
+
+ $this->findProphecyMethodCalls('setName', $wildcard)->shouldReturn(array($call));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard
+ */
+ function its_addMethodProphecy_adds_method_prophecy(
+ $methodProphecy, $argumentsWildcard
+ )
+ {
+ $methodProphecy->getArgumentsWildcard()->willReturn($argumentsWildcard);
+ $methodProphecy->getMethodName()->willReturn('getUsername');
+
+ $this->addMethodProphecy($methodProphecy);
+
+ $this->getMethodProphecies()->shouldReturn(array(
+ 'getUsername' => array($methodProphecy)
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
+ */
+ function its_addMethodProphecy_handles_prophecies_with_different_arguments(
+ $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
+ )
+ {
+ $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
+ $methodProphecy1->getMethodName()->willReturn('getUsername');
+
+ $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
+ $methodProphecy2->getMethodName()->willReturn('getUsername');
+
+ $this->addMethodProphecy($methodProphecy1);
+ $this->addMethodProphecy($methodProphecy2);
+
+ $this->getMethodProphecies()->shouldReturn(array(
+ 'getUsername' => array(
+ $methodProphecy1,
+ $methodProphecy2,
+ )
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
+ */
+ function its_addMethodProphecy_handles_prophecies_for_different_methods(
+ $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
+ )
+ {
+ $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
+ $methodProphecy1->getMethodName()->willReturn('getUsername');
+
+ $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
+ $methodProphecy2->getMethodName()->willReturn('isUsername');
+
+ $this->addMethodProphecy($methodProphecy1);
+ $this->addMethodProphecy($methodProphecy2);
+
+ $this->getMethodProphecies()->shouldReturn(array(
+ 'getUsername' => array(
+ $methodProphecy1
+ ),
+ 'isUsername' => array(
+ $methodProphecy2
+ )
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy
+ */
+ function its_addMethodProphecy_throws_exception_when_method_has_no_ArgumentsWildcard(
+ $methodProphecy
+ )
+ {
+ $methodProphecy->getArgumentsWildcard()->willReturn(null);
+ $methodProphecy->getObjectProphecy()->willReturn($this);
+ $methodProphecy->getMethodName()->willReturn('getTitle');
+
+ $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->duringAddMethodProphecy(
+ $methodProphecy
+ );
+ }
+
+ function it_returns_null_after_checkPredictions_call_if_there_is_no_method_prophecies()
+ {
+ $this->checkProphecyMethodsPredictions()->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
+ */
+ function it_throws_AggregateException_during_checkPredictions_if_predictions_fail(
+ $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
+ )
+ {
+ $methodProphecy1->getMethodName()->willReturn('getName');
+ $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
+ $methodProphecy1->checkPrediction()
+ ->willThrow('Prophecy\Exception\Prediction\AggregateException');
+
+ $methodProphecy2->getMethodName()->willReturn('setName');
+ $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
+ $methodProphecy2->checkPrediction()
+ ->willThrow('Prophecy\Exception\Prediction\AggregateException');
+
+ $this->addMethodProphecy($methodProphecy1);
+ $this->addMethodProphecy($methodProphecy2);
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
+ ->duringCheckProphecyMethodsPredictions();
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_new_MethodProphecy_instance_for_arbitrary_call($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $return = $this->getProphecy();
+ $return->shouldBeAnInstanceOf('Prophecy\Prophecy\MethodProphecy');
+ $return->getMethodName()->shouldReturn('getProphecy');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_same_MethodProphecy_for_same_registered_signature($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3));
+ $methodProphecy2 = $this->getProphecy(1, 2, 3);
+
+ $methodProphecy2->shouldBe($methodProphecy1);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_new_MethodProphecy_for_different_signatures($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $value = new ObjectProphecySpecFixtureB('ABC');
+ $value2 = new ObjectProphecySpecFixtureB('CBA');
+
+ $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3, $value));
+ $methodProphecy2 = $this->getProphecy(1, 2, 3, $value2);
+
+ $methodProphecy2->shouldNotBe($methodProphecy1);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_new_MethodProphecy_for_all_callback_signatures($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(function(){}));
+ $methodProphecy2 = $this->getProphecy(function(){});
+
+ $methodProphecy2->shouldNotBe($methodProphecy1);
+ }
+}
+
+class ObjectProphecySpecFixtureA
+{
+ public $errors;
+}
+
+class ObjectProphecySpecFixtureB extends ObjectProphecySpecFixtureA
+{
+ public $errors;
+ public $value = null;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
new file mode 100644
index 00000000..4d83d739
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
@@ -0,0 +1,51 @@
+shouldBeAnInstanceOf('Prophecy\Prophecy\RevealerInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecyInterface $prophecy
+ * @param \stdClass $object
+ */
+ function it_reveals_single_instance_of_ProphecyInterface($prophecy, $object)
+ {
+ $prophecy->reveal()->willReturn($object);
+
+ $this->reveal($prophecy)->shouldReturn($object);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecyInterface $prophecy1
+ * @param \Prophecy\Prophecy\ProphecyInterface $prophecy2
+ * @param \stdClass $object1
+ * @param \stdClass $object2
+ */
+ function it_reveals_instances_of_ProphecyInterface_inside_array(
+ $prophecy1, $prophecy2, $object1, $object2
+ )
+ {
+ $prophecy1->reveal()->willReturn($object1);
+ $prophecy2->reveal()->willReturn($object2);
+
+ $this->reveal(array(
+ array('item' => $prophecy2),
+ $prophecy1
+ ))->shouldReturn(array(
+ array('item' => $object2),
+ $object1
+ ));
+ }
+
+ function it_does_not_touch_non_prophecy_interface()
+ {
+ $this->reveal(42)->shouldReturn(42);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
new file mode 100644
index 00000000..74d5976a
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
@@ -0,0 +1,91 @@
+double(null, array())->willReturn($double);
+
+ $this->beConstructedWith($doubler);
+ }
+
+ function it_constructs_new_prophecy_on_prophesize_call()
+ {
+ $prophecy = $this->prophesize();
+ $prophecy->shouldBeAnInstanceOf('Prophecy\Prophecy\ObjectProphecy');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $newDouble
+ */
+ function it_constructs_new_prophecy_with_parent_class_if_specified($doubler, $newDouble)
+ {
+ $doubler->double(Argument::any(), array())->willReturn($newDouble);
+
+ $this->prophesize('Prophecy\Prophet')->reveal()->shouldReturn($newDouble);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $newDouble
+ */
+ function it_constructs_new_prophecy_with_interface_if_specified($doubler, $newDouble)
+ {
+ $doubler->double(null, Argument::any())->willReturn($newDouble);
+
+ $this->prophesize('ArrayAccess')->reveal()->shouldReturn($newDouble);
+ }
+
+ function it_exposes_all_created_prophecies_through_getter()
+ {
+ $prophecy1 = $this->prophesize();
+ $prophecy2 = $this->prophesize();
+
+ $this->getProphecies()->shouldReturn(array($prophecy1, $prophecy2));
+ }
+
+ function it_does_nothing_during_checkPredictions_call_if_no_predictions_defined()
+ {
+ $this->checkPredictions()->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments1
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments2
+ */
+ function it_throws_AggregateException_if_defined_predictions_fail(
+ $method1, $method2, $arguments1, $arguments2
+ )
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments1);
+ $method1->checkPrediction()->willReturn(null);
+
+ $method2->getMethodName()->willReturn('isSet');
+ $method2->getArgumentsWildcard()->willReturn($arguments2);
+ $method2->checkPrediction()->willThrow(
+ 'Prophecy\Exception\Prediction\AggregateException'
+ );
+
+ $this->prophesize()->addMethodProphecy($method1);
+ $this->prophesize()->addMethodProphecy($method2);
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
+ ->duringCheckPredictions();
+ }
+
+ function it_exposes_doubler_through_getter($doubler)
+ {
+ $this->getDoubler()->shouldReturn($doubler);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
new file mode 100644
index 00000000..a4eef59f
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
@@ -0,0 +1,97 @@
+stringify(42)->shouldReturn('42');
+ }
+
+ function it_generates_proper_string_representation_for_string()
+ {
+ $this->stringify('some string')->shouldReturn('"some string"');
+ }
+
+ function it_generates_single_line_representation_for_multiline_string()
+ {
+ $this->stringify("some\nstring")->shouldReturn('"some\\nstring"');
+ }
+
+ function it_generates_proper_string_representation_for_double()
+ {
+ $this->stringify(42.3)->shouldReturn('42.3');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_true()
+ {
+ $this->stringify(true)->shouldReturn('true');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_false()
+ {
+ $this->stringify(false)->shouldReturn('false');
+ }
+
+ function it_generates_proper_string_representation_for_null()
+ {
+ $this->stringify(null)->shouldReturn('null');
+ }
+
+ function it_generates_proper_string_representation_for_empty_array()
+ {
+ $this->stringify(array())->shouldReturn('[]');
+ }
+
+ function it_generates_proper_string_representation_for_array()
+ {
+ $this->stringify(array('zet', 42))->shouldReturn('["zet", 42]');
+ }
+
+ function it_generates_proper_string_representation_for_hash_containing_one_value()
+ {
+ $this->stringify(array('ever' => 'zet'))->shouldReturn('["ever" => "zet"]');
+ }
+
+ function it_generates_proper_string_representation_for_hash()
+ {
+ $this->stringify(array('ever' => 'zet', 52 => 'hey', 'num' => 42))->shouldReturn(
+ '["ever" => "zet", 52 => "hey", "num" => 42]'
+ );
+ }
+
+ function it_generates_proper_string_representation_for_resource()
+ {
+ $resource = fopen(__FILE__, 'r');
+ $this->stringify($resource)->shouldReturn('stream:'.$resource);
+ }
+
+ /**
+ * @param \stdClass $object
+ */
+ function it_generates_proper_string_representation_for_object($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ ) . " Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n)";
+
+ $this->stringify($object)->shouldReturn("$objHash");
+ }
+
+ /**
+ * @param stdClass $object
+ */
+ function it_generates_proper_string_representation_for_object_without_exporting($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ );
+
+ $this->stringify($object, false)->shouldReturn("$objHash");
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument.php
new file mode 100644
index 00000000..fde6aa90
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument.php
@@ -0,0 +1,212 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy;
+
+use Prophecy\Argument\Token;
+
+/**
+ * Argument tokens shortcuts.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Argument
+{
+ /**
+ * Checks that argument is exact value or object.
+ *
+ * @param mixed $value
+ *
+ * @return Token\ExactValueToken
+ */
+ public static function exact($value)
+ {
+ return new Token\ExactValueToken($value);
+ }
+
+ /**
+ * Checks that argument is of specific type or instance of specific class.
+ *
+ * @param string $type Type name (`integer`, `string`) or full class name
+ *
+ * @return Token\TypeToken
+ */
+ public static function type($type)
+ {
+ return new Token\TypeToken($type);
+ }
+
+ /**
+ * Checks that argument object has specific state.
+ *
+ * @param string $methodName
+ * @param mixed $value
+ *
+ * @return Token\ObjectStateToken
+ */
+ public static function which($methodName, $value)
+ {
+ return new Token\ObjectStateToken($methodName, $value);
+ }
+
+ /**
+ * Checks that argument matches provided callback.
+ *
+ * @param callable $callback
+ *
+ * @return Token\CallbackToken
+ */
+ public static function that($callback)
+ {
+ return new Token\CallbackToken($callback);
+ }
+
+ /**
+ * Matches any single value.
+ *
+ * @return Token\AnyValueToken
+ */
+ public static function any()
+ {
+ return new Token\AnyValueToken;
+ }
+
+ /**
+ * Matches all values to the rest of the signature.
+ *
+ * @return Token\AnyValuesToken
+ */
+ public static function cetera()
+ {
+ return new Token\AnyValuesToken;
+ }
+
+ /**
+ * Checks that argument matches all tokens
+ *
+ * @param mixed ... a list of tokens
+ *
+ * @return Token\LogicalAndToken
+ */
+ public static function allOf()
+ {
+ return new Token\LogicalAndToken(func_get_args());
+ }
+
+ /**
+ * Checks that argument array or countable object has exact number of elements.
+ *
+ * @param integer $value array elements count
+ *
+ * @return Token\ArrayCountToken
+ */
+ public static function size($value)
+ {
+ return new Token\ArrayCountToken($value);
+ }
+
+ /**
+ * Checks that argument array contains (key, value) pair
+ *
+ * @param mixed $key exact value or token
+ * @param mixed $value exact value or token
+ *
+ * @return Token\ArrayEntryToken
+ */
+ public static function withEntry($key, $value)
+ {
+ return new Token\ArrayEntryToken($key, $value);
+ }
+
+ /**
+ * Checks that arguments array entries all match value
+ *
+ * @param mixed $value
+ *
+ * @return Token\ArrayEveryEntryToken
+ */
+ public static function withEveryEntry($value)
+ {
+ return new Token\ArrayEveryEntryToken($value);
+ }
+
+ /**
+ * Checks that argument array contains value
+ *
+ * @param mixed $value
+ *
+ * @return Token\ArrayEntryToken
+ */
+ public static function containing($value)
+ {
+ return new Token\ArrayEntryToken(self::any(), $value);
+ }
+
+ /**
+ * Checks that argument array has key
+ *
+ * @param mixed $key exact value or token
+ *
+ * @return Token\ArrayEntryToken
+ */
+ public static function withKey($key)
+ {
+ return new Token\ArrayEntryToken($key, self::any());
+ }
+
+ /**
+ * Checks that argument does not match the value|token.
+ *
+ * @param mixed $value either exact value or argument token
+ *
+ * @return Token\LogicalNotToken
+ */
+ public static function not($value)
+ {
+ return new Token\LogicalNotToken($value);
+ }
+
+ /**
+ * @param string $value
+ *
+ * @return Token\StringContainsToken
+ */
+ public static function containingString($value)
+ {
+ return new Token\StringContainsToken($value);
+ }
+
+ /**
+ * Checks that argument is identical value.
+ *
+ * @param mixed $value
+ *
+ * @return Token\IdenticalValueToken
+ */
+ public static function is($value)
+ {
+ return new Token\IdenticalValueToken($value);
+ }
+
+ /**
+ * Check that argument is same value when rounding to the
+ * given precision.
+ *
+ * @param float $value
+ * @param float $precision
+ *
+ * @return Token\ApproximateValueToken
+ */
+ public static function approximate($value, $precision = 0)
+ {
+ return new Token\ApproximateValueToken($value, $precision);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
new file mode 100644
index 00000000..a088f21d
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
@@ -0,0 +1,101 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument;
+
+/**
+ * Arguments wildcarding.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ArgumentsWildcard
+{
+ /**
+ * @var Token\TokenInterface[]
+ */
+ private $tokens = array();
+ private $string;
+
+ /**
+ * Initializes wildcard.
+ *
+ * @param array $arguments Array of argument tokens or values
+ */
+ public function __construct(array $arguments)
+ {
+ foreach ($arguments as $argument) {
+ if (!$argument instanceof Token\TokenInterface) {
+ $argument = new Token\ExactValueToken($argument);
+ }
+
+ $this->tokens[] = $argument;
+ }
+ }
+
+ /**
+ * Calculates wildcard match score for provided arguments.
+ *
+ * @param array $arguments
+ *
+ * @return false|int False OR integer score (higher - better)
+ */
+ public function scoreArguments(array $arguments)
+ {
+ if (0 == count($arguments) && 0 == count($this->tokens)) {
+ return 1;
+ }
+
+ $arguments = array_values($arguments);
+ $totalScore = 0;
+ foreach ($this->tokens as $i => $token) {
+ $argument = isset($arguments[$i]) ? $arguments[$i] : null;
+ if (1 >= $score = $token->scoreArgument($argument)) {
+ return false;
+ }
+
+ $totalScore += $score;
+
+ if (true === $token->isLast()) {
+ return $totalScore;
+ }
+ }
+
+ if (count($arguments) > count($this->tokens)) {
+ return false;
+ }
+
+ return $totalScore;
+ }
+
+ /**
+ * Returns string representation for wildcard.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (null === $this->string) {
+ $this->string = implode(', ', array_map(function ($token) {
+ return (string) $token;
+ }, $this->tokens));
+ }
+
+ return $this->string;
+ }
+
+ /**
+ * @return array
+ */
+ public function getTokens()
+ {
+ return $this->tokens;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php
new file mode 100644
index 00000000..50988112
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php
@@ -0,0 +1,52 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Any single value token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class AnyValueToken implements TokenInterface
+{
+ /**
+ * Always scores 3 for any argument.
+ *
+ * @param $argument
+ *
+ * @return int
+ */
+ public function scoreArgument($argument)
+ {
+ return 3;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return '*';
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php
new file mode 100644
index 00000000..f76b17bc
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php
@@ -0,0 +1,52 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Any values token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class AnyValuesToken implements TokenInterface
+{
+ /**
+ * Always scores 2 for any argument.
+ *
+ * @param $argument
+ *
+ * @return int
+ */
+ public function scoreArgument($argument)
+ {
+ return 2;
+ }
+
+ /**
+ * Returns true to stop wildcard from processing other tokens.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return true;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return '* [, ...]';
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php
new file mode 100644
index 00000000..d4918b1a
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php
@@ -0,0 +1,55 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Approximate value token
+ *
+ * @author Daniel Leech
+ */
+class ApproximateValueToken implements TokenInterface
+{
+ private $value;
+ private $precision;
+
+ public function __construct($value, $precision = 0)
+ {
+ $this->value = $value;
+ $this->precision = $precision;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function scoreArgument($argument)
+ {
+ return round($argument, $this->precision) === round($this->value, $this->precision) ? 10 : false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('≅%s', round($this->value, $this->precision));
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php
new file mode 100644
index 00000000..96b4befd
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php
@@ -0,0 +1,86 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Array elements count token.
+ *
+ * @author Boris Mikhaylov
+ */
+
+class ArrayCountToken implements TokenInterface
+{
+ private $count;
+
+ /**
+ * @param integer $value
+ */
+ public function __construct($value)
+ {
+ $this->count = $value;
+ }
+
+ /**
+ * Scores 6 when argument has preset number of elements.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return boolean
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('count(%s)', $this->count);
+ }
+
+ /**
+ * Returns true if object is either array or instance of \Countable
+ *
+ * @param $argument
+ * @return bool
+ */
+ private function isCountable($argument)
+ {
+ return (is_array($argument) || $argument instanceof \Countable);
+ }
+
+ /**
+ * Returns true if $argument has expected number of elements
+ *
+ * @param array|\Countable $argument
+ *
+ * @return bool
+ */
+ private function hasProperCount($argument)
+ {
+ return $this->count === count($argument);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php
new file mode 100644
index 00000000..0305fc72
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php
@@ -0,0 +1,143 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Array entry token.
+ *
+ * @author Boris Mikhaylov
+ */
+class ArrayEntryToken implements TokenInterface
+{
+ /** @var \Prophecy\Argument\Token\TokenInterface */
+ private $key;
+ /** @var \Prophecy\Argument\Token\TokenInterface */
+ private $value;
+
+ /**
+ * @param mixed $key exact value or token
+ * @param mixed $value exact value or token
+ */
+ public function __construct($key, $value)
+ {
+ $this->key = $this->wrapIntoExactValueToken($key);
+ $this->value = $this->wrapIntoExactValueToken($value);
+ }
+
+ /**
+ * Scores half of combined scores from key and value tokens for same entry. Capped at 8.
+ * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken.
+ *
+ * @param array|\ArrayAccess|\Traversable $argument
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if ($argument instanceof \Traversable) {
+ $argument = iterator_to_array($argument);
+ }
+
+ if ($argument instanceof \ArrayAccess) {
+ $argument = $this->convertArrayAccessToEntry($argument);
+ }
+
+ if (!is_array($argument) || empty($argument)) {
+ return false;
+ }
+
+ $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument));
+ $valueScores = array_map(array($this->value,'scoreArgument'), $argument);
+ $scoreEntry = function ($value, $key) {
+ return $value && $key ? min(8, ($key + $value) / 2) : false;
+ };
+
+ return max(array_map($scoreEntry, $valueScores, $keyScores));
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return boolean
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('[..., %s => %s, ...]', $this->key, $this->value);
+ }
+
+ /**
+ * Returns key
+ *
+ * @return TokenInterface
+ */
+ public function getKey()
+ {
+ return $this->key;
+ }
+
+ /**
+ * Returns value
+ *
+ * @return TokenInterface
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Wraps non token $value into ExactValueToken
+ *
+ * @param $value
+ * @return TokenInterface
+ */
+ private function wrapIntoExactValueToken($value)
+ {
+ return $value instanceof TokenInterface ? $value : new ExactValueToken($value);
+ }
+
+ /**
+ * Converts instance of \ArrayAccess to key => value array entry
+ *
+ * @param \ArrayAccess $object
+ *
+ * @return array|null
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ private function convertArrayAccessToEntry(\ArrayAccess $object)
+ {
+ if (!$this->key instanceof ExactValueToken) {
+ throw new InvalidArgumentException(sprintf(
+ 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
+ 'But you used `%s`.',
+ $this->key
+ ));
+ }
+
+ $key = $this->key->getValue();
+
+ return $object->offsetExists($key) ? array($key => $object[$key]) : array();
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php
new file mode 100644
index 00000000..5d41fa48
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php
@@ -0,0 +1,82 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Array every entry token.
+ *
+ * @author Adrien Brault
+ */
+class ArrayEveryEntryToken implements TokenInterface
+{
+ /**
+ * @var TokenInterface
+ */
+ private $value;
+
+ /**
+ * @param mixed $value exact value or token
+ */
+ public function __construct($value)
+ {
+ if (!$value instanceof TokenInterface) {
+ $value = new ExactValueToken($value);
+ }
+
+ $this->value = $value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function scoreArgument($argument)
+ {
+ if (!$argument instanceof \Traversable && !is_array($argument)) {
+ return false;
+ }
+
+ $scores = array();
+ foreach ($argument as $key => $argumentEntry) {
+ $scores[] = $this->value->scoreArgument($argumentEntry);
+ }
+
+ if (empty($scores) || in_array(false, $scores, true)) {
+ return false;
+ }
+
+ return array_sum($scores) / count($scores);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __toString()
+ {
+ return sprintf('[%s, ..., %s]', $this->value, $this->value);
+ }
+
+ /**
+ * @return TokenInterface
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php
new file mode 100644
index 00000000..f45ba20b
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php
@@ -0,0 +1,75 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Callback-verified token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallbackToken implements TokenInterface
+{
+ private $callback;
+
+ /**
+ * Initializes token.
+ *
+ * @param callable $callback
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function __construct($callback)
+ {
+ if (!is_callable($callback)) {
+ throw new InvalidArgumentException(sprintf(
+ 'Callable expected as an argument to CallbackToken, but got %s.',
+ gettype($callback)
+ ));
+ }
+
+ $this->callback = $callback;
+ }
+
+ /**
+ * Scores 7 if callback returns true, false otherwise.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return call_user_func($this->callback, $argument) ? 7 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'callback()';
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
new file mode 100644
index 00000000..aa960f3f
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
@@ -0,0 +1,116 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use SebastianBergmann\Comparator\ComparisonFailure;
+use Prophecy\Comparator\Factory as ComparatorFactory;
+use Prophecy\Util\StringUtil;
+
+/**
+ * Exact value token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ExactValueToken implements TokenInterface
+{
+ private $value;
+ private $string;
+ private $util;
+ private $comparatorFactory;
+
+ /**
+ * Initializes token.
+ *
+ * @param mixed $value
+ * @param StringUtil $util
+ * @param ComparatorFactory $comparatorFactory
+ */
+ public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null)
+ {
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil();
+
+ $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
+ }
+
+ /**
+ * Scores 10 if argument matches preset value.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if (is_object($argument) && is_object($this->value)) {
+ $comparator = $this->comparatorFactory->getComparatorFor(
+ $argument, $this->value
+ );
+
+ try {
+ $comparator->assertEquals($argument, $this->value);
+ return 10;
+ } catch (ComparisonFailure $failure) {}
+ }
+
+ // If either one is an object it should be castable to a string
+ if (is_object($argument) xor is_object($this->value)) {
+ if (is_object($argument) && !method_exists($argument, '__toString')) {
+ return false;
+ }
+
+ if (is_object($this->value) && !method_exists($this->value, '__toString')) {
+ return false;
+ }
+ } elseif (is_numeric($argument) && is_numeric($this->value)) {
+ // noop
+ } elseif (gettype($argument) !== gettype($this->value)) {
+ return false;
+ }
+
+ return $argument == $this->value ? 10 : false;
+ }
+
+ /**
+ * Returns preset value against which token checks arguments.
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (null === $this->string) {
+ $this->string = sprintf('exact(%s)', $this->util->stringify($this->value));
+ }
+
+ return $this->string;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php
new file mode 100644
index 00000000..0b6d23ab
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php
@@ -0,0 +1,74 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Util\StringUtil;
+
+/**
+ * Identical value token.
+ *
+ * @author Florian Voutzinos
+ */
+class IdenticalValueToken implements TokenInterface
+{
+ private $value;
+ private $string;
+ private $util;
+
+ /**
+ * Initializes token.
+ *
+ * @param mixed $value
+ * @param StringUtil $util
+ */
+ public function __construct($value, StringUtil $util = null)
+ {
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil();
+ }
+
+ /**
+ * Scores 11 if argument matches preset value.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return $argument === $this->value ? 11 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (null === $this->string) {
+ $this->string = sprintf('identical(%s)', $this->util->stringify($this->value));
+ }
+
+ return $this->string;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php
new file mode 100644
index 00000000..4ee1b25e
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php
@@ -0,0 +1,80 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Logical AND token.
+ *
+ * @author Boris Mikhaylov
+ */
+class LogicalAndToken implements TokenInterface
+{
+ private $tokens = array();
+
+ /**
+ * @param array $arguments exact values or tokens
+ */
+ public function __construct(array $arguments)
+ {
+ foreach ($arguments as $argument) {
+ if (!$argument instanceof TokenInterface) {
+ $argument = new ExactValueToken($argument);
+ }
+ $this->tokens[] = $argument;
+ }
+ }
+
+ /**
+ * Scores maximum score from scores returned by tokens for this argument if all of them score.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if (0 === count($this->tokens)) {
+ return false;
+ }
+
+ $maxScore = 0;
+ foreach ($this->tokens as $token) {
+ $score = $token->scoreArgument($argument);
+ if (false === $score) {
+ return false;
+ }
+ $maxScore = max($score, $maxScore);
+ }
+
+ return $maxScore;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return boolean
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('bool(%s)', implode(' AND ', $this->tokens));
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php
new file mode 100644
index 00000000..623efa57
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php
@@ -0,0 +1,73 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Logical NOT token.
+ *
+ * @author Boris Mikhaylov
+ */
+class LogicalNotToken implements TokenInterface
+{
+ /** @var \Prophecy\Argument\Token\TokenInterface */
+ private $token;
+
+ /**
+ * @param mixed $value exact value or token
+ */
+ public function __construct($value)
+ {
+ $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value);
+ }
+
+ /**
+ * Scores 4 when preset token does not match the argument.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return false === $this->token->scoreArgument($argument) ? 4 : false;
+ }
+
+ /**
+ * Returns true if preset token is last.
+ *
+ * @return bool|int
+ */
+ public function isLast()
+ {
+ return $this->token->isLast();
+ }
+
+ /**
+ * Returns originating token.
+ *
+ * @return TokenInterface
+ */
+ public function getOriginatingToken()
+ {
+ return $this->token;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('not(%s)', $this->token);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
new file mode 100644
index 00000000..8d93bfd6
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
@@ -0,0 +1,104 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use SebastianBergmann\Comparator\ComparisonFailure;
+use Prophecy\Comparator\Factory as ComparatorFactory;
+use Prophecy\Util\StringUtil;
+
+/**
+ * Object state-checker token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ObjectStateToken implements TokenInterface
+{
+ private $name;
+ private $value;
+ private $util;
+ private $comparatorFactory;
+
+ /**
+ * Initializes token.
+ *
+ * @param string $methodName
+ * @param mixed $value Expected return value
+ * @param null|StringUtil $util
+ * @param ComparatorFactory $comparatorFactory
+ */
+ public function __construct(
+ $methodName,
+ $value,
+ StringUtil $util = null,
+ ComparatorFactory $comparatorFactory = null
+ ) {
+ $this->name = $methodName;
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil;
+
+ $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
+ }
+
+ /**
+ * Scores 8 if argument is an object, which method returns expected value.
+ *
+ * @param mixed $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if (is_object($argument) && method_exists($argument, $this->name)) {
+ $actual = call_user_func(array($argument, $this->name));
+
+ $comparator = $this->comparatorFactory->getComparatorFor(
+ $actual, $this->value
+ );
+
+ try {
+ $comparator->assertEquals($actual, $this->value);
+ return 8;
+ } catch (ComparisonFailure $failure) {
+ return false;
+ }
+ }
+
+ if (is_object($argument) && property_exists($argument, $this->name)) {
+ return $argument->{$this->name} === $this->value ? 8 : false;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('state(%s(), %s)',
+ $this->name,
+ $this->util->stringify($this->value)
+ );
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
new file mode 100644
index 00000000..24ff8c2e
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
@@ -0,0 +1,67 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * String contains token.
+ *
+ * @author Peter Mitchell
+ */
+class StringContainsToken implements TokenInterface
+{
+ private $value;
+
+ /**
+ * Initializes token.
+ *
+ * @param string $value
+ */
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ public function scoreArgument($argument)
+ {
+ return strpos($argument, $this->value) !== false ? 6 : false;
+ }
+
+ /**
+ * Returns preset value against which token checks arguments.
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('contains("%s")', $this->value);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php
new file mode 100644
index 00000000..625d3bad
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php
@@ -0,0 +1,43 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Argument token interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface TokenInterface
+{
+ /**
+ * Calculates token match score for provided argument.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument);
+
+ /**
+ * Returns true if this token prevents check of other tokens (is last one).
+ *
+ * @return bool|int
+ */
+ public function isLast();
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString();
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php
new file mode 100644
index 00000000..cb65132c
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php
@@ -0,0 +1,76 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Value type token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class TypeToken implements TokenInterface
+{
+ private $type;
+
+ /**
+ * @param string $type
+ */
+ public function __construct($type)
+ {
+ $checker = "is_{$type}";
+ if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) {
+ throw new InvalidArgumentException(sprintf(
+ 'Type or class name expected as an argument to TypeToken, but got %s.', $type
+ ));
+ }
+
+ $this->type = $type;
+ }
+
+ /**
+ * Scores 5 if argument has the same type this token was constructed with.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ $checker = "is_{$this->type}";
+ if (function_exists($checker)) {
+ return call_user_func($checker, $argument) ? 5 : false;
+ }
+
+ return $argument instanceof $this->type ? 5 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('type(%s)', $this->type);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
new file mode 100644
index 00000000..2f3fbadb
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
@@ -0,0 +1,127 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Call;
+
+use Exception;
+
+/**
+ * Call object.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Call
+{
+ private $methodName;
+ private $arguments;
+ private $returnValue;
+ private $exception;
+ private $file;
+ private $line;
+
+ /**
+ * Initializes call.
+ *
+ * @param string $methodName
+ * @param array $arguments
+ * @param mixed $returnValue
+ * @param Exception $exception
+ * @param null|string $file
+ * @param null|int $line
+ */
+ public function __construct($methodName, array $arguments, $returnValue,
+ Exception $exception = null, $file, $line)
+ {
+ $this->methodName = $methodName;
+ $this->arguments = $arguments;
+ $this->returnValue = $returnValue;
+ $this->exception = $exception;
+
+ if ($file) {
+ $this->file = $file;
+ $this->line = intval($line);
+ }
+ }
+
+ /**
+ * Returns called method name.
+ *
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * Returns called method arguments.
+ *
+ * @return array
+ */
+ public function getArguments()
+ {
+ return $this->arguments;
+ }
+
+ /**
+ * Returns called method return value.
+ *
+ * @return null|mixed
+ */
+ public function getReturnValue()
+ {
+ return $this->returnValue;
+ }
+
+ /**
+ * Returns exception that call thrown.
+ *
+ * @return null|Exception
+ */
+ public function getException()
+ {
+ return $this->exception;
+ }
+
+ /**
+ * Returns callee filename.
+ *
+ * @return string
+ */
+ public function getFile()
+ {
+ return $this->file;
+ }
+
+ /**
+ * Returns callee line number.
+ *
+ * @return int
+ */
+ public function getLine()
+ {
+ return $this->line;
+ }
+
+ /**
+ * Returns short notation for callee place.
+ *
+ * @return string
+ */
+ public function getCallPlace()
+ {
+ if (null === $this->file) {
+ return 'unknown';
+ }
+
+ return sprintf('%s:%d', $this->file, $this->line);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
new file mode 100644
index 00000000..a1f8c618
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
@@ -0,0 +1,162 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Call;
+
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Argument\ArgumentsWildcard;
+use Prophecy\Util\StringUtil;
+use Prophecy\Exception\Call\UnexpectedCallException;
+
+/**
+ * Calls receiver & manager.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallCenter
+{
+ private $util;
+
+ /**
+ * @var Call[]
+ */
+ private $recordedCalls = array();
+
+ /**
+ * Initializes call center.
+ *
+ * @param StringUtil $util
+ */
+ public function __construct(StringUtil $util = null)
+ {
+ $this->util = $util ?: new StringUtil;
+ }
+
+ /**
+ * Makes and records specific method call for object prophecy.
+ *
+ * @param ObjectProphecy $prophecy
+ * @param string $methodName
+ * @param array $arguments
+ *
+ * @return mixed Returns null if no promise for prophecy found or promise return value.
+ *
+ * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found
+ */
+ public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments)
+ {
+ // For efficiency exclude 'args' from the generated backtrace
+ if (PHP_VERSION_ID >= 50400) {
+ // Limit backtrace to last 3 calls as we don't use the rest
+ // Limit argument was introduced in PHP 5.4.0
+ $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
+ } elseif (defined('DEBUG_BACKTRACE_IGNORE_ARGS')) {
+ // DEBUG_BACKTRACE_IGNORE_ARGS was introduced in PHP 5.3.6
+ $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+ } else {
+ $backtrace = debug_backtrace();
+ }
+
+ $file = $line = null;
+ if (isset($backtrace[2]) && isset($backtrace[2]['file'])) {
+ $file = $backtrace[2]['file'];
+ $line = $backtrace[2]['line'];
+ }
+
+ // If no method prophecies defined, then it's a dummy, so we'll just return null
+ if ('__destruct' === $methodName || 0 == count($prophecy->getMethodProphecies())) {
+ $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line);
+
+ return null;
+ }
+
+ // There are method prophecies, so it's a fake/stub. Searching prophecy for this call
+ $matches = array();
+ foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) {
+ if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) {
+ $matches[] = array($score, $methodProphecy);
+ }
+ }
+
+ // If fake/stub doesn't have method prophecy for this call - throw exception
+ if (!count($matches)) {
+ throw $this->createUnexpectedCallException($prophecy, $methodName, $arguments);
+ }
+
+ // Sort matches by their score value
+ @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; });
+
+ // If Highest rated method prophecy has a promise - execute it or return null instead
+ $returnValue = null;
+ $exception = null;
+ if ($promise = $matches[0][1]->getPromise()) {
+ try {
+ $returnValue = $promise->execute($arguments, $prophecy, $matches[0][1]);
+ } catch (\Exception $e) {
+ $exception = $e;
+ }
+ }
+
+ $this->recordedCalls[] = new Call(
+ $methodName, $arguments, $returnValue, $exception, $file, $line
+ );
+
+ if (null !== $exception) {
+ throw $exception;
+ }
+
+ return $returnValue;
+ }
+
+ /**
+ * Searches for calls by method name & arguments wildcard.
+ *
+ * @param string $methodName
+ * @param ArgumentsWildcard $wildcard
+ *
+ * @return Call[]
+ */
+ public function findCalls($methodName, ArgumentsWildcard $wildcard)
+ {
+ return array_values(
+ array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) {
+ return $methodName === $call->getMethodName()
+ && 0 < $wildcard->scoreArguments($call->getArguments())
+ ;
+ })
+ );
+ }
+
+ private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName,
+ array $arguments)
+ {
+ $classname = get_class($prophecy->reveal());
+ $argstring = implode(', ', array_map(array($this->util, 'stringify'), $arguments));
+ $expected = implode("\n", array_map(function (MethodProphecy $methodProphecy) {
+ return sprintf(' - %s(%s)',
+ $methodProphecy->getMethodName(),
+ $methodProphecy->getArgumentsWildcard()
+ );
+ }, call_user_func_array('array_merge', $prophecy->getMethodProphecies())));
+
+ return new UnexpectedCallException(
+ sprintf(
+ "Method call:\n".
+ " - %s(%s)\n".
+ "on %s was not expected, expected calls were:\n%s",
+
+ $methodName, $argstring, $classname, $expected
+ ),
+ $prophecy, $methodName, $arguments
+ );
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php
new file mode 100644
index 00000000..874e474c
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php
@@ -0,0 +1,42 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Comparator;
+
+use SebastianBergmann\Comparator\Comparator;
+use SebastianBergmann\Comparator\ComparisonFailure;
+
+/**
+ * Closure comparator.
+ *
+ * @author Konstantin Kudryashov
+ */
+final class ClosureComparator extends Comparator
+{
+ public function accepts($expected, $actual)
+ {
+ return is_object($expected) && $expected instanceof \Closure
+ && is_object($actual) && $actual instanceof \Closure;
+ }
+
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
+ {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ // we don't need a diff
+ '',
+ '',
+ false,
+ 'all closures are born different'
+ );
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php
new file mode 100644
index 00000000..2070db14
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php
@@ -0,0 +1,47 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Comparator;
+
+use SebastianBergmann\Comparator\Factory as BaseFactory;
+
+/**
+ * Prophecy comparator factory.
+ *
+ * @author Konstantin Kudryashov
+ */
+final class Factory extends BaseFactory
+{
+ /**
+ * @var Factory
+ */
+ private static $instance;
+
+ public function __construct()
+ {
+ parent::__construct();
+
+ $this->register(new ClosureComparator());
+ $this->register(new ProphecyComparator());
+ }
+
+ /**
+ * @return Factory
+ */
+ public static function getInstance()
+ {
+ if (self::$instance === null) {
+ self::$instance = new Factory;
+ }
+
+ return self::$instance;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php
new file mode 100644
index 00000000..298a8e35
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php
@@ -0,0 +1,28 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Comparator;
+
+use Prophecy\Prophecy\ProphecyInterface;
+use SebastianBergmann\Comparator\ObjectComparator;
+
+class ProphecyComparator extends ObjectComparator
+{
+ public function accepts($expected, $actual)
+ {
+ return is_object($expected) && is_object($actual) && $actual instanceof ProphecyInterface;
+ }
+
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
+ {
+ parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed);
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
new file mode 100644
index 00000000..d6b6b1a9
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
@@ -0,0 +1,68 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler;
+
+use ReflectionClass;
+
+/**
+ * Cached class doubler.
+ * Prevents mirroring/creation of the same structure twice.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CachedDoubler extends Doubler
+{
+ private $classes = array();
+
+ /**
+ * {@inheritdoc}
+ */
+ public function registerClassPatch(ClassPatch\ClassPatchInterface $patch)
+ {
+ $this->classes[] = array();
+
+ parent::registerClassPatch($patch);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
+ {
+ $classId = $this->generateClassId($class, $interfaces);
+ if (isset($this->classes[$classId])) {
+ return $this->classes[$classId];
+ }
+
+ return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionClass[] $interfaces
+ *
+ * @return string
+ */
+ private function generateClassId(ReflectionClass $class = null, array $interfaces)
+ {
+ $parts = array();
+ if (null !== $class) {
+ $parts[] = $class->getName();
+ }
+ foreach ($interfaces as $interface) {
+ $parts[] = $interface->getName();
+ }
+ sort($parts);
+
+ return md5(implode('', $parts));
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php
new file mode 100644
index 00000000..d6d19685
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php
@@ -0,0 +1,48 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * Class patch interface.
+ * Class patches extend doubles functionality or help
+ * Prophecy to avoid some internal PHP bugs.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface ClassPatchInterface
+{
+ /**
+ * Checks if patch supports specific class node.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node);
+
+ /**
+ * Applies patch to the specific class node.
+ *
+ * @param ClassNode $node
+ * @return void
+ */
+ public function apply(ClassNode $node);
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority();
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
new file mode 100644
index 00000000..61998fc4
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
@@ -0,0 +1,72 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+
+/**
+ * Disable constructor.
+ * Makes all constructor arguments optional.
+ *
+ * @author Konstantin Kudryashov
+ */
+class DisableConstructorPatch implements ClassPatchInterface
+{
+ /**
+ * Checks if class has `__construct` method.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Makes all class constructor arguments optional.
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ if (!$node->hasMethod('__construct')) {
+ $node->addMethod(new MethodNode('__construct', ''));
+
+ return;
+ }
+
+ $constructor = $node->getMethod('__construct');
+ foreach ($constructor->getArguments() as $argument) {
+ $argument->setDefault(null);
+ }
+
+ $constructor->setCode(<<
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * Exception patch for HHVM to remove the stubs from special methods
+ *
+ * @author Christophe Coevoet
+ */
+class HhvmExceptionPatch implements ClassPatchInterface
+{
+ /**
+ * Supports exceptions on HHVM.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ if (!defined('HHVM_VERSION')) {
+ return false;
+ }
+
+ return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception');
+ }
+
+ /**
+ * Removes special exception static methods from the doubled methods.
+ *
+ * @param ClassNode $node
+ *
+ * @return void
+ */
+ public function apply(ClassNode $node)
+ {
+ if ($node->hasMethod('setTraceOptions')) {
+ $node->getMethod('setTraceOptions')->useParentCode();
+ }
+ if ($node->hasMethod('getTraceOptions')) {
+ $node->getMethod('getTraceOptions')->useParentCode();
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPriority()
+ {
+ return -50;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
new file mode 100644
index 00000000..b0d9793a
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
@@ -0,0 +1,135 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * Remove method functionality from the double which will clash with php keywords.
+ *
+ * @author Milan Magudia
+ */
+class KeywordPatch implements ClassPatchInterface
+{
+ /**
+ * Support any class
+ *
+ * @param ClassNode $node
+ *
+ * @return boolean
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Remove methods that clash with php keywords
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ $methodNames = array_keys($node->getMethods());
+ $methodsToRemove = array_intersect($methodNames, $this->getKeywords());
+ foreach ($methodsToRemove as $methodName) {
+ $node->removeMethod($methodName);
+ }
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority() {
+ return 49;
+ }
+
+ /**
+ * Returns array of php keywords.
+ *
+ * @return array
+ */
+ private function getKeywords() {
+
+ return array(
+ '__halt_compiler',
+ 'abstract',
+ 'and',
+ 'array',
+ 'as',
+ 'break',
+ 'callable',
+ 'case',
+ 'catch',
+ 'class',
+ 'clone',
+ 'const',
+ 'continue',
+ 'declare',
+ 'default',
+ 'die',
+ 'do',
+ 'echo',
+ 'else',
+ 'elseif',
+ 'empty',
+ 'enddeclare',
+ 'endfor',
+ 'endforeach',
+ 'endif',
+ 'endswitch',
+ 'endwhile',
+ 'eval',
+ 'exit',
+ 'extends',
+ 'final',
+ 'finally',
+ 'for',
+ 'foreach',
+ 'function',
+ 'global',
+ 'goto',
+ 'if',
+ 'implements',
+ 'include',
+ 'include_once',
+ 'instanceof',
+ 'insteadof',
+ 'interface',
+ 'isset',
+ 'list',
+ 'namespace',
+ 'new',
+ 'or',
+ 'print',
+ 'private',
+ 'protected',
+ 'public',
+ 'require',
+ 'require_once',
+ 'return',
+ 'static',
+ 'switch',
+ 'throw',
+ 'trait',
+ 'try',
+ 'unset',
+ 'use',
+ 'var',
+ 'while',
+ 'xor',
+ 'yield',
+ );
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
new file mode 100644
index 00000000..23891c09
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
@@ -0,0 +1,85 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever;
+use Prophecy\PhpDocumentor\MethodTagRetrieverInterface;
+
+/**
+ * Discover Magical API using "@method" PHPDoc format.
+ *
+ * @author Thomas Tourlourat
+ * @author Kévin Dunglas
+ * @author Théo FIDRY
+ */
+class MagicCallPatch implements ClassPatchInterface
+{
+ private $tagRetriever;
+
+ public function __construct(MethodTagRetrieverInterface $tagRetriever = null)
+ {
+ $this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever;
+ }
+
+ /**
+ * Support any class
+ *
+ * @param ClassNode $node
+ *
+ * @return boolean
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Discover Magical API
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ $parentClass = $node->getParentClass();
+ $reflectionClass = new \ReflectionClass($parentClass);
+
+ $tagList = $this->tagRetriever->getTagList($reflectionClass);
+
+ foreach($tagList as $tag) {
+ $methodName = $tag->getMethodName();
+
+ if (empty($methodName)) {
+ continue;
+ }
+
+ if (!$reflectionClass->hasMethod($methodName)) {
+ $methodNode = new MethodNode($methodName);
+ $methodNode->setStatic($tag->isStatic());
+
+ $node->addMethod($methodNode);
+ }
+ }
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return integer Priority number (higher - earlier)
+ */
+ public function getPriority()
+ {
+ return 50;
+ }
+}
+
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
new file mode 100644
index 00000000..ab0bb7c7
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
@@ -0,0 +1,98 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+use Prophecy\Doubler\Generator\Node\ArgumentNode;
+
+/**
+ * Add Prophecy functionality to the double.
+ * This is a core class patch for Prophecy.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ProphecySubjectPatch implements ClassPatchInterface
+{
+ /**
+ * Always returns true.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Apply Prophecy functionality to class node.
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface');
+ $node->addProperty('objectProphecy', 'private');
+
+ foreach ($node->getMethods() as $name => $method) {
+ if ('__construct' === strtolower($name)) {
+ continue;
+ }
+
+ $method->setCode(
+ 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'
+ );
+ }
+
+ $prophecySetter = new MethodNode('setProphecy');
+ $prophecyArgument = new ArgumentNode('prophecy');
+ $prophecyArgument->setTypeHint('Prophecy\Prophecy\ProphecyInterface');
+ $prophecySetter->addArgument($prophecyArgument);
+ $prophecySetter->setCode('$this->objectProphecy = $prophecy;');
+
+ $prophecyGetter = new MethodNode('getProphecy');
+ $prophecyGetter->setCode('return $this->objectProphecy;');
+
+ if ($node->hasMethod('__call')) {
+ $__call = $node->getMethod('__call');
+ } else {
+ $__call = new MethodNode('__call');
+ $__call->addArgument(new ArgumentNode('name'));
+ $__call->addArgument(new ArgumentNode('arguments'));
+
+ $node->addMethod($__call);
+ }
+
+ $__call->setCode(<<getProphecy(), func_get_arg(0)
+);
+PHP
+ );
+
+ $node->addMethod($prophecySetter);
+ $node->addMethod($prophecyGetter);
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority()
+ {
+ return 0;
+ }
+}
diff --git a/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php
new file mode 100644
index 00000000..9166aeef
--- /dev/null
+++ b/src/composer/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php
@@ -0,0 +1,57 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * ReflectionClass::newInstance patch.
+ * Makes first argument of newInstance optional, since it works but signature is misleading
+ *
+ * @author Florian Klein