├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── UPGRADE.md ├── composer.json ├── composer.lock └── src ├── SearchComponent.php ├── interfaces ├── CustomSearchInterface.php └── SearchInterface.php └── models └── SearchResult.php /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Search Component Change Log 2 | --------------------------- 3 | 4 | 2.0.0 February 10, 2018 5 | ----------------------- 6 | * Enh: Some improvements in SearchResult model (greeflas) 7 | * Chg #1: Changed minimum Yii version from `^2.0.0` to `^2.0.13` (greeflas, CodeIgniter00) 8 | * Chg: Removed unused dev packages `codeception/verify` and `codeception/specify` (greeflas) 9 | * Chg: Updated code style 10 | 11 | 1.1.0 October 19, 2017 12 | ---------------------- 13 | * Enh: Refactored code: improve code readability (greeflas) 14 | * Enh: Creates interface for custom search query (greeflas) 15 | * Enh: Improved unit tests (greeflas) 16 | * Fix: Use Inflector if label for model not specified (greeflas) 17 | 18 | 1.0.0 August 11, 2017 19 | --------------------- 20 | * Initial release (greeflas) 21 | 22 | Development started April 05, 2017 23 | ---------------------------------- 24 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing 2 | ============ 3 | 4 | We welcome any contributing! 5 | 6 | Pull requests 7 | ------------- 8 | 9 | You must follow the next rules to contribute to this project: 10 | 11 | - **Create feature branches** - You must create a new branch for a feature. We don't accept pull requests from master branch. 12 | 13 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. 14 | 15 | Tests 16 | ----- 17 | 18 | You can run tests with composer command 19 | 20 | ``` 21 | $ composer test 22 | ``` 23 | 24 | or using following command 25 | 26 | ``` 27 | $ codecept build && codecept run 28 | ``` 29 | 30 | Happy coding :) 31 | --------------- -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2017, Vladimir Kuprienko 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 |

Search in Active Record models for Yii2

6 |

7 | 8 | [![Build Status](https://travis-ci.org/Vintage-web-production/yii2-search.svg?branch=master)](https://travis-ci.org/Vintage-web-production/yii2-search) 9 | [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Vintage-web-production/yii2-search/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Vintage-web-production/yii2-search/?branch=master) 10 | [![Total Downloads](https://poser.pugx.org/vintage/yii2-search/downloads)](https://packagist.org/packages/vintage/yii2-search) 11 | [![Latest Stable Version](https://poser.pugx.org/vintage/yii2-search/v/stable)](CHANGELOG.md) 12 | [![Latest Unstable Version](https://poser.pugx.org/vintage/yii2-search/v/unstable)](CHANGELOG.md) 13 | 14 | This is component for searching in the Active Record models for Yii2 Framework. 15 | 16 | Documentation is at [docs/guide/README.md](docs/guide/README.md). 17 | 18 | Installation 19 | ------------ 20 | 21 | #### Install package 22 | 23 | The preferred way to install this extension is through [composer](http://getcomposer.org/download/). 24 | 25 | Either run 26 | 27 | ``` 28 | $ composer require vintage/yii2-search 29 | ``` 30 | 31 | or add 32 | 33 | ``` 34 | "vintage/yii2-search": "~2.0" 35 | ``` 36 | 37 | to the `require` section of your `composer.json`. 38 | 39 | Usage 40 | ----- 41 | 42 | Implement `\vintage\search\interfaces\SearchInterface` interface in Active Record models 43 | 44 | ```php 45 | /** 46 | * Article search model. 47 | * 48 | * @property integer $id 49 | * @property string $title 50 | * @property string $short_description 51 | * @property string $content 52 | */ 53 | class ArticleSearch extends ActiveRecord implements \vintage\search\interfaces\SearchInterface 54 | { 55 | /** 56 | * @inheritdoc 57 | */ 58 | public function getSearchTitle() 59 | { 60 | 61 | return $this->title; 62 | } 63 | 64 | /** 65 | * @inheritdoc 66 | */ 67 | public function getSearchDescription() 68 | { 69 | return $this->short_description; 70 | } 71 | 72 | /** 73 | * @inheritdoc 74 | */ 75 | public function getSearchUrl() 76 | { 77 | return Url::toRoute(['/news/default/index', 'id' => $this->id]); 78 | } 79 | 80 | /** 81 | * @inheritdoc 82 | */ 83 | public function getSearchFields() 84 | { 85 | return [ 86 | 'title', 87 | 'short_description', 88 | 'content', 89 | ]; 90 | } 91 | } 92 | ``` 93 | 94 | Call method of search component with a query 95 | 96 | ```php 97 | /* @var \vintage\search\models\SearchResult[] $result */ 98 | $result = Yii::$app->get('searcher')->search('some query here'); 99 | ``` 100 | 101 | this method returns array of `\vintage\search\models\SearchResult` objects. 102 | 103 | Tests 104 | ----- 105 | You can run tests with composer command 106 | 107 | ``` 108 | $ composer test 109 | ``` 110 | 111 | or using following command 112 | 113 | ``` 114 | $ codecept build && codecept run 115 | ``` 116 | 117 | Contributing 118 | ------------ 119 | For information about contributing please read [CONTRIBUTING.md](CONTRIBUTING.md). 120 | 121 | Licence 122 | ------- 123 | [![License](https://poser.pugx.org/vintage/yii2-search/license)](LICENSE) 124 | 125 | This project is released under the terms of the BSD-3-Clause [license](LICENSE). 126 | -------------------------------------------------------------------------------- /UPGRADE.md: -------------------------------------------------------------------------------- 1 | Upgrading Instructions 2 | ====================== 3 | 4 | This file contains the upgrade notes. These notes highlight changes that could break your 5 | application when you upgrade the package from one version to another. 6 | 7 | Upgrade from 1.x to 2.x 8 | ----------------------- 9 | 10 | * Changed minimum Yii version from `^2.0.0` to `^2.0.13` 11 | 12 | * Moved `vintage\search\data\SearchResult` class to `vintage\search\models\SearchResult` 13 | namespace 14 | 15 | * Removed unused dev packages codeception/verify and codeception/specify -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vintage/yii2-search", 3 | "description": "Search in Active Record models for Yii2", 4 | "keywords": ["yii2", "component", "search", "active record"], 5 | "type": "yii2-extension", 6 | "license": "BSD-3-Clause", 7 | "support": { 8 | "source": "https://github.com/Vintage-web-production/yii2-search", 9 | "issues": "https://github.com/Vintage-web-production/yii2-search/issues" 10 | }, 11 | "authors": [ 12 | { 13 | "name": "Vladimir Kuprienko", 14 | "email": "vldmr.kuprienko@gmail.com", 15 | "role": "Developer" 16 | } 17 | ], 18 | "repositories": [ 19 | { 20 | "type": "composer", 21 | "url": "https://asset-packagist.org" 22 | } 23 | ], 24 | "require": { 25 | "yiisoft/yii2": "^2.0.13" 26 | }, 27 | "require-dev": { 28 | "codeception/codeception": "~2.3" 29 | }, 30 | "autoload": { 31 | "psr-4": { 32 | "vintage\\search\\": "src/" 33 | } 34 | }, 35 | "autoload-dev": { 36 | "psr-4": { 37 | "vintage\\search\\tests\\": "tests/" 38 | } 39 | }, 40 | "extra": { 41 | "branch-alias": { 42 | "dev-master": "2.0.x-dev" 43 | } 44 | }, 45 | "scripts": { 46 | "test": [ 47 | "codecept build", 48 | "codecept run" 49 | ] 50 | } 51 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "23b3e0c34c0f9966ee23d4da4ae21d1e", 8 | "packages": [ 9 | { 10 | "name": "bower-asset/inputmask", 11 | "version": "3.3.11", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/RobinHerbots/Inputmask.git", 15 | "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/RobinHerbots/Inputmask/zipball/5e670ad62f50c738388d4dcec78d2888505ad77b", 20 | "reference": "5e670ad62f50c738388d4dcec78d2888505ad77b", 21 | "shasum": null 22 | }, 23 | "require": { 24 | "bower-asset/jquery": ">=1.7" 25 | }, 26 | "type": "bower-asset", 27 | "license": [ 28 | "http://opensource.org/licenses/mit-license.php" 29 | ] 30 | }, 31 | { 32 | "name": "bower-asset/jquery", 33 | "version": "3.2.1", 34 | "source": { 35 | "type": "git", 36 | "url": "https://github.com/jquery/jquery-dist.git", 37 | "reference": "77d2a51d0520d2ee44173afdf4e40a9201f5964e" 38 | }, 39 | "dist": { 40 | "type": "zip", 41 | "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/77d2a51d0520d2ee44173afdf4e40a9201f5964e", 42 | "reference": "77d2a51d0520d2ee44173afdf4e40a9201f5964e", 43 | "shasum": null 44 | }, 45 | "type": "bower-asset", 46 | "license": [ 47 | "MIT" 48 | ] 49 | }, 50 | { 51 | "name": "bower-asset/punycode", 52 | "version": "v1.3.2", 53 | "source": { 54 | "type": "git", 55 | "url": "https://github.com/bestiejs/punycode.js.git", 56 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" 57 | }, 58 | "dist": { 59 | "type": "zip", 60 | "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", 61 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", 62 | "shasum": null 63 | }, 64 | "type": "bower-asset" 65 | }, 66 | { 67 | "name": "bower-asset/yii2-pjax", 68 | "version": "2.0.7.1", 69 | "source": { 70 | "type": "git", 71 | "url": "git@github.com:yiisoft/jquery-pjax.git", 72 | "reference": "aef7b953107264f00234902a3880eb50dafc48be" 73 | }, 74 | "dist": { 75 | "type": "zip", 76 | "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/aef7b953107264f00234902a3880eb50dafc48be", 77 | "reference": "aef7b953107264f00234902a3880eb50dafc48be", 78 | "shasum": null 79 | }, 80 | "require": { 81 | "bower-asset/jquery": ">=1.8" 82 | }, 83 | "type": "bower-asset", 84 | "license": [ 85 | "MIT" 86 | ] 87 | }, 88 | { 89 | "name": "cebe/markdown", 90 | "version": "1.1.2", 91 | "source": { 92 | "type": "git", 93 | "url": "https://github.com/cebe/markdown.git", 94 | "reference": "25b28bae8a6f185b5030673af77b32e1163d5c6e" 95 | }, 96 | "dist": { 97 | "type": "zip", 98 | "url": "https://api.github.com/repos/cebe/markdown/zipball/25b28bae8a6f185b5030673af77b32e1163d5c6e", 99 | "reference": "25b28bae8a6f185b5030673af77b32e1163d5c6e", 100 | "shasum": "" 101 | }, 102 | "require": { 103 | "lib-pcre": "*", 104 | "php": ">=5.4.0" 105 | }, 106 | "require-dev": { 107 | "cebe/indent": "*", 108 | "facebook/xhprof": "*@dev", 109 | "phpunit/phpunit": "4.1.*" 110 | }, 111 | "bin": [ 112 | "bin/markdown" 113 | ], 114 | "type": "library", 115 | "extra": { 116 | "branch-alias": { 117 | "dev-master": "1.1.x-dev" 118 | } 119 | }, 120 | "autoload": { 121 | "psr-4": { 122 | "cebe\\markdown\\": "" 123 | } 124 | }, 125 | "notification-url": "https://packagist.org/downloads/", 126 | "license": [ 127 | "MIT" 128 | ], 129 | "authors": [ 130 | { 131 | "name": "Carsten Brandt", 132 | "email": "mail@cebe.cc", 133 | "homepage": "http://cebe.cc/", 134 | "role": "Creator" 135 | } 136 | ], 137 | "description": "A super fast, highly extensible markdown parser for PHP", 138 | "homepage": "https://github.com/cebe/markdown#readme", 139 | "keywords": [ 140 | "extensible", 141 | "fast", 142 | "gfm", 143 | "markdown", 144 | "markdown-extra" 145 | ], 146 | "time": "2017-07-16T21:13:23+00:00" 147 | }, 148 | { 149 | "name": "ezyang/htmlpurifier", 150 | "version": "v4.9.3", 151 | "source": { 152 | "type": "git", 153 | "url": "https://github.com/ezyang/htmlpurifier.git", 154 | "reference": "95e1bae3182efc0f3422896a3236e991049dac69" 155 | }, 156 | "dist": { 157 | "type": "zip", 158 | "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/95e1bae3182efc0f3422896a3236e991049dac69", 159 | "reference": "95e1bae3182efc0f3422896a3236e991049dac69", 160 | "shasum": "" 161 | }, 162 | "require": { 163 | "php": ">=5.2" 164 | }, 165 | "require-dev": { 166 | "simpletest/simpletest": "^1.1" 167 | }, 168 | "type": "library", 169 | "autoload": { 170 | "psr-0": { 171 | "HTMLPurifier": "library/" 172 | }, 173 | "files": [ 174 | "library/HTMLPurifier.composer.php" 175 | ] 176 | }, 177 | "notification-url": "https://packagist.org/downloads/", 178 | "license": [ 179 | "LGPL" 180 | ], 181 | "authors": [ 182 | { 183 | "name": "Edward Z. Yang", 184 | "email": "admin@htmlpurifier.org", 185 | "homepage": "http://ezyang.com" 186 | } 187 | ], 188 | "description": "Standards compliant HTML filter written in PHP", 189 | "homepage": "http://htmlpurifier.org/", 190 | "keywords": [ 191 | "html" 192 | ], 193 | "time": "2017-06-03T02:28:16+00:00" 194 | }, 195 | { 196 | "name": "yiisoft/yii2", 197 | "version": "2.0.13.1", 198 | "source": { 199 | "type": "git", 200 | "url": "https://github.com/yiisoft/yii2-framework.git", 201 | "reference": "7af96d8da5ea3e9a5dd05d0e734b21c5726a6ddf" 202 | }, 203 | "dist": { 204 | "type": "zip", 205 | "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/7af96d8da5ea3e9a5dd05d0e734b21c5726a6ddf", 206 | "reference": "7af96d8da5ea3e9a5dd05d0e734b21c5726a6ddf", 207 | "shasum": "" 208 | }, 209 | "require": { 210 | "bower-asset/inputmask": "~3.2.2 | ~3.3.5", 211 | "bower-asset/jquery": "3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", 212 | "bower-asset/punycode": "1.3.*", 213 | "bower-asset/yii2-pjax": "~2.0.1", 214 | "cebe/markdown": "~1.0.0 | ~1.1.0", 215 | "ext-ctype": "*", 216 | "ext-mbstring": "*", 217 | "ezyang/htmlpurifier": "~4.6", 218 | "lib-pcre": "*", 219 | "php": ">=5.4.0", 220 | "yiisoft/yii2-composer": "~2.0.4" 221 | }, 222 | "bin": [ 223 | "yii" 224 | ], 225 | "type": "library", 226 | "extra": { 227 | "branch-alias": { 228 | "dev-master": "2.0.x-dev" 229 | } 230 | }, 231 | "autoload": { 232 | "psr-4": { 233 | "yii\\": "" 234 | } 235 | }, 236 | "notification-url": "https://packagist.org/downloads/", 237 | "license": [ 238 | "BSD-3-Clause" 239 | ], 240 | "authors": [ 241 | { 242 | "name": "Qiang Xue", 243 | "email": "qiang.xue@gmail.com", 244 | "homepage": "http://www.yiiframework.com/", 245 | "role": "Founder and project lead" 246 | }, 247 | { 248 | "name": "Alexander Makarov", 249 | "email": "sam@rmcreative.ru", 250 | "homepage": "http://rmcreative.ru/", 251 | "role": "Core framework development" 252 | }, 253 | { 254 | "name": "Maurizio Domba", 255 | "homepage": "http://mdomba.info/", 256 | "role": "Core framework development" 257 | }, 258 | { 259 | "name": "Carsten Brandt", 260 | "email": "mail@cebe.cc", 261 | "homepage": "http://cebe.cc/", 262 | "role": "Core framework development" 263 | }, 264 | { 265 | "name": "Timur Ruziev", 266 | "email": "resurtm@gmail.com", 267 | "homepage": "http://resurtm.com/", 268 | "role": "Core framework development" 269 | }, 270 | { 271 | "name": "Paul Klimov", 272 | "email": "klimov.paul@gmail.com", 273 | "role": "Core framework development" 274 | }, 275 | { 276 | "name": "Dmitry Naumenko", 277 | "email": "d.naumenko.a@gmail.com", 278 | "role": "Core framework development" 279 | }, 280 | { 281 | "name": "Boudewijn Vahrmeijer", 282 | "email": "info@dynasource.eu", 283 | "homepage": "http://dynasource.eu", 284 | "role": "Core framework development" 285 | } 286 | ], 287 | "description": "Yii PHP Framework Version 2", 288 | "homepage": "http://www.yiiframework.com/", 289 | "keywords": [ 290 | "framework", 291 | "yii2" 292 | ], 293 | "time": "2017-11-14T11:08:21+00:00" 294 | }, 295 | { 296 | "name": "yiisoft/yii2-composer", 297 | "version": "2.0.5", 298 | "source": { 299 | "type": "git", 300 | "url": "https://github.com/yiisoft/yii2-composer.git", 301 | "reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2" 302 | }, 303 | "dist": { 304 | "type": "zip", 305 | "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", 306 | "reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", 307 | "shasum": "" 308 | }, 309 | "require": { 310 | "composer-plugin-api": "^1.0" 311 | }, 312 | "require-dev": { 313 | "composer/composer": "^1.0" 314 | }, 315 | "type": "composer-plugin", 316 | "extra": { 317 | "class": "yii\\composer\\Plugin", 318 | "branch-alias": { 319 | "dev-master": "2.0.x-dev" 320 | } 321 | }, 322 | "autoload": { 323 | "psr-4": { 324 | "yii\\composer\\": "" 325 | } 326 | }, 327 | "notification-url": "https://packagist.org/downloads/", 328 | "license": [ 329 | "BSD-3-Clause" 330 | ], 331 | "authors": [ 332 | { 333 | "name": "Qiang Xue", 334 | "email": "qiang.xue@gmail.com" 335 | } 336 | ], 337 | "description": "The composer plugin for Yii extension installer", 338 | "keywords": [ 339 | "composer", 340 | "extension installer", 341 | "yii2" 342 | ], 343 | "time": "2016-12-20T13:26:02+00:00" 344 | } 345 | ], 346 | "packages-dev": [ 347 | { 348 | "name": "behat/gherkin", 349 | "version": "v4.4.5", 350 | "source": { 351 | "type": "git", 352 | "url": "https://github.com/Behat/Gherkin.git", 353 | "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74" 354 | }, 355 | "dist": { 356 | "type": "zip", 357 | "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74", 358 | "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74", 359 | "shasum": "" 360 | }, 361 | "require": { 362 | "php": ">=5.3.1" 363 | }, 364 | "require-dev": { 365 | "phpunit/phpunit": "~4.5|~5", 366 | "symfony/phpunit-bridge": "~2.7|~3", 367 | "symfony/yaml": "~2.3|~3" 368 | }, 369 | "suggest": { 370 | "symfony/yaml": "If you want to parse features, represented in YAML files" 371 | }, 372 | "type": "library", 373 | "extra": { 374 | "branch-alias": { 375 | "dev-master": "4.4-dev" 376 | } 377 | }, 378 | "autoload": { 379 | "psr-0": { 380 | "Behat\\Gherkin": "src/" 381 | } 382 | }, 383 | "notification-url": "https://packagist.org/downloads/", 384 | "license": [ 385 | "MIT" 386 | ], 387 | "authors": [ 388 | { 389 | "name": "Konstantin Kudryashov", 390 | "email": "ever.zet@gmail.com", 391 | "homepage": "http://everzet.com" 392 | } 393 | ], 394 | "description": "Gherkin DSL parser for PHP 5.3", 395 | "homepage": "http://behat.org/", 396 | "keywords": [ 397 | "BDD", 398 | "Behat", 399 | "Cucumber", 400 | "DSL", 401 | "gherkin", 402 | "parser" 403 | ], 404 | "time": "2016-10-30T11:50:56+00:00" 405 | }, 406 | { 407 | "name": "codeception/codeception", 408 | "version": "2.3.8", 409 | "source": { 410 | "type": "git", 411 | "url": "https://github.com/Codeception/Codeception.git", 412 | "reference": "43eade17a8cd68e9cde401e8585b09d11d41b12d" 413 | }, 414 | "dist": { 415 | "type": "zip", 416 | "url": "https://api.github.com/repos/Codeception/Codeception/zipball/43eade17a8cd68e9cde401e8585b09d11d41b12d", 417 | "reference": "43eade17a8cd68e9cde401e8585b09d11d41b12d", 418 | "shasum": "" 419 | }, 420 | "require": { 421 | "behat/gherkin": "~4.4.0", 422 | "codeception/stub": "^1.0", 423 | "ext-json": "*", 424 | "ext-mbstring": "*", 425 | "facebook/webdriver": ">=1.1.3 <2.0", 426 | "guzzlehttp/guzzle": ">=4.1.4 <7.0", 427 | "guzzlehttp/psr7": "~1.0", 428 | "php": ">=5.4.0 <8.0", 429 | "phpunit/php-code-coverage": ">=2.2.4 <6.0", 430 | "phpunit/phpunit": ">=4.8.28 <5.0.0 || >=5.6.3 <7.0", 431 | "sebastian/comparator": ">1.1 <3.0", 432 | "sebastian/diff": ">=1.4 <3.0", 433 | "symfony/browser-kit": ">=2.7 <5.0", 434 | "symfony/console": ">=2.7 <5.0", 435 | "symfony/css-selector": ">=2.7 <5.0", 436 | "symfony/dom-crawler": ">=2.7 <5.0", 437 | "symfony/event-dispatcher": ">=2.7 <5.0", 438 | "symfony/finder": ">=2.7 <5.0", 439 | "symfony/yaml": ">=2.7 <5.0" 440 | }, 441 | "require-dev": { 442 | "codeception/specify": "~0.3", 443 | "facebook/graph-sdk": "~5.3", 444 | "flow/jsonpath": "~0.2", 445 | "monolog/monolog": "~1.8", 446 | "pda/pheanstalk": "~3.0", 447 | "php-amqplib/php-amqplib": "~2.4", 448 | "predis/predis": "^1.0", 449 | "squizlabs/php_codesniffer": "~2.0", 450 | "symfony/process": ">=2.7 <5.0", 451 | "vlucas/phpdotenv": "^2.4.0" 452 | }, 453 | "suggest": { 454 | "aws/aws-sdk-php": "For using AWS Auth in REST module and Queue module", 455 | "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests", 456 | "codeception/specify": "BDD-style code blocks", 457 | "codeception/verify": "BDD-style assertions", 458 | "flow/jsonpath": "For using JSONPath in REST module", 459 | "league/factory-muffin": "For DataFactory module", 460 | "league/factory-muffin-faker": "For Faker support in DataFactory module", 461 | "phpseclib/phpseclib": "for SFTP option in FTP Module", 462 | "stecman/symfony-console-completion": "For BASH autocompletion", 463 | "symfony/phpunit-bridge": "For phpunit-bridge support" 464 | }, 465 | "bin": [ 466 | "codecept" 467 | ], 468 | "type": "library", 469 | "extra": { 470 | "branch-alias": [] 471 | }, 472 | "autoload": { 473 | "psr-4": { 474 | "Codeception\\": "src\\Codeception", 475 | "Codeception\\Extension\\": "ext" 476 | } 477 | }, 478 | "notification-url": "https://packagist.org/downloads/", 479 | "license": [ 480 | "MIT" 481 | ], 482 | "authors": [ 483 | { 484 | "name": "Michael Bodnarchuk", 485 | "email": "davert@mail.ua", 486 | "homepage": "http://codegyre.com" 487 | } 488 | ], 489 | "description": "BDD-style testing framework", 490 | "homepage": "http://codeception.com/", 491 | "keywords": [ 492 | "BDD", 493 | "TDD", 494 | "acceptance testing", 495 | "functional testing", 496 | "unit testing" 497 | ], 498 | "time": "2018-01-27T22:47:33+00:00" 499 | }, 500 | { 501 | "name": "codeception/stub", 502 | "version": "1.0.1", 503 | "source": { 504 | "type": "git", 505 | "url": "https://github.com/Codeception/Stub.git", 506 | "reference": "673ea54cdd7141e0a5138ad78aaa60751912f573" 507 | }, 508 | "dist": { 509 | "type": "zip", 510 | "url": "https://api.github.com/repos/Codeception/Stub/zipball/673ea54cdd7141e0a5138ad78aaa60751912f573", 511 | "reference": "673ea54cdd7141e0a5138ad78aaa60751912f573", 512 | "shasum": "" 513 | }, 514 | "require": { 515 | "phpunit/phpunit-mock-objects": "^2.3|^3.0|^4.0|^5.0" 516 | }, 517 | "require-dev": { 518 | "phpunit/phpunit": "^4.8|^5.0|^6.0|^7.0" 519 | }, 520 | "type": "library", 521 | "autoload": { 522 | "psr-4": { 523 | "Codeception\\": "src/" 524 | } 525 | }, 526 | "notification-url": "https://packagist.org/downloads/", 527 | "license": [ 528 | "MIT" 529 | ], 530 | "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", 531 | "time": "2018-01-27T00:37:17+00:00" 532 | }, 533 | { 534 | "name": "doctrine/instantiator", 535 | "version": "1.1.0", 536 | "source": { 537 | "type": "git", 538 | "url": "https://github.com/doctrine/instantiator.git", 539 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 540 | }, 541 | "dist": { 542 | "type": "zip", 543 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 544 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 545 | "shasum": "" 546 | }, 547 | "require": { 548 | "php": "^7.1" 549 | }, 550 | "require-dev": { 551 | "athletic/athletic": "~0.1.8", 552 | "ext-pdo": "*", 553 | "ext-phar": "*", 554 | "phpunit/phpunit": "^6.2.3", 555 | "squizlabs/php_codesniffer": "^3.0.2" 556 | }, 557 | "type": "library", 558 | "extra": { 559 | "branch-alias": { 560 | "dev-master": "1.2.x-dev" 561 | } 562 | }, 563 | "autoload": { 564 | "psr-4": { 565 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 566 | } 567 | }, 568 | "notification-url": "https://packagist.org/downloads/", 569 | "license": [ 570 | "MIT" 571 | ], 572 | "authors": [ 573 | { 574 | "name": "Marco Pivetta", 575 | "email": "ocramius@gmail.com", 576 | "homepage": "http://ocramius.github.com/" 577 | } 578 | ], 579 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 580 | "homepage": "https://github.com/doctrine/instantiator", 581 | "keywords": [ 582 | "constructor", 583 | "instantiate" 584 | ], 585 | "time": "2017-07-22T11:58:36+00:00" 586 | }, 587 | { 588 | "name": "facebook/webdriver", 589 | "version": "1.5.0", 590 | "source": { 591 | "type": "git", 592 | "url": "https://github.com/facebook/php-webdriver.git", 593 | "reference": "86b5ca2f67173c9d34340845dd690149c886a605" 594 | }, 595 | "dist": { 596 | "type": "zip", 597 | "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/86b5ca2f67173c9d34340845dd690149c886a605", 598 | "reference": "86b5ca2f67173c9d34340845dd690149c886a605", 599 | "shasum": "" 600 | }, 601 | "require": { 602 | "ext-curl": "*", 603 | "ext-zip": "*", 604 | "php": "^5.6 || ~7.0", 605 | "symfony/process": "^2.8 || ^3.1 || ^4.0" 606 | }, 607 | "require-dev": { 608 | "friendsofphp/php-cs-fixer": "^2.0", 609 | "guzzle/guzzle": "^3.4.1", 610 | "php-coveralls/php-coveralls": "^1.0.2", 611 | "php-mock/php-mock-phpunit": "^1.1", 612 | "phpunit/phpunit": "^5.7", 613 | "sebastian/environment": "^1.3.4 || ^2.0 || ^3.0", 614 | "squizlabs/php_codesniffer": "^2.6", 615 | "symfony/var-dumper": "^3.3 || ^4.0" 616 | }, 617 | "type": "library", 618 | "extra": { 619 | "branch-alias": { 620 | "dev-community": "1.5-dev" 621 | } 622 | }, 623 | "autoload": { 624 | "psr-4": { 625 | "Facebook\\WebDriver\\": "lib/" 626 | } 627 | }, 628 | "notification-url": "https://packagist.org/downloads/", 629 | "license": [ 630 | "Apache-2.0" 631 | ], 632 | "description": "A PHP client for Selenium WebDriver", 633 | "homepage": "https://github.com/facebook/php-webdriver", 634 | "keywords": [ 635 | "facebook", 636 | "php", 637 | "selenium", 638 | "webdriver" 639 | ], 640 | "time": "2017-11-15T11:08:09+00:00" 641 | }, 642 | { 643 | "name": "guzzlehttp/guzzle", 644 | "version": "6.3.0", 645 | "source": { 646 | "type": "git", 647 | "url": "https://github.com/guzzle/guzzle.git", 648 | "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" 649 | }, 650 | "dist": { 651 | "type": "zip", 652 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", 653 | "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", 654 | "shasum": "" 655 | }, 656 | "require": { 657 | "guzzlehttp/promises": "^1.0", 658 | "guzzlehttp/psr7": "^1.4", 659 | "php": ">=5.5" 660 | }, 661 | "require-dev": { 662 | "ext-curl": "*", 663 | "phpunit/phpunit": "^4.0 || ^5.0", 664 | "psr/log": "^1.0" 665 | }, 666 | "suggest": { 667 | "psr/log": "Required for using the Log middleware" 668 | }, 669 | "type": "library", 670 | "extra": { 671 | "branch-alias": { 672 | "dev-master": "6.2-dev" 673 | } 674 | }, 675 | "autoload": { 676 | "files": [ 677 | "src/functions_include.php" 678 | ], 679 | "psr-4": { 680 | "GuzzleHttp\\": "src/" 681 | } 682 | }, 683 | "notification-url": "https://packagist.org/downloads/", 684 | "license": [ 685 | "MIT" 686 | ], 687 | "authors": [ 688 | { 689 | "name": "Michael Dowling", 690 | "email": "mtdowling@gmail.com", 691 | "homepage": "https://github.com/mtdowling" 692 | } 693 | ], 694 | "description": "Guzzle is a PHP HTTP client library", 695 | "homepage": "http://guzzlephp.org/", 696 | "keywords": [ 697 | "client", 698 | "curl", 699 | "framework", 700 | "http", 701 | "http client", 702 | "rest", 703 | "web service" 704 | ], 705 | "time": "2017-06-22T18:50:49+00:00" 706 | }, 707 | { 708 | "name": "guzzlehttp/promises", 709 | "version": "v1.3.1", 710 | "source": { 711 | "type": "git", 712 | "url": "https://github.com/guzzle/promises.git", 713 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 714 | }, 715 | "dist": { 716 | "type": "zip", 717 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 718 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 719 | "shasum": "" 720 | }, 721 | "require": { 722 | "php": ">=5.5.0" 723 | }, 724 | "require-dev": { 725 | "phpunit/phpunit": "^4.0" 726 | }, 727 | "type": "library", 728 | "extra": { 729 | "branch-alias": { 730 | "dev-master": "1.4-dev" 731 | } 732 | }, 733 | "autoload": { 734 | "psr-4": { 735 | "GuzzleHttp\\Promise\\": "src/" 736 | }, 737 | "files": [ 738 | "src/functions_include.php" 739 | ] 740 | }, 741 | "notification-url": "https://packagist.org/downloads/", 742 | "license": [ 743 | "MIT" 744 | ], 745 | "authors": [ 746 | { 747 | "name": "Michael Dowling", 748 | "email": "mtdowling@gmail.com", 749 | "homepage": "https://github.com/mtdowling" 750 | } 751 | ], 752 | "description": "Guzzle promises library", 753 | "keywords": [ 754 | "promise" 755 | ], 756 | "time": "2016-12-20T10:07:11+00:00" 757 | }, 758 | { 759 | "name": "guzzlehttp/psr7", 760 | "version": "1.4.2", 761 | "source": { 762 | "type": "git", 763 | "url": "https://github.com/guzzle/psr7.git", 764 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" 765 | }, 766 | "dist": { 767 | "type": "zip", 768 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 769 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 770 | "shasum": "" 771 | }, 772 | "require": { 773 | "php": ">=5.4.0", 774 | "psr/http-message": "~1.0" 775 | }, 776 | "provide": { 777 | "psr/http-message-implementation": "1.0" 778 | }, 779 | "require-dev": { 780 | "phpunit/phpunit": "~4.0" 781 | }, 782 | "type": "library", 783 | "extra": { 784 | "branch-alias": { 785 | "dev-master": "1.4-dev" 786 | } 787 | }, 788 | "autoload": { 789 | "psr-4": { 790 | "GuzzleHttp\\Psr7\\": "src/" 791 | }, 792 | "files": [ 793 | "src/functions_include.php" 794 | ] 795 | }, 796 | "notification-url": "https://packagist.org/downloads/", 797 | "license": [ 798 | "MIT" 799 | ], 800 | "authors": [ 801 | { 802 | "name": "Michael Dowling", 803 | "email": "mtdowling@gmail.com", 804 | "homepage": "https://github.com/mtdowling" 805 | }, 806 | { 807 | "name": "Tobias Schultze", 808 | "homepage": "https://github.com/Tobion" 809 | } 810 | ], 811 | "description": "PSR-7 message implementation that also provides common utility methods", 812 | "keywords": [ 813 | "http", 814 | "message", 815 | "request", 816 | "response", 817 | "stream", 818 | "uri", 819 | "url" 820 | ], 821 | "time": "2017-03-20T17:10:46+00:00" 822 | }, 823 | { 824 | "name": "myclabs/deep-copy", 825 | "version": "1.7.0", 826 | "source": { 827 | "type": "git", 828 | "url": "https://github.com/myclabs/DeepCopy.git", 829 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" 830 | }, 831 | "dist": { 832 | "type": "zip", 833 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 834 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 835 | "shasum": "" 836 | }, 837 | "require": { 838 | "php": "^5.6 || ^7.0" 839 | }, 840 | "require-dev": { 841 | "doctrine/collections": "^1.0", 842 | "doctrine/common": "^2.6", 843 | "phpunit/phpunit": "^4.1" 844 | }, 845 | "type": "library", 846 | "autoload": { 847 | "psr-4": { 848 | "DeepCopy\\": "src/DeepCopy/" 849 | }, 850 | "files": [ 851 | "src/DeepCopy/deep_copy.php" 852 | ] 853 | }, 854 | "notification-url": "https://packagist.org/downloads/", 855 | "license": [ 856 | "MIT" 857 | ], 858 | "description": "Create deep copies (clones) of your objects", 859 | "keywords": [ 860 | "clone", 861 | "copy", 862 | "duplicate", 863 | "object", 864 | "object graph" 865 | ], 866 | "time": "2017-10-19T19:58:43+00:00" 867 | }, 868 | { 869 | "name": "phar-io/manifest", 870 | "version": "1.0.1", 871 | "source": { 872 | "type": "git", 873 | "url": "https://github.com/phar-io/manifest.git", 874 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" 875 | }, 876 | "dist": { 877 | "type": "zip", 878 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", 879 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", 880 | "shasum": "" 881 | }, 882 | "require": { 883 | "ext-dom": "*", 884 | "ext-phar": "*", 885 | "phar-io/version": "^1.0.1", 886 | "php": "^5.6 || ^7.0" 887 | }, 888 | "type": "library", 889 | "extra": { 890 | "branch-alias": { 891 | "dev-master": "1.0.x-dev" 892 | } 893 | }, 894 | "autoload": { 895 | "classmap": [ 896 | "src/" 897 | ] 898 | }, 899 | "notification-url": "https://packagist.org/downloads/", 900 | "license": [ 901 | "BSD-3-Clause" 902 | ], 903 | "authors": [ 904 | { 905 | "name": "Arne Blankerts", 906 | "email": "arne@blankerts.de", 907 | "role": "Developer" 908 | }, 909 | { 910 | "name": "Sebastian Heuer", 911 | "email": "sebastian@phpeople.de", 912 | "role": "Developer" 913 | }, 914 | { 915 | "name": "Sebastian Bergmann", 916 | "email": "sebastian@phpunit.de", 917 | "role": "Developer" 918 | } 919 | ], 920 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 921 | "time": "2017-03-05T18:14:27+00:00" 922 | }, 923 | { 924 | "name": "phar-io/version", 925 | "version": "1.0.1", 926 | "source": { 927 | "type": "git", 928 | "url": "https://github.com/phar-io/version.git", 929 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" 930 | }, 931 | "dist": { 932 | "type": "zip", 933 | "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", 934 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", 935 | "shasum": "" 936 | }, 937 | "require": { 938 | "php": "^5.6 || ^7.0" 939 | }, 940 | "type": "library", 941 | "autoload": { 942 | "classmap": [ 943 | "src/" 944 | ] 945 | }, 946 | "notification-url": "https://packagist.org/downloads/", 947 | "license": [ 948 | "BSD-3-Clause" 949 | ], 950 | "authors": [ 951 | { 952 | "name": "Arne Blankerts", 953 | "email": "arne@blankerts.de", 954 | "role": "Developer" 955 | }, 956 | { 957 | "name": "Sebastian Heuer", 958 | "email": "sebastian@phpeople.de", 959 | "role": "Developer" 960 | }, 961 | { 962 | "name": "Sebastian Bergmann", 963 | "email": "sebastian@phpunit.de", 964 | "role": "Developer" 965 | } 966 | ], 967 | "description": "Library for handling version information and constraints", 968 | "time": "2017-03-05T17:38:23+00:00" 969 | }, 970 | { 971 | "name": "phpdocumentor/reflection-common", 972 | "version": "1.0.1", 973 | "source": { 974 | "type": "git", 975 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 976 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 977 | }, 978 | "dist": { 979 | "type": "zip", 980 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 981 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 982 | "shasum": "" 983 | }, 984 | "require": { 985 | "php": ">=5.5" 986 | }, 987 | "require-dev": { 988 | "phpunit/phpunit": "^4.6" 989 | }, 990 | "type": "library", 991 | "extra": { 992 | "branch-alias": { 993 | "dev-master": "1.0.x-dev" 994 | } 995 | }, 996 | "autoload": { 997 | "psr-4": { 998 | "phpDocumentor\\Reflection\\": [ 999 | "src" 1000 | ] 1001 | } 1002 | }, 1003 | "notification-url": "https://packagist.org/downloads/", 1004 | "license": [ 1005 | "MIT" 1006 | ], 1007 | "authors": [ 1008 | { 1009 | "name": "Jaap van Otterdijk", 1010 | "email": "opensource@ijaap.nl" 1011 | } 1012 | ], 1013 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1014 | "homepage": "http://www.phpdoc.org", 1015 | "keywords": [ 1016 | "FQSEN", 1017 | "phpDocumentor", 1018 | "phpdoc", 1019 | "reflection", 1020 | "static analysis" 1021 | ], 1022 | "time": "2017-09-11T18:02:19+00:00" 1023 | }, 1024 | { 1025 | "name": "phpdocumentor/reflection-docblock", 1026 | "version": "4.3.0", 1027 | "source": { 1028 | "type": "git", 1029 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1030 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08" 1031 | }, 1032 | "dist": { 1033 | "type": "zip", 1034 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", 1035 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08", 1036 | "shasum": "" 1037 | }, 1038 | "require": { 1039 | "php": "^7.0", 1040 | "phpdocumentor/reflection-common": "^1.0.0", 1041 | "phpdocumentor/type-resolver": "^0.4.0", 1042 | "webmozart/assert": "^1.0" 1043 | }, 1044 | "require-dev": { 1045 | "doctrine/instantiator": "~1.0.5", 1046 | "mockery/mockery": "^1.0", 1047 | "phpunit/phpunit": "^6.4" 1048 | }, 1049 | "type": "library", 1050 | "extra": { 1051 | "branch-alias": { 1052 | "dev-master": "4.x-dev" 1053 | } 1054 | }, 1055 | "autoload": { 1056 | "psr-4": { 1057 | "phpDocumentor\\Reflection\\": [ 1058 | "src/" 1059 | ] 1060 | } 1061 | }, 1062 | "notification-url": "https://packagist.org/downloads/", 1063 | "license": [ 1064 | "MIT" 1065 | ], 1066 | "authors": [ 1067 | { 1068 | "name": "Mike van Riel", 1069 | "email": "me@mikevanriel.com" 1070 | } 1071 | ], 1072 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1073 | "time": "2017-11-30T07:14:17+00:00" 1074 | }, 1075 | { 1076 | "name": "phpdocumentor/type-resolver", 1077 | "version": "0.4.0", 1078 | "source": { 1079 | "type": "git", 1080 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1081 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 1082 | }, 1083 | "dist": { 1084 | "type": "zip", 1085 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 1086 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 1087 | "shasum": "" 1088 | }, 1089 | "require": { 1090 | "php": "^5.5 || ^7.0", 1091 | "phpdocumentor/reflection-common": "^1.0" 1092 | }, 1093 | "require-dev": { 1094 | "mockery/mockery": "^0.9.4", 1095 | "phpunit/phpunit": "^5.2||^4.8.24" 1096 | }, 1097 | "type": "library", 1098 | "extra": { 1099 | "branch-alias": { 1100 | "dev-master": "1.0.x-dev" 1101 | } 1102 | }, 1103 | "autoload": { 1104 | "psr-4": { 1105 | "phpDocumentor\\Reflection\\": [ 1106 | "src/" 1107 | ] 1108 | } 1109 | }, 1110 | "notification-url": "https://packagist.org/downloads/", 1111 | "license": [ 1112 | "MIT" 1113 | ], 1114 | "authors": [ 1115 | { 1116 | "name": "Mike van Riel", 1117 | "email": "me@mikevanriel.com" 1118 | } 1119 | ], 1120 | "time": "2017-07-14T14:27:02+00:00" 1121 | }, 1122 | { 1123 | "name": "phpspec/prophecy", 1124 | "version": "1.7.3", 1125 | "source": { 1126 | "type": "git", 1127 | "url": "https://github.com/phpspec/prophecy.git", 1128 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf" 1129 | }, 1130 | "dist": { 1131 | "type": "zip", 1132 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", 1133 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", 1134 | "shasum": "" 1135 | }, 1136 | "require": { 1137 | "doctrine/instantiator": "^1.0.2", 1138 | "php": "^5.3|^7.0", 1139 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 1140 | "sebastian/comparator": "^1.1|^2.0", 1141 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 1142 | }, 1143 | "require-dev": { 1144 | "phpspec/phpspec": "^2.5|^3.2", 1145 | "phpunit/phpunit": "^4.8.35 || ^5.7" 1146 | }, 1147 | "type": "library", 1148 | "extra": { 1149 | "branch-alias": { 1150 | "dev-master": "1.7.x-dev" 1151 | } 1152 | }, 1153 | "autoload": { 1154 | "psr-0": { 1155 | "Prophecy\\": "src/" 1156 | } 1157 | }, 1158 | "notification-url": "https://packagist.org/downloads/", 1159 | "license": [ 1160 | "MIT" 1161 | ], 1162 | "authors": [ 1163 | { 1164 | "name": "Konstantin Kudryashov", 1165 | "email": "ever.zet@gmail.com", 1166 | "homepage": "http://everzet.com" 1167 | }, 1168 | { 1169 | "name": "Marcello Duarte", 1170 | "email": "marcello.duarte@gmail.com" 1171 | } 1172 | ], 1173 | "description": "Highly opinionated mocking framework for PHP 5.3+", 1174 | "homepage": "https://github.com/phpspec/prophecy", 1175 | "keywords": [ 1176 | "Double", 1177 | "Dummy", 1178 | "fake", 1179 | "mock", 1180 | "spy", 1181 | "stub" 1182 | ], 1183 | "time": "2017-11-24T13:59:53+00:00" 1184 | }, 1185 | { 1186 | "name": "phpunit/php-code-coverage", 1187 | "version": "5.3.0", 1188 | "source": { 1189 | "type": "git", 1190 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1191 | "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1" 1192 | }, 1193 | "dist": { 1194 | "type": "zip", 1195 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/661f34d0bd3f1a7225ef491a70a020ad23a057a1", 1196 | "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1", 1197 | "shasum": "" 1198 | }, 1199 | "require": { 1200 | "ext-dom": "*", 1201 | "ext-xmlwriter": "*", 1202 | "php": "^7.0", 1203 | "phpunit/php-file-iterator": "^1.4.2", 1204 | "phpunit/php-text-template": "^1.2.1", 1205 | "phpunit/php-token-stream": "^2.0.1", 1206 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 1207 | "sebastian/environment": "^3.0", 1208 | "sebastian/version": "^2.0.1", 1209 | "theseer/tokenizer": "^1.1" 1210 | }, 1211 | "require-dev": { 1212 | "phpunit/phpunit": "^6.0" 1213 | }, 1214 | "suggest": { 1215 | "ext-xdebug": "^2.5.5" 1216 | }, 1217 | "type": "library", 1218 | "extra": { 1219 | "branch-alias": { 1220 | "dev-master": "5.3.x-dev" 1221 | } 1222 | }, 1223 | "autoload": { 1224 | "classmap": [ 1225 | "src/" 1226 | ] 1227 | }, 1228 | "notification-url": "https://packagist.org/downloads/", 1229 | "license": [ 1230 | "BSD-3-Clause" 1231 | ], 1232 | "authors": [ 1233 | { 1234 | "name": "Sebastian Bergmann", 1235 | "email": "sebastian@phpunit.de", 1236 | "role": "lead" 1237 | } 1238 | ], 1239 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1240 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1241 | "keywords": [ 1242 | "coverage", 1243 | "testing", 1244 | "xunit" 1245 | ], 1246 | "time": "2017-12-06T09:29:45+00:00" 1247 | }, 1248 | { 1249 | "name": "phpunit/php-file-iterator", 1250 | "version": "1.4.5", 1251 | "source": { 1252 | "type": "git", 1253 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1254 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" 1255 | }, 1256 | "dist": { 1257 | "type": "zip", 1258 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", 1259 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", 1260 | "shasum": "" 1261 | }, 1262 | "require": { 1263 | "php": ">=5.3.3" 1264 | }, 1265 | "type": "library", 1266 | "extra": { 1267 | "branch-alias": { 1268 | "dev-master": "1.4.x-dev" 1269 | } 1270 | }, 1271 | "autoload": { 1272 | "classmap": [ 1273 | "src/" 1274 | ] 1275 | }, 1276 | "notification-url": "https://packagist.org/downloads/", 1277 | "license": [ 1278 | "BSD-3-Clause" 1279 | ], 1280 | "authors": [ 1281 | { 1282 | "name": "Sebastian Bergmann", 1283 | "email": "sb@sebastian-bergmann.de", 1284 | "role": "lead" 1285 | } 1286 | ], 1287 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1288 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1289 | "keywords": [ 1290 | "filesystem", 1291 | "iterator" 1292 | ], 1293 | "time": "2017-11-27T13:52:08+00:00" 1294 | }, 1295 | { 1296 | "name": "phpunit/php-text-template", 1297 | "version": "1.2.1", 1298 | "source": { 1299 | "type": "git", 1300 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1301 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 1302 | }, 1303 | "dist": { 1304 | "type": "zip", 1305 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1306 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1307 | "shasum": "" 1308 | }, 1309 | "require": { 1310 | "php": ">=5.3.3" 1311 | }, 1312 | "type": "library", 1313 | "autoload": { 1314 | "classmap": [ 1315 | "src/" 1316 | ] 1317 | }, 1318 | "notification-url": "https://packagist.org/downloads/", 1319 | "license": [ 1320 | "BSD-3-Clause" 1321 | ], 1322 | "authors": [ 1323 | { 1324 | "name": "Sebastian Bergmann", 1325 | "email": "sebastian@phpunit.de", 1326 | "role": "lead" 1327 | } 1328 | ], 1329 | "description": "Simple template engine.", 1330 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1331 | "keywords": [ 1332 | "template" 1333 | ], 1334 | "time": "2015-06-21T13:50:34+00:00" 1335 | }, 1336 | { 1337 | "name": "phpunit/php-timer", 1338 | "version": "1.0.9", 1339 | "source": { 1340 | "type": "git", 1341 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1342 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 1343 | }, 1344 | "dist": { 1345 | "type": "zip", 1346 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 1347 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 1348 | "shasum": "" 1349 | }, 1350 | "require": { 1351 | "php": "^5.3.3 || ^7.0" 1352 | }, 1353 | "require-dev": { 1354 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1355 | }, 1356 | "type": "library", 1357 | "extra": { 1358 | "branch-alias": { 1359 | "dev-master": "1.0-dev" 1360 | } 1361 | }, 1362 | "autoload": { 1363 | "classmap": [ 1364 | "src/" 1365 | ] 1366 | }, 1367 | "notification-url": "https://packagist.org/downloads/", 1368 | "license": [ 1369 | "BSD-3-Clause" 1370 | ], 1371 | "authors": [ 1372 | { 1373 | "name": "Sebastian Bergmann", 1374 | "email": "sb@sebastian-bergmann.de", 1375 | "role": "lead" 1376 | } 1377 | ], 1378 | "description": "Utility class for timing", 1379 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1380 | "keywords": [ 1381 | "timer" 1382 | ], 1383 | "time": "2017-02-26T11:10:40+00:00" 1384 | }, 1385 | { 1386 | "name": "phpunit/php-token-stream", 1387 | "version": "2.0.2", 1388 | "source": { 1389 | "type": "git", 1390 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 1391 | "reference": "791198a2c6254db10131eecfe8c06670700904db" 1392 | }, 1393 | "dist": { 1394 | "type": "zip", 1395 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", 1396 | "reference": "791198a2c6254db10131eecfe8c06670700904db", 1397 | "shasum": "" 1398 | }, 1399 | "require": { 1400 | "ext-tokenizer": "*", 1401 | "php": "^7.0" 1402 | }, 1403 | "require-dev": { 1404 | "phpunit/phpunit": "^6.2.4" 1405 | }, 1406 | "type": "library", 1407 | "extra": { 1408 | "branch-alias": { 1409 | "dev-master": "2.0-dev" 1410 | } 1411 | }, 1412 | "autoload": { 1413 | "classmap": [ 1414 | "src/" 1415 | ] 1416 | }, 1417 | "notification-url": "https://packagist.org/downloads/", 1418 | "license": [ 1419 | "BSD-3-Clause" 1420 | ], 1421 | "authors": [ 1422 | { 1423 | "name": "Sebastian Bergmann", 1424 | "email": "sebastian@phpunit.de" 1425 | } 1426 | ], 1427 | "description": "Wrapper around PHP's tokenizer extension.", 1428 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 1429 | "keywords": [ 1430 | "tokenizer" 1431 | ], 1432 | "time": "2017-11-27T05:48:46+00:00" 1433 | }, 1434 | { 1435 | "name": "phpunit/phpunit", 1436 | "version": "6.5.6", 1437 | "source": { 1438 | "type": "git", 1439 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1440 | "reference": "3330ef26ade05359d006041316ed0fa9e8e3cefe" 1441 | }, 1442 | "dist": { 1443 | "type": "zip", 1444 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3330ef26ade05359d006041316ed0fa9e8e3cefe", 1445 | "reference": "3330ef26ade05359d006041316ed0fa9e8e3cefe", 1446 | "shasum": "" 1447 | }, 1448 | "require": { 1449 | "ext-dom": "*", 1450 | "ext-json": "*", 1451 | "ext-libxml": "*", 1452 | "ext-mbstring": "*", 1453 | "ext-xml": "*", 1454 | "myclabs/deep-copy": "^1.6.1", 1455 | "phar-io/manifest": "^1.0.1", 1456 | "phar-io/version": "^1.0", 1457 | "php": "^7.0", 1458 | "phpspec/prophecy": "^1.7", 1459 | "phpunit/php-code-coverage": "^5.3", 1460 | "phpunit/php-file-iterator": "^1.4.3", 1461 | "phpunit/php-text-template": "^1.2.1", 1462 | "phpunit/php-timer": "^1.0.9", 1463 | "phpunit/phpunit-mock-objects": "^5.0.5", 1464 | "sebastian/comparator": "^2.1", 1465 | "sebastian/diff": "^2.0", 1466 | "sebastian/environment": "^3.1", 1467 | "sebastian/exporter": "^3.1", 1468 | "sebastian/global-state": "^2.0", 1469 | "sebastian/object-enumerator": "^3.0.3", 1470 | "sebastian/resource-operations": "^1.0", 1471 | "sebastian/version": "^2.0.1" 1472 | }, 1473 | "conflict": { 1474 | "phpdocumentor/reflection-docblock": "3.0.2", 1475 | "phpunit/dbunit": "<3.0" 1476 | }, 1477 | "require-dev": { 1478 | "ext-pdo": "*" 1479 | }, 1480 | "suggest": { 1481 | "ext-xdebug": "*", 1482 | "phpunit/php-invoker": "^1.1" 1483 | }, 1484 | "bin": [ 1485 | "phpunit" 1486 | ], 1487 | "type": "library", 1488 | "extra": { 1489 | "branch-alias": { 1490 | "dev-master": "6.5.x-dev" 1491 | } 1492 | }, 1493 | "autoload": { 1494 | "classmap": [ 1495 | "src/" 1496 | ] 1497 | }, 1498 | "notification-url": "https://packagist.org/downloads/", 1499 | "license": [ 1500 | "BSD-3-Clause" 1501 | ], 1502 | "authors": [ 1503 | { 1504 | "name": "Sebastian Bergmann", 1505 | "email": "sebastian@phpunit.de", 1506 | "role": "lead" 1507 | } 1508 | ], 1509 | "description": "The PHP Unit Testing framework.", 1510 | "homepage": "https://phpunit.de/", 1511 | "keywords": [ 1512 | "phpunit", 1513 | "testing", 1514 | "xunit" 1515 | ], 1516 | "time": "2018-02-01T05:57:37+00:00" 1517 | }, 1518 | { 1519 | "name": "phpunit/phpunit-mock-objects", 1520 | "version": "5.0.6", 1521 | "source": { 1522 | "type": "git", 1523 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 1524 | "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf" 1525 | }, 1526 | "dist": { 1527 | "type": "zip", 1528 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/33fd41a76e746b8fa96d00b49a23dadfa8334cdf", 1529 | "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf", 1530 | "shasum": "" 1531 | }, 1532 | "require": { 1533 | "doctrine/instantiator": "^1.0.5", 1534 | "php": "^7.0", 1535 | "phpunit/php-text-template": "^1.2.1", 1536 | "sebastian/exporter": "^3.1" 1537 | }, 1538 | "conflict": { 1539 | "phpunit/phpunit": "<6.0" 1540 | }, 1541 | "require-dev": { 1542 | "phpunit/phpunit": "^6.5" 1543 | }, 1544 | "suggest": { 1545 | "ext-soap": "*" 1546 | }, 1547 | "type": "library", 1548 | "extra": { 1549 | "branch-alias": { 1550 | "dev-master": "5.0.x-dev" 1551 | } 1552 | }, 1553 | "autoload": { 1554 | "classmap": [ 1555 | "src/" 1556 | ] 1557 | }, 1558 | "notification-url": "https://packagist.org/downloads/", 1559 | "license": [ 1560 | "BSD-3-Clause" 1561 | ], 1562 | "authors": [ 1563 | { 1564 | "name": "Sebastian Bergmann", 1565 | "email": "sebastian@phpunit.de", 1566 | "role": "lead" 1567 | } 1568 | ], 1569 | "description": "Mock Object library for PHPUnit", 1570 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 1571 | "keywords": [ 1572 | "mock", 1573 | "xunit" 1574 | ], 1575 | "time": "2018-01-06T05:45:45+00:00" 1576 | }, 1577 | { 1578 | "name": "psr/http-message", 1579 | "version": "1.0.1", 1580 | "source": { 1581 | "type": "git", 1582 | "url": "https://github.com/php-fig/http-message.git", 1583 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1584 | }, 1585 | "dist": { 1586 | "type": "zip", 1587 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1588 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1589 | "shasum": "" 1590 | }, 1591 | "require": { 1592 | "php": ">=5.3.0" 1593 | }, 1594 | "type": "library", 1595 | "extra": { 1596 | "branch-alias": { 1597 | "dev-master": "1.0.x-dev" 1598 | } 1599 | }, 1600 | "autoload": { 1601 | "psr-4": { 1602 | "Psr\\Http\\Message\\": "src/" 1603 | } 1604 | }, 1605 | "notification-url": "https://packagist.org/downloads/", 1606 | "license": [ 1607 | "MIT" 1608 | ], 1609 | "authors": [ 1610 | { 1611 | "name": "PHP-FIG", 1612 | "homepage": "http://www.php-fig.org/" 1613 | } 1614 | ], 1615 | "description": "Common interface for HTTP messages", 1616 | "homepage": "https://github.com/php-fig/http-message", 1617 | "keywords": [ 1618 | "http", 1619 | "http-message", 1620 | "psr", 1621 | "psr-7", 1622 | "request", 1623 | "response" 1624 | ], 1625 | "time": "2016-08-06T14:39:51+00:00" 1626 | }, 1627 | { 1628 | "name": "sebastian/code-unit-reverse-lookup", 1629 | "version": "1.0.1", 1630 | "source": { 1631 | "type": "git", 1632 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1633 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 1634 | }, 1635 | "dist": { 1636 | "type": "zip", 1637 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1638 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1639 | "shasum": "" 1640 | }, 1641 | "require": { 1642 | "php": "^5.6 || ^7.0" 1643 | }, 1644 | "require-dev": { 1645 | "phpunit/phpunit": "^5.7 || ^6.0" 1646 | }, 1647 | "type": "library", 1648 | "extra": { 1649 | "branch-alias": { 1650 | "dev-master": "1.0.x-dev" 1651 | } 1652 | }, 1653 | "autoload": { 1654 | "classmap": [ 1655 | "src/" 1656 | ] 1657 | }, 1658 | "notification-url": "https://packagist.org/downloads/", 1659 | "license": [ 1660 | "BSD-3-Clause" 1661 | ], 1662 | "authors": [ 1663 | { 1664 | "name": "Sebastian Bergmann", 1665 | "email": "sebastian@phpunit.de" 1666 | } 1667 | ], 1668 | "description": "Looks up which function or method a line of code belongs to", 1669 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1670 | "time": "2017-03-04T06:30:41+00:00" 1671 | }, 1672 | { 1673 | "name": "sebastian/comparator", 1674 | "version": "2.1.3", 1675 | "source": { 1676 | "type": "git", 1677 | "url": "https://github.com/sebastianbergmann/comparator.git", 1678 | "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" 1679 | }, 1680 | "dist": { 1681 | "type": "zip", 1682 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", 1683 | "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", 1684 | "shasum": "" 1685 | }, 1686 | "require": { 1687 | "php": "^7.0", 1688 | "sebastian/diff": "^2.0 || ^3.0", 1689 | "sebastian/exporter": "^3.1" 1690 | }, 1691 | "require-dev": { 1692 | "phpunit/phpunit": "^6.4" 1693 | }, 1694 | "type": "library", 1695 | "extra": { 1696 | "branch-alias": { 1697 | "dev-master": "2.1.x-dev" 1698 | } 1699 | }, 1700 | "autoload": { 1701 | "classmap": [ 1702 | "src/" 1703 | ] 1704 | }, 1705 | "notification-url": "https://packagist.org/downloads/", 1706 | "license": [ 1707 | "BSD-3-Clause" 1708 | ], 1709 | "authors": [ 1710 | { 1711 | "name": "Jeff Welch", 1712 | "email": "whatthejeff@gmail.com" 1713 | }, 1714 | { 1715 | "name": "Volker Dusch", 1716 | "email": "github@wallbash.com" 1717 | }, 1718 | { 1719 | "name": "Bernhard Schussek", 1720 | "email": "bschussek@2bepublished.at" 1721 | }, 1722 | { 1723 | "name": "Sebastian Bergmann", 1724 | "email": "sebastian@phpunit.de" 1725 | } 1726 | ], 1727 | "description": "Provides the functionality to compare PHP values for equality", 1728 | "homepage": "https://github.com/sebastianbergmann/comparator", 1729 | "keywords": [ 1730 | "comparator", 1731 | "compare", 1732 | "equality" 1733 | ], 1734 | "time": "2018-02-01T13:46:46+00:00" 1735 | }, 1736 | { 1737 | "name": "sebastian/diff", 1738 | "version": "2.0.1", 1739 | "source": { 1740 | "type": "git", 1741 | "url": "https://github.com/sebastianbergmann/diff.git", 1742 | "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" 1743 | }, 1744 | "dist": { 1745 | "type": "zip", 1746 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", 1747 | "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", 1748 | "shasum": "" 1749 | }, 1750 | "require": { 1751 | "php": "^7.0" 1752 | }, 1753 | "require-dev": { 1754 | "phpunit/phpunit": "^6.2" 1755 | }, 1756 | "type": "library", 1757 | "extra": { 1758 | "branch-alias": { 1759 | "dev-master": "2.0-dev" 1760 | } 1761 | }, 1762 | "autoload": { 1763 | "classmap": [ 1764 | "src/" 1765 | ] 1766 | }, 1767 | "notification-url": "https://packagist.org/downloads/", 1768 | "license": [ 1769 | "BSD-3-Clause" 1770 | ], 1771 | "authors": [ 1772 | { 1773 | "name": "Kore Nordmann", 1774 | "email": "mail@kore-nordmann.de" 1775 | }, 1776 | { 1777 | "name": "Sebastian Bergmann", 1778 | "email": "sebastian@phpunit.de" 1779 | } 1780 | ], 1781 | "description": "Diff implementation", 1782 | "homepage": "https://github.com/sebastianbergmann/diff", 1783 | "keywords": [ 1784 | "diff" 1785 | ], 1786 | "time": "2017-08-03T08:09:46+00:00" 1787 | }, 1788 | { 1789 | "name": "sebastian/environment", 1790 | "version": "3.1.0", 1791 | "source": { 1792 | "type": "git", 1793 | "url": "https://github.com/sebastianbergmann/environment.git", 1794 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" 1795 | }, 1796 | "dist": { 1797 | "type": "zip", 1798 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 1799 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", 1800 | "shasum": "" 1801 | }, 1802 | "require": { 1803 | "php": "^7.0" 1804 | }, 1805 | "require-dev": { 1806 | "phpunit/phpunit": "^6.1" 1807 | }, 1808 | "type": "library", 1809 | "extra": { 1810 | "branch-alias": { 1811 | "dev-master": "3.1.x-dev" 1812 | } 1813 | }, 1814 | "autoload": { 1815 | "classmap": [ 1816 | "src/" 1817 | ] 1818 | }, 1819 | "notification-url": "https://packagist.org/downloads/", 1820 | "license": [ 1821 | "BSD-3-Clause" 1822 | ], 1823 | "authors": [ 1824 | { 1825 | "name": "Sebastian Bergmann", 1826 | "email": "sebastian@phpunit.de" 1827 | } 1828 | ], 1829 | "description": "Provides functionality to handle HHVM/PHP environments", 1830 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1831 | "keywords": [ 1832 | "Xdebug", 1833 | "environment", 1834 | "hhvm" 1835 | ], 1836 | "time": "2017-07-01T08:51:00+00:00" 1837 | }, 1838 | { 1839 | "name": "sebastian/exporter", 1840 | "version": "3.1.0", 1841 | "source": { 1842 | "type": "git", 1843 | "url": "https://github.com/sebastianbergmann/exporter.git", 1844 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" 1845 | }, 1846 | "dist": { 1847 | "type": "zip", 1848 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", 1849 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", 1850 | "shasum": "" 1851 | }, 1852 | "require": { 1853 | "php": "^7.0", 1854 | "sebastian/recursion-context": "^3.0" 1855 | }, 1856 | "require-dev": { 1857 | "ext-mbstring": "*", 1858 | "phpunit/phpunit": "^6.0" 1859 | }, 1860 | "type": "library", 1861 | "extra": { 1862 | "branch-alias": { 1863 | "dev-master": "3.1.x-dev" 1864 | } 1865 | }, 1866 | "autoload": { 1867 | "classmap": [ 1868 | "src/" 1869 | ] 1870 | }, 1871 | "notification-url": "https://packagist.org/downloads/", 1872 | "license": [ 1873 | "BSD-3-Clause" 1874 | ], 1875 | "authors": [ 1876 | { 1877 | "name": "Jeff Welch", 1878 | "email": "whatthejeff@gmail.com" 1879 | }, 1880 | { 1881 | "name": "Volker Dusch", 1882 | "email": "github@wallbash.com" 1883 | }, 1884 | { 1885 | "name": "Bernhard Schussek", 1886 | "email": "bschussek@2bepublished.at" 1887 | }, 1888 | { 1889 | "name": "Sebastian Bergmann", 1890 | "email": "sebastian@phpunit.de" 1891 | }, 1892 | { 1893 | "name": "Adam Harvey", 1894 | "email": "aharvey@php.net" 1895 | } 1896 | ], 1897 | "description": "Provides the functionality to export PHP variables for visualization", 1898 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1899 | "keywords": [ 1900 | "export", 1901 | "exporter" 1902 | ], 1903 | "time": "2017-04-03T13:19:02+00:00" 1904 | }, 1905 | { 1906 | "name": "sebastian/global-state", 1907 | "version": "2.0.0", 1908 | "source": { 1909 | "type": "git", 1910 | "url": "https://github.com/sebastianbergmann/global-state.git", 1911 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 1912 | }, 1913 | "dist": { 1914 | "type": "zip", 1915 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1916 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1917 | "shasum": "" 1918 | }, 1919 | "require": { 1920 | "php": "^7.0" 1921 | }, 1922 | "require-dev": { 1923 | "phpunit/phpunit": "^6.0" 1924 | }, 1925 | "suggest": { 1926 | "ext-uopz": "*" 1927 | }, 1928 | "type": "library", 1929 | "extra": { 1930 | "branch-alias": { 1931 | "dev-master": "2.0-dev" 1932 | } 1933 | }, 1934 | "autoload": { 1935 | "classmap": [ 1936 | "src/" 1937 | ] 1938 | }, 1939 | "notification-url": "https://packagist.org/downloads/", 1940 | "license": [ 1941 | "BSD-3-Clause" 1942 | ], 1943 | "authors": [ 1944 | { 1945 | "name": "Sebastian Bergmann", 1946 | "email": "sebastian@phpunit.de" 1947 | } 1948 | ], 1949 | "description": "Snapshotting of global state", 1950 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1951 | "keywords": [ 1952 | "global state" 1953 | ], 1954 | "time": "2017-04-27T15:39:26+00:00" 1955 | }, 1956 | { 1957 | "name": "sebastian/object-enumerator", 1958 | "version": "3.0.3", 1959 | "source": { 1960 | "type": "git", 1961 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1962 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1963 | }, 1964 | "dist": { 1965 | "type": "zip", 1966 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1967 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1968 | "shasum": "" 1969 | }, 1970 | "require": { 1971 | "php": "^7.0", 1972 | "sebastian/object-reflector": "^1.1.1", 1973 | "sebastian/recursion-context": "^3.0" 1974 | }, 1975 | "require-dev": { 1976 | "phpunit/phpunit": "^6.0" 1977 | }, 1978 | "type": "library", 1979 | "extra": { 1980 | "branch-alias": { 1981 | "dev-master": "3.0.x-dev" 1982 | } 1983 | }, 1984 | "autoload": { 1985 | "classmap": [ 1986 | "src/" 1987 | ] 1988 | }, 1989 | "notification-url": "https://packagist.org/downloads/", 1990 | "license": [ 1991 | "BSD-3-Clause" 1992 | ], 1993 | "authors": [ 1994 | { 1995 | "name": "Sebastian Bergmann", 1996 | "email": "sebastian@phpunit.de" 1997 | } 1998 | ], 1999 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2000 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2001 | "time": "2017-08-03T12:35:26+00:00" 2002 | }, 2003 | { 2004 | "name": "sebastian/object-reflector", 2005 | "version": "1.1.1", 2006 | "source": { 2007 | "type": "git", 2008 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2009 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 2010 | }, 2011 | "dist": { 2012 | "type": "zip", 2013 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 2014 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 2015 | "shasum": "" 2016 | }, 2017 | "require": { 2018 | "php": "^7.0" 2019 | }, 2020 | "require-dev": { 2021 | "phpunit/phpunit": "^6.0" 2022 | }, 2023 | "type": "library", 2024 | "extra": { 2025 | "branch-alias": { 2026 | "dev-master": "1.1-dev" 2027 | } 2028 | }, 2029 | "autoload": { 2030 | "classmap": [ 2031 | "src/" 2032 | ] 2033 | }, 2034 | "notification-url": "https://packagist.org/downloads/", 2035 | "license": [ 2036 | "BSD-3-Clause" 2037 | ], 2038 | "authors": [ 2039 | { 2040 | "name": "Sebastian Bergmann", 2041 | "email": "sebastian@phpunit.de" 2042 | } 2043 | ], 2044 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2045 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2046 | "time": "2017-03-29T09:07:27+00:00" 2047 | }, 2048 | { 2049 | "name": "sebastian/recursion-context", 2050 | "version": "3.0.0", 2051 | "source": { 2052 | "type": "git", 2053 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2054 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 2055 | }, 2056 | "dist": { 2057 | "type": "zip", 2058 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 2059 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 2060 | "shasum": "" 2061 | }, 2062 | "require": { 2063 | "php": "^7.0" 2064 | }, 2065 | "require-dev": { 2066 | "phpunit/phpunit": "^6.0" 2067 | }, 2068 | "type": "library", 2069 | "extra": { 2070 | "branch-alias": { 2071 | "dev-master": "3.0.x-dev" 2072 | } 2073 | }, 2074 | "autoload": { 2075 | "classmap": [ 2076 | "src/" 2077 | ] 2078 | }, 2079 | "notification-url": "https://packagist.org/downloads/", 2080 | "license": [ 2081 | "BSD-3-Clause" 2082 | ], 2083 | "authors": [ 2084 | { 2085 | "name": "Jeff Welch", 2086 | "email": "whatthejeff@gmail.com" 2087 | }, 2088 | { 2089 | "name": "Sebastian Bergmann", 2090 | "email": "sebastian@phpunit.de" 2091 | }, 2092 | { 2093 | "name": "Adam Harvey", 2094 | "email": "aharvey@php.net" 2095 | } 2096 | ], 2097 | "description": "Provides functionality to recursively process PHP variables", 2098 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2099 | "time": "2017-03-03T06:23:57+00:00" 2100 | }, 2101 | { 2102 | "name": "sebastian/resource-operations", 2103 | "version": "1.0.0", 2104 | "source": { 2105 | "type": "git", 2106 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2107 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 2108 | }, 2109 | "dist": { 2110 | "type": "zip", 2111 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 2112 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 2113 | "shasum": "" 2114 | }, 2115 | "require": { 2116 | "php": ">=5.6.0" 2117 | }, 2118 | "type": "library", 2119 | "extra": { 2120 | "branch-alias": { 2121 | "dev-master": "1.0.x-dev" 2122 | } 2123 | }, 2124 | "autoload": { 2125 | "classmap": [ 2126 | "src/" 2127 | ] 2128 | }, 2129 | "notification-url": "https://packagist.org/downloads/", 2130 | "license": [ 2131 | "BSD-3-Clause" 2132 | ], 2133 | "authors": [ 2134 | { 2135 | "name": "Sebastian Bergmann", 2136 | "email": "sebastian@phpunit.de" 2137 | } 2138 | ], 2139 | "description": "Provides a list of PHP built-in functions that operate on resources", 2140 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2141 | "time": "2015-07-28T20:34:47+00:00" 2142 | }, 2143 | { 2144 | "name": "sebastian/version", 2145 | "version": "2.0.1", 2146 | "source": { 2147 | "type": "git", 2148 | "url": "https://github.com/sebastianbergmann/version.git", 2149 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 2150 | }, 2151 | "dist": { 2152 | "type": "zip", 2153 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 2154 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 2155 | "shasum": "" 2156 | }, 2157 | "require": { 2158 | "php": ">=5.6" 2159 | }, 2160 | "type": "library", 2161 | "extra": { 2162 | "branch-alias": { 2163 | "dev-master": "2.0.x-dev" 2164 | } 2165 | }, 2166 | "autoload": { 2167 | "classmap": [ 2168 | "src/" 2169 | ] 2170 | }, 2171 | "notification-url": "https://packagist.org/downloads/", 2172 | "license": [ 2173 | "BSD-3-Clause" 2174 | ], 2175 | "authors": [ 2176 | { 2177 | "name": "Sebastian Bergmann", 2178 | "email": "sebastian@phpunit.de", 2179 | "role": "lead" 2180 | } 2181 | ], 2182 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2183 | "homepage": "https://github.com/sebastianbergmann/version", 2184 | "time": "2016-10-03T07:35:21+00:00" 2185 | }, 2186 | { 2187 | "name": "symfony/browser-kit", 2188 | "version": "v4.0.4", 2189 | "source": { 2190 | "type": "git", 2191 | "url": "https://github.com/symfony/browser-kit.git", 2192 | "reference": "fee0fcd501304b1c3190f6293f650cceb738a353" 2193 | }, 2194 | "dist": { 2195 | "type": "zip", 2196 | "url": "https://api.github.com/repos/symfony/browser-kit/zipball/fee0fcd501304b1c3190f6293f650cceb738a353", 2197 | "reference": "fee0fcd501304b1c3190f6293f650cceb738a353", 2198 | "shasum": "" 2199 | }, 2200 | "require": { 2201 | "php": "^7.1.3", 2202 | "symfony/dom-crawler": "~3.4|~4.0" 2203 | }, 2204 | "require-dev": { 2205 | "symfony/css-selector": "~3.4|~4.0", 2206 | "symfony/process": "~3.4|~4.0" 2207 | }, 2208 | "suggest": { 2209 | "symfony/process": "" 2210 | }, 2211 | "type": "library", 2212 | "extra": { 2213 | "branch-alias": { 2214 | "dev-master": "4.0-dev" 2215 | } 2216 | }, 2217 | "autoload": { 2218 | "psr-4": { 2219 | "Symfony\\Component\\BrowserKit\\": "" 2220 | }, 2221 | "exclude-from-classmap": [ 2222 | "/Tests/" 2223 | ] 2224 | }, 2225 | "notification-url": "https://packagist.org/downloads/", 2226 | "license": [ 2227 | "MIT" 2228 | ], 2229 | "authors": [ 2230 | { 2231 | "name": "Fabien Potencier", 2232 | "email": "fabien@symfony.com" 2233 | }, 2234 | { 2235 | "name": "Symfony Community", 2236 | "homepage": "https://symfony.com/contributors" 2237 | } 2238 | ], 2239 | "description": "Symfony BrowserKit Component", 2240 | "homepage": "https://symfony.com", 2241 | "time": "2018-01-03T07:38:00+00:00" 2242 | }, 2243 | { 2244 | "name": "symfony/console", 2245 | "version": "v4.0.4", 2246 | "source": { 2247 | "type": "git", 2248 | "url": "https://github.com/symfony/console.git", 2249 | "reference": "36d5b41e7d4e1ccf0370f6babe966c08ef0a1488" 2250 | }, 2251 | "dist": { 2252 | "type": "zip", 2253 | "url": "https://api.github.com/repos/symfony/console/zipball/36d5b41e7d4e1ccf0370f6babe966c08ef0a1488", 2254 | "reference": "36d5b41e7d4e1ccf0370f6babe966c08ef0a1488", 2255 | "shasum": "" 2256 | }, 2257 | "require": { 2258 | "php": "^7.1.3", 2259 | "symfony/polyfill-mbstring": "~1.0" 2260 | }, 2261 | "conflict": { 2262 | "symfony/dependency-injection": "<3.4", 2263 | "symfony/process": "<3.3" 2264 | }, 2265 | "require-dev": { 2266 | "psr/log": "~1.0", 2267 | "symfony/config": "~3.4|~4.0", 2268 | "symfony/dependency-injection": "~3.4|~4.0", 2269 | "symfony/event-dispatcher": "~3.4|~4.0", 2270 | "symfony/lock": "~3.4|~4.0", 2271 | "symfony/process": "~3.4|~4.0" 2272 | }, 2273 | "suggest": { 2274 | "psr/log": "For using the console logger", 2275 | "symfony/event-dispatcher": "", 2276 | "symfony/lock": "", 2277 | "symfony/process": "" 2278 | }, 2279 | "type": "library", 2280 | "extra": { 2281 | "branch-alias": { 2282 | "dev-master": "4.0-dev" 2283 | } 2284 | }, 2285 | "autoload": { 2286 | "psr-4": { 2287 | "Symfony\\Component\\Console\\": "" 2288 | }, 2289 | "exclude-from-classmap": [ 2290 | "/Tests/" 2291 | ] 2292 | }, 2293 | "notification-url": "https://packagist.org/downloads/", 2294 | "license": [ 2295 | "MIT" 2296 | ], 2297 | "authors": [ 2298 | { 2299 | "name": "Fabien Potencier", 2300 | "email": "fabien@symfony.com" 2301 | }, 2302 | { 2303 | "name": "Symfony Community", 2304 | "homepage": "https://symfony.com/contributors" 2305 | } 2306 | ], 2307 | "description": "Symfony Console Component", 2308 | "homepage": "https://symfony.com", 2309 | "time": "2018-01-29T09:06:29+00:00" 2310 | }, 2311 | { 2312 | "name": "symfony/css-selector", 2313 | "version": "v4.0.4", 2314 | "source": { 2315 | "type": "git", 2316 | "url": "https://github.com/symfony/css-selector.git", 2317 | "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7" 2318 | }, 2319 | "dist": { 2320 | "type": "zip", 2321 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/f97600434e3141ef3cbb9ea42cf500fba88022b7", 2322 | "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7", 2323 | "shasum": "" 2324 | }, 2325 | "require": { 2326 | "php": "^7.1.3" 2327 | }, 2328 | "type": "library", 2329 | "extra": { 2330 | "branch-alias": { 2331 | "dev-master": "4.0-dev" 2332 | } 2333 | }, 2334 | "autoload": { 2335 | "psr-4": { 2336 | "Symfony\\Component\\CssSelector\\": "" 2337 | }, 2338 | "exclude-from-classmap": [ 2339 | "/Tests/" 2340 | ] 2341 | }, 2342 | "notification-url": "https://packagist.org/downloads/", 2343 | "license": [ 2344 | "MIT" 2345 | ], 2346 | "authors": [ 2347 | { 2348 | "name": "Jean-François Simon", 2349 | "email": "jeanfrancois.simon@sensiolabs.com" 2350 | }, 2351 | { 2352 | "name": "Fabien Potencier", 2353 | "email": "fabien@symfony.com" 2354 | }, 2355 | { 2356 | "name": "Symfony Community", 2357 | "homepage": "https://symfony.com/contributors" 2358 | } 2359 | ], 2360 | "description": "Symfony CssSelector Component", 2361 | "homepage": "https://symfony.com", 2362 | "time": "2018-01-03T07:38:00+00:00" 2363 | }, 2364 | { 2365 | "name": "symfony/dom-crawler", 2366 | "version": "v4.0.4", 2367 | "source": { 2368 | "type": "git", 2369 | "url": "https://github.com/symfony/dom-crawler.git", 2370 | "reference": "39b785e1cf28e9f21bb601a5d62c4992a8e8a290" 2371 | }, 2372 | "dist": { 2373 | "type": "zip", 2374 | "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/39b785e1cf28e9f21bb601a5d62c4992a8e8a290", 2375 | "reference": "39b785e1cf28e9f21bb601a5d62c4992a8e8a290", 2376 | "shasum": "" 2377 | }, 2378 | "require": { 2379 | "php": "^7.1.3", 2380 | "symfony/polyfill-mbstring": "~1.0" 2381 | }, 2382 | "require-dev": { 2383 | "symfony/css-selector": "~3.4|~4.0" 2384 | }, 2385 | "suggest": { 2386 | "symfony/css-selector": "" 2387 | }, 2388 | "type": "library", 2389 | "extra": { 2390 | "branch-alias": { 2391 | "dev-master": "4.0-dev" 2392 | } 2393 | }, 2394 | "autoload": { 2395 | "psr-4": { 2396 | "Symfony\\Component\\DomCrawler\\": "" 2397 | }, 2398 | "exclude-from-classmap": [ 2399 | "/Tests/" 2400 | ] 2401 | }, 2402 | "notification-url": "https://packagist.org/downloads/", 2403 | "license": [ 2404 | "MIT" 2405 | ], 2406 | "authors": [ 2407 | { 2408 | "name": "Fabien Potencier", 2409 | "email": "fabien@symfony.com" 2410 | }, 2411 | { 2412 | "name": "Symfony Community", 2413 | "homepage": "https://symfony.com/contributors" 2414 | } 2415 | ], 2416 | "description": "Symfony DomCrawler Component", 2417 | "homepage": "https://symfony.com", 2418 | "time": "2018-01-03T07:38:00+00:00" 2419 | }, 2420 | { 2421 | "name": "symfony/event-dispatcher", 2422 | "version": "v4.0.4", 2423 | "source": { 2424 | "type": "git", 2425 | "url": "https://github.com/symfony/event-dispatcher.git", 2426 | "reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb" 2427 | }, 2428 | "dist": { 2429 | "type": "zip", 2430 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/74d33aac36208c4d6757807d9f598f0133a3a4eb", 2431 | "reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb", 2432 | "shasum": "" 2433 | }, 2434 | "require": { 2435 | "php": "^7.1.3" 2436 | }, 2437 | "conflict": { 2438 | "symfony/dependency-injection": "<3.4" 2439 | }, 2440 | "require-dev": { 2441 | "psr/log": "~1.0", 2442 | "symfony/config": "~3.4|~4.0", 2443 | "symfony/dependency-injection": "~3.4|~4.0", 2444 | "symfony/expression-language": "~3.4|~4.0", 2445 | "symfony/stopwatch": "~3.4|~4.0" 2446 | }, 2447 | "suggest": { 2448 | "symfony/dependency-injection": "", 2449 | "symfony/http-kernel": "" 2450 | }, 2451 | "type": "library", 2452 | "extra": { 2453 | "branch-alias": { 2454 | "dev-master": "4.0-dev" 2455 | } 2456 | }, 2457 | "autoload": { 2458 | "psr-4": { 2459 | "Symfony\\Component\\EventDispatcher\\": "" 2460 | }, 2461 | "exclude-from-classmap": [ 2462 | "/Tests/" 2463 | ] 2464 | }, 2465 | "notification-url": "https://packagist.org/downloads/", 2466 | "license": [ 2467 | "MIT" 2468 | ], 2469 | "authors": [ 2470 | { 2471 | "name": "Fabien Potencier", 2472 | "email": "fabien@symfony.com" 2473 | }, 2474 | { 2475 | "name": "Symfony Community", 2476 | "homepage": "https://symfony.com/contributors" 2477 | } 2478 | ], 2479 | "description": "Symfony EventDispatcher Component", 2480 | "homepage": "https://symfony.com", 2481 | "time": "2018-01-03T07:38:00+00:00" 2482 | }, 2483 | { 2484 | "name": "symfony/finder", 2485 | "version": "v4.0.4", 2486 | "source": { 2487 | "type": "git", 2488 | "url": "https://github.com/symfony/finder.git", 2489 | "reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601" 2490 | }, 2491 | "dist": { 2492 | "type": "zip", 2493 | "url": "https://api.github.com/repos/symfony/finder/zipball/8b08180f2b7ccb41062366b9ad91fbc4f1af8601", 2494 | "reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601", 2495 | "shasum": "" 2496 | }, 2497 | "require": { 2498 | "php": "^7.1.3" 2499 | }, 2500 | "type": "library", 2501 | "extra": { 2502 | "branch-alias": { 2503 | "dev-master": "4.0-dev" 2504 | } 2505 | }, 2506 | "autoload": { 2507 | "psr-4": { 2508 | "Symfony\\Component\\Finder\\": "" 2509 | }, 2510 | "exclude-from-classmap": [ 2511 | "/Tests/" 2512 | ] 2513 | }, 2514 | "notification-url": "https://packagist.org/downloads/", 2515 | "license": [ 2516 | "MIT" 2517 | ], 2518 | "authors": [ 2519 | { 2520 | "name": "Fabien Potencier", 2521 | "email": "fabien@symfony.com" 2522 | }, 2523 | { 2524 | "name": "Symfony Community", 2525 | "homepage": "https://symfony.com/contributors" 2526 | } 2527 | ], 2528 | "description": "Symfony Finder Component", 2529 | "homepage": "https://symfony.com", 2530 | "time": "2018-01-03T07:38:00+00:00" 2531 | }, 2532 | { 2533 | "name": "symfony/polyfill-mbstring", 2534 | "version": "v1.7.0", 2535 | "source": { 2536 | "type": "git", 2537 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2538 | "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b" 2539 | }, 2540 | "dist": { 2541 | "type": "zip", 2542 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/78be803ce01e55d3491c1397cf1c64beb9c1b63b", 2543 | "reference": "78be803ce01e55d3491c1397cf1c64beb9c1b63b", 2544 | "shasum": "" 2545 | }, 2546 | "require": { 2547 | "php": ">=5.3.3" 2548 | }, 2549 | "suggest": { 2550 | "ext-mbstring": "For best performance" 2551 | }, 2552 | "type": "library", 2553 | "extra": { 2554 | "branch-alias": { 2555 | "dev-master": "1.7-dev" 2556 | } 2557 | }, 2558 | "autoload": { 2559 | "psr-4": { 2560 | "Symfony\\Polyfill\\Mbstring\\": "" 2561 | }, 2562 | "files": [ 2563 | "bootstrap.php" 2564 | ] 2565 | }, 2566 | "notification-url": "https://packagist.org/downloads/", 2567 | "license": [ 2568 | "MIT" 2569 | ], 2570 | "authors": [ 2571 | { 2572 | "name": "Nicolas Grekas", 2573 | "email": "p@tchwork.com" 2574 | }, 2575 | { 2576 | "name": "Symfony Community", 2577 | "homepage": "https://symfony.com/contributors" 2578 | } 2579 | ], 2580 | "description": "Symfony polyfill for the Mbstring extension", 2581 | "homepage": "https://symfony.com", 2582 | "keywords": [ 2583 | "compatibility", 2584 | "mbstring", 2585 | "polyfill", 2586 | "portable", 2587 | "shim" 2588 | ], 2589 | "time": "2018-01-30T19:27:44+00:00" 2590 | }, 2591 | { 2592 | "name": "symfony/process", 2593 | "version": "v4.0.4", 2594 | "source": { 2595 | "type": "git", 2596 | "url": "https://github.com/symfony/process.git", 2597 | "reference": "e1712002d81de6f39f854bc5bbd9e9f4bb6345b4" 2598 | }, 2599 | "dist": { 2600 | "type": "zip", 2601 | "url": "https://api.github.com/repos/symfony/process/zipball/e1712002d81de6f39f854bc5bbd9e9f4bb6345b4", 2602 | "reference": "e1712002d81de6f39f854bc5bbd9e9f4bb6345b4", 2603 | "shasum": "" 2604 | }, 2605 | "require": { 2606 | "php": "^7.1.3" 2607 | }, 2608 | "type": "library", 2609 | "extra": { 2610 | "branch-alias": { 2611 | "dev-master": "4.0-dev" 2612 | } 2613 | }, 2614 | "autoload": { 2615 | "psr-4": { 2616 | "Symfony\\Component\\Process\\": "" 2617 | }, 2618 | "exclude-from-classmap": [ 2619 | "/Tests/" 2620 | ] 2621 | }, 2622 | "notification-url": "https://packagist.org/downloads/", 2623 | "license": [ 2624 | "MIT" 2625 | ], 2626 | "authors": [ 2627 | { 2628 | "name": "Fabien Potencier", 2629 | "email": "fabien@symfony.com" 2630 | }, 2631 | { 2632 | "name": "Symfony Community", 2633 | "homepage": "https://symfony.com/contributors" 2634 | } 2635 | ], 2636 | "description": "Symfony Process Component", 2637 | "homepage": "https://symfony.com", 2638 | "time": "2018-01-29T09:06:29+00:00" 2639 | }, 2640 | { 2641 | "name": "symfony/yaml", 2642 | "version": "v4.0.4", 2643 | "source": { 2644 | "type": "git", 2645 | "url": "https://github.com/symfony/yaml.git", 2646 | "reference": "ffc60bda1d4a00ec0b32eeabf39dc017bf480028" 2647 | }, 2648 | "dist": { 2649 | "type": "zip", 2650 | "url": "https://api.github.com/repos/symfony/yaml/zipball/ffc60bda1d4a00ec0b32eeabf39dc017bf480028", 2651 | "reference": "ffc60bda1d4a00ec0b32eeabf39dc017bf480028", 2652 | "shasum": "" 2653 | }, 2654 | "require": { 2655 | "php": "^7.1.3" 2656 | }, 2657 | "conflict": { 2658 | "symfony/console": "<3.4" 2659 | }, 2660 | "require-dev": { 2661 | "symfony/console": "~3.4|~4.0" 2662 | }, 2663 | "suggest": { 2664 | "symfony/console": "For validating YAML files using the lint command" 2665 | }, 2666 | "type": "library", 2667 | "extra": { 2668 | "branch-alias": { 2669 | "dev-master": "4.0-dev" 2670 | } 2671 | }, 2672 | "autoload": { 2673 | "psr-4": { 2674 | "Symfony\\Component\\Yaml\\": "" 2675 | }, 2676 | "exclude-from-classmap": [ 2677 | "/Tests/" 2678 | ] 2679 | }, 2680 | "notification-url": "https://packagist.org/downloads/", 2681 | "license": [ 2682 | "MIT" 2683 | ], 2684 | "authors": [ 2685 | { 2686 | "name": "Fabien Potencier", 2687 | "email": "fabien@symfony.com" 2688 | }, 2689 | { 2690 | "name": "Symfony Community", 2691 | "homepage": "https://symfony.com/contributors" 2692 | } 2693 | ], 2694 | "description": "Symfony Yaml Component", 2695 | "homepage": "https://symfony.com", 2696 | "time": "2018-01-21T19:06:11+00:00" 2697 | }, 2698 | { 2699 | "name": "theseer/tokenizer", 2700 | "version": "1.1.0", 2701 | "source": { 2702 | "type": "git", 2703 | "url": "https://github.com/theseer/tokenizer.git", 2704 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 2705 | }, 2706 | "dist": { 2707 | "type": "zip", 2708 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 2709 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 2710 | "shasum": "" 2711 | }, 2712 | "require": { 2713 | "ext-dom": "*", 2714 | "ext-tokenizer": "*", 2715 | "ext-xmlwriter": "*", 2716 | "php": "^7.0" 2717 | }, 2718 | "type": "library", 2719 | "autoload": { 2720 | "classmap": [ 2721 | "src/" 2722 | ] 2723 | }, 2724 | "notification-url": "https://packagist.org/downloads/", 2725 | "license": [ 2726 | "BSD-3-Clause" 2727 | ], 2728 | "authors": [ 2729 | { 2730 | "name": "Arne Blankerts", 2731 | "email": "arne@blankerts.de", 2732 | "role": "Developer" 2733 | } 2734 | ], 2735 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2736 | "time": "2017-04-07T12:08:54+00:00" 2737 | }, 2738 | { 2739 | "name": "webmozart/assert", 2740 | "version": "1.3.0", 2741 | "source": { 2742 | "type": "git", 2743 | "url": "https://github.com/webmozart/assert.git", 2744 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a" 2745 | }, 2746 | "dist": { 2747 | "type": "zip", 2748 | "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", 2749 | "reference": "0df1908962e7a3071564e857d86874dad1ef204a", 2750 | "shasum": "" 2751 | }, 2752 | "require": { 2753 | "php": "^5.3.3 || ^7.0" 2754 | }, 2755 | "require-dev": { 2756 | "phpunit/phpunit": "^4.6", 2757 | "sebastian/version": "^1.0.1" 2758 | }, 2759 | "type": "library", 2760 | "extra": { 2761 | "branch-alias": { 2762 | "dev-master": "1.3-dev" 2763 | } 2764 | }, 2765 | "autoload": { 2766 | "psr-4": { 2767 | "Webmozart\\Assert\\": "src/" 2768 | } 2769 | }, 2770 | "notification-url": "https://packagist.org/downloads/", 2771 | "license": [ 2772 | "MIT" 2773 | ], 2774 | "authors": [ 2775 | { 2776 | "name": "Bernhard Schussek", 2777 | "email": "bschussek@gmail.com" 2778 | } 2779 | ], 2780 | "description": "Assertions to validate method input/output with nice error messages.", 2781 | "keywords": [ 2782 | "assert", 2783 | "check", 2784 | "validate" 2785 | ], 2786 | "time": "2018-01-29T19:49:41+00:00" 2787 | } 2788 | ], 2789 | "aliases": [], 2790 | "minimum-stability": "stable", 2791 | "stability-flags": [], 2792 | "prefer-stable": false, 2793 | "prefer-lowest": false, 2794 | "platform": [], 2795 | "platform-dev": [] 2796 | } 2797 | -------------------------------------------------------------------------------- /src/SearchComponent.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace vintage\search; 13 | 14 | use Yii; 15 | use yii\base\Component; 16 | use yii\base\InvalidConfigException; 17 | use yii\base\Model; 18 | use yii\db\BaseActiveRecord; 19 | use yii\helpers\ArrayHelper; 20 | use yii\helpers\Inflector; 21 | use vintage\search\models\SearchResult; 22 | use vintage\search\interfaces\SearchInterface; 23 | use vintage\search\interfaces\CustomSearchInterface; 24 | 25 | /** 26 | * Component for search in Active Record models. 27 | * 28 | * @author Vladimir Kuprienko 29 | * @since 1.0 30 | */ 31 | class SearchComponent extends Component 32 | { 33 | /** 34 | * @var array Array with configuration of models for search. 35 | * 36 | * @example 37 | * ```php 38 | * 'models' => [ 39 | * 'articles' => [ 40 | * 'class' => Article::class, 41 | * 'label' => 'Articles', 42 | * ], 43 | * 'products' => [ 44 | * 'class' => Product::class, 45 | * 'label' => 'Shop products', 46 | * ], 47 | * // ... 48 | * ] 49 | * ``` 50 | */ 51 | public $models = []; 52 | 53 | /** 54 | * @var SearchResult[] Array of the search result. 55 | */ 56 | protected $result = []; 57 | 58 | 59 | /** 60 | * Method for searching. 61 | * 62 | * @example 63 | * ```php 64 | * $result = Yii::$app->get('searcher')->search('query for searching'); 65 | * ``` 66 | * 67 | * @param string $query Keywords for search. 68 | * 69 | * @return SearchResult[] Array of the result objects. 70 | * 71 | * @throws \Exception 72 | * @throws InvalidConfigException 73 | */ 74 | public function search($query) 75 | { 76 | foreach ($this->models as $model) { 77 | /* @var BaseActiveRecord|SearchInterface $searchModel */ 78 | $searchModel = Yii::createObject($model['class']); 79 | 80 | if (!$this->isSearchModel($searchModel)) { 81 | throw new InvalidConfigException( 82 | $model['class'] . 'should be instance of `\vintage\search\interfaces\SearchInterface` and `\yii\db\ActiveRecordInterface`' 83 | ); 84 | } 85 | 86 | $activeQuery = $searchModel::find(); 87 | 88 | foreach ($searchModel->getSearchFields() as $field) { 89 | if (!$searchModel->hasAttribute($field)) { 90 | throw new \Exception(sprintf("Field `%s` not found in `%s` model", $field, $model['class'])); 91 | } 92 | 93 | $activeQuery = ($searchModel instanceof CustomSearchInterface) 94 | ? $searchModel->getQuery($activeQuery, $field, $query) 95 | : $activeQuery->orWhere(['like', $field, $query]); 96 | } 97 | 98 | $this->addToResult($activeQuery->all()); 99 | } 100 | 101 | return $this->result; 102 | } 103 | 104 | /** 105 | * Getting model label by model name. 106 | * 107 | * @param string $modelName 108 | * 109 | * @return null|string 110 | */ 111 | public function getModelLabel($modelName) 112 | { 113 | foreach ($this->models as $key => $model) { 114 | if ($model['class'] == $modelName) { 115 | return isset($model['label']) ? $model['label'] : Inflector::camel2words($key); 116 | } 117 | } 118 | 119 | return null; 120 | } 121 | 122 | /** 123 | * Method for adding iteration result to final result. 124 | * 125 | * @param \yii\db\ActiveRecord[] $foundModels 126 | */ 127 | protected function addToResult($foundModels) 128 | { 129 | if (null !== $foundModels) { 130 | $tmp = SearchResult::buildMultiply($foundModels); 131 | $this->result = ArrayHelper::merge($tmp, $this->result); 132 | } 133 | } 134 | 135 | /** 136 | * Check whether given model is search model. 137 | * 138 | * @param Model $model 139 | * 140 | * @return bool `true` if given model is search model. 141 | * 142 | * @since 1.1 143 | */ 144 | protected function isSearchModel(Model $model) 145 | { 146 | return $model instanceof BaseActiveRecord && 147 | $model instanceof SearchInterface; 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /src/interfaces/CustomSearchInterface.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace vintage\search\interfaces; 13 | 14 | use yii\db\ActiveQueryInterface; 15 | 16 | /** 17 | * Interface for search models with custom query. 18 | * 19 | * @author Vladimir Kuprienko 20 | * @since 1.1 21 | */ 22 | interface CustomSearchInterface extends SearchInterface 23 | { 24 | /** 25 | * In this method you should implement custom search query. 26 | * 27 | * @param ActiveQueryInterface $query 28 | * @param string $field Current search field. 29 | * @param string $searchQuery Search query. 30 | * 31 | * @return ActiveQueryInterface 32 | */ 33 | public function getQuery(ActiveQueryInterface $query, $field, $searchQuery); 34 | } 35 | -------------------------------------------------------------------------------- /src/interfaces/SearchInterface.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace vintage\search\interfaces; 13 | 14 | /** 15 | * Interface for building the search result. 16 | * 17 | * @see \vintage\search\models\SearchResult 18 | * 19 | * You should implement this interface in your Active Record model. 20 | * 21 | * @author Vladimir Kuprienko 22 | * @since 1.0 23 | */ 24 | interface SearchInterface 25 | { 26 | /** 27 | * Gets title. 28 | * 29 | * @return string This string will be inserted to the search result 30 | * to `title` field. 31 | */ 32 | public function getSearchTitle(); 33 | 34 | /** 35 | * Gets description. 36 | * 37 | * @return string This string will be inserted to the search result 38 | * to `description` field. 39 | */ 40 | public function getSearchDescription(); 41 | 42 | /** 43 | * Gets routes. 44 | * 45 | * @return string This string will be inserted to the search result 46 | * to `url` field. 47 | */ 48 | public function getSearchUrl(); 49 | 50 | /** 51 | * @return string[] Array of the field names 52 | * where will be implemented search in model. 53 | */ 54 | public function getSearchFields(); 55 | } 56 | -------------------------------------------------------------------------------- /src/models/SearchResult.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace vintage\search\models; 13 | 14 | use yii\base\BaseObject; 15 | 16 | /** 17 | * Model for store of search result. 18 | * 19 | * @property string $title 20 | * @property string $description 21 | * @property string $url 22 | * 23 | * @author Vladimir Kuprienko 24 | * @since 1.0 25 | */ 26 | class SearchResult extends BaseObject 27 | { 28 | /** 29 | * @var string 30 | */ 31 | public $title; 32 | /** 33 | * @var string 34 | */ 35 | public $description; 36 | /** 37 | * @var string 38 | */ 39 | public $url; 40 | /** 41 | * @var integer 42 | */ 43 | public $modelId; 44 | /** 45 | * @var string 46 | */ 47 | public $modelName; 48 | 49 | 50 | /** 51 | * Building the result from Active Record object. 52 | * 53 | * @param \yii\db\BaseActiveRecord|\vintage\search\interfaces\SearchInterface $modelObject 54 | * 55 | * @return SearchResult 56 | */ 57 | public static function build($modelObject) 58 | { 59 | return new self([ 60 | 'modelId' => $modelObject->getPrimaryKey(), 61 | 'modelName' => $modelObject::className(), 62 | 'title' => $modelObject->getSearchTitle(), 63 | 'description' => $modelObject->getSearchDescription(), 64 | 'url' => $modelObject->getSearchUrl(), 65 | ]); 66 | } 67 | 68 | /** 69 | * Multiply building of result from Active Record objects. 70 | * 71 | * @param \yii\db\BaseActiveRecord[]|\vintage\search\interfaces\SearchInterface[] $modelObjects 72 | * 73 | * @return SearchResult[] 74 | */ 75 | public static function buildMultiply($modelObjects) 76 | { 77 | $results = []; 78 | 79 | foreach ($modelObjects as $object) { 80 | $results[] = static::build($object); 81 | } 82 | 83 | return $results; 84 | } 85 | 86 | /** 87 | * Method for sorting results of search by model name. 88 | * 89 | * @param SearchResult[] $searchResults 90 | * 91 | * @return SearchResult[] 92 | */ 93 | public static function sortByModel(array $searchResults) 94 | { 95 | $sorted = []; 96 | 97 | foreach ($searchResults as $obj) { 98 | $sorted[$obj->modelName][] = $obj; 99 | } 100 | 101 | return $sorted; 102 | } 103 | } 104 | --------------------------------------------------------------------------------