├── .gitignore ├── tests ├── dummy │ ├── files │ │ └── test1.csv │ └── Middleware │ │ └── IndexCheckMiddleware.php ├── MiddlewareTest │ ├── MiddlewareTest.php │ └── MiddlewareManagerTest.php └── SheetReaderTest.php ├── .travis.yml ├── src ├── Middleware │ ├── TrimMiddleware.php │ └── MiddlewareManager.php └── SheetReader.php ├── phpunit.xml ├── composer.json ├── license.md ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | vendor -------------------------------------------------------------------------------- /tests/dummy/files/test1.csv: -------------------------------------------------------------------------------- 1 | ID,NAME,AGE 2 | 1,Mahmud,26 3 | 2, Raju, 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 7.1.3 5 | 6 | install: 7 | - composer self-update 8 | - travis_retry composer install --no-interaction --prefer-dist --no-suggest 9 | 10 | script: 11 | - vendor/bin/phpunit -------------------------------------------------------------------------------- /src/Middleware/TrimMiddleware.php: -------------------------------------------------------------------------------- 1 | . 4 | */ 5 | 6 | namespace Mahmud\Sheet\Middleware; 7 | 8 | 9 | class TrimMiddleware { 10 | public function handle($row) { 11 | foreach ($row as $key => $val) { 12 | $row[$key] = $val ? trim($val) : $val; 13 | } 14 | 15 | return $row; 16 | } 17 | } -------------------------------------------------------------------------------- /tests/dummy/Middleware/IndexCheckMiddleware.php: -------------------------------------------------------------------------------- 1 | . 4 | */ 5 | 6 | namespace Mahmud\Sheet\Tests\dummy\Middleware; 7 | 8 | 9 | class IndexCheckMiddleware { 10 | private $callback; 11 | 12 | public function __construct($callback) { 13 | $this->callback = $callback; 14 | } 15 | 16 | public function handle($row, $index) { 17 | call_user_func($this->callback, $index); 18 | return $row; 19 | } 20 | } -------------------------------------------------------------------------------- /src/Middleware/MiddlewareManager.php: -------------------------------------------------------------------------------- 1 | . 4 | */ 5 | 6 | namespace Mahmud\Sheet\Middleware; 7 | 8 | 9 | class MiddlewareManager { 10 | public function passThrough(array $middlewares, $row, $index) { 11 | foreach ($middlewares as $middleware){ 12 | if($middleware instanceof \Closure){ 13 | if($row){ 14 | $row = $middleware($row, $index); 15 | } 16 | }else{ 17 | if($row){ 18 | $row = $middleware->handle($row, $index); 19 | } 20 | } 21 | } 22 | 23 | return $row; 24 | } 25 | } -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | ./tests/ 15 | 16 | 17 | 18 | 19 | src/ 20 | 21 | 22 | -------------------------------------------------------------------------------- /tests/MiddlewareTest/MiddlewareTest.php: -------------------------------------------------------------------------------- 1 | . 4 | */ 5 | 6 | namespace Mahmud\Sheet\Tests\MiddlewareTest; 7 | 8 | 9 | use Mahmud\Sheet\Middleware\TrimMiddleware; 10 | use Mahmud\Sheet\SheetReader; 11 | use PHPUnit\Framework\TestCase; 12 | 13 | class MiddlewareTest extends TestCase { 14 | /** 15 | * @test 16 | */ 17 | public function it_can_trim_data() { 18 | $data = []; 19 | SheetReader::makeFromCsv(__DIR__ . "/../dummy/files/test1.csv") 20 | ->columns(['id', 'name', 'age']) 21 | ->ignoreRow(0) 22 | ->applyMiddleware(new TrimMiddleware()) 23 | ->onEachRow(function ($row, $index) use (&$data) { 24 | $data[] = $row; 25 | })->read(); 26 | 27 | $this->assertEquals([ 28 | 'id' => 2, 29 | 'name' => 'Raju', 30 | 'age' => "", 31 | ], $data[1]); 32 | } 33 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mahmud/sheet", 3 | "description": "Excel and CSV file reader", 4 | "license": "MIT", 5 | "type": "library", 6 | "authors": [ 7 | { 8 | "name": "Mahmudur Rahman", 9 | "email": "mahmudkuet11@gmail.com", 10 | "homepage": "https://mahmud.live" 11 | } 12 | ], 13 | "minimum-stability": "dev", 14 | "require": { 15 | "php": "^7.1.3", 16 | "box/spout": "^3.0" 17 | }, 18 | "prefer-stable": true, 19 | "autoload": { 20 | "psr-4": { 21 | "Mahmud\\Sheet\\": "src/" 22 | } 23 | }, 24 | "autoload-dev": { 25 | "psr-4": { 26 | "Mahmud\\Sheet\\Tests\\": "tests" 27 | } 28 | }, 29 | "config": { 30 | "optimize-autoloader": true, 31 | "preferred-install": "dist", 32 | "sort-packages": true 33 | }, 34 | "keywords": ["Excel", "CSV", "Sheet"], 35 | "require-dev": { 36 | "phpunit/phpunit": "^7", 37 | "mockery/mockery": "dev-master" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2019 Mahmud. https://mahmud.live 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /tests/MiddlewareTest/MiddlewareManagerTest.php: -------------------------------------------------------------------------------- 1 | . 4 | */ 5 | 6 | namespace Mahmud\Sheet\Tests\MiddlewareTest; 7 | 8 | 9 | use Mahmud\Sheet\Middleware\MiddlewareManager; 10 | use PHPUnit\Framework\TestCase; 11 | 12 | class MiddlewareManagerTest extends TestCase { 13 | /** 14 | * @test 15 | */ 16 | public function data_can_be_passed_through_the_middleware() { 17 | $middleware = \Mockery::mock('TestMiddleware') 18 | ->shouldReceive('handle') 19 | ->once() 20 | ->andReturn([ 21 | 'foo' => 'foo1', 22 | 'bar' => 'bar1' 23 | ])->getMock(); 24 | 25 | $manager = new MiddlewareManager(); 26 | $data = $manager->passThrough([$middleware], [ 27 | 'foo' => 'bar', 28 | 'bar' => 'baz' 29 | ], 0); 30 | 31 | $this->assertEquals([ 32 | 'foo' => 'foo1', 33 | 'bar' => 'bar1' 34 | ], $data); 35 | } 36 | 37 | /** 38 | * @test 39 | */ 40 | public function closure_can_be_passed_as_middleware() { 41 | $middleware = function ($row) { 42 | return [ 43 | 'foo' => 'foo1', 44 | 'bar' => 'bar1' 45 | ]; 46 | }; 47 | $manager = new MiddlewareManager(); 48 | $data = $manager->passThrough([$middleware], [ 49 | 'foo' => 'bar', 50 | 'bar' => 'baz' 51 | ], 0); 52 | 53 | $this->assertEquals([ 54 | 'foo' => 'foo1', 55 | 'bar' => 'bar1' 56 | ], $data); 57 | } 58 | 59 | protected function tearDown() { 60 | \Mockery::close(); 61 | parent::tearDown(); 62 | } 63 | } -------------------------------------------------------------------------------- /src/SheetReader.php: -------------------------------------------------------------------------------- 1 | . 4 | */ 5 | 6 | namespace Mahmud\Sheet; 7 | 8 | use Box\Spout\Common\Type; 9 | use Box\Spout\Reader\Common\Creator\ReaderFactory; 10 | use Mahmud\Sheet\Middleware\MiddlewareManager; 11 | 12 | class SheetReader { 13 | protected $filePath; 14 | 15 | protected $ignoredRowsIndex = []; 16 | 17 | protected $rowCallback; 18 | 19 | protected $columns = []; 20 | 21 | protected $fileType = null; 22 | 23 | protected $delimiter = null; 24 | 25 | protected $middleware = []; 26 | 27 | private $middlewareManager; 28 | 29 | public function __construct($filePath, $fileType = Type::XLSX, $delimiter = ',') { 30 | $this->filePath = $filePath; 31 | $this->fileType = $fileType; 32 | $this->delimiter = $delimiter; 33 | 34 | $this->middlewareManager = new MiddlewareManager(); 35 | } 36 | 37 | public static function makeFromXlsx($filePath) { 38 | return static::make($filePath); 39 | } 40 | 41 | public static function make($filePath, $fileType = Type::XLSX) { 42 | return new static($filePath, $fileType); 43 | } 44 | 45 | public static function makeFromCsv($filePath) { 46 | return static::make($filePath, Type::CSV); 47 | } 48 | 49 | public function ignoreRow($index) { 50 | $this->ignoredRowsIndex[] = $index; 51 | 52 | return $this; 53 | } 54 | 55 | public function columns($columns) { 56 | $this->columns = $columns; 57 | 58 | return $this; 59 | } 60 | 61 | public function delimiter($delimiter) { 62 | $this->delimiter = $delimiter; 63 | 64 | return $this; 65 | } 66 | 67 | public function totalRows() { 68 | $count = 0; 69 | static::make($this->filePath, $this->fileType) 70 | ->onEachRow(function () use (&$count) { 71 | $count++; 72 | }) 73 | ->read(); 74 | return $count; 75 | } 76 | 77 | public function read() { 78 | $reader = ReaderFactory::createFromType($this->fileType); 79 | if ($this->fileType === Type::CSV) { 80 | $reader->setFieldDelimiter($this->delimiter); 81 | } 82 | $reader->open($this->filePath); 83 | 84 | foreach ($reader->getSheetIterator() as $sheet) { 85 | foreach ($sheet->getRowIterator() as $row_number => $row) { 86 | $index = $row_number - 1; 87 | if ($this->isIgnored($index)) continue; 88 | 89 | $row = $this->prepareRow($row->toArray(), $index); 90 | if($row){ 91 | call_user_func($this->rowCallback, $row, $index); 92 | } 93 | } 94 | } 95 | 96 | $reader->close(); 97 | 98 | return $this; 99 | } 100 | 101 | private function isIgnored($index) { 102 | return array_search($index, $this->ignoredRowsIndex) !== false; 103 | } 104 | 105 | protected function prepareRow($row, $index) { 106 | $row = $this->mapDataForColumns($row); 107 | $row = $this->middlewareManager->passThrough($this->middleware, $row, $index); 108 | 109 | return $row; 110 | } 111 | 112 | protected function mapDataForColumns($row) { 113 | if (count($this->columns) === 0) return $row; 114 | 115 | $data = []; 116 | foreach ($this->columns as $index => $column) { 117 | $data[$column] = isset($row[$index]) ? $row[$index] : null; 118 | } 119 | 120 | return $data; 121 | } 122 | 123 | public function onEachRow($callback) { 124 | $this->rowCallback = $callback; 125 | 126 | return $this; 127 | } 128 | 129 | public function applyMiddleware($middleware) { 130 | if(! is_array($middleware)){ 131 | $middleware = [$middleware]; 132 | } 133 | 134 | $this->middleware = array_merge($this->middleware, $middleware); 135 | 136 | return $this; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.org/mahmudkuet11/sheet.svg?branch=master)](https://travis-ci.org/mahmudkuet11/sheet) 2 | [![Latest Stable Version](https://poser.pugx.org/mahmud/sheet/v/stable)](https://packagist.org/packages/mahmud/sheet) 3 | [![License](https://poser.pugx.org/mahmud/sheet/license)](https://packagist.org/packages/mahmud/sheet) 4 | [![composer.lock](https://poser.pugx.org/mahmud/sheet/composerlock)](https://packagist.org/packages/mahmud/sheet) 5 | 6 | A clean and beautiful API to read Excel/CSV sheet. This is a wrapper around [box/spout](https://github.com/box/spout) package. 7 | 8 | # Installation 9 | 10 | ```bash 11 | composer require mahmud/sheet 12 | ``` 13 | 14 | # Requirements 15 | 16 | - php: ^7.1.3 17 | - box/spout: ^3.0 18 | 19 | # Usage 20 | 21 | ## Simple Example 22 | 23 | Let's assume we have a csv file like this. 24 | 25 | 26 | | ID | Name | Age | 27 | |----|--------|-----| 28 | | 1 | Mahmud | 27 | 29 | | 2 | Mohor | 26 | 30 | | 3 | Ayman | 1 | 31 | 32 | 33 | ```php 34 | use Mahmud\Sheet\SheetReader; 35 | 36 | SheetReader::makeFromCsv('/path-to-csv-file/example-file.csv') 37 | ->delimiter(",") // Optional: You can set delimiter for CSV file 38 | ->ignoreRow(0) // Optional: Skip the header row 39 | ->columns(['id', 'name', 'age']) // Arbitary column name that will be mapped sequentially for each row 40 | ->onEachRow(function($row, $index){ 41 | // This callback will be executed for each row 42 | var_dump($row); // Current row in associative array 43 | var_dump($index); // Current index of the row 44 | })->read(); 45 | ``` 46 | 47 | ## Middleware 48 | 49 | You can modify data of each row with middleware. See the following example 50 | 51 | ```php 52 | use Mahmud\Sheet\SheetReader; 53 | 54 | SheetReader::makeFromCsv('/path-to-csv-file/example-file.csv') 55 | ->delimiter(",") 56 | ->ignoreRow(0) 57 | ->columns(['id', 'name', 'age']) 58 | ->applyMiddleware(function($row, $index){ 59 | $row['age'] = $row['age'] . " Years"; 60 | 61 | return $row; 62 | }) 63 | ->onEachRow(function($row, $index){ 64 | var_dump($row); 65 | })->read(); 66 | 67 | ``` 68 | 69 | Another example using class as middleware 70 | 71 | ```php 72 | class AgeMiddleware{ 73 | public function handle($row, $index) { 74 | $row['age'] = $row['age'] . " Years"; 75 | 76 | return $row; 77 | } 78 | } 79 | 80 | SheetReader::makeFromCsv('/path-to-csv-file/example-file.csv') 81 | ->delimiter(",") 82 | ->ignoreRow(0) 83 | ->columns(['id', 'name', 'age']) 84 | ->applyMiddleware(new AgeMiddleware) 85 | ->onEachRow(function($row, $index){ 86 | var_dump($row); 87 | })->read(); 88 | 89 | ``` 90 | 91 | Also you can pass array of middlewares 92 | 93 | ```php 94 | SheetReader::makeFromCsv('/path-to-csv-file/example-file.csv') 95 | ->delimiter(",") 96 | ->ignoreRow(0) 97 | ->columns(['id', 'name', 'age']) 98 | ->applyMiddleware([ 99 | new AgeMiddleware, 100 | new AnotherMiddleware, 101 | ]) 102 | ->onEachRow(function($row, $index){ 103 | var_dump($row); 104 | })->read(); 105 | ``` 106 | 107 | If you return `null` from middleware, That row will be skipped and won't pass to `onEachRow` handler. 108 | 109 | ```php 110 | SheetReader::makeFromCsv('/path-to-csv-file/example-file.csv') 111 | ->delimiter(",") 112 | ->ignoreRow(0) 113 | ->columns(['id', 'name', 'age']) 114 | ->applyMiddleware(function($row){ 115 | if($row['id'] == 1){ 116 | return null; 117 | } 118 | 119 | return $row; 120 | }) 121 | ->onEachRow(function($row, $index){ 122 | var_dump($row); 123 | })->read(); 124 | ``` 125 | 126 | ## Count total rows 127 | 128 | ```php 129 | $total = SheetReader::makeFromCsv('/path-to-csv-file/example-file.csv') 130 | ->totalRows(); 131 | 132 | var_dump($total); // 4 133 | ``` 134 | -------------------------------------------------------------------------------- /tests/SheetReaderTest.php: -------------------------------------------------------------------------------- 1 | . 4 | */ 5 | 6 | namespace Mahmud\Sheet\Tests; 7 | 8 | use Mahmud\Sheet\SheetReader; 9 | use Mahmud\Sheet\Tests\dummy\Middleware\IndexCheckMiddleware; 10 | use PHPUnit\Framework\TestCase; 11 | 12 | class SheetReaderTest extends TestCase { 13 | /** 14 | * @test 15 | */ 16 | public function it_can_read_csv_file() { 17 | $data = []; 18 | SheetReader::makeFromCsv(__DIR__ . "/dummy/files/test1.csv") 19 | ->columns(['id', 'name', 'age']) 20 | ->onEachRow(function ($row, $index) use (&$data) { 21 | if ($index === 1) { 22 | $data = $row; 23 | } 24 | })->read(); 25 | $this->assertEquals([ 26 | 'id' => 1, 27 | 'name' => 'Mahmud', 28 | 'age' => 26 29 | ], $data); 30 | } 31 | 32 | /** 33 | * @test 34 | */ 35 | public function middleware_can_be_applied_to_row() { 36 | $data = []; 37 | SheetReader::makeFromCsv(__DIR__ . "/dummy/files/test1.csv") 38 | ->columns(['id', 'name', 'age']) 39 | ->ignoreRow(0) 40 | ->applyMiddleware(function ($row) { 41 | $row['url'] = 'https://mahmud.live'; 42 | 43 | return $row; 44 | }) 45 | ->onEachRow(function ($row, $index) use (&$data) { 46 | $data[] = $row; 47 | })->read(); 48 | 49 | $this->assertEquals([ 50 | 'id' => 1, 51 | 'name' => 'Mahmud', 52 | 'age' => 26, 53 | 'url' => 'https://mahmud.live' 54 | ], $data[0]); 55 | } 56 | 57 | /** 58 | * @test 59 | */ 60 | public function callback_wont_be_called_if_middleware_returns_null() { 61 | $data = []; 62 | SheetReader::makeFromCsv(__DIR__ . "/dummy/files/test1.csv") 63 | ->columns(['id', 'name', 'age']) 64 | ->ignoreRow(0) 65 | ->applyMiddleware(function ($row) { 66 | if($row['id'] == 2){ 67 | return null; 68 | } 69 | return $row; 70 | }) 71 | ->onEachRow(function ($row, $index) use (&$data) { 72 | $data[] = $row; 73 | })->read(); 74 | 75 | $this->assertEquals(1, count($data)); 76 | } 77 | 78 | /** 79 | * @test 80 | */ 81 | public function middleware_handler_will_receive_current_index_as_second_argument() { 82 | $indexes1 = []; 83 | $indexes2 = []; 84 | SheetReader::makeFromCsv(__DIR__ . "/dummy/files/test1.csv") 85 | ->columns(['id', 'name', 'age']) 86 | ->ignoreRow(0) 87 | ->applyMiddleware([ 88 | function ($row, $index) use (&$indexes1) { 89 | if(isset($index)){ 90 | $indexes1[] = $index; 91 | } 92 | return $row; 93 | }, 94 | new IndexCheckMiddleware(function($index) use (&$indexes2){ 95 | if(isset($index)){ 96 | $indexes2[] = $index; 97 | } 98 | }) 99 | ]) 100 | ->onEachRow(function ($row, $index) use (&$data) { 101 | $data[] = $row; 102 | })->read(); 103 | 104 | $this->assertTrue(count($indexes1) > 0); 105 | $this->assertTrue(count($indexes2) > 0); 106 | } 107 | 108 | /** 109 | * @test 110 | */ 111 | public function apply_middleware_can_be_called_multiple_times() { 112 | $isChanged = true; 113 | SheetReader::makeFromCsv(__DIR__ . "/dummy/files/test1.csv") 114 | ->columns(['id', 'name', 'age']) 115 | ->ignoreRow(0) 116 | ->applyMiddleware(function($row){ 117 | $row['name'] = "TEST"; 118 | 119 | return $row; 120 | }) 121 | ->applyMiddleware(function($row){ 122 | $row['age'] = "TEST"; 123 | 124 | return $row; 125 | }) 126 | ->onEachRow(function ($row, $index) use (&$isChanged) { 127 | if($row['name'] !== 'TEST' || $row['age'] !== "TEST"){ 128 | $isChanged = false; 129 | } 130 | })->read(); 131 | 132 | $this->assertTrue($isChanged); 133 | } 134 | 135 | /** 136 | * @test 137 | */ 138 | public function total_rows_can_be_counted() { 139 | $count = SheetReader::makeFromCsv(__DIR__ . "/dummy/files/test1.csv")->totalRows(); 140 | $this->assertEquals(3, $count); 141 | } 142 | } -------------------------------------------------------------------------------- /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#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "8d767fb748b1e9435d66ea39fe6ef80b", 8 | "packages": [ 9 | { 10 | "name": "box/spout", 11 | "version": "v3.1.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/box/spout.git", 15 | "reference": "7964dadc2128f3a00ffa393395b618ea115c8032" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/box/spout/zipball/7964dadc2128f3a00ffa393395b618ea115c8032", 20 | "reference": "7964dadc2128f3a00ffa393395b618ea115c8032", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-xmlreader": "*", 25 | "ext-zip": "*", 26 | "php": ">=7.1.0" 27 | }, 28 | "require-dev": { 29 | "friendsofphp/php-cs-fixer": "^2", 30 | "phpunit/phpunit": "^7" 31 | }, 32 | "suggest": { 33 | "ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)", 34 | "ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "3.1.x-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "psr-4": { 44 | "Box\\Spout\\": "src/Spout" 45 | } 46 | }, 47 | "notification-url": "https://packagist.org/downloads/", 48 | "license": [ 49 | "Apache-2.0" 50 | ], 51 | "authors": [ 52 | { 53 | "name": "Adrien Loison", 54 | "email": "adrien@box.com" 55 | } 56 | ], 57 | "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", 58 | "homepage": "https://www.github.com/box/spout", 59 | "keywords": [ 60 | "OOXML", 61 | "csv", 62 | "excel", 63 | "memory", 64 | "odf", 65 | "ods", 66 | "office", 67 | "open", 68 | "php", 69 | "read", 70 | "scale", 71 | "spreadsheet", 72 | "stream", 73 | "write", 74 | "xlsx" 75 | ], 76 | "time": "2019-12-02T21:21:41+00:00" 77 | } 78 | ], 79 | "packages-dev": [ 80 | { 81 | "name": "doctrine/instantiator", 82 | "version": "1.3.0", 83 | "source": { 84 | "type": "git", 85 | "url": "https://github.com/doctrine/instantiator.git", 86 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" 87 | }, 88 | "dist": { 89 | "type": "zip", 90 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", 91 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", 92 | "shasum": "" 93 | }, 94 | "require": { 95 | "php": "^7.1" 96 | }, 97 | "require-dev": { 98 | "doctrine/coding-standard": "^6.0", 99 | "ext-pdo": "*", 100 | "ext-phar": "*", 101 | "phpbench/phpbench": "^0.13", 102 | "phpstan/phpstan-phpunit": "^0.11", 103 | "phpstan/phpstan-shim": "^0.11", 104 | "phpunit/phpunit": "^7.0" 105 | }, 106 | "type": "library", 107 | "extra": { 108 | "branch-alias": { 109 | "dev-master": "1.2.x-dev" 110 | } 111 | }, 112 | "autoload": { 113 | "psr-4": { 114 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 115 | } 116 | }, 117 | "notification-url": "https://packagist.org/downloads/", 118 | "license": [ 119 | "MIT" 120 | ], 121 | "authors": [ 122 | { 123 | "name": "Marco Pivetta", 124 | "email": "ocramius@gmail.com", 125 | "homepage": "http://ocramius.github.com/" 126 | } 127 | ], 128 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 129 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 130 | "keywords": [ 131 | "constructor", 132 | "instantiate" 133 | ], 134 | "time": "2019-10-21T16:45:58+00:00" 135 | }, 136 | { 137 | "name": "hamcrest/hamcrest-php", 138 | "version": "v2.0.0", 139 | "source": { 140 | "type": "git", 141 | "url": "https://github.com/hamcrest/hamcrest-php.git", 142 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" 143 | }, 144 | "dist": { 145 | "type": "zip", 146 | "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", 147 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", 148 | "shasum": "" 149 | }, 150 | "require": { 151 | "php": "^5.3|^7.0" 152 | }, 153 | "replace": { 154 | "cordoval/hamcrest-php": "*", 155 | "davedevelopment/hamcrest-php": "*", 156 | "kodova/hamcrest-php": "*" 157 | }, 158 | "require-dev": { 159 | "phpunit/php-file-iterator": "1.3.3", 160 | "phpunit/phpunit": "~4.0", 161 | "satooshi/php-coveralls": "^1.0" 162 | }, 163 | "type": "library", 164 | "extra": { 165 | "branch-alias": { 166 | "dev-master": "2.0-dev" 167 | } 168 | }, 169 | "autoload": { 170 | "classmap": [ 171 | "hamcrest" 172 | ] 173 | }, 174 | "notification-url": "https://packagist.org/downloads/", 175 | "license": [ 176 | "BSD" 177 | ], 178 | "description": "This is the PHP port of Hamcrest Matchers", 179 | "keywords": [ 180 | "test" 181 | ], 182 | "time": "2016-01-20T08:20:44+00:00" 183 | }, 184 | { 185 | "name": "mockery/mockery", 186 | "version": "dev-master", 187 | "source": { 188 | "type": "git", 189 | "url": "https://github.com/mockery/mockery.git", 190 | "reference": "c21660612104ad072bbc3f0f3d934689160924dc" 191 | }, 192 | "dist": { 193 | "type": "zip", 194 | "url": "https://api.github.com/repos/mockery/mockery/zipball/c21660612104ad072bbc3f0f3d934689160924dc", 195 | "reference": "c21660612104ad072bbc3f0f3d934689160924dc", 196 | "shasum": "" 197 | }, 198 | "require": { 199 | "hamcrest/hamcrest-php": "~2.0", 200 | "lib-pcre": ">=7.0", 201 | "php": ">=5.6.0", 202 | "sebastian/comparator": "^1.2.4|^3.0" 203 | }, 204 | "require-dev": { 205 | "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" 206 | }, 207 | "type": "library", 208 | "extra": { 209 | "branch-alias": { 210 | "dev-master": "1.3.x-dev" 211 | } 212 | }, 213 | "autoload": { 214 | "psr-0": { 215 | "Mockery": "library/" 216 | } 217 | }, 218 | "notification-url": "https://packagist.org/downloads/", 219 | "license": [ 220 | "BSD-3-Clause" 221 | ], 222 | "authors": [ 223 | { 224 | "name": "Pádraic Brady", 225 | "email": "padraic.brady@gmail.com", 226 | "homepage": "http://blog.astrumfutura.com" 227 | }, 228 | { 229 | "name": "Dave Marshall", 230 | "email": "dave.marshall@atstsolutions.co.uk", 231 | "homepage": "http://davedevelopment.co.uk" 232 | } 233 | ], 234 | "description": "Mockery is a simple yet flexible PHP mock object framework", 235 | "homepage": "https://github.com/mockery/mockery", 236 | "keywords": [ 237 | "BDD", 238 | "TDD", 239 | "library", 240 | "mock", 241 | "mock objects", 242 | "mockery", 243 | "stub", 244 | "test", 245 | "test double", 246 | "testing" 247 | ], 248 | "time": "2019-12-04T04:23:30+00:00" 249 | }, 250 | { 251 | "name": "myclabs/deep-copy", 252 | "version": "1.9.3", 253 | "source": { 254 | "type": "git", 255 | "url": "https://github.com/myclabs/DeepCopy.git", 256 | "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" 257 | }, 258 | "dist": { 259 | "type": "zip", 260 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", 261 | "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", 262 | "shasum": "" 263 | }, 264 | "require": { 265 | "php": "^7.1" 266 | }, 267 | "replace": { 268 | "myclabs/deep-copy": "self.version" 269 | }, 270 | "require-dev": { 271 | "doctrine/collections": "^1.0", 272 | "doctrine/common": "^2.6", 273 | "phpunit/phpunit": "^7.1" 274 | }, 275 | "type": "library", 276 | "autoload": { 277 | "psr-4": { 278 | "DeepCopy\\": "src/DeepCopy/" 279 | }, 280 | "files": [ 281 | "src/DeepCopy/deep_copy.php" 282 | ] 283 | }, 284 | "notification-url": "https://packagist.org/downloads/", 285 | "license": [ 286 | "MIT" 287 | ], 288 | "description": "Create deep copies (clones) of your objects", 289 | "keywords": [ 290 | "clone", 291 | "copy", 292 | "duplicate", 293 | "object", 294 | "object graph" 295 | ], 296 | "time": "2019-08-09T12:45:53+00:00" 297 | }, 298 | { 299 | "name": "phar-io/manifest", 300 | "version": "1.0.3", 301 | "source": { 302 | "type": "git", 303 | "url": "https://github.com/phar-io/manifest.git", 304 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 305 | }, 306 | "dist": { 307 | "type": "zip", 308 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 309 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 310 | "shasum": "" 311 | }, 312 | "require": { 313 | "ext-dom": "*", 314 | "ext-phar": "*", 315 | "phar-io/version": "^2.0", 316 | "php": "^5.6 || ^7.0" 317 | }, 318 | "type": "library", 319 | "extra": { 320 | "branch-alias": { 321 | "dev-master": "1.0.x-dev" 322 | } 323 | }, 324 | "autoload": { 325 | "classmap": [ 326 | "src/" 327 | ] 328 | }, 329 | "notification-url": "https://packagist.org/downloads/", 330 | "license": [ 331 | "BSD-3-Clause" 332 | ], 333 | "authors": [ 334 | { 335 | "name": "Arne Blankerts", 336 | "email": "arne@blankerts.de", 337 | "role": "Developer" 338 | }, 339 | { 340 | "name": "Sebastian Heuer", 341 | "email": "sebastian@phpeople.de", 342 | "role": "Developer" 343 | }, 344 | { 345 | "name": "Sebastian Bergmann", 346 | "email": "sebastian@phpunit.de", 347 | "role": "Developer" 348 | } 349 | ], 350 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 351 | "time": "2018-07-08T19:23:20+00:00" 352 | }, 353 | { 354 | "name": "phar-io/version", 355 | "version": "2.0.1", 356 | "source": { 357 | "type": "git", 358 | "url": "https://github.com/phar-io/version.git", 359 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 360 | }, 361 | "dist": { 362 | "type": "zip", 363 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 364 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 365 | "shasum": "" 366 | }, 367 | "require": { 368 | "php": "^5.6 || ^7.0" 369 | }, 370 | "type": "library", 371 | "autoload": { 372 | "classmap": [ 373 | "src/" 374 | ] 375 | }, 376 | "notification-url": "https://packagist.org/downloads/", 377 | "license": [ 378 | "BSD-3-Clause" 379 | ], 380 | "authors": [ 381 | { 382 | "name": "Arne Blankerts", 383 | "email": "arne@blankerts.de", 384 | "role": "Developer" 385 | }, 386 | { 387 | "name": "Sebastian Heuer", 388 | "email": "sebastian@phpeople.de", 389 | "role": "Developer" 390 | }, 391 | { 392 | "name": "Sebastian Bergmann", 393 | "email": "sebastian@phpunit.de", 394 | "role": "Developer" 395 | } 396 | ], 397 | "description": "Library for handling version information and constraints", 398 | "time": "2018-07-08T19:19:57+00:00" 399 | }, 400 | { 401 | "name": "phpdocumentor/reflection-common", 402 | "version": "2.0.0", 403 | "source": { 404 | "type": "git", 405 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 406 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" 407 | }, 408 | "dist": { 409 | "type": "zip", 410 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", 411 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", 412 | "shasum": "" 413 | }, 414 | "require": { 415 | "php": ">=7.1" 416 | }, 417 | "require-dev": { 418 | "phpunit/phpunit": "~6" 419 | }, 420 | "type": "library", 421 | "extra": { 422 | "branch-alias": { 423 | "dev-master": "2.x-dev" 424 | } 425 | }, 426 | "autoload": { 427 | "psr-4": { 428 | "phpDocumentor\\Reflection\\": "src/" 429 | } 430 | }, 431 | "notification-url": "https://packagist.org/downloads/", 432 | "license": [ 433 | "MIT" 434 | ], 435 | "authors": [ 436 | { 437 | "name": "Jaap van Otterdijk", 438 | "email": "opensource@ijaap.nl" 439 | } 440 | ], 441 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 442 | "homepage": "http://www.phpdoc.org", 443 | "keywords": [ 444 | "FQSEN", 445 | "phpDocumentor", 446 | "phpdoc", 447 | "reflection", 448 | "static analysis" 449 | ], 450 | "time": "2018-08-07T13:53:10+00:00" 451 | }, 452 | { 453 | "name": "phpdocumentor/reflection-docblock", 454 | "version": "4.3.2", 455 | "source": { 456 | "type": "git", 457 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 458 | "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e" 459 | }, 460 | "dist": { 461 | "type": "zip", 462 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e", 463 | "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e", 464 | "shasum": "" 465 | }, 466 | "require": { 467 | "php": "^7.0", 468 | "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", 469 | "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", 470 | "webmozart/assert": "^1.0" 471 | }, 472 | "require-dev": { 473 | "doctrine/instantiator": "^1.0.5", 474 | "mockery/mockery": "^1.0", 475 | "phpunit/phpunit": "^6.4" 476 | }, 477 | "type": "library", 478 | "extra": { 479 | "branch-alias": { 480 | "dev-master": "4.x-dev" 481 | } 482 | }, 483 | "autoload": { 484 | "psr-4": { 485 | "phpDocumentor\\Reflection\\": [ 486 | "src/" 487 | ] 488 | } 489 | }, 490 | "notification-url": "https://packagist.org/downloads/", 491 | "license": [ 492 | "MIT" 493 | ], 494 | "authors": [ 495 | { 496 | "name": "Mike van Riel", 497 | "email": "me@mikevanriel.com" 498 | } 499 | ], 500 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 501 | "time": "2019-09-12T14:27:41+00:00" 502 | }, 503 | { 504 | "name": "phpdocumentor/type-resolver", 505 | "version": "1.0.1", 506 | "source": { 507 | "type": "git", 508 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 509 | "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" 510 | }, 511 | "dist": { 512 | "type": "zip", 513 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", 514 | "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", 515 | "shasum": "" 516 | }, 517 | "require": { 518 | "php": "^7.1", 519 | "phpdocumentor/reflection-common": "^2.0" 520 | }, 521 | "require-dev": { 522 | "ext-tokenizer": "^7.1", 523 | "mockery/mockery": "~1", 524 | "phpunit/phpunit": "^7.0" 525 | }, 526 | "type": "library", 527 | "extra": { 528 | "branch-alias": { 529 | "dev-master": "1.x-dev" 530 | } 531 | }, 532 | "autoload": { 533 | "psr-4": { 534 | "phpDocumentor\\Reflection\\": "src" 535 | } 536 | }, 537 | "notification-url": "https://packagist.org/downloads/", 538 | "license": [ 539 | "MIT" 540 | ], 541 | "authors": [ 542 | { 543 | "name": "Mike van Riel", 544 | "email": "me@mikevanriel.com" 545 | } 546 | ], 547 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 548 | "time": "2019-08-22T18:11:29+00:00" 549 | }, 550 | { 551 | "name": "phpspec/prophecy", 552 | "version": "1.9.0", 553 | "source": { 554 | "type": "git", 555 | "url": "https://github.com/phpspec/prophecy.git", 556 | "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" 557 | }, 558 | "dist": { 559 | "type": "zip", 560 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", 561 | "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", 562 | "shasum": "" 563 | }, 564 | "require": { 565 | "doctrine/instantiator": "^1.0.2", 566 | "php": "^5.3|^7.0", 567 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 568 | "sebastian/comparator": "^1.1|^2.0|^3.0", 569 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 570 | }, 571 | "require-dev": { 572 | "phpspec/phpspec": "^2.5|^3.2", 573 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 574 | }, 575 | "type": "library", 576 | "extra": { 577 | "branch-alias": { 578 | "dev-master": "1.8.x-dev" 579 | } 580 | }, 581 | "autoload": { 582 | "psr-4": { 583 | "Prophecy\\": "src/Prophecy" 584 | } 585 | }, 586 | "notification-url": "https://packagist.org/downloads/", 587 | "license": [ 588 | "MIT" 589 | ], 590 | "authors": [ 591 | { 592 | "name": "Konstantin Kudryashov", 593 | "email": "ever.zet@gmail.com", 594 | "homepage": "http://everzet.com" 595 | }, 596 | { 597 | "name": "Marcello Duarte", 598 | "email": "marcello.duarte@gmail.com" 599 | } 600 | ], 601 | "description": "Highly opinionated mocking framework for PHP 5.3+", 602 | "homepage": "https://github.com/phpspec/prophecy", 603 | "keywords": [ 604 | "Double", 605 | "Dummy", 606 | "fake", 607 | "mock", 608 | "spy", 609 | "stub" 610 | ], 611 | "time": "2019-10-03T11:07:50+00:00" 612 | }, 613 | { 614 | "name": "phpunit/php-code-coverage", 615 | "version": "6.1.4", 616 | "source": { 617 | "type": "git", 618 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 619 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" 620 | }, 621 | "dist": { 622 | "type": "zip", 623 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 624 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 625 | "shasum": "" 626 | }, 627 | "require": { 628 | "ext-dom": "*", 629 | "ext-xmlwriter": "*", 630 | "php": "^7.1", 631 | "phpunit/php-file-iterator": "^2.0", 632 | "phpunit/php-text-template": "^1.2.1", 633 | "phpunit/php-token-stream": "^3.0", 634 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 635 | "sebastian/environment": "^3.1 || ^4.0", 636 | "sebastian/version": "^2.0.1", 637 | "theseer/tokenizer": "^1.1" 638 | }, 639 | "require-dev": { 640 | "phpunit/phpunit": "^7.0" 641 | }, 642 | "suggest": { 643 | "ext-xdebug": "^2.6.0" 644 | }, 645 | "type": "library", 646 | "extra": { 647 | "branch-alias": { 648 | "dev-master": "6.1-dev" 649 | } 650 | }, 651 | "autoload": { 652 | "classmap": [ 653 | "src/" 654 | ] 655 | }, 656 | "notification-url": "https://packagist.org/downloads/", 657 | "license": [ 658 | "BSD-3-Clause" 659 | ], 660 | "authors": [ 661 | { 662 | "name": "Sebastian Bergmann", 663 | "email": "sebastian@phpunit.de", 664 | "role": "lead" 665 | } 666 | ], 667 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 668 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 669 | "keywords": [ 670 | "coverage", 671 | "testing", 672 | "xunit" 673 | ], 674 | "time": "2018-10-31T16:06:48+00:00" 675 | }, 676 | { 677 | "name": "phpunit/php-file-iterator", 678 | "version": "2.0.2", 679 | "source": { 680 | "type": "git", 681 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 682 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 683 | }, 684 | "dist": { 685 | "type": "zip", 686 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 687 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 688 | "shasum": "" 689 | }, 690 | "require": { 691 | "php": "^7.1" 692 | }, 693 | "require-dev": { 694 | "phpunit/phpunit": "^7.1" 695 | }, 696 | "type": "library", 697 | "extra": { 698 | "branch-alias": { 699 | "dev-master": "2.0.x-dev" 700 | } 701 | }, 702 | "autoload": { 703 | "classmap": [ 704 | "src/" 705 | ] 706 | }, 707 | "notification-url": "https://packagist.org/downloads/", 708 | "license": [ 709 | "BSD-3-Clause" 710 | ], 711 | "authors": [ 712 | { 713 | "name": "Sebastian Bergmann", 714 | "email": "sebastian@phpunit.de", 715 | "role": "lead" 716 | } 717 | ], 718 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 719 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 720 | "keywords": [ 721 | "filesystem", 722 | "iterator" 723 | ], 724 | "time": "2018-09-13T20:33:42+00:00" 725 | }, 726 | { 727 | "name": "phpunit/php-text-template", 728 | "version": "1.2.1", 729 | "source": { 730 | "type": "git", 731 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 732 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 733 | }, 734 | "dist": { 735 | "type": "zip", 736 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 737 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 738 | "shasum": "" 739 | }, 740 | "require": { 741 | "php": ">=5.3.3" 742 | }, 743 | "type": "library", 744 | "autoload": { 745 | "classmap": [ 746 | "src/" 747 | ] 748 | }, 749 | "notification-url": "https://packagist.org/downloads/", 750 | "license": [ 751 | "BSD-3-Clause" 752 | ], 753 | "authors": [ 754 | { 755 | "name": "Sebastian Bergmann", 756 | "email": "sebastian@phpunit.de", 757 | "role": "lead" 758 | } 759 | ], 760 | "description": "Simple template engine.", 761 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 762 | "keywords": [ 763 | "template" 764 | ], 765 | "time": "2015-06-21T13:50:34+00:00" 766 | }, 767 | { 768 | "name": "phpunit/php-timer", 769 | "version": "2.1.2", 770 | "source": { 771 | "type": "git", 772 | "url": "https://github.com/sebastianbergmann/php-timer.git", 773 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" 774 | }, 775 | "dist": { 776 | "type": "zip", 777 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", 778 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", 779 | "shasum": "" 780 | }, 781 | "require": { 782 | "php": "^7.1" 783 | }, 784 | "require-dev": { 785 | "phpunit/phpunit": "^7.0" 786 | }, 787 | "type": "library", 788 | "extra": { 789 | "branch-alias": { 790 | "dev-master": "2.1-dev" 791 | } 792 | }, 793 | "autoload": { 794 | "classmap": [ 795 | "src/" 796 | ] 797 | }, 798 | "notification-url": "https://packagist.org/downloads/", 799 | "license": [ 800 | "BSD-3-Clause" 801 | ], 802 | "authors": [ 803 | { 804 | "name": "Sebastian Bergmann", 805 | "email": "sebastian@phpunit.de", 806 | "role": "lead" 807 | } 808 | ], 809 | "description": "Utility class for timing", 810 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 811 | "keywords": [ 812 | "timer" 813 | ], 814 | "time": "2019-06-07T04:22:29+00:00" 815 | }, 816 | { 817 | "name": "phpunit/php-token-stream", 818 | "version": "3.1.1", 819 | "source": { 820 | "type": "git", 821 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 822 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" 823 | }, 824 | "dist": { 825 | "type": "zip", 826 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", 827 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", 828 | "shasum": "" 829 | }, 830 | "require": { 831 | "ext-tokenizer": "*", 832 | "php": "^7.1" 833 | }, 834 | "require-dev": { 835 | "phpunit/phpunit": "^7.0" 836 | }, 837 | "type": "library", 838 | "extra": { 839 | "branch-alias": { 840 | "dev-master": "3.1-dev" 841 | } 842 | }, 843 | "autoload": { 844 | "classmap": [ 845 | "src/" 846 | ] 847 | }, 848 | "notification-url": "https://packagist.org/downloads/", 849 | "license": [ 850 | "BSD-3-Clause" 851 | ], 852 | "authors": [ 853 | { 854 | "name": "Sebastian Bergmann", 855 | "email": "sebastian@phpunit.de" 856 | } 857 | ], 858 | "description": "Wrapper around PHP's tokenizer extension.", 859 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 860 | "keywords": [ 861 | "tokenizer" 862 | ], 863 | "time": "2019-09-17T06:23:10+00:00" 864 | }, 865 | { 866 | "name": "phpunit/phpunit", 867 | "version": "7.5.18", 868 | "source": { 869 | "type": "git", 870 | "url": "https://github.com/sebastianbergmann/phpunit.git", 871 | "reference": "fcf6c4bfafaadc07785528b06385cce88935474d" 872 | }, 873 | "dist": { 874 | "type": "zip", 875 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fcf6c4bfafaadc07785528b06385cce88935474d", 876 | "reference": "fcf6c4bfafaadc07785528b06385cce88935474d", 877 | "shasum": "" 878 | }, 879 | "require": { 880 | "doctrine/instantiator": "^1.1", 881 | "ext-dom": "*", 882 | "ext-json": "*", 883 | "ext-libxml": "*", 884 | "ext-mbstring": "*", 885 | "ext-xml": "*", 886 | "myclabs/deep-copy": "^1.7", 887 | "phar-io/manifest": "^1.0.2", 888 | "phar-io/version": "^2.0", 889 | "php": "^7.1", 890 | "phpspec/prophecy": "^1.7", 891 | "phpunit/php-code-coverage": "^6.0.7", 892 | "phpunit/php-file-iterator": "^2.0.1", 893 | "phpunit/php-text-template": "^1.2.1", 894 | "phpunit/php-timer": "^2.1", 895 | "sebastian/comparator": "^3.0", 896 | "sebastian/diff": "^3.0", 897 | "sebastian/environment": "^4.0", 898 | "sebastian/exporter": "^3.1", 899 | "sebastian/global-state": "^2.0", 900 | "sebastian/object-enumerator": "^3.0.3", 901 | "sebastian/resource-operations": "^2.0", 902 | "sebastian/version": "^2.0.1" 903 | }, 904 | "conflict": { 905 | "phpunit/phpunit-mock-objects": "*" 906 | }, 907 | "require-dev": { 908 | "ext-pdo": "*" 909 | }, 910 | "suggest": { 911 | "ext-soap": "*", 912 | "ext-xdebug": "*", 913 | "phpunit/php-invoker": "^2.0" 914 | }, 915 | "bin": [ 916 | "phpunit" 917 | ], 918 | "type": "library", 919 | "extra": { 920 | "branch-alias": { 921 | "dev-master": "7.5-dev" 922 | } 923 | }, 924 | "autoload": { 925 | "classmap": [ 926 | "src/" 927 | ] 928 | }, 929 | "notification-url": "https://packagist.org/downloads/", 930 | "license": [ 931 | "BSD-3-Clause" 932 | ], 933 | "authors": [ 934 | { 935 | "name": "Sebastian Bergmann", 936 | "email": "sebastian@phpunit.de", 937 | "role": "lead" 938 | } 939 | ], 940 | "description": "The PHP Unit Testing framework.", 941 | "homepage": "https://phpunit.de/", 942 | "keywords": [ 943 | "phpunit", 944 | "testing", 945 | "xunit" 946 | ], 947 | "time": "2019-12-06T05:14:37+00:00" 948 | }, 949 | { 950 | "name": "sebastian/code-unit-reverse-lookup", 951 | "version": "1.0.1", 952 | "source": { 953 | "type": "git", 954 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 955 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 956 | }, 957 | "dist": { 958 | "type": "zip", 959 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 960 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 961 | "shasum": "" 962 | }, 963 | "require": { 964 | "php": "^5.6 || ^7.0" 965 | }, 966 | "require-dev": { 967 | "phpunit/phpunit": "^5.7 || ^6.0" 968 | }, 969 | "type": "library", 970 | "extra": { 971 | "branch-alias": { 972 | "dev-master": "1.0.x-dev" 973 | } 974 | }, 975 | "autoload": { 976 | "classmap": [ 977 | "src/" 978 | ] 979 | }, 980 | "notification-url": "https://packagist.org/downloads/", 981 | "license": [ 982 | "BSD-3-Clause" 983 | ], 984 | "authors": [ 985 | { 986 | "name": "Sebastian Bergmann", 987 | "email": "sebastian@phpunit.de" 988 | } 989 | ], 990 | "description": "Looks up which function or method a line of code belongs to", 991 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 992 | "time": "2017-03-04T06:30:41+00:00" 993 | }, 994 | { 995 | "name": "sebastian/comparator", 996 | "version": "3.0.2", 997 | "source": { 998 | "type": "git", 999 | "url": "https://github.com/sebastianbergmann/comparator.git", 1000 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 1001 | }, 1002 | "dist": { 1003 | "type": "zip", 1004 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 1005 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 1006 | "shasum": "" 1007 | }, 1008 | "require": { 1009 | "php": "^7.1", 1010 | "sebastian/diff": "^3.0", 1011 | "sebastian/exporter": "^3.1" 1012 | }, 1013 | "require-dev": { 1014 | "phpunit/phpunit": "^7.1" 1015 | }, 1016 | "type": "library", 1017 | "extra": { 1018 | "branch-alias": { 1019 | "dev-master": "3.0-dev" 1020 | } 1021 | }, 1022 | "autoload": { 1023 | "classmap": [ 1024 | "src/" 1025 | ] 1026 | }, 1027 | "notification-url": "https://packagist.org/downloads/", 1028 | "license": [ 1029 | "BSD-3-Clause" 1030 | ], 1031 | "authors": [ 1032 | { 1033 | "name": "Jeff Welch", 1034 | "email": "whatthejeff@gmail.com" 1035 | }, 1036 | { 1037 | "name": "Volker Dusch", 1038 | "email": "github@wallbash.com" 1039 | }, 1040 | { 1041 | "name": "Bernhard Schussek", 1042 | "email": "bschussek@2bepublished.at" 1043 | }, 1044 | { 1045 | "name": "Sebastian Bergmann", 1046 | "email": "sebastian@phpunit.de" 1047 | } 1048 | ], 1049 | "description": "Provides the functionality to compare PHP values for equality", 1050 | "homepage": "https://github.com/sebastianbergmann/comparator", 1051 | "keywords": [ 1052 | "comparator", 1053 | "compare", 1054 | "equality" 1055 | ], 1056 | "time": "2018-07-12T15:12:46+00:00" 1057 | }, 1058 | { 1059 | "name": "sebastian/diff", 1060 | "version": "3.0.2", 1061 | "source": { 1062 | "type": "git", 1063 | "url": "https://github.com/sebastianbergmann/diff.git", 1064 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 1065 | }, 1066 | "dist": { 1067 | "type": "zip", 1068 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 1069 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 1070 | "shasum": "" 1071 | }, 1072 | "require": { 1073 | "php": "^7.1" 1074 | }, 1075 | "require-dev": { 1076 | "phpunit/phpunit": "^7.5 || ^8.0", 1077 | "symfony/process": "^2 || ^3.3 || ^4" 1078 | }, 1079 | "type": "library", 1080 | "extra": { 1081 | "branch-alias": { 1082 | "dev-master": "3.0-dev" 1083 | } 1084 | }, 1085 | "autoload": { 1086 | "classmap": [ 1087 | "src/" 1088 | ] 1089 | }, 1090 | "notification-url": "https://packagist.org/downloads/", 1091 | "license": [ 1092 | "BSD-3-Clause" 1093 | ], 1094 | "authors": [ 1095 | { 1096 | "name": "Kore Nordmann", 1097 | "email": "mail@kore-nordmann.de" 1098 | }, 1099 | { 1100 | "name": "Sebastian Bergmann", 1101 | "email": "sebastian@phpunit.de" 1102 | } 1103 | ], 1104 | "description": "Diff implementation", 1105 | "homepage": "https://github.com/sebastianbergmann/diff", 1106 | "keywords": [ 1107 | "diff", 1108 | "udiff", 1109 | "unidiff", 1110 | "unified diff" 1111 | ], 1112 | "time": "2019-02-04T06:01:07+00:00" 1113 | }, 1114 | { 1115 | "name": "sebastian/environment", 1116 | "version": "4.2.3", 1117 | "source": { 1118 | "type": "git", 1119 | "url": "https://github.com/sebastianbergmann/environment.git", 1120 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" 1121 | }, 1122 | "dist": { 1123 | "type": "zip", 1124 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 1125 | "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", 1126 | "shasum": "" 1127 | }, 1128 | "require": { 1129 | "php": "^7.1" 1130 | }, 1131 | "require-dev": { 1132 | "phpunit/phpunit": "^7.5" 1133 | }, 1134 | "suggest": { 1135 | "ext-posix": "*" 1136 | }, 1137 | "type": "library", 1138 | "extra": { 1139 | "branch-alias": { 1140 | "dev-master": "4.2-dev" 1141 | } 1142 | }, 1143 | "autoload": { 1144 | "classmap": [ 1145 | "src/" 1146 | ] 1147 | }, 1148 | "notification-url": "https://packagist.org/downloads/", 1149 | "license": [ 1150 | "BSD-3-Clause" 1151 | ], 1152 | "authors": [ 1153 | { 1154 | "name": "Sebastian Bergmann", 1155 | "email": "sebastian@phpunit.de" 1156 | } 1157 | ], 1158 | "description": "Provides functionality to handle HHVM/PHP environments", 1159 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1160 | "keywords": [ 1161 | "Xdebug", 1162 | "environment", 1163 | "hhvm" 1164 | ], 1165 | "time": "2019-11-20T08:46:58+00:00" 1166 | }, 1167 | { 1168 | "name": "sebastian/exporter", 1169 | "version": "3.1.2", 1170 | "source": { 1171 | "type": "git", 1172 | "url": "https://github.com/sebastianbergmann/exporter.git", 1173 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" 1174 | }, 1175 | "dist": { 1176 | "type": "zip", 1177 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", 1178 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", 1179 | "shasum": "" 1180 | }, 1181 | "require": { 1182 | "php": "^7.0", 1183 | "sebastian/recursion-context": "^3.0" 1184 | }, 1185 | "require-dev": { 1186 | "ext-mbstring": "*", 1187 | "phpunit/phpunit": "^6.0" 1188 | }, 1189 | "type": "library", 1190 | "extra": { 1191 | "branch-alias": { 1192 | "dev-master": "3.1.x-dev" 1193 | } 1194 | }, 1195 | "autoload": { 1196 | "classmap": [ 1197 | "src/" 1198 | ] 1199 | }, 1200 | "notification-url": "https://packagist.org/downloads/", 1201 | "license": [ 1202 | "BSD-3-Clause" 1203 | ], 1204 | "authors": [ 1205 | { 1206 | "name": "Sebastian Bergmann", 1207 | "email": "sebastian@phpunit.de" 1208 | }, 1209 | { 1210 | "name": "Jeff Welch", 1211 | "email": "whatthejeff@gmail.com" 1212 | }, 1213 | { 1214 | "name": "Volker Dusch", 1215 | "email": "github@wallbash.com" 1216 | }, 1217 | { 1218 | "name": "Adam Harvey", 1219 | "email": "aharvey@php.net" 1220 | }, 1221 | { 1222 | "name": "Bernhard Schussek", 1223 | "email": "bschussek@gmail.com" 1224 | } 1225 | ], 1226 | "description": "Provides the functionality to export PHP variables for visualization", 1227 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1228 | "keywords": [ 1229 | "export", 1230 | "exporter" 1231 | ], 1232 | "time": "2019-09-14T09:02:43+00:00" 1233 | }, 1234 | { 1235 | "name": "sebastian/global-state", 1236 | "version": "2.0.0", 1237 | "source": { 1238 | "type": "git", 1239 | "url": "https://github.com/sebastianbergmann/global-state.git", 1240 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 1241 | }, 1242 | "dist": { 1243 | "type": "zip", 1244 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1245 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1246 | "shasum": "" 1247 | }, 1248 | "require": { 1249 | "php": "^7.0" 1250 | }, 1251 | "require-dev": { 1252 | "phpunit/phpunit": "^6.0" 1253 | }, 1254 | "suggest": { 1255 | "ext-uopz": "*" 1256 | }, 1257 | "type": "library", 1258 | "extra": { 1259 | "branch-alias": { 1260 | "dev-master": "2.0-dev" 1261 | } 1262 | }, 1263 | "autoload": { 1264 | "classmap": [ 1265 | "src/" 1266 | ] 1267 | }, 1268 | "notification-url": "https://packagist.org/downloads/", 1269 | "license": [ 1270 | "BSD-3-Clause" 1271 | ], 1272 | "authors": [ 1273 | { 1274 | "name": "Sebastian Bergmann", 1275 | "email": "sebastian@phpunit.de" 1276 | } 1277 | ], 1278 | "description": "Snapshotting of global state", 1279 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1280 | "keywords": [ 1281 | "global state" 1282 | ], 1283 | "time": "2017-04-27T15:39:26+00:00" 1284 | }, 1285 | { 1286 | "name": "sebastian/object-enumerator", 1287 | "version": "3.0.3", 1288 | "source": { 1289 | "type": "git", 1290 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1291 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1292 | }, 1293 | "dist": { 1294 | "type": "zip", 1295 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1296 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1297 | "shasum": "" 1298 | }, 1299 | "require": { 1300 | "php": "^7.0", 1301 | "sebastian/object-reflector": "^1.1.1", 1302 | "sebastian/recursion-context": "^3.0" 1303 | }, 1304 | "require-dev": { 1305 | "phpunit/phpunit": "^6.0" 1306 | }, 1307 | "type": "library", 1308 | "extra": { 1309 | "branch-alias": { 1310 | "dev-master": "3.0.x-dev" 1311 | } 1312 | }, 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 | } 1327 | ], 1328 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1329 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1330 | "time": "2017-08-03T12:35:26+00:00" 1331 | }, 1332 | { 1333 | "name": "sebastian/object-reflector", 1334 | "version": "1.1.1", 1335 | "source": { 1336 | "type": "git", 1337 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1338 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 1339 | }, 1340 | "dist": { 1341 | "type": "zip", 1342 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 1343 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 1344 | "shasum": "" 1345 | }, 1346 | "require": { 1347 | "php": "^7.0" 1348 | }, 1349 | "require-dev": { 1350 | "phpunit/phpunit": "^6.0" 1351 | }, 1352 | "type": "library", 1353 | "extra": { 1354 | "branch-alias": { 1355 | "dev-master": "1.1-dev" 1356 | } 1357 | }, 1358 | "autoload": { 1359 | "classmap": [ 1360 | "src/" 1361 | ] 1362 | }, 1363 | "notification-url": "https://packagist.org/downloads/", 1364 | "license": [ 1365 | "BSD-3-Clause" 1366 | ], 1367 | "authors": [ 1368 | { 1369 | "name": "Sebastian Bergmann", 1370 | "email": "sebastian@phpunit.de" 1371 | } 1372 | ], 1373 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1374 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1375 | "time": "2017-03-29T09:07:27+00:00" 1376 | }, 1377 | { 1378 | "name": "sebastian/recursion-context", 1379 | "version": "3.0.0", 1380 | "source": { 1381 | "type": "git", 1382 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1383 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1384 | }, 1385 | "dist": { 1386 | "type": "zip", 1387 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1388 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1389 | "shasum": "" 1390 | }, 1391 | "require": { 1392 | "php": "^7.0" 1393 | }, 1394 | "require-dev": { 1395 | "phpunit/phpunit": "^6.0" 1396 | }, 1397 | "type": "library", 1398 | "extra": { 1399 | "branch-alias": { 1400 | "dev-master": "3.0.x-dev" 1401 | } 1402 | }, 1403 | "autoload": { 1404 | "classmap": [ 1405 | "src/" 1406 | ] 1407 | }, 1408 | "notification-url": "https://packagist.org/downloads/", 1409 | "license": [ 1410 | "BSD-3-Clause" 1411 | ], 1412 | "authors": [ 1413 | { 1414 | "name": "Jeff Welch", 1415 | "email": "whatthejeff@gmail.com" 1416 | }, 1417 | { 1418 | "name": "Sebastian Bergmann", 1419 | "email": "sebastian@phpunit.de" 1420 | }, 1421 | { 1422 | "name": "Adam Harvey", 1423 | "email": "aharvey@php.net" 1424 | } 1425 | ], 1426 | "description": "Provides functionality to recursively process PHP variables", 1427 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1428 | "time": "2017-03-03T06:23:57+00:00" 1429 | }, 1430 | { 1431 | "name": "sebastian/resource-operations", 1432 | "version": "2.0.1", 1433 | "source": { 1434 | "type": "git", 1435 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1436 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 1437 | }, 1438 | "dist": { 1439 | "type": "zip", 1440 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1441 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1442 | "shasum": "" 1443 | }, 1444 | "require": { 1445 | "php": "^7.1" 1446 | }, 1447 | "type": "library", 1448 | "extra": { 1449 | "branch-alias": { 1450 | "dev-master": "2.0-dev" 1451 | } 1452 | }, 1453 | "autoload": { 1454 | "classmap": [ 1455 | "src/" 1456 | ] 1457 | }, 1458 | "notification-url": "https://packagist.org/downloads/", 1459 | "license": [ 1460 | "BSD-3-Clause" 1461 | ], 1462 | "authors": [ 1463 | { 1464 | "name": "Sebastian Bergmann", 1465 | "email": "sebastian@phpunit.de" 1466 | } 1467 | ], 1468 | "description": "Provides a list of PHP built-in functions that operate on resources", 1469 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1470 | "time": "2018-10-04T04:07:39+00:00" 1471 | }, 1472 | { 1473 | "name": "sebastian/version", 1474 | "version": "2.0.1", 1475 | "source": { 1476 | "type": "git", 1477 | "url": "https://github.com/sebastianbergmann/version.git", 1478 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1479 | }, 1480 | "dist": { 1481 | "type": "zip", 1482 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1483 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1484 | "shasum": "" 1485 | }, 1486 | "require": { 1487 | "php": ">=5.6" 1488 | }, 1489 | "type": "library", 1490 | "extra": { 1491 | "branch-alias": { 1492 | "dev-master": "2.0.x-dev" 1493 | } 1494 | }, 1495 | "autoload": { 1496 | "classmap": [ 1497 | "src/" 1498 | ] 1499 | }, 1500 | "notification-url": "https://packagist.org/downloads/", 1501 | "license": [ 1502 | "BSD-3-Clause" 1503 | ], 1504 | "authors": [ 1505 | { 1506 | "name": "Sebastian Bergmann", 1507 | "email": "sebastian@phpunit.de", 1508 | "role": "lead" 1509 | } 1510 | ], 1511 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1512 | "homepage": "https://github.com/sebastianbergmann/version", 1513 | "time": "2016-10-03T07:35:21+00:00" 1514 | }, 1515 | { 1516 | "name": "symfony/polyfill-ctype", 1517 | "version": "v1.13.1", 1518 | "source": { 1519 | "type": "git", 1520 | "url": "https://github.com/symfony/polyfill-ctype.git", 1521 | "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" 1522 | }, 1523 | "dist": { 1524 | "type": "zip", 1525 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", 1526 | "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", 1527 | "shasum": "" 1528 | }, 1529 | "require": { 1530 | "php": ">=5.3.3" 1531 | }, 1532 | "suggest": { 1533 | "ext-ctype": "For best performance" 1534 | }, 1535 | "type": "library", 1536 | "extra": { 1537 | "branch-alias": { 1538 | "dev-master": "1.13-dev" 1539 | } 1540 | }, 1541 | "autoload": { 1542 | "psr-4": { 1543 | "Symfony\\Polyfill\\Ctype\\": "" 1544 | }, 1545 | "files": [ 1546 | "bootstrap.php" 1547 | ] 1548 | }, 1549 | "notification-url": "https://packagist.org/downloads/", 1550 | "license": [ 1551 | "MIT" 1552 | ], 1553 | "authors": [ 1554 | { 1555 | "name": "Gert de Pagter", 1556 | "email": "BackEndTea@gmail.com" 1557 | }, 1558 | { 1559 | "name": "Symfony Community", 1560 | "homepage": "https://symfony.com/contributors" 1561 | } 1562 | ], 1563 | "description": "Symfony polyfill for ctype functions", 1564 | "homepage": "https://symfony.com", 1565 | "keywords": [ 1566 | "compatibility", 1567 | "ctype", 1568 | "polyfill", 1569 | "portable" 1570 | ], 1571 | "time": "2019-11-27T13:56:44+00:00" 1572 | }, 1573 | { 1574 | "name": "theseer/tokenizer", 1575 | "version": "1.1.3", 1576 | "source": { 1577 | "type": "git", 1578 | "url": "https://github.com/theseer/tokenizer.git", 1579 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" 1580 | }, 1581 | "dist": { 1582 | "type": "zip", 1583 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1584 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1585 | "shasum": "" 1586 | }, 1587 | "require": { 1588 | "ext-dom": "*", 1589 | "ext-tokenizer": "*", 1590 | "ext-xmlwriter": "*", 1591 | "php": "^7.0" 1592 | }, 1593 | "type": "library", 1594 | "autoload": { 1595 | "classmap": [ 1596 | "src/" 1597 | ] 1598 | }, 1599 | "notification-url": "https://packagist.org/downloads/", 1600 | "license": [ 1601 | "BSD-3-Clause" 1602 | ], 1603 | "authors": [ 1604 | { 1605 | "name": "Arne Blankerts", 1606 | "email": "arne@blankerts.de", 1607 | "role": "Developer" 1608 | } 1609 | ], 1610 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1611 | "time": "2019-06-13T22:48:21+00:00" 1612 | }, 1613 | { 1614 | "name": "webmozart/assert", 1615 | "version": "1.6.0", 1616 | "source": { 1617 | "type": "git", 1618 | "url": "https://github.com/webmozart/assert.git", 1619 | "reference": "573381c0a64f155a0d9a23f4b0c797194805b925" 1620 | }, 1621 | "dist": { 1622 | "type": "zip", 1623 | "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925", 1624 | "reference": "573381c0a64f155a0d9a23f4b0c797194805b925", 1625 | "shasum": "" 1626 | }, 1627 | "require": { 1628 | "php": "^5.3.3 || ^7.0", 1629 | "symfony/polyfill-ctype": "^1.8" 1630 | }, 1631 | "conflict": { 1632 | "vimeo/psalm": "<3.6.0" 1633 | }, 1634 | "require-dev": { 1635 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 1636 | }, 1637 | "type": "library", 1638 | "autoload": { 1639 | "psr-4": { 1640 | "Webmozart\\Assert\\": "src/" 1641 | } 1642 | }, 1643 | "notification-url": "https://packagist.org/downloads/", 1644 | "license": [ 1645 | "MIT" 1646 | ], 1647 | "authors": [ 1648 | { 1649 | "name": "Bernhard Schussek", 1650 | "email": "bschussek@gmail.com" 1651 | } 1652 | ], 1653 | "description": "Assertions to validate method input/output with nice error messages.", 1654 | "keywords": [ 1655 | "assert", 1656 | "check", 1657 | "validate" 1658 | ], 1659 | "time": "2019-11-24T13:36:37+00:00" 1660 | } 1661 | ], 1662 | "aliases": [], 1663 | "minimum-stability": "dev", 1664 | "stability-flags": { 1665 | "mockery/mockery": 20 1666 | }, 1667 | "prefer-stable": true, 1668 | "prefer-lowest": false, 1669 | "platform": { 1670 | "php": "^7.1.3" 1671 | }, 1672 | "platform-dev": [] 1673 | } 1674 | --------------------------------------------------------------------------------