├── .circleci └── config.yml ├── .gitignore ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── phpunit.php ├── phpunit.xml ├── src ├── Cache.php ├── Dom.php ├── HtmlPieces.php ├── Imdb.php └── Response.php └── tests ├── CacheTest.php ├── HtmlPiecesTest.php ├── ImdbTest.php ├── ResponseTest.php └── index.php /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # PHP CircleCI 2.0 configuration file 2 | # See: https://circleci.com/docs/2.0/language-php/ 3 | version: 2 4 | 5 | # Define a job to be invoked later in a workflow. 6 | # See: https://circleci.com/docs/2.0/configuration-reference/#jobs 7 | jobs: 8 | test: 9 | # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. 10 | # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor 11 | docker: 12 | # Specify the version you desire here 13 | - image: cimg/php:8.3.0 14 | 15 | # Add steps to the job 16 | # See: https://circleci.com/docs/2.0/configuration-reference/#steps 17 | steps: 18 | - checkout 19 | 20 | # Download and cache dependencies 21 | - restore_cache: 22 | keys: 23 | # "composer.lock" can be used if it is committed to the repo 24 | - v1-dependencies-{{ checksum "composer.lock" }} 25 | # fallback to using the latest cache if no exact match is found 26 | - v1-dependencies- 27 | 28 | - run: 29 | name: Setup & install dependencies 30 | command: | 31 | composer install --no-interaction 32 | 33 | - run: 34 | name: Enable PCOV, disable Xdebug 35 | command: | 36 | mkdir -p ./build/logs 37 | sudo pecl install pcov 38 | 39 | - run: 40 | name: Tests 41 | command: | 42 | composer test 43 | # php ./vendor/bin/php-coveralls -v 44 | 45 | workflows: 46 | version: 2 47 | test: 48 | jobs: 49 | - test 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/* 2 | build/* 3 | src/cache/* 4 | .phpunit.result.cache 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2019 Harry Merritt 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP IMDB API 2 | 3 | [![Latest Stable Version](https://poser.pugx.org/hmerritt/imdb-api/v/stable)](https://packagist.org/packages/hmerritt/imdb-api) 4 | [![CircleCI](https://circleci.com/gh/hmerritt/php-imdb-api/tree/master.svg?style=svg)](https://circleci.com/gh/hmerritt/php-imdb-api/tree/master) 5 | [![Coverage Status](https://coveralls.io/repos/github/hmerritt/php-imdb-api/badge.svg?branch=master)](https://coveralls.io/github/hmerritt/php-imdb-api?branch=master) 6 | 7 | PHP IMDB-API that can fetch film data and search results. 8 | 9 | ## Install 10 | 11 | Install the latest version using [composer](https://getcomposer.org/). 12 | 13 | ``` 14 | $ composer require hmerritt/imdb-api 15 | ``` 16 | 17 | ## Usage 18 | 19 | ```php 20 | // Assuming you installed from Composer: 21 | require "vendor/autoload.php"; 22 | use hmerritt\Imdb; 23 | 24 | $imdb = new Imdb; 25 | 26 | // Search imdb 27 | // -> returns array of films and people found 28 | $imdb->search("Apocalypse"); 29 | 30 | // Get film data 31 | // -> returns array of film data (title, year, rating...) 32 | $imdb->film("tt0816692"); 33 | ``` 34 | 35 | ### Options 36 | 37 | | Name | Type | Default Value | Description | 38 | | ------------- | ------ | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | 39 | | `curlHeaders` | array | `['Accept-Language: en-US,en;q=0.5']` | Custom headers can be passed to `cURL` when fetching the IMDB page | 40 | | `cache` | bool | `true` | Caches film data to speed-up future requests for the same film | 41 | | `cacheType` | string | `file` or `redis` | Choose how the caching is done. Either a local file database, or connect to a redis server | 42 | | `cacheRedis` | array | `[ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, 'password' => '', 'database' => 0 ]` | Redis options | 43 | | `techSpecs` | bool | `true` | Loads a films technical specifications (this will take longer as it makes a separate request) | 44 | | `category` | string | `all` | What category to search for (films `tt`, people `nm` or companies `co`) | 45 | 46 | ```php 47 | $imdb = new Imdb; 48 | 49 | // Options are passed as an array as the second argument 50 | // These are the default options 51 | $imdb->film("tt0816692", [ 52 | 'cache' => true, 53 | 'curlHeaders' => ['Accept-Language: en-US,en;q=0.5'], 54 | 'techSpecs' => true, 55 | ]); 56 | 57 | $imdb->search("Interstellar", [ 58 | 'category' => 'all', 59 | 'curlHeaders' => ['Accept-Language: en-US,en;q=0.5'], 60 | ]); 61 | ``` 62 | 63 | ### Best Match 64 | 65 | If you do not know the imdb-id of a film, a search string can be entered. This will search imdb and use the first result as the film to fetch data for. 66 | 67 | > Note that this will take longer than just entering the ID as it needs to first search imdb before it can get the film data. 68 | 69 | ```php 70 | // Searches imdb and gets the film data of the first result 71 | // -> will return the film data for 'Apocalypse Now' 72 | $imdb->film("Apocalypse"); 73 | ``` 74 | 75 | ## Features 76 | 77 | ### Film Data 78 | 79 | ``` 80 | - Title 81 | - Genres 82 | - Year 83 | - Length 84 | - Plot 85 | - Rating 86 | - Rating Votes (# of votes) 87 | - Poster 88 | - Trailer 89 | - id 90 | - link 91 | - Cast 92 | - actor name 93 | - actor id 94 | - character 95 | - avatar 96 | - avatar_hq (high quality avatar) 97 | - Technical Specs 98 | ``` 99 | 100 | ### Search 101 | 102 | Search IMDB to return an array of films, people and companies 103 | 104 | ``` 105 | - Films 106 | - id 107 | - title 108 | - image 109 | - People 110 | - id 111 | - name 112 | - image 113 | - Companies 114 | - id 115 | - name 116 | - image 117 | ``` 118 | 119 | ## Dependencies 120 | 121 | > All dependencies are managed automatically by `composer`. 122 | 123 | - [php-html-parser](https://github.com/paquettg/php-html-parser) 124 | - [filebase](https://github.com/tmarois/Filebase) 125 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hmerritt/imdb-api", 3 | "description": "IMDB API that can fetch film data and search results", 4 | "keywords": ["imdb", "api", "film", "movie", "search"], 5 | "license": "Apache-2.0", 6 | "authors": [ 7 | { 8 | "name": "Harry Merritt", 9 | "email": "harry@mrrtt.me" 10 | } 11 | ], 12 | "type": "project", 13 | "require": { 14 | "php": ">=7.1", 15 | "paquettg/php-html-parser": "^2.1", 16 | "tmarois/filebase": "^1.0", 17 | "predis/predis": "^2.2" 18 | }, 19 | "require-dev": { 20 | "phpunit/phpunit": "9.5.16", 21 | "php-coveralls/php-coveralls": "2.5.2" 22 | }, 23 | "scripts": { 24 | "test": "php vendor/phpunit/phpunit/phpunit" 25 | }, 26 | "autoload": { 27 | "psr-4": { 28 | "hmerritt\\": "src/" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /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": "ff645d33987dc0e428b603aff80bb0fc", 8 | "packages": [ 9 | { 10 | "name": "paquettg/php-html-parser", 11 | "version": "2.2.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/paquettg/php-html-parser.git", 15 | "reference": "668c770fc5724ea3f15b8791435f054835be8d5e" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/paquettg/php-html-parser/zipball/668c770fc5724ea3f15b8791435f054835be8d5e", 20 | "reference": "668c770fc5724ea3f15b8791435f054835be8d5e", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-curl": "*", 25 | "ext-mbstring": "*", 26 | "ext-zlib": "*", 27 | "paquettg/string-encode": "~1.0.0", 28 | "php": ">=7.1" 29 | }, 30 | "require-dev": { 31 | "infection/infection": "^0.13.4", 32 | "mockery/mockery": "^1.2", 33 | "phan/phan": "^2.4", 34 | "php-coveralls/php-coveralls": "^2.1", 35 | "phpunit/phpunit": "^7.5.1" 36 | }, 37 | "type": "library", 38 | "autoload": { 39 | "psr-4": { 40 | "PHPHtmlParser\\": "src/PHPHtmlParser" 41 | } 42 | }, 43 | "notification-url": "https://packagist.org/downloads/", 44 | "license": [ 45 | "MIT" 46 | ], 47 | "authors": [ 48 | { 49 | "name": "Gilles Paquette", 50 | "email": "paquettg@gmail.com", 51 | "homepage": "http://gillespaquette.ca" 52 | } 53 | ], 54 | "description": "An HTML DOM parser. It allows you to manipulate HTML. Find tags on an HTML page with selectors just like jQuery.", 55 | "homepage": "https://github.com/paquettg/php-html-parser", 56 | "keywords": [ 57 | "dom", 58 | "html", 59 | "parser" 60 | ], 61 | "support": { 62 | "issues": "https://github.com/paquettg/php-html-parser/issues", 63 | "source": "https://github.com/paquettg/php-html-parser/tree/2.2.1" 64 | }, 65 | "time": "2020-01-20T12:59:15+00:00" 66 | }, 67 | { 68 | "name": "paquettg/string-encode", 69 | "version": "1.0.1", 70 | "source": { 71 | "type": "git", 72 | "url": "https://github.com/paquettg/string-encoder.git", 73 | "reference": "a8708e9fac9d5ddfc8fc2aac6004e2cd05d80fee" 74 | }, 75 | "dist": { 76 | "type": "zip", 77 | "url": "https://api.github.com/repos/paquettg/string-encoder/zipball/a8708e9fac9d5ddfc8fc2aac6004e2cd05d80fee", 78 | "reference": "a8708e9fac9d5ddfc8fc2aac6004e2cd05d80fee", 79 | "shasum": "" 80 | }, 81 | "require": { 82 | "php": ">=7.1" 83 | }, 84 | "require-dev": { 85 | "phpunit/phpunit": "^7.5.1" 86 | }, 87 | "type": "library", 88 | "autoload": { 89 | "psr-0": { 90 | "stringEncode": "src/" 91 | } 92 | }, 93 | "notification-url": "https://packagist.org/downloads/", 94 | "license": [ 95 | "MIT" 96 | ], 97 | "authors": [ 98 | { 99 | "name": "Gilles Paquette", 100 | "email": "paquettg@gmail.com", 101 | "homepage": "http://gillespaquette.ca" 102 | } 103 | ], 104 | "description": "Facilitating the process of altering string encoding in PHP.", 105 | "homepage": "https://github.com/paquettg/string-encoder", 106 | "keywords": [ 107 | "charset", 108 | "encoding", 109 | "string" 110 | ], 111 | "support": { 112 | "issues": "https://github.com/paquettg/string-encoder/issues", 113 | "source": "https://github.com/paquettg/string-encoder/tree/1.0.1" 114 | }, 115 | "time": "2018-12-21T02:25:09+00:00" 116 | }, 117 | { 118 | "name": "predis/predis", 119 | "version": "v2.2.2", 120 | "source": { 121 | "type": "git", 122 | "url": "https://github.com/predis/predis.git", 123 | "reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1" 124 | }, 125 | "dist": { 126 | "type": "zip", 127 | "url": "https://api.github.com/repos/predis/predis/zipball/b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", 128 | "reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", 129 | "shasum": "" 130 | }, 131 | "require": { 132 | "php": "^7.2 || ^8.0" 133 | }, 134 | "require-dev": { 135 | "friendsofphp/php-cs-fixer": "^3.3", 136 | "phpstan/phpstan": "^1.9", 137 | "phpunit/phpunit": "^8.0 || ~9.4.4" 138 | }, 139 | "suggest": { 140 | "ext-relay": "Faster connection with in-memory caching (>=0.6.2)" 141 | }, 142 | "type": "library", 143 | "autoload": { 144 | "psr-4": { 145 | "Predis\\": "src/" 146 | } 147 | }, 148 | "notification-url": "https://packagist.org/downloads/", 149 | "license": [ 150 | "MIT" 151 | ], 152 | "authors": [ 153 | { 154 | "name": "Till Krüss", 155 | "homepage": "https://till.im", 156 | "role": "Maintainer" 157 | } 158 | ], 159 | "description": "A flexible and feature-complete Redis client for PHP.", 160 | "homepage": "http://github.com/predis/predis", 161 | "keywords": [ 162 | "nosql", 163 | "predis", 164 | "redis" 165 | ], 166 | "support": { 167 | "issues": "https://github.com/predis/predis/issues", 168 | "source": "https://github.com/predis/predis/tree/v2.2.2" 169 | }, 170 | "funding": [ 171 | { 172 | "url": "https://github.com/sponsors/tillkruss", 173 | "type": "github" 174 | } 175 | ], 176 | "time": "2023-09-13T16:42:03+00:00" 177 | }, 178 | { 179 | "name": "tmarois/filebase", 180 | "version": "v1.0.24", 181 | "source": { 182 | "type": "git", 183 | "url": "https://github.com/tmarois/Filebase.git", 184 | "reference": "b660650472362e45f78d97cb395f09889196d164" 185 | }, 186 | "dist": { 187 | "type": "zip", 188 | "url": "https://api.github.com/repos/tmarois/Filebase/zipball/b660650472362e45f78d97cb395f09889196d164", 189 | "reference": "b660650472362e45f78d97cb395f09889196d164", 190 | "shasum": "" 191 | }, 192 | "require": { 193 | "php": ">=5.6" 194 | }, 195 | "require-dev": { 196 | "php-coveralls/php-coveralls": "^2.0", 197 | "phpunit/phpunit": "5.*", 198 | "symfony/yaml": "^3.4" 199 | }, 200 | "suggest": { 201 | "symfony/yaml": "Allows Yaml format" 202 | }, 203 | "type": "package", 204 | "autoload": { 205 | "psr-4": { 206 | "Filebase\\": "src/" 207 | } 208 | }, 209 | "notification-url": "https://packagist.org/downloads/", 210 | "authors": [ 211 | { 212 | "name": "Timothy Marois", 213 | "email": "timothymarois@gmail.com" 214 | } 215 | ], 216 | "description": "A Simple but Powerful Flat File Database Storage.", 217 | "homepage": "https://github.com/filebase/Filebase", 218 | "keywords": [ 219 | "database", 220 | "document", 221 | "file", 222 | "file-files", 223 | "filebase", 224 | "flat", 225 | "flat-file", 226 | "key-value", 227 | "serverless" 228 | ], 229 | "support": { 230 | "issues": "https://github.com/tmarois/Filebase/issues", 231 | "source": "https://github.com/tmarois/Filebase/tree/v1.0.24" 232 | }, 233 | "time": "2019-02-24T22:55:23+00:00" 234 | } 235 | ], 236 | "packages-dev": [ 237 | { 238 | "name": "doctrine/deprecations", 239 | "version": "1.1.2", 240 | "source": { 241 | "type": "git", 242 | "url": "https://github.com/doctrine/deprecations.git", 243 | "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" 244 | }, 245 | "dist": { 246 | "type": "zip", 247 | "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", 248 | "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", 249 | "shasum": "" 250 | }, 251 | "require": { 252 | "php": "^7.1 || ^8.0" 253 | }, 254 | "require-dev": { 255 | "doctrine/coding-standard": "^9", 256 | "phpstan/phpstan": "1.4.10 || 1.10.15", 257 | "phpstan/phpstan-phpunit": "^1.0", 258 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 259 | "psalm/plugin-phpunit": "0.18.4", 260 | "psr/log": "^1 || ^2 || ^3", 261 | "vimeo/psalm": "4.30.0 || 5.12.0" 262 | }, 263 | "suggest": { 264 | "psr/log": "Allows logging deprecations via PSR-3 logger implementation" 265 | }, 266 | "type": "library", 267 | "autoload": { 268 | "psr-4": { 269 | "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" 270 | } 271 | }, 272 | "notification-url": "https://packagist.org/downloads/", 273 | "license": [ 274 | "MIT" 275 | ], 276 | "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", 277 | "homepage": "https://www.doctrine-project.org/", 278 | "support": { 279 | "issues": "https://github.com/doctrine/deprecations/issues", 280 | "source": "https://github.com/doctrine/deprecations/tree/1.1.2" 281 | }, 282 | "time": "2023-09-27T20:04:15+00:00" 283 | }, 284 | { 285 | "name": "doctrine/instantiator", 286 | "version": "1.5.0", 287 | "source": { 288 | "type": "git", 289 | "url": "https://github.com/doctrine/instantiator.git", 290 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 291 | }, 292 | "dist": { 293 | "type": "zip", 294 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 295 | "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 296 | "shasum": "" 297 | }, 298 | "require": { 299 | "php": "^7.1 || ^8.0" 300 | }, 301 | "require-dev": { 302 | "doctrine/coding-standard": "^9 || ^11", 303 | "ext-pdo": "*", 304 | "ext-phar": "*", 305 | "phpbench/phpbench": "^0.16 || ^1", 306 | "phpstan/phpstan": "^1.4", 307 | "phpstan/phpstan-phpunit": "^1", 308 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 309 | "vimeo/psalm": "^4.30 || ^5.4" 310 | }, 311 | "type": "library", 312 | "autoload": { 313 | "psr-4": { 314 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 315 | } 316 | }, 317 | "notification-url": "https://packagist.org/downloads/", 318 | "license": [ 319 | "MIT" 320 | ], 321 | "authors": [ 322 | { 323 | "name": "Marco Pivetta", 324 | "email": "ocramius@gmail.com", 325 | "homepage": "https://ocramius.github.io/" 326 | } 327 | ], 328 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 329 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 330 | "keywords": [ 331 | "constructor", 332 | "instantiate" 333 | ], 334 | "support": { 335 | "issues": "https://github.com/doctrine/instantiator/issues", 336 | "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 337 | }, 338 | "funding": [ 339 | { 340 | "url": "https://www.doctrine-project.org/sponsorship.html", 341 | "type": "custom" 342 | }, 343 | { 344 | "url": "https://www.patreon.com/phpdoctrine", 345 | "type": "patreon" 346 | }, 347 | { 348 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 349 | "type": "tidelift" 350 | } 351 | ], 352 | "time": "2022-12-30T00:15:36+00:00" 353 | }, 354 | { 355 | "name": "guzzlehttp/guzzle", 356 | "version": "7.8.1", 357 | "source": { 358 | "type": "git", 359 | "url": "https://github.com/guzzle/guzzle.git", 360 | "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" 361 | }, 362 | "dist": { 363 | "type": "zip", 364 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", 365 | "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", 366 | "shasum": "" 367 | }, 368 | "require": { 369 | "ext-json": "*", 370 | "guzzlehttp/promises": "^1.5.3 || ^2.0.1", 371 | "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", 372 | "php": "^7.2.5 || ^8.0", 373 | "psr/http-client": "^1.0", 374 | "symfony/deprecation-contracts": "^2.2 || ^3.0" 375 | }, 376 | "provide": { 377 | "psr/http-client-implementation": "1.0" 378 | }, 379 | "require-dev": { 380 | "bamarni/composer-bin-plugin": "^1.8.2", 381 | "ext-curl": "*", 382 | "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", 383 | "php-http/message-factory": "^1.1", 384 | "phpunit/phpunit": "^8.5.36 || ^9.6.15", 385 | "psr/log": "^1.1 || ^2.0 || ^3.0" 386 | }, 387 | "suggest": { 388 | "ext-curl": "Required for CURL handler support", 389 | "ext-intl": "Required for Internationalized Domain Name (IDN) support", 390 | "psr/log": "Required for using the Log middleware" 391 | }, 392 | "type": "library", 393 | "extra": { 394 | "bamarni-bin": { 395 | "bin-links": true, 396 | "forward-command": false 397 | } 398 | }, 399 | "autoload": { 400 | "files": [ 401 | "src/functions_include.php" 402 | ], 403 | "psr-4": { 404 | "GuzzleHttp\\": "src/" 405 | } 406 | }, 407 | "notification-url": "https://packagist.org/downloads/", 408 | "license": [ 409 | "MIT" 410 | ], 411 | "authors": [ 412 | { 413 | "name": "Graham Campbell", 414 | "email": "hello@gjcampbell.co.uk", 415 | "homepage": "https://github.com/GrahamCampbell" 416 | }, 417 | { 418 | "name": "Michael Dowling", 419 | "email": "mtdowling@gmail.com", 420 | "homepage": "https://github.com/mtdowling" 421 | }, 422 | { 423 | "name": "Jeremy Lindblom", 424 | "email": "jeremeamia@gmail.com", 425 | "homepage": "https://github.com/jeremeamia" 426 | }, 427 | { 428 | "name": "George Mponos", 429 | "email": "gmponos@gmail.com", 430 | "homepage": "https://github.com/gmponos" 431 | }, 432 | { 433 | "name": "Tobias Nyholm", 434 | "email": "tobias.nyholm@gmail.com", 435 | "homepage": "https://github.com/Nyholm" 436 | }, 437 | { 438 | "name": "Márk Sági-Kazár", 439 | "email": "mark.sagikazar@gmail.com", 440 | "homepage": "https://github.com/sagikazarmark" 441 | }, 442 | { 443 | "name": "Tobias Schultze", 444 | "email": "webmaster@tubo-world.de", 445 | "homepage": "https://github.com/Tobion" 446 | } 447 | ], 448 | "description": "Guzzle is a PHP HTTP client library", 449 | "keywords": [ 450 | "client", 451 | "curl", 452 | "framework", 453 | "http", 454 | "http client", 455 | "psr-18", 456 | "psr-7", 457 | "rest", 458 | "web service" 459 | ], 460 | "support": { 461 | "issues": "https://github.com/guzzle/guzzle/issues", 462 | "source": "https://github.com/guzzle/guzzle/tree/7.8.1" 463 | }, 464 | "funding": [ 465 | { 466 | "url": "https://github.com/GrahamCampbell", 467 | "type": "github" 468 | }, 469 | { 470 | "url": "https://github.com/Nyholm", 471 | "type": "github" 472 | }, 473 | { 474 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", 475 | "type": "tidelift" 476 | } 477 | ], 478 | "time": "2023-12-03T20:35:24+00:00" 479 | }, 480 | { 481 | "name": "guzzlehttp/promises", 482 | "version": "2.0.2", 483 | "source": { 484 | "type": "git", 485 | "url": "https://github.com/guzzle/promises.git", 486 | "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" 487 | }, 488 | "dist": { 489 | "type": "zip", 490 | "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", 491 | "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", 492 | "shasum": "" 493 | }, 494 | "require": { 495 | "php": "^7.2.5 || ^8.0" 496 | }, 497 | "require-dev": { 498 | "bamarni/composer-bin-plugin": "^1.8.2", 499 | "phpunit/phpunit": "^8.5.36 || ^9.6.15" 500 | }, 501 | "type": "library", 502 | "extra": { 503 | "bamarni-bin": { 504 | "bin-links": true, 505 | "forward-command": false 506 | } 507 | }, 508 | "autoload": { 509 | "psr-4": { 510 | "GuzzleHttp\\Promise\\": "src/" 511 | } 512 | }, 513 | "notification-url": "https://packagist.org/downloads/", 514 | "license": [ 515 | "MIT" 516 | ], 517 | "authors": [ 518 | { 519 | "name": "Graham Campbell", 520 | "email": "hello@gjcampbell.co.uk", 521 | "homepage": "https://github.com/GrahamCampbell" 522 | }, 523 | { 524 | "name": "Michael Dowling", 525 | "email": "mtdowling@gmail.com", 526 | "homepage": "https://github.com/mtdowling" 527 | }, 528 | { 529 | "name": "Tobias Nyholm", 530 | "email": "tobias.nyholm@gmail.com", 531 | "homepage": "https://github.com/Nyholm" 532 | }, 533 | { 534 | "name": "Tobias Schultze", 535 | "email": "webmaster@tubo-world.de", 536 | "homepage": "https://github.com/Tobion" 537 | } 538 | ], 539 | "description": "Guzzle promises library", 540 | "keywords": [ 541 | "promise" 542 | ], 543 | "support": { 544 | "issues": "https://github.com/guzzle/promises/issues", 545 | "source": "https://github.com/guzzle/promises/tree/2.0.2" 546 | }, 547 | "funding": [ 548 | { 549 | "url": "https://github.com/GrahamCampbell", 550 | "type": "github" 551 | }, 552 | { 553 | "url": "https://github.com/Nyholm", 554 | "type": "github" 555 | }, 556 | { 557 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", 558 | "type": "tidelift" 559 | } 560 | ], 561 | "time": "2023-12-03T20:19:20+00:00" 562 | }, 563 | { 564 | "name": "guzzlehttp/psr7", 565 | "version": "2.6.2", 566 | "source": { 567 | "type": "git", 568 | "url": "https://github.com/guzzle/psr7.git", 569 | "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" 570 | }, 571 | "dist": { 572 | "type": "zip", 573 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", 574 | "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", 575 | "shasum": "" 576 | }, 577 | "require": { 578 | "php": "^7.2.5 || ^8.0", 579 | "psr/http-factory": "^1.0", 580 | "psr/http-message": "^1.1 || ^2.0", 581 | "ralouphie/getallheaders": "^3.0" 582 | }, 583 | "provide": { 584 | "psr/http-factory-implementation": "1.0", 585 | "psr/http-message-implementation": "1.0" 586 | }, 587 | "require-dev": { 588 | "bamarni/composer-bin-plugin": "^1.8.2", 589 | "http-interop/http-factory-tests": "^0.9", 590 | "phpunit/phpunit": "^8.5.36 || ^9.6.15" 591 | }, 592 | "suggest": { 593 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 594 | }, 595 | "type": "library", 596 | "extra": { 597 | "bamarni-bin": { 598 | "bin-links": true, 599 | "forward-command": false 600 | } 601 | }, 602 | "autoload": { 603 | "psr-4": { 604 | "GuzzleHttp\\Psr7\\": "src/" 605 | } 606 | }, 607 | "notification-url": "https://packagist.org/downloads/", 608 | "license": [ 609 | "MIT" 610 | ], 611 | "authors": [ 612 | { 613 | "name": "Graham Campbell", 614 | "email": "hello@gjcampbell.co.uk", 615 | "homepage": "https://github.com/GrahamCampbell" 616 | }, 617 | { 618 | "name": "Michael Dowling", 619 | "email": "mtdowling@gmail.com", 620 | "homepage": "https://github.com/mtdowling" 621 | }, 622 | { 623 | "name": "George Mponos", 624 | "email": "gmponos@gmail.com", 625 | "homepage": "https://github.com/gmponos" 626 | }, 627 | { 628 | "name": "Tobias Nyholm", 629 | "email": "tobias.nyholm@gmail.com", 630 | "homepage": "https://github.com/Nyholm" 631 | }, 632 | { 633 | "name": "Márk Sági-Kazár", 634 | "email": "mark.sagikazar@gmail.com", 635 | "homepage": "https://github.com/sagikazarmark" 636 | }, 637 | { 638 | "name": "Tobias Schultze", 639 | "email": "webmaster@tubo-world.de", 640 | "homepage": "https://github.com/Tobion" 641 | }, 642 | { 643 | "name": "Márk Sági-Kazár", 644 | "email": "mark.sagikazar@gmail.com", 645 | "homepage": "https://sagikazarmark.hu" 646 | } 647 | ], 648 | "description": "PSR-7 message implementation that also provides common utility methods", 649 | "keywords": [ 650 | "http", 651 | "message", 652 | "psr-7", 653 | "request", 654 | "response", 655 | "stream", 656 | "uri", 657 | "url" 658 | ], 659 | "support": { 660 | "issues": "https://github.com/guzzle/psr7/issues", 661 | "source": "https://github.com/guzzle/psr7/tree/2.6.2" 662 | }, 663 | "funding": [ 664 | { 665 | "url": "https://github.com/GrahamCampbell", 666 | "type": "github" 667 | }, 668 | { 669 | "url": "https://github.com/Nyholm", 670 | "type": "github" 671 | }, 672 | { 673 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", 674 | "type": "tidelift" 675 | } 676 | ], 677 | "time": "2023-12-03T20:05:35+00:00" 678 | }, 679 | { 680 | "name": "myclabs/deep-copy", 681 | "version": "1.11.1", 682 | "source": { 683 | "type": "git", 684 | "url": "https://github.com/myclabs/DeepCopy.git", 685 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" 686 | }, 687 | "dist": { 688 | "type": "zip", 689 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 690 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 691 | "shasum": "" 692 | }, 693 | "require": { 694 | "php": "^7.1 || ^8.0" 695 | }, 696 | "conflict": { 697 | "doctrine/collections": "<1.6.8", 698 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 699 | }, 700 | "require-dev": { 701 | "doctrine/collections": "^1.6.8", 702 | "doctrine/common": "^2.13.3 || ^3.2.2", 703 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 704 | }, 705 | "type": "library", 706 | "autoload": { 707 | "files": [ 708 | "src/DeepCopy/deep_copy.php" 709 | ], 710 | "psr-4": { 711 | "DeepCopy\\": "src/DeepCopy/" 712 | } 713 | }, 714 | "notification-url": "https://packagist.org/downloads/", 715 | "license": [ 716 | "MIT" 717 | ], 718 | "description": "Create deep copies (clones) of your objects", 719 | "keywords": [ 720 | "clone", 721 | "copy", 722 | "duplicate", 723 | "object", 724 | "object graph" 725 | ], 726 | "support": { 727 | "issues": "https://github.com/myclabs/DeepCopy/issues", 728 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" 729 | }, 730 | "funding": [ 731 | { 732 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 733 | "type": "tidelift" 734 | } 735 | ], 736 | "time": "2023-03-08T13:26:56+00:00" 737 | }, 738 | { 739 | "name": "nikic/php-parser", 740 | "version": "v4.18.0", 741 | "source": { 742 | "type": "git", 743 | "url": "https://github.com/nikic/PHP-Parser.git", 744 | "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" 745 | }, 746 | "dist": { 747 | "type": "zip", 748 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", 749 | "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", 750 | "shasum": "" 751 | }, 752 | "require": { 753 | "ext-tokenizer": "*", 754 | "php": ">=7.0" 755 | }, 756 | "require-dev": { 757 | "ircmaxell/php-yacc": "^0.0.7", 758 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 759 | }, 760 | "bin": [ 761 | "bin/php-parse" 762 | ], 763 | "type": "library", 764 | "extra": { 765 | "branch-alias": { 766 | "dev-master": "4.9-dev" 767 | } 768 | }, 769 | "autoload": { 770 | "psr-4": { 771 | "PhpParser\\": "lib/PhpParser" 772 | } 773 | }, 774 | "notification-url": "https://packagist.org/downloads/", 775 | "license": [ 776 | "BSD-3-Clause" 777 | ], 778 | "authors": [ 779 | { 780 | "name": "Nikita Popov" 781 | } 782 | ], 783 | "description": "A PHP parser written in PHP", 784 | "keywords": [ 785 | "parser", 786 | "php" 787 | ], 788 | "support": { 789 | "issues": "https://github.com/nikic/PHP-Parser/issues", 790 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" 791 | }, 792 | "time": "2023-12-10T21:03:43+00:00" 793 | }, 794 | { 795 | "name": "phar-io/manifest", 796 | "version": "2.0.3", 797 | "source": { 798 | "type": "git", 799 | "url": "https://github.com/phar-io/manifest.git", 800 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 801 | }, 802 | "dist": { 803 | "type": "zip", 804 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 805 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 806 | "shasum": "" 807 | }, 808 | "require": { 809 | "ext-dom": "*", 810 | "ext-phar": "*", 811 | "ext-xmlwriter": "*", 812 | "phar-io/version": "^3.0.1", 813 | "php": "^7.2 || ^8.0" 814 | }, 815 | "type": "library", 816 | "extra": { 817 | "branch-alias": { 818 | "dev-master": "2.0.x-dev" 819 | } 820 | }, 821 | "autoload": { 822 | "classmap": [ 823 | "src/" 824 | ] 825 | }, 826 | "notification-url": "https://packagist.org/downloads/", 827 | "license": [ 828 | "BSD-3-Clause" 829 | ], 830 | "authors": [ 831 | { 832 | "name": "Arne Blankerts", 833 | "email": "arne@blankerts.de", 834 | "role": "Developer" 835 | }, 836 | { 837 | "name": "Sebastian Heuer", 838 | "email": "sebastian@phpeople.de", 839 | "role": "Developer" 840 | }, 841 | { 842 | "name": "Sebastian Bergmann", 843 | "email": "sebastian@phpunit.de", 844 | "role": "Developer" 845 | } 846 | ], 847 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 848 | "support": { 849 | "issues": "https://github.com/phar-io/manifest/issues", 850 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 851 | }, 852 | "time": "2021-07-20T11:28:43+00:00" 853 | }, 854 | { 855 | "name": "phar-io/version", 856 | "version": "3.2.1", 857 | "source": { 858 | "type": "git", 859 | "url": "https://github.com/phar-io/version.git", 860 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 861 | }, 862 | "dist": { 863 | "type": "zip", 864 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 865 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 866 | "shasum": "" 867 | }, 868 | "require": { 869 | "php": "^7.2 || ^8.0" 870 | }, 871 | "type": "library", 872 | "autoload": { 873 | "classmap": [ 874 | "src/" 875 | ] 876 | }, 877 | "notification-url": "https://packagist.org/downloads/", 878 | "license": [ 879 | "BSD-3-Clause" 880 | ], 881 | "authors": [ 882 | { 883 | "name": "Arne Blankerts", 884 | "email": "arne@blankerts.de", 885 | "role": "Developer" 886 | }, 887 | { 888 | "name": "Sebastian Heuer", 889 | "email": "sebastian@phpeople.de", 890 | "role": "Developer" 891 | }, 892 | { 893 | "name": "Sebastian Bergmann", 894 | "email": "sebastian@phpunit.de", 895 | "role": "Developer" 896 | } 897 | ], 898 | "description": "Library for handling version information and constraints", 899 | "support": { 900 | "issues": "https://github.com/phar-io/version/issues", 901 | "source": "https://github.com/phar-io/version/tree/3.2.1" 902 | }, 903 | "time": "2022-02-21T01:04:05+00:00" 904 | }, 905 | { 906 | "name": "php-coveralls/php-coveralls", 907 | "version": "v2.5.2", 908 | "source": { 909 | "type": "git", 910 | "url": "https://github.com/php-coveralls/php-coveralls.git", 911 | "reference": "007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4" 912 | }, 913 | "dist": { 914 | "type": "zip", 915 | "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4", 916 | "reference": "007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4", 917 | "shasum": "" 918 | }, 919 | "require": { 920 | "ext-json": "*", 921 | "ext-simplexml": "*", 922 | "guzzlehttp/guzzle": "^6.0 || ^7.0", 923 | "php": "^5.5 || ^7.0 || ^8.0", 924 | "psr/log": "^1.0 || ^2.0", 925 | "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", 926 | "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", 927 | "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", 928 | "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" 929 | }, 930 | "require-dev": { 931 | "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0", 932 | "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" 933 | }, 934 | "suggest": { 935 | "symfony/http-kernel": "Allows Symfony integration" 936 | }, 937 | "bin": [ 938 | "bin/php-coveralls" 939 | ], 940 | "type": "library", 941 | "autoload": { 942 | "psr-4": { 943 | "PhpCoveralls\\": "src/" 944 | } 945 | }, 946 | "notification-url": "https://packagist.org/downloads/", 947 | "license": [ 948 | "MIT" 949 | ], 950 | "authors": [ 951 | { 952 | "name": "Kitamura Satoshi", 953 | "email": "with.no.parachute@gmail.com", 954 | "homepage": "https://www.facebook.com/satooshi.jp", 955 | "role": "Original creator" 956 | }, 957 | { 958 | "name": "Takashi Matsuo", 959 | "email": "tmatsuo@google.com" 960 | }, 961 | { 962 | "name": "Google Inc" 963 | }, 964 | { 965 | "name": "Dariusz Ruminski", 966 | "email": "dariusz.ruminski@gmail.com", 967 | "homepage": "https://github.com/keradus" 968 | }, 969 | { 970 | "name": "Contributors", 971 | "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" 972 | } 973 | ], 974 | "description": "PHP client library for Coveralls API", 975 | "homepage": "https://github.com/php-coveralls/php-coveralls", 976 | "keywords": [ 977 | "ci", 978 | "coverage", 979 | "github", 980 | "test" 981 | ], 982 | "support": { 983 | "issues": "https://github.com/php-coveralls/php-coveralls/issues", 984 | "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.2" 985 | }, 986 | "time": "2021-12-06T17:05:08+00:00" 987 | }, 988 | { 989 | "name": "phpdocumentor/reflection-common", 990 | "version": "2.2.0", 991 | "source": { 992 | "type": "git", 993 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 994 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 995 | }, 996 | "dist": { 997 | "type": "zip", 998 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 999 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 1000 | "shasum": "" 1001 | }, 1002 | "require": { 1003 | "php": "^7.2 || ^8.0" 1004 | }, 1005 | "type": "library", 1006 | "extra": { 1007 | "branch-alias": { 1008 | "dev-2.x": "2.x-dev" 1009 | } 1010 | }, 1011 | "autoload": { 1012 | "psr-4": { 1013 | "phpDocumentor\\Reflection\\": "src/" 1014 | } 1015 | }, 1016 | "notification-url": "https://packagist.org/downloads/", 1017 | "license": [ 1018 | "MIT" 1019 | ], 1020 | "authors": [ 1021 | { 1022 | "name": "Jaap van Otterdijk", 1023 | "email": "opensource@ijaap.nl" 1024 | } 1025 | ], 1026 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1027 | "homepage": "http://www.phpdoc.org", 1028 | "keywords": [ 1029 | "FQSEN", 1030 | "phpDocumentor", 1031 | "phpdoc", 1032 | "reflection", 1033 | "static analysis" 1034 | ], 1035 | "support": { 1036 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", 1037 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" 1038 | }, 1039 | "time": "2020-06-27T09:03:43+00:00" 1040 | }, 1041 | { 1042 | "name": "phpdocumentor/reflection-docblock", 1043 | "version": "5.3.0", 1044 | "source": { 1045 | "type": "git", 1046 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1047 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" 1048 | }, 1049 | "dist": { 1050 | "type": "zip", 1051 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", 1052 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", 1053 | "shasum": "" 1054 | }, 1055 | "require": { 1056 | "ext-filter": "*", 1057 | "php": "^7.2 || ^8.0", 1058 | "phpdocumentor/reflection-common": "^2.2", 1059 | "phpdocumentor/type-resolver": "^1.3", 1060 | "webmozart/assert": "^1.9.1" 1061 | }, 1062 | "require-dev": { 1063 | "mockery/mockery": "~1.3.2", 1064 | "psalm/phar": "^4.8" 1065 | }, 1066 | "type": "library", 1067 | "extra": { 1068 | "branch-alias": { 1069 | "dev-master": "5.x-dev" 1070 | } 1071 | }, 1072 | "autoload": { 1073 | "psr-4": { 1074 | "phpDocumentor\\Reflection\\": "src" 1075 | } 1076 | }, 1077 | "notification-url": "https://packagist.org/downloads/", 1078 | "license": [ 1079 | "MIT" 1080 | ], 1081 | "authors": [ 1082 | { 1083 | "name": "Mike van Riel", 1084 | "email": "me@mikevanriel.com" 1085 | }, 1086 | { 1087 | "name": "Jaap van Otterdijk", 1088 | "email": "account@ijaap.nl" 1089 | } 1090 | ], 1091 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1092 | "support": { 1093 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", 1094 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" 1095 | }, 1096 | "time": "2021-10-19T17:43:47+00:00" 1097 | }, 1098 | { 1099 | "name": "phpdocumentor/type-resolver", 1100 | "version": "1.7.3", 1101 | "source": { 1102 | "type": "git", 1103 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1104 | "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" 1105 | }, 1106 | "dist": { 1107 | "type": "zip", 1108 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", 1109 | "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", 1110 | "shasum": "" 1111 | }, 1112 | "require": { 1113 | "doctrine/deprecations": "^1.0", 1114 | "php": "^7.4 || ^8.0", 1115 | "phpdocumentor/reflection-common": "^2.0", 1116 | "phpstan/phpdoc-parser": "^1.13" 1117 | }, 1118 | "require-dev": { 1119 | "ext-tokenizer": "*", 1120 | "phpbench/phpbench": "^1.2", 1121 | "phpstan/extension-installer": "^1.1", 1122 | "phpstan/phpstan": "^1.8", 1123 | "phpstan/phpstan-phpunit": "^1.1", 1124 | "phpunit/phpunit": "^9.5", 1125 | "rector/rector": "^0.13.9", 1126 | "vimeo/psalm": "^4.25" 1127 | }, 1128 | "type": "library", 1129 | "extra": { 1130 | "branch-alias": { 1131 | "dev-1.x": "1.x-dev" 1132 | } 1133 | }, 1134 | "autoload": { 1135 | "psr-4": { 1136 | "phpDocumentor\\Reflection\\": "src" 1137 | } 1138 | }, 1139 | "notification-url": "https://packagist.org/downloads/", 1140 | "license": [ 1141 | "MIT" 1142 | ], 1143 | "authors": [ 1144 | { 1145 | "name": "Mike van Riel", 1146 | "email": "me@mikevanriel.com" 1147 | } 1148 | ], 1149 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 1150 | "support": { 1151 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues", 1152 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" 1153 | }, 1154 | "time": "2023-08-12T11:01:26+00:00" 1155 | }, 1156 | { 1157 | "name": "phpspec/prophecy", 1158 | "version": "v1.18.0", 1159 | "source": { 1160 | "type": "git", 1161 | "url": "https://github.com/phpspec/prophecy.git", 1162 | "reference": "d4f454f7e1193933f04e6500de3e79191648ed0c" 1163 | }, 1164 | "dist": { 1165 | "type": "zip", 1166 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d4f454f7e1193933f04e6500de3e79191648ed0c", 1167 | "reference": "d4f454f7e1193933f04e6500de3e79191648ed0c", 1168 | "shasum": "" 1169 | }, 1170 | "require": { 1171 | "doctrine/instantiator": "^1.2 || ^2.0", 1172 | "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.*", 1173 | "phpdocumentor/reflection-docblock": "^5.2", 1174 | "sebastian/comparator": "^3.0 || ^4.0 || ^5.0", 1175 | "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0" 1176 | }, 1177 | "require-dev": { 1178 | "phpspec/phpspec": "^6.0 || ^7.0", 1179 | "phpstan/phpstan": "^1.9", 1180 | "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0" 1181 | }, 1182 | "type": "library", 1183 | "extra": { 1184 | "branch-alias": { 1185 | "dev-master": "1.x-dev" 1186 | } 1187 | }, 1188 | "autoload": { 1189 | "psr-4": { 1190 | "Prophecy\\": "src/Prophecy" 1191 | } 1192 | }, 1193 | "notification-url": "https://packagist.org/downloads/", 1194 | "license": [ 1195 | "MIT" 1196 | ], 1197 | "authors": [ 1198 | { 1199 | "name": "Konstantin Kudryashov", 1200 | "email": "ever.zet@gmail.com", 1201 | "homepage": "http://everzet.com" 1202 | }, 1203 | { 1204 | "name": "Marcello Duarte", 1205 | "email": "marcello.duarte@gmail.com" 1206 | } 1207 | ], 1208 | "description": "Highly opinionated mocking framework for PHP 5.3+", 1209 | "homepage": "https://github.com/phpspec/prophecy", 1210 | "keywords": [ 1211 | "Double", 1212 | "Dummy", 1213 | "dev", 1214 | "fake", 1215 | "mock", 1216 | "spy", 1217 | "stub" 1218 | ], 1219 | "support": { 1220 | "issues": "https://github.com/phpspec/prophecy/issues", 1221 | "source": "https://github.com/phpspec/prophecy/tree/v1.18.0" 1222 | }, 1223 | "time": "2023-12-07T16:22:33+00:00" 1224 | }, 1225 | { 1226 | "name": "phpstan/phpdoc-parser", 1227 | "version": "1.24.5", 1228 | "source": { 1229 | "type": "git", 1230 | "url": "https://github.com/phpstan/phpdoc-parser.git", 1231 | "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" 1232 | }, 1233 | "dist": { 1234 | "type": "zip", 1235 | "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", 1236 | "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", 1237 | "shasum": "" 1238 | }, 1239 | "require": { 1240 | "php": "^7.2 || ^8.0" 1241 | }, 1242 | "require-dev": { 1243 | "doctrine/annotations": "^2.0", 1244 | "nikic/php-parser": "^4.15", 1245 | "php-parallel-lint/php-parallel-lint": "^1.2", 1246 | "phpstan/extension-installer": "^1.0", 1247 | "phpstan/phpstan": "^1.5", 1248 | "phpstan/phpstan-phpunit": "^1.1", 1249 | "phpstan/phpstan-strict-rules": "^1.0", 1250 | "phpunit/phpunit": "^9.5", 1251 | "symfony/process": "^5.2" 1252 | }, 1253 | "type": "library", 1254 | "autoload": { 1255 | "psr-4": { 1256 | "PHPStan\\PhpDocParser\\": [ 1257 | "src/" 1258 | ] 1259 | } 1260 | }, 1261 | "notification-url": "https://packagist.org/downloads/", 1262 | "license": [ 1263 | "MIT" 1264 | ], 1265 | "description": "PHPDoc parser with support for nullable, intersection and generic types", 1266 | "support": { 1267 | "issues": "https://github.com/phpstan/phpdoc-parser/issues", 1268 | "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" 1269 | }, 1270 | "time": "2023-12-16T09:33:33+00:00" 1271 | }, 1272 | { 1273 | "name": "phpunit/php-code-coverage", 1274 | "version": "9.2.29", 1275 | "source": { 1276 | "type": "git", 1277 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1278 | "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" 1279 | }, 1280 | "dist": { 1281 | "type": "zip", 1282 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", 1283 | "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", 1284 | "shasum": "" 1285 | }, 1286 | "require": { 1287 | "ext-dom": "*", 1288 | "ext-libxml": "*", 1289 | "ext-xmlwriter": "*", 1290 | "nikic/php-parser": "^4.15", 1291 | "php": ">=7.3", 1292 | "phpunit/php-file-iterator": "^3.0.3", 1293 | "phpunit/php-text-template": "^2.0.2", 1294 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 1295 | "sebastian/complexity": "^2.0", 1296 | "sebastian/environment": "^5.1.2", 1297 | "sebastian/lines-of-code": "^1.0.3", 1298 | "sebastian/version": "^3.0.1", 1299 | "theseer/tokenizer": "^1.2.0" 1300 | }, 1301 | "require-dev": { 1302 | "phpunit/phpunit": "^9.3" 1303 | }, 1304 | "suggest": { 1305 | "ext-pcov": "PHP extension that provides line coverage", 1306 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 1307 | }, 1308 | "type": "library", 1309 | "extra": { 1310 | "branch-alias": { 1311 | "dev-master": "9.2-dev" 1312 | } 1313 | }, 1314 | "autoload": { 1315 | "classmap": [ 1316 | "src/" 1317 | ] 1318 | }, 1319 | "notification-url": "https://packagist.org/downloads/", 1320 | "license": [ 1321 | "BSD-3-Clause" 1322 | ], 1323 | "authors": [ 1324 | { 1325 | "name": "Sebastian Bergmann", 1326 | "email": "sebastian@phpunit.de", 1327 | "role": "lead" 1328 | } 1329 | ], 1330 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1331 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1332 | "keywords": [ 1333 | "coverage", 1334 | "testing", 1335 | "xunit" 1336 | ], 1337 | "support": { 1338 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 1339 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 1340 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" 1341 | }, 1342 | "funding": [ 1343 | { 1344 | "url": "https://github.com/sebastianbergmann", 1345 | "type": "github" 1346 | } 1347 | ], 1348 | "time": "2023-09-19T04:57:46+00:00" 1349 | }, 1350 | { 1351 | "name": "phpunit/php-file-iterator", 1352 | "version": "3.0.6", 1353 | "source": { 1354 | "type": "git", 1355 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1356 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 1357 | }, 1358 | "dist": { 1359 | "type": "zip", 1360 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 1361 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 1362 | "shasum": "" 1363 | }, 1364 | "require": { 1365 | "php": ">=7.3" 1366 | }, 1367 | "require-dev": { 1368 | "phpunit/phpunit": "^9.3" 1369 | }, 1370 | "type": "library", 1371 | "extra": { 1372 | "branch-alias": { 1373 | "dev-master": "3.0-dev" 1374 | } 1375 | }, 1376 | "autoload": { 1377 | "classmap": [ 1378 | "src/" 1379 | ] 1380 | }, 1381 | "notification-url": "https://packagist.org/downloads/", 1382 | "license": [ 1383 | "BSD-3-Clause" 1384 | ], 1385 | "authors": [ 1386 | { 1387 | "name": "Sebastian Bergmann", 1388 | "email": "sebastian@phpunit.de", 1389 | "role": "lead" 1390 | } 1391 | ], 1392 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1393 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1394 | "keywords": [ 1395 | "filesystem", 1396 | "iterator" 1397 | ], 1398 | "support": { 1399 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 1400 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 1401 | }, 1402 | "funding": [ 1403 | { 1404 | "url": "https://github.com/sebastianbergmann", 1405 | "type": "github" 1406 | } 1407 | ], 1408 | "time": "2021-12-02T12:48:52+00:00" 1409 | }, 1410 | { 1411 | "name": "phpunit/php-invoker", 1412 | "version": "3.1.1", 1413 | "source": { 1414 | "type": "git", 1415 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 1416 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 1417 | }, 1418 | "dist": { 1419 | "type": "zip", 1420 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 1421 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 1422 | "shasum": "" 1423 | }, 1424 | "require": { 1425 | "php": ">=7.3" 1426 | }, 1427 | "require-dev": { 1428 | "ext-pcntl": "*", 1429 | "phpunit/phpunit": "^9.3" 1430 | }, 1431 | "suggest": { 1432 | "ext-pcntl": "*" 1433 | }, 1434 | "type": "library", 1435 | "extra": { 1436 | "branch-alias": { 1437 | "dev-master": "3.1-dev" 1438 | } 1439 | }, 1440 | "autoload": { 1441 | "classmap": [ 1442 | "src/" 1443 | ] 1444 | }, 1445 | "notification-url": "https://packagist.org/downloads/", 1446 | "license": [ 1447 | "BSD-3-Clause" 1448 | ], 1449 | "authors": [ 1450 | { 1451 | "name": "Sebastian Bergmann", 1452 | "email": "sebastian@phpunit.de", 1453 | "role": "lead" 1454 | } 1455 | ], 1456 | "description": "Invoke callables with a timeout", 1457 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 1458 | "keywords": [ 1459 | "process" 1460 | ], 1461 | "support": { 1462 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 1463 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 1464 | }, 1465 | "funding": [ 1466 | { 1467 | "url": "https://github.com/sebastianbergmann", 1468 | "type": "github" 1469 | } 1470 | ], 1471 | "time": "2020-09-28T05:58:55+00:00" 1472 | }, 1473 | { 1474 | "name": "phpunit/php-text-template", 1475 | "version": "2.0.4", 1476 | "source": { 1477 | "type": "git", 1478 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1479 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 1480 | }, 1481 | "dist": { 1482 | "type": "zip", 1483 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1484 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1485 | "shasum": "" 1486 | }, 1487 | "require": { 1488 | "php": ">=7.3" 1489 | }, 1490 | "require-dev": { 1491 | "phpunit/phpunit": "^9.3" 1492 | }, 1493 | "type": "library", 1494 | "extra": { 1495 | "branch-alias": { 1496 | "dev-master": "2.0-dev" 1497 | } 1498 | }, 1499 | "autoload": { 1500 | "classmap": [ 1501 | "src/" 1502 | ] 1503 | }, 1504 | "notification-url": "https://packagist.org/downloads/", 1505 | "license": [ 1506 | "BSD-3-Clause" 1507 | ], 1508 | "authors": [ 1509 | { 1510 | "name": "Sebastian Bergmann", 1511 | "email": "sebastian@phpunit.de", 1512 | "role": "lead" 1513 | } 1514 | ], 1515 | "description": "Simple template engine.", 1516 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1517 | "keywords": [ 1518 | "template" 1519 | ], 1520 | "support": { 1521 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1522 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 1523 | }, 1524 | "funding": [ 1525 | { 1526 | "url": "https://github.com/sebastianbergmann", 1527 | "type": "github" 1528 | } 1529 | ], 1530 | "time": "2020-10-26T05:33:50+00:00" 1531 | }, 1532 | { 1533 | "name": "phpunit/php-timer", 1534 | "version": "5.0.3", 1535 | "source": { 1536 | "type": "git", 1537 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1538 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 1539 | }, 1540 | "dist": { 1541 | "type": "zip", 1542 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1543 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 1544 | "shasum": "" 1545 | }, 1546 | "require": { 1547 | "php": ">=7.3" 1548 | }, 1549 | "require-dev": { 1550 | "phpunit/phpunit": "^9.3" 1551 | }, 1552 | "type": "library", 1553 | "extra": { 1554 | "branch-alias": { 1555 | "dev-master": "5.0-dev" 1556 | } 1557 | }, 1558 | "autoload": { 1559 | "classmap": [ 1560 | "src/" 1561 | ] 1562 | }, 1563 | "notification-url": "https://packagist.org/downloads/", 1564 | "license": [ 1565 | "BSD-3-Clause" 1566 | ], 1567 | "authors": [ 1568 | { 1569 | "name": "Sebastian Bergmann", 1570 | "email": "sebastian@phpunit.de", 1571 | "role": "lead" 1572 | } 1573 | ], 1574 | "description": "Utility class for timing", 1575 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1576 | "keywords": [ 1577 | "timer" 1578 | ], 1579 | "support": { 1580 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1581 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 1582 | }, 1583 | "funding": [ 1584 | { 1585 | "url": "https://github.com/sebastianbergmann", 1586 | "type": "github" 1587 | } 1588 | ], 1589 | "time": "2020-10-26T13:16:10+00:00" 1590 | }, 1591 | { 1592 | "name": "phpunit/phpunit", 1593 | "version": "9.5.16", 1594 | "source": { 1595 | "type": "git", 1596 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1597 | "reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc" 1598 | }, 1599 | "dist": { 1600 | "type": "zip", 1601 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ff8c545a50226c569310a35f4fa89d79f1ddfdc", 1602 | "reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc", 1603 | "shasum": "" 1604 | }, 1605 | "require": { 1606 | "doctrine/instantiator": "^1.3.1", 1607 | "ext-dom": "*", 1608 | "ext-json": "*", 1609 | "ext-libxml": "*", 1610 | "ext-mbstring": "*", 1611 | "ext-xml": "*", 1612 | "ext-xmlwriter": "*", 1613 | "myclabs/deep-copy": "^1.10.1", 1614 | "phar-io/manifest": "^2.0.3", 1615 | "phar-io/version": "^3.0.2", 1616 | "php": ">=7.3", 1617 | "phpspec/prophecy": "^1.12.1", 1618 | "phpunit/php-code-coverage": "^9.2.13", 1619 | "phpunit/php-file-iterator": "^3.0.5", 1620 | "phpunit/php-invoker": "^3.1.1", 1621 | "phpunit/php-text-template": "^2.0.3", 1622 | "phpunit/php-timer": "^5.0.2", 1623 | "sebastian/cli-parser": "^1.0.1", 1624 | "sebastian/code-unit": "^1.0.6", 1625 | "sebastian/comparator": "^4.0.5", 1626 | "sebastian/diff": "^4.0.3", 1627 | "sebastian/environment": "^5.1.3", 1628 | "sebastian/exporter": "^4.0.3", 1629 | "sebastian/global-state": "^5.0.1", 1630 | "sebastian/object-enumerator": "^4.0.3", 1631 | "sebastian/resource-operations": "^3.0.3", 1632 | "sebastian/type": "^2.3.4", 1633 | "sebastian/version": "^3.0.2" 1634 | }, 1635 | "require-dev": { 1636 | "ext-pdo": "*", 1637 | "phpspec/prophecy-phpunit": "^2.0.1" 1638 | }, 1639 | "suggest": { 1640 | "ext-soap": "*", 1641 | "ext-xdebug": "*" 1642 | }, 1643 | "bin": [ 1644 | "phpunit" 1645 | ], 1646 | "type": "library", 1647 | "extra": { 1648 | "branch-alias": { 1649 | "dev-master": "9.5-dev" 1650 | } 1651 | }, 1652 | "autoload": { 1653 | "files": [ 1654 | "src/Framework/Assert/Functions.php" 1655 | ], 1656 | "classmap": [ 1657 | "src/" 1658 | ] 1659 | }, 1660 | "notification-url": "https://packagist.org/downloads/", 1661 | "license": [ 1662 | "BSD-3-Clause" 1663 | ], 1664 | "authors": [ 1665 | { 1666 | "name": "Sebastian Bergmann", 1667 | "email": "sebastian@phpunit.de", 1668 | "role": "lead" 1669 | } 1670 | ], 1671 | "description": "The PHP Unit Testing framework.", 1672 | "homepage": "https://phpunit.de/", 1673 | "keywords": [ 1674 | "phpunit", 1675 | "testing", 1676 | "xunit" 1677 | ], 1678 | "support": { 1679 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1680 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.16" 1681 | }, 1682 | "funding": [ 1683 | { 1684 | "url": "https://phpunit.de/sponsors.html", 1685 | "type": "custom" 1686 | }, 1687 | { 1688 | "url": "https://github.com/sebastianbergmann", 1689 | "type": "github" 1690 | } 1691 | ], 1692 | "time": "2022-02-23T17:10:58+00:00" 1693 | }, 1694 | { 1695 | "name": "psr/container", 1696 | "version": "2.0.2", 1697 | "source": { 1698 | "type": "git", 1699 | "url": "https://github.com/php-fig/container.git", 1700 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1701 | }, 1702 | "dist": { 1703 | "type": "zip", 1704 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1705 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1706 | "shasum": "" 1707 | }, 1708 | "require": { 1709 | "php": ">=7.4.0" 1710 | }, 1711 | "type": "library", 1712 | "extra": { 1713 | "branch-alias": { 1714 | "dev-master": "2.0.x-dev" 1715 | } 1716 | }, 1717 | "autoload": { 1718 | "psr-4": { 1719 | "Psr\\Container\\": "src/" 1720 | } 1721 | }, 1722 | "notification-url": "https://packagist.org/downloads/", 1723 | "license": [ 1724 | "MIT" 1725 | ], 1726 | "authors": [ 1727 | { 1728 | "name": "PHP-FIG", 1729 | "homepage": "https://www.php-fig.org/" 1730 | } 1731 | ], 1732 | "description": "Common Container Interface (PHP FIG PSR-11)", 1733 | "homepage": "https://github.com/php-fig/container", 1734 | "keywords": [ 1735 | "PSR-11", 1736 | "container", 1737 | "container-interface", 1738 | "container-interop", 1739 | "psr" 1740 | ], 1741 | "support": { 1742 | "issues": "https://github.com/php-fig/container/issues", 1743 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1744 | }, 1745 | "time": "2021-11-05T16:47:00+00:00" 1746 | }, 1747 | { 1748 | "name": "psr/http-client", 1749 | "version": "1.0.3", 1750 | "source": { 1751 | "type": "git", 1752 | "url": "https://github.com/php-fig/http-client.git", 1753 | "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" 1754 | }, 1755 | "dist": { 1756 | "type": "zip", 1757 | "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", 1758 | "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", 1759 | "shasum": "" 1760 | }, 1761 | "require": { 1762 | "php": "^7.0 || ^8.0", 1763 | "psr/http-message": "^1.0 || ^2.0" 1764 | }, 1765 | "type": "library", 1766 | "extra": { 1767 | "branch-alias": { 1768 | "dev-master": "1.0.x-dev" 1769 | } 1770 | }, 1771 | "autoload": { 1772 | "psr-4": { 1773 | "Psr\\Http\\Client\\": "src/" 1774 | } 1775 | }, 1776 | "notification-url": "https://packagist.org/downloads/", 1777 | "license": [ 1778 | "MIT" 1779 | ], 1780 | "authors": [ 1781 | { 1782 | "name": "PHP-FIG", 1783 | "homepage": "https://www.php-fig.org/" 1784 | } 1785 | ], 1786 | "description": "Common interface for HTTP clients", 1787 | "homepage": "https://github.com/php-fig/http-client", 1788 | "keywords": [ 1789 | "http", 1790 | "http-client", 1791 | "psr", 1792 | "psr-18" 1793 | ], 1794 | "support": { 1795 | "source": "https://github.com/php-fig/http-client" 1796 | }, 1797 | "time": "2023-09-23T14:17:50+00:00" 1798 | }, 1799 | { 1800 | "name": "psr/http-factory", 1801 | "version": "1.0.2", 1802 | "source": { 1803 | "type": "git", 1804 | "url": "https://github.com/php-fig/http-factory.git", 1805 | "reference": "e616d01114759c4c489f93b099585439f795fe35" 1806 | }, 1807 | "dist": { 1808 | "type": "zip", 1809 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", 1810 | "reference": "e616d01114759c4c489f93b099585439f795fe35", 1811 | "shasum": "" 1812 | }, 1813 | "require": { 1814 | "php": ">=7.0.0", 1815 | "psr/http-message": "^1.0 || ^2.0" 1816 | }, 1817 | "type": "library", 1818 | "extra": { 1819 | "branch-alias": { 1820 | "dev-master": "1.0.x-dev" 1821 | } 1822 | }, 1823 | "autoload": { 1824 | "psr-4": { 1825 | "Psr\\Http\\Message\\": "src/" 1826 | } 1827 | }, 1828 | "notification-url": "https://packagist.org/downloads/", 1829 | "license": [ 1830 | "MIT" 1831 | ], 1832 | "authors": [ 1833 | { 1834 | "name": "PHP-FIG", 1835 | "homepage": "https://www.php-fig.org/" 1836 | } 1837 | ], 1838 | "description": "Common interfaces for PSR-7 HTTP message factories", 1839 | "keywords": [ 1840 | "factory", 1841 | "http", 1842 | "message", 1843 | "psr", 1844 | "psr-17", 1845 | "psr-7", 1846 | "request", 1847 | "response" 1848 | ], 1849 | "support": { 1850 | "source": "https://github.com/php-fig/http-factory/tree/1.0.2" 1851 | }, 1852 | "time": "2023-04-10T20:10:41+00:00" 1853 | }, 1854 | { 1855 | "name": "psr/http-message", 1856 | "version": "2.0", 1857 | "source": { 1858 | "type": "git", 1859 | "url": "https://github.com/php-fig/http-message.git", 1860 | "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" 1861 | }, 1862 | "dist": { 1863 | "type": "zip", 1864 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", 1865 | "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", 1866 | "shasum": "" 1867 | }, 1868 | "require": { 1869 | "php": "^7.2 || ^8.0" 1870 | }, 1871 | "type": "library", 1872 | "extra": { 1873 | "branch-alias": { 1874 | "dev-master": "2.0.x-dev" 1875 | } 1876 | }, 1877 | "autoload": { 1878 | "psr-4": { 1879 | "Psr\\Http\\Message\\": "src/" 1880 | } 1881 | }, 1882 | "notification-url": "https://packagist.org/downloads/", 1883 | "license": [ 1884 | "MIT" 1885 | ], 1886 | "authors": [ 1887 | { 1888 | "name": "PHP-FIG", 1889 | "homepage": "https://www.php-fig.org/" 1890 | } 1891 | ], 1892 | "description": "Common interface for HTTP messages", 1893 | "homepage": "https://github.com/php-fig/http-message", 1894 | "keywords": [ 1895 | "http", 1896 | "http-message", 1897 | "psr", 1898 | "psr-7", 1899 | "request", 1900 | "response" 1901 | ], 1902 | "support": { 1903 | "source": "https://github.com/php-fig/http-message/tree/2.0" 1904 | }, 1905 | "time": "2023-04-04T09:54:51+00:00" 1906 | }, 1907 | { 1908 | "name": "psr/log", 1909 | "version": "2.0.0", 1910 | "source": { 1911 | "type": "git", 1912 | "url": "https://github.com/php-fig/log.git", 1913 | "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" 1914 | }, 1915 | "dist": { 1916 | "type": "zip", 1917 | "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", 1918 | "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", 1919 | "shasum": "" 1920 | }, 1921 | "require": { 1922 | "php": ">=8.0.0" 1923 | }, 1924 | "type": "library", 1925 | "extra": { 1926 | "branch-alias": { 1927 | "dev-master": "2.0.x-dev" 1928 | } 1929 | }, 1930 | "autoload": { 1931 | "psr-4": { 1932 | "Psr\\Log\\": "src" 1933 | } 1934 | }, 1935 | "notification-url": "https://packagist.org/downloads/", 1936 | "license": [ 1937 | "MIT" 1938 | ], 1939 | "authors": [ 1940 | { 1941 | "name": "PHP-FIG", 1942 | "homepage": "https://www.php-fig.org/" 1943 | } 1944 | ], 1945 | "description": "Common interface for logging libraries", 1946 | "homepage": "https://github.com/php-fig/log", 1947 | "keywords": [ 1948 | "log", 1949 | "psr", 1950 | "psr-3" 1951 | ], 1952 | "support": { 1953 | "source": "https://github.com/php-fig/log/tree/2.0.0" 1954 | }, 1955 | "time": "2021-07-14T16:41:46+00:00" 1956 | }, 1957 | { 1958 | "name": "ralouphie/getallheaders", 1959 | "version": "3.0.3", 1960 | "source": { 1961 | "type": "git", 1962 | "url": "https://github.com/ralouphie/getallheaders.git", 1963 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 1964 | }, 1965 | "dist": { 1966 | "type": "zip", 1967 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 1968 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 1969 | "shasum": "" 1970 | }, 1971 | "require": { 1972 | "php": ">=5.6" 1973 | }, 1974 | "require-dev": { 1975 | "php-coveralls/php-coveralls": "^2.1", 1976 | "phpunit/phpunit": "^5 || ^6.5" 1977 | }, 1978 | "type": "library", 1979 | "autoload": { 1980 | "files": [ 1981 | "src/getallheaders.php" 1982 | ] 1983 | }, 1984 | "notification-url": "https://packagist.org/downloads/", 1985 | "license": [ 1986 | "MIT" 1987 | ], 1988 | "authors": [ 1989 | { 1990 | "name": "Ralph Khattar", 1991 | "email": "ralph.khattar@gmail.com" 1992 | } 1993 | ], 1994 | "description": "A polyfill for getallheaders.", 1995 | "support": { 1996 | "issues": "https://github.com/ralouphie/getallheaders/issues", 1997 | "source": "https://github.com/ralouphie/getallheaders/tree/develop" 1998 | }, 1999 | "time": "2019-03-08T08:55:37+00:00" 2000 | }, 2001 | { 2002 | "name": "sebastian/cli-parser", 2003 | "version": "1.0.1", 2004 | "source": { 2005 | "type": "git", 2006 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 2007 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 2008 | }, 2009 | "dist": { 2010 | "type": "zip", 2011 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 2012 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 2013 | "shasum": "" 2014 | }, 2015 | "require": { 2016 | "php": ">=7.3" 2017 | }, 2018 | "require-dev": { 2019 | "phpunit/phpunit": "^9.3" 2020 | }, 2021 | "type": "library", 2022 | "extra": { 2023 | "branch-alias": { 2024 | "dev-master": "1.0-dev" 2025 | } 2026 | }, 2027 | "autoload": { 2028 | "classmap": [ 2029 | "src/" 2030 | ] 2031 | }, 2032 | "notification-url": "https://packagist.org/downloads/", 2033 | "license": [ 2034 | "BSD-3-Clause" 2035 | ], 2036 | "authors": [ 2037 | { 2038 | "name": "Sebastian Bergmann", 2039 | "email": "sebastian@phpunit.de", 2040 | "role": "lead" 2041 | } 2042 | ], 2043 | "description": "Library for parsing CLI options", 2044 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 2045 | "support": { 2046 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 2047 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 2048 | }, 2049 | "funding": [ 2050 | { 2051 | "url": "https://github.com/sebastianbergmann", 2052 | "type": "github" 2053 | } 2054 | ], 2055 | "time": "2020-09-28T06:08:49+00:00" 2056 | }, 2057 | { 2058 | "name": "sebastian/code-unit", 2059 | "version": "1.0.8", 2060 | "source": { 2061 | "type": "git", 2062 | "url": "https://github.com/sebastianbergmann/code-unit.git", 2063 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 2064 | }, 2065 | "dist": { 2066 | "type": "zip", 2067 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 2068 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 2069 | "shasum": "" 2070 | }, 2071 | "require": { 2072 | "php": ">=7.3" 2073 | }, 2074 | "require-dev": { 2075 | "phpunit/phpunit": "^9.3" 2076 | }, 2077 | "type": "library", 2078 | "extra": { 2079 | "branch-alias": { 2080 | "dev-master": "1.0-dev" 2081 | } 2082 | }, 2083 | "autoload": { 2084 | "classmap": [ 2085 | "src/" 2086 | ] 2087 | }, 2088 | "notification-url": "https://packagist.org/downloads/", 2089 | "license": [ 2090 | "BSD-3-Clause" 2091 | ], 2092 | "authors": [ 2093 | { 2094 | "name": "Sebastian Bergmann", 2095 | "email": "sebastian@phpunit.de", 2096 | "role": "lead" 2097 | } 2098 | ], 2099 | "description": "Collection of value objects that represent the PHP code units", 2100 | "homepage": "https://github.com/sebastianbergmann/code-unit", 2101 | "support": { 2102 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 2103 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 2104 | }, 2105 | "funding": [ 2106 | { 2107 | "url": "https://github.com/sebastianbergmann", 2108 | "type": "github" 2109 | } 2110 | ], 2111 | "time": "2020-10-26T13:08:54+00:00" 2112 | }, 2113 | { 2114 | "name": "sebastian/code-unit-reverse-lookup", 2115 | "version": "2.0.3", 2116 | "source": { 2117 | "type": "git", 2118 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2119 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 2120 | }, 2121 | "dist": { 2122 | "type": "zip", 2123 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 2124 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 2125 | "shasum": "" 2126 | }, 2127 | "require": { 2128 | "php": ">=7.3" 2129 | }, 2130 | "require-dev": { 2131 | "phpunit/phpunit": "^9.3" 2132 | }, 2133 | "type": "library", 2134 | "extra": { 2135 | "branch-alias": { 2136 | "dev-master": "2.0-dev" 2137 | } 2138 | }, 2139 | "autoload": { 2140 | "classmap": [ 2141 | "src/" 2142 | ] 2143 | }, 2144 | "notification-url": "https://packagist.org/downloads/", 2145 | "license": [ 2146 | "BSD-3-Clause" 2147 | ], 2148 | "authors": [ 2149 | { 2150 | "name": "Sebastian Bergmann", 2151 | "email": "sebastian@phpunit.de" 2152 | } 2153 | ], 2154 | "description": "Looks up which function or method a line of code belongs to", 2155 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 2156 | "support": { 2157 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 2158 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 2159 | }, 2160 | "funding": [ 2161 | { 2162 | "url": "https://github.com/sebastianbergmann", 2163 | "type": "github" 2164 | } 2165 | ], 2166 | "time": "2020-09-28T05:30:19+00:00" 2167 | }, 2168 | { 2169 | "name": "sebastian/comparator", 2170 | "version": "4.0.8", 2171 | "source": { 2172 | "type": "git", 2173 | "url": "https://github.com/sebastianbergmann/comparator.git", 2174 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 2175 | }, 2176 | "dist": { 2177 | "type": "zip", 2178 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 2179 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 2180 | "shasum": "" 2181 | }, 2182 | "require": { 2183 | "php": ">=7.3", 2184 | "sebastian/diff": "^4.0", 2185 | "sebastian/exporter": "^4.0" 2186 | }, 2187 | "require-dev": { 2188 | "phpunit/phpunit": "^9.3" 2189 | }, 2190 | "type": "library", 2191 | "extra": { 2192 | "branch-alias": { 2193 | "dev-master": "4.0-dev" 2194 | } 2195 | }, 2196 | "autoload": { 2197 | "classmap": [ 2198 | "src/" 2199 | ] 2200 | }, 2201 | "notification-url": "https://packagist.org/downloads/", 2202 | "license": [ 2203 | "BSD-3-Clause" 2204 | ], 2205 | "authors": [ 2206 | { 2207 | "name": "Sebastian Bergmann", 2208 | "email": "sebastian@phpunit.de" 2209 | }, 2210 | { 2211 | "name": "Jeff Welch", 2212 | "email": "whatthejeff@gmail.com" 2213 | }, 2214 | { 2215 | "name": "Volker Dusch", 2216 | "email": "github@wallbash.com" 2217 | }, 2218 | { 2219 | "name": "Bernhard Schussek", 2220 | "email": "bschussek@2bepublished.at" 2221 | } 2222 | ], 2223 | "description": "Provides the functionality to compare PHP values for equality", 2224 | "homepage": "https://github.com/sebastianbergmann/comparator", 2225 | "keywords": [ 2226 | "comparator", 2227 | "compare", 2228 | "equality" 2229 | ], 2230 | "support": { 2231 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 2232 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 2233 | }, 2234 | "funding": [ 2235 | { 2236 | "url": "https://github.com/sebastianbergmann", 2237 | "type": "github" 2238 | } 2239 | ], 2240 | "time": "2022-09-14T12:41:17+00:00" 2241 | }, 2242 | { 2243 | "name": "sebastian/complexity", 2244 | "version": "2.0.2", 2245 | "source": { 2246 | "type": "git", 2247 | "url": "https://github.com/sebastianbergmann/complexity.git", 2248 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 2249 | }, 2250 | "dist": { 2251 | "type": "zip", 2252 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 2253 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 2254 | "shasum": "" 2255 | }, 2256 | "require": { 2257 | "nikic/php-parser": "^4.7", 2258 | "php": ">=7.3" 2259 | }, 2260 | "require-dev": { 2261 | "phpunit/phpunit": "^9.3" 2262 | }, 2263 | "type": "library", 2264 | "extra": { 2265 | "branch-alias": { 2266 | "dev-master": "2.0-dev" 2267 | } 2268 | }, 2269 | "autoload": { 2270 | "classmap": [ 2271 | "src/" 2272 | ] 2273 | }, 2274 | "notification-url": "https://packagist.org/downloads/", 2275 | "license": [ 2276 | "BSD-3-Clause" 2277 | ], 2278 | "authors": [ 2279 | { 2280 | "name": "Sebastian Bergmann", 2281 | "email": "sebastian@phpunit.de", 2282 | "role": "lead" 2283 | } 2284 | ], 2285 | "description": "Library for calculating the complexity of PHP code units", 2286 | "homepage": "https://github.com/sebastianbergmann/complexity", 2287 | "support": { 2288 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 2289 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 2290 | }, 2291 | "funding": [ 2292 | { 2293 | "url": "https://github.com/sebastianbergmann", 2294 | "type": "github" 2295 | } 2296 | ], 2297 | "time": "2020-10-26T15:52:27+00:00" 2298 | }, 2299 | { 2300 | "name": "sebastian/diff", 2301 | "version": "4.0.5", 2302 | "source": { 2303 | "type": "git", 2304 | "url": "https://github.com/sebastianbergmann/diff.git", 2305 | "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" 2306 | }, 2307 | "dist": { 2308 | "type": "zip", 2309 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", 2310 | "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", 2311 | "shasum": "" 2312 | }, 2313 | "require": { 2314 | "php": ">=7.3" 2315 | }, 2316 | "require-dev": { 2317 | "phpunit/phpunit": "^9.3", 2318 | "symfony/process": "^4.2 || ^5" 2319 | }, 2320 | "type": "library", 2321 | "extra": { 2322 | "branch-alias": { 2323 | "dev-master": "4.0-dev" 2324 | } 2325 | }, 2326 | "autoload": { 2327 | "classmap": [ 2328 | "src/" 2329 | ] 2330 | }, 2331 | "notification-url": "https://packagist.org/downloads/", 2332 | "license": [ 2333 | "BSD-3-Clause" 2334 | ], 2335 | "authors": [ 2336 | { 2337 | "name": "Sebastian Bergmann", 2338 | "email": "sebastian@phpunit.de" 2339 | }, 2340 | { 2341 | "name": "Kore Nordmann", 2342 | "email": "mail@kore-nordmann.de" 2343 | } 2344 | ], 2345 | "description": "Diff implementation", 2346 | "homepage": "https://github.com/sebastianbergmann/diff", 2347 | "keywords": [ 2348 | "diff", 2349 | "udiff", 2350 | "unidiff", 2351 | "unified diff" 2352 | ], 2353 | "support": { 2354 | "issues": "https://github.com/sebastianbergmann/diff/issues", 2355 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" 2356 | }, 2357 | "funding": [ 2358 | { 2359 | "url": "https://github.com/sebastianbergmann", 2360 | "type": "github" 2361 | } 2362 | ], 2363 | "time": "2023-05-07T05:35:17+00:00" 2364 | }, 2365 | { 2366 | "name": "sebastian/environment", 2367 | "version": "5.1.5", 2368 | "source": { 2369 | "type": "git", 2370 | "url": "https://github.com/sebastianbergmann/environment.git", 2371 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 2372 | }, 2373 | "dist": { 2374 | "type": "zip", 2375 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 2376 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 2377 | "shasum": "" 2378 | }, 2379 | "require": { 2380 | "php": ">=7.3" 2381 | }, 2382 | "require-dev": { 2383 | "phpunit/phpunit": "^9.3" 2384 | }, 2385 | "suggest": { 2386 | "ext-posix": "*" 2387 | }, 2388 | "type": "library", 2389 | "extra": { 2390 | "branch-alias": { 2391 | "dev-master": "5.1-dev" 2392 | } 2393 | }, 2394 | "autoload": { 2395 | "classmap": [ 2396 | "src/" 2397 | ] 2398 | }, 2399 | "notification-url": "https://packagist.org/downloads/", 2400 | "license": [ 2401 | "BSD-3-Clause" 2402 | ], 2403 | "authors": [ 2404 | { 2405 | "name": "Sebastian Bergmann", 2406 | "email": "sebastian@phpunit.de" 2407 | } 2408 | ], 2409 | "description": "Provides functionality to handle HHVM/PHP environments", 2410 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2411 | "keywords": [ 2412 | "Xdebug", 2413 | "environment", 2414 | "hhvm" 2415 | ], 2416 | "support": { 2417 | "issues": "https://github.com/sebastianbergmann/environment/issues", 2418 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 2419 | }, 2420 | "funding": [ 2421 | { 2422 | "url": "https://github.com/sebastianbergmann", 2423 | "type": "github" 2424 | } 2425 | ], 2426 | "time": "2023-02-03T06:03:51+00:00" 2427 | }, 2428 | { 2429 | "name": "sebastian/exporter", 2430 | "version": "4.0.5", 2431 | "source": { 2432 | "type": "git", 2433 | "url": "https://github.com/sebastianbergmann/exporter.git", 2434 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" 2435 | }, 2436 | "dist": { 2437 | "type": "zip", 2438 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 2439 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 2440 | "shasum": "" 2441 | }, 2442 | "require": { 2443 | "php": ">=7.3", 2444 | "sebastian/recursion-context": "^4.0" 2445 | }, 2446 | "require-dev": { 2447 | "ext-mbstring": "*", 2448 | "phpunit/phpunit": "^9.3" 2449 | }, 2450 | "type": "library", 2451 | "extra": { 2452 | "branch-alias": { 2453 | "dev-master": "4.0-dev" 2454 | } 2455 | }, 2456 | "autoload": { 2457 | "classmap": [ 2458 | "src/" 2459 | ] 2460 | }, 2461 | "notification-url": "https://packagist.org/downloads/", 2462 | "license": [ 2463 | "BSD-3-Clause" 2464 | ], 2465 | "authors": [ 2466 | { 2467 | "name": "Sebastian Bergmann", 2468 | "email": "sebastian@phpunit.de" 2469 | }, 2470 | { 2471 | "name": "Jeff Welch", 2472 | "email": "whatthejeff@gmail.com" 2473 | }, 2474 | { 2475 | "name": "Volker Dusch", 2476 | "email": "github@wallbash.com" 2477 | }, 2478 | { 2479 | "name": "Adam Harvey", 2480 | "email": "aharvey@php.net" 2481 | }, 2482 | { 2483 | "name": "Bernhard Schussek", 2484 | "email": "bschussek@gmail.com" 2485 | } 2486 | ], 2487 | "description": "Provides the functionality to export PHP variables for visualization", 2488 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 2489 | "keywords": [ 2490 | "export", 2491 | "exporter" 2492 | ], 2493 | "support": { 2494 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 2495 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" 2496 | }, 2497 | "funding": [ 2498 | { 2499 | "url": "https://github.com/sebastianbergmann", 2500 | "type": "github" 2501 | } 2502 | ], 2503 | "time": "2022-09-14T06:03:37+00:00" 2504 | }, 2505 | { 2506 | "name": "sebastian/global-state", 2507 | "version": "5.0.6", 2508 | "source": { 2509 | "type": "git", 2510 | "url": "https://github.com/sebastianbergmann/global-state.git", 2511 | "reference": "bde739e7565280bda77be70044ac1047bc007e34" 2512 | }, 2513 | "dist": { 2514 | "type": "zip", 2515 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", 2516 | "reference": "bde739e7565280bda77be70044ac1047bc007e34", 2517 | "shasum": "" 2518 | }, 2519 | "require": { 2520 | "php": ">=7.3", 2521 | "sebastian/object-reflector": "^2.0", 2522 | "sebastian/recursion-context": "^4.0" 2523 | }, 2524 | "require-dev": { 2525 | "ext-dom": "*", 2526 | "phpunit/phpunit": "^9.3" 2527 | }, 2528 | "suggest": { 2529 | "ext-uopz": "*" 2530 | }, 2531 | "type": "library", 2532 | "extra": { 2533 | "branch-alias": { 2534 | "dev-master": "5.0-dev" 2535 | } 2536 | }, 2537 | "autoload": { 2538 | "classmap": [ 2539 | "src/" 2540 | ] 2541 | }, 2542 | "notification-url": "https://packagist.org/downloads/", 2543 | "license": [ 2544 | "BSD-3-Clause" 2545 | ], 2546 | "authors": [ 2547 | { 2548 | "name": "Sebastian Bergmann", 2549 | "email": "sebastian@phpunit.de" 2550 | } 2551 | ], 2552 | "description": "Snapshotting of global state", 2553 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2554 | "keywords": [ 2555 | "global state" 2556 | ], 2557 | "support": { 2558 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 2559 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" 2560 | }, 2561 | "funding": [ 2562 | { 2563 | "url": "https://github.com/sebastianbergmann", 2564 | "type": "github" 2565 | } 2566 | ], 2567 | "time": "2023-08-02T09:26:13+00:00" 2568 | }, 2569 | { 2570 | "name": "sebastian/lines-of-code", 2571 | "version": "1.0.3", 2572 | "source": { 2573 | "type": "git", 2574 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 2575 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 2576 | }, 2577 | "dist": { 2578 | "type": "zip", 2579 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 2580 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 2581 | "shasum": "" 2582 | }, 2583 | "require": { 2584 | "nikic/php-parser": "^4.6", 2585 | "php": ">=7.3" 2586 | }, 2587 | "require-dev": { 2588 | "phpunit/phpunit": "^9.3" 2589 | }, 2590 | "type": "library", 2591 | "extra": { 2592 | "branch-alias": { 2593 | "dev-master": "1.0-dev" 2594 | } 2595 | }, 2596 | "autoload": { 2597 | "classmap": [ 2598 | "src/" 2599 | ] 2600 | }, 2601 | "notification-url": "https://packagist.org/downloads/", 2602 | "license": [ 2603 | "BSD-3-Clause" 2604 | ], 2605 | "authors": [ 2606 | { 2607 | "name": "Sebastian Bergmann", 2608 | "email": "sebastian@phpunit.de", 2609 | "role": "lead" 2610 | } 2611 | ], 2612 | "description": "Library for counting the lines of code in PHP source code", 2613 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 2614 | "support": { 2615 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 2616 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 2617 | }, 2618 | "funding": [ 2619 | { 2620 | "url": "https://github.com/sebastianbergmann", 2621 | "type": "github" 2622 | } 2623 | ], 2624 | "time": "2020-11-28T06:42:11+00:00" 2625 | }, 2626 | { 2627 | "name": "sebastian/object-enumerator", 2628 | "version": "4.0.4", 2629 | "source": { 2630 | "type": "git", 2631 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2632 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 2633 | }, 2634 | "dist": { 2635 | "type": "zip", 2636 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 2637 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 2638 | "shasum": "" 2639 | }, 2640 | "require": { 2641 | "php": ">=7.3", 2642 | "sebastian/object-reflector": "^2.0", 2643 | "sebastian/recursion-context": "^4.0" 2644 | }, 2645 | "require-dev": { 2646 | "phpunit/phpunit": "^9.3" 2647 | }, 2648 | "type": "library", 2649 | "extra": { 2650 | "branch-alias": { 2651 | "dev-master": "4.0-dev" 2652 | } 2653 | }, 2654 | "autoload": { 2655 | "classmap": [ 2656 | "src/" 2657 | ] 2658 | }, 2659 | "notification-url": "https://packagist.org/downloads/", 2660 | "license": [ 2661 | "BSD-3-Clause" 2662 | ], 2663 | "authors": [ 2664 | { 2665 | "name": "Sebastian Bergmann", 2666 | "email": "sebastian@phpunit.de" 2667 | } 2668 | ], 2669 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2670 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2671 | "support": { 2672 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 2673 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 2674 | }, 2675 | "funding": [ 2676 | { 2677 | "url": "https://github.com/sebastianbergmann", 2678 | "type": "github" 2679 | } 2680 | ], 2681 | "time": "2020-10-26T13:12:34+00:00" 2682 | }, 2683 | { 2684 | "name": "sebastian/object-reflector", 2685 | "version": "2.0.4", 2686 | "source": { 2687 | "type": "git", 2688 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2689 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 2690 | }, 2691 | "dist": { 2692 | "type": "zip", 2693 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2694 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2695 | "shasum": "" 2696 | }, 2697 | "require": { 2698 | "php": ">=7.3" 2699 | }, 2700 | "require-dev": { 2701 | "phpunit/phpunit": "^9.3" 2702 | }, 2703 | "type": "library", 2704 | "extra": { 2705 | "branch-alias": { 2706 | "dev-master": "2.0-dev" 2707 | } 2708 | }, 2709 | "autoload": { 2710 | "classmap": [ 2711 | "src/" 2712 | ] 2713 | }, 2714 | "notification-url": "https://packagist.org/downloads/", 2715 | "license": [ 2716 | "BSD-3-Clause" 2717 | ], 2718 | "authors": [ 2719 | { 2720 | "name": "Sebastian Bergmann", 2721 | "email": "sebastian@phpunit.de" 2722 | } 2723 | ], 2724 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2725 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2726 | "support": { 2727 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2728 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 2729 | }, 2730 | "funding": [ 2731 | { 2732 | "url": "https://github.com/sebastianbergmann", 2733 | "type": "github" 2734 | } 2735 | ], 2736 | "time": "2020-10-26T13:14:26+00:00" 2737 | }, 2738 | { 2739 | "name": "sebastian/recursion-context", 2740 | "version": "4.0.5", 2741 | "source": { 2742 | "type": "git", 2743 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2744 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 2745 | }, 2746 | "dist": { 2747 | "type": "zip", 2748 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 2749 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 2750 | "shasum": "" 2751 | }, 2752 | "require": { 2753 | "php": ">=7.3" 2754 | }, 2755 | "require-dev": { 2756 | "phpunit/phpunit": "^9.3" 2757 | }, 2758 | "type": "library", 2759 | "extra": { 2760 | "branch-alias": { 2761 | "dev-master": "4.0-dev" 2762 | } 2763 | }, 2764 | "autoload": { 2765 | "classmap": [ 2766 | "src/" 2767 | ] 2768 | }, 2769 | "notification-url": "https://packagist.org/downloads/", 2770 | "license": [ 2771 | "BSD-3-Clause" 2772 | ], 2773 | "authors": [ 2774 | { 2775 | "name": "Sebastian Bergmann", 2776 | "email": "sebastian@phpunit.de" 2777 | }, 2778 | { 2779 | "name": "Jeff Welch", 2780 | "email": "whatthejeff@gmail.com" 2781 | }, 2782 | { 2783 | "name": "Adam Harvey", 2784 | "email": "aharvey@php.net" 2785 | } 2786 | ], 2787 | "description": "Provides functionality to recursively process PHP variables", 2788 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 2789 | "support": { 2790 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2791 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 2792 | }, 2793 | "funding": [ 2794 | { 2795 | "url": "https://github.com/sebastianbergmann", 2796 | "type": "github" 2797 | } 2798 | ], 2799 | "time": "2023-02-03T06:07:39+00:00" 2800 | }, 2801 | { 2802 | "name": "sebastian/resource-operations", 2803 | "version": "3.0.3", 2804 | "source": { 2805 | "type": "git", 2806 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2807 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 2808 | }, 2809 | "dist": { 2810 | "type": "zip", 2811 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2812 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2813 | "shasum": "" 2814 | }, 2815 | "require": { 2816 | "php": ">=7.3" 2817 | }, 2818 | "require-dev": { 2819 | "phpunit/phpunit": "^9.0" 2820 | }, 2821 | "type": "library", 2822 | "extra": { 2823 | "branch-alias": { 2824 | "dev-master": "3.0-dev" 2825 | } 2826 | }, 2827 | "autoload": { 2828 | "classmap": [ 2829 | "src/" 2830 | ] 2831 | }, 2832 | "notification-url": "https://packagist.org/downloads/", 2833 | "license": [ 2834 | "BSD-3-Clause" 2835 | ], 2836 | "authors": [ 2837 | { 2838 | "name": "Sebastian Bergmann", 2839 | "email": "sebastian@phpunit.de" 2840 | } 2841 | ], 2842 | "description": "Provides a list of PHP built-in functions that operate on resources", 2843 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2844 | "support": { 2845 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 2846 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 2847 | }, 2848 | "funding": [ 2849 | { 2850 | "url": "https://github.com/sebastianbergmann", 2851 | "type": "github" 2852 | } 2853 | ], 2854 | "time": "2020-09-28T06:45:17+00:00" 2855 | }, 2856 | { 2857 | "name": "sebastian/type", 2858 | "version": "2.3.4", 2859 | "source": { 2860 | "type": "git", 2861 | "url": "https://github.com/sebastianbergmann/type.git", 2862 | "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" 2863 | }, 2864 | "dist": { 2865 | "type": "zip", 2866 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", 2867 | "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", 2868 | "shasum": "" 2869 | }, 2870 | "require": { 2871 | "php": ">=7.3" 2872 | }, 2873 | "require-dev": { 2874 | "phpunit/phpunit": "^9.3" 2875 | }, 2876 | "type": "library", 2877 | "extra": { 2878 | "branch-alias": { 2879 | "dev-master": "2.3-dev" 2880 | } 2881 | }, 2882 | "autoload": { 2883 | "classmap": [ 2884 | "src/" 2885 | ] 2886 | }, 2887 | "notification-url": "https://packagist.org/downloads/", 2888 | "license": [ 2889 | "BSD-3-Clause" 2890 | ], 2891 | "authors": [ 2892 | { 2893 | "name": "Sebastian Bergmann", 2894 | "email": "sebastian@phpunit.de", 2895 | "role": "lead" 2896 | } 2897 | ], 2898 | "description": "Collection of value objects that represent the types of the PHP type system", 2899 | "homepage": "https://github.com/sebastianbergmann/type", 2900 | "support": { 2901 | "issues": "https://github.com/sebastianbergmann/type/issues", 2902 | "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" 2903 | }, 2904 | "funding": [ 2905 | { 2906 | "url": "https://github.com/sebastianbergmann", 2907 | "type": "github" 2908 | } 2909 | ], 2910 | "time": "2021-06-15T12:49:02+00:00" 2911 | }, 2912 | { 2913 | "name": "sebastian/version", 2914 | "version": "3.0.2", 2915 | "source": { 2916 | "type": "git", 2917 | "url": "https://github.com/sebastianbergmann/version.git", 2918 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2919 | }, 2920 | "dist": { 2921 | "type": "zip", 2922 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2923 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2924 | "shasum": "" 2925 | }, 2926 | "require": { 2927 | "php": ">=7.3" 2928 | }, 2929 | "type": "library", 2930 | "extra": { 2931 | "branch-alias": { 2932 | "dev-master": "3.0-dev" 2933 | } 2934 | }, 2935 | "autoload": { 2936 | "classmap": [ 2937 | "src/" 2938 | ] 2939 | }, 2940 | "notification-url": "https://packagist.org/downloads/", 2941 | "license": [ 2942 | "BSD-3-Clause" 2943 | ], 2944 | "authors": [ 2945 | { 2946 | "name": "Sebastian Bergmann", 2947 | "email": "sebastian@phpunit.de", 2948 | "role": "lead" 2949 | } 2950 | ], 2951 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2952 | "homepage": "https://github.com/sebastianbergmann/version", 2953 | "support": { 2954 | "issues": "https://github.com/sebastianbergmann/version/issues", 2955 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2956 | }, 2957 | "funding": [ 2958 | { 2959 | "url": "https://github.com/sebastianbergmann", 2960 | "type": "github" 2961 | } 2962 | ], 2963 | "time": "2020-09-28T06:39:44+00:00" 2964 | }, 2965 | { 2966 | "name": "symfony/config", 2967 | "version": "v6.4.0", 2968 | "source": { 2969 | "type": "git", 2970 | "url": "https://github.com/symfony/config.git", 2971 | "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" 2972 | }, 2973 | "dist": { 2974 | "type": "zip", 2975 | "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", 2976 | "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", 2977 | "shasum": "" 2978 | }, 2979 | "require": { 2980 | "php": ">=8.1", 2981 | "symfony/deprecation-contracts": "^2.5|^3", 2982 | "symfony/filesystem": "^5.4|^6.0|^7.0", 2983 | "symfony/polyfill-ctype": "~1.8" 2984 | }, 2985 | "conflict": { 2986 | "symfony/finder": "<5.4", 2987 | "symfony/service-contracts": "<2.5" 2988 | }, 2989 | "require-dev": { 2990 | "symfony/event-dispatcher": "^5.4|^6.0|^7.0", 2991 | "symfony/finder": "^5.4|^6.0|^7.0", 2992 | "symfony/messenger": "^5.4|^6.0|^7.0", 2993 | "symfony/service-contracts": "^2.5|^3", 2994 | "symfony/yaml": "^5.4|^6.0|^7.0" 2995 | }, 2996 | "type": "library", 2997 | "autoload": { 2998 | "psr-4": { 2999 | "Symfony\\Component\\Config\\": "" 3000 | }, 3001 | "exclude-from-classmap": [ 3002 | "/Tests/" 3003 | ] 3004 | }, 3005 | "notification-url": "https://packagist.org/downloads/", 3006 | "license": [ 3007 | "MIT" 3008 | ], 3009 | "authors": [ 3010 | { 3011 | "name": "Fabien Potencier", 3012 | "email": "fabien@symfony.com" 3013 | }, 3014 | { 3015 | "name": "Symfony Community", 3016 | "homepage": "https://symfony.com/contributors" 3017 | } 3018 | ], 3019 | "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", 3020 | "homepage": "https://symfony.com", 3021 | "support": { 3022 | "source": "https://github.com/symfony/config/tree/v6.4.0" 3023 | }, 3024 | "funding": [ 3025 | { 3026 | "url": "https://symfony.com/sponsor", 3027 | "type": "custom" 3028 | }, 3029 | { 3030 | "url": "https://github.com/fabpot", 3031 | "type": "github" 3032 | }, 3033 | { 3034 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3035 | "type": "tidelift" 3036 | } 3037 | ], 3038 | "time": "2023-11-09T08:28:32+00:00" 3039 | }, 3040 | { 3041 | "name": "symfony/console", 3042 | "version": "v6.4.1", 3043 | "source": { 3044 | "type": "git", 3045 | "url": "https://github.com/symfony/console.git", 3046 | "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd" 3047 | }, 3048 | "dist": { 3049 | "type": "zip", 3050 | "url": "https://api.github.com/repos/symfony/console/zipball/a550a7c99daeedef3f9d23fb82e3531525ff11fd", 3051 | "reference": "a550a7c99daeedef3f9d23fb82e3531525ff11fd", 3052 | "shasum": "" 3053 | }, 3054 | "require": { 3055 | "php": ">=8.1", 3056 | "symfony/deprecation-contracts": "^2.5|^3", 3057 | "symfony/polyfill-mbstring": "~1.0", 3058 | "symfony/service-contracts": "^2.5|^3", 3059 | "symfony/string": "^5.4|^6.0|^7.0" 3060 | }, 3061 | "conflict": { 3062 | "symfony/dependency-injection": "<5.4", 3063 | "symfony/dotenv": "<5.4", 3064 | "symfony/event-dispatcher": "<5.4", 3065 | "symfony/lock": "<5.4", 3066 | "symfony/process": "<5.4" 3067 | }, 3068 | "provide": { 3069 | "psr/log-implementation": "1.0|2.0|3.0" 3070 | }, 3071 | "require-dev": { 3072 | "psr/log": "^1|^2|^3", 3073 | "symfony/config": "^5.4|^6.0|^7.0", 3074 | "symfony/dependency-injection": "^5.4|^6.0|^7.0", 3075 | "symfony/event-dispatcher": "^5.4|^6.0|^7.0", 3076 | "symfony/http-foundation": "^6.4|^7.0", 3077 | "symfony/http-kernel": "^6.4|^7.0", 3078 | "symfony/lock": "^5.4|^6.0|^7.0", 3079 | "symfony/messenger": "^5.4|^6.0|^7.0", 3080 | "symfony/process": "^5.4|^6.0|^7.0", 3081 | "symfony/stopwatch": "^5.4|^6.0|^7.0", 3082 | "symfony/var-dumper": "^5.4|^6.0|^7.0" 3083 | }, 3084 | "type": "library", 3085 | "autoload": { 3086 | "psr-4": { 3087 | "Symfony\\Component\\Console\\": "" 3088 | }, 3089 | "exclude-from-classmap": [ 3090 | "/Tests/" 3091 | ] 3092 | }, 3093 | "notification-url": "https://packagist.org/downloads/", 3094 | "license": [ 3095 | "MIT" 3096 | ], 3097 | "authors": [ 3098 | { 3099 | "name": "Fabien Potencier", 3100 | "email": "fabien@symfony.com" 3101 | }, 3102 | { 3103 | "name": "Symfony Community", 3104 | "homepage": "https://symfony.com/contributors" 3105 | } 3106 | ], 3107 | "description": "Eases the creation of beautiful and testable command line interfaces", 3108 | "homepage": "https://symfony.com", 3109 | "keywords": [ 3110 | "cli", 3111 | "command-line", 3112 | "console", 3113 | "terminal" 3114 | ], 3115 | "support": { 3116 | "source": "https://github.com/symfony/console/tree/v6.4.1" 3117 | }, 3118 | "funding": [ 3119 | { 3120 | "url": "https://symfony.com/sponsor", 3121 | "type": "custom" 3122 | }, 3123 | { 3124 | "url": "https://github.com/fabpot", 3125 | "type": "github" 3126 | }, 3127 | { 3128 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3129 | "type": "tidelift" 3130 | } 3131 | ], 3132 | "time": "2023-11-30T10:54:28+00:00" 3133 | }, 3134 | { 3135 | "name": "symfony/deprecation-contracts", 3136 | "version": "v3.4.0", 3137 | "source": { 3138 | "type": "git", 3139 | "url": "https://github.com/symfony/deprecation-contracts.git", 3140 | "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" 3141 | }, 3142 | "dist": { 3143 | "type": "zip", 3144 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", 3145 | "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", 3146 | "shasum": "" 3147 | }, 3148 | "require": { 3149 | "php": ">=8.1" 3150 | }, 3151 | "type": "library", 3152 | "extra": { 3153 | "branch-alias": { 3154 | "dev-main": "3.4-dev" 3155 | }, 3156 | "thanks": { 3157 | "name": "symfony/contracts", 3158 | "url": "https://github.com/symfony/contracts" 3159 | } 3160 | }, 3161 | "autoload": { 3162 | "files": [ 3163 | "function.php" 3164 | ] 3165 | }, 3166 | "notification-url": "https://packagist.org/downloads/", 3167 | "license": [ 3168 | "MIT" 3169 | ], 3170 | "authors": [ 3171 | { 3172 | "name": "Nicolas Grekas", 3173 | "email": "p@tchwork.com" 3174 | }, 3175 | { 3176 | "name": "Symfony Community", 3177 | "homepage": "https://symfony.com/contributors" 3178 | } 3179 | ], 3180 | "description": "A generic function and convention to trigger deprecation notices", 3181 | "homepage": "https://symfony.com", 3182 | "support": { 3183 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" 3184 | }, 3185 | "funding": [ 3186 | { 3187 | "url": "https://symfony.com/sponsor", 3188 | "type": "custom" 3189 | }, 3190 | { 3191 | "url": "https://github.com/fabpot", 3192 | "type": "github" 3193 | }, 3194 | { 3195 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3196 | "type": "tidelift" 3197 | } 3198 | ], 3199 | "time": "2023-05-23T14:45:45+00:00" 3200 | }, 3201 | { 3202 | "name": "symfony/filesystem", 3203 | "version": "v7.0.0", 3204 | "source": { 3205 | "type": "git", 3206 | "url": "https://github.com/symfony/filesystem.git", 3207 | "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7" 3208 | }, 3209 | "dist": { 3210 | "type": "zip", 3211 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/7da8ea2362a283771478c5f7729cfcb43a76b8b7", 3212 | "reference": "7da8ea2362a283771478c5f7729cfcb43a76b8b7", 3213 | "shasum": "" 3214 | }, 3215 | "require": { 3216 | "php": ">=8.2", 3217 | "symfony/polyfill-ctype": "~1.8", 3218 | "symfony/polyfill-mbstring": "~1.8" 3219 | }, 3220 | "type": "library", 3221 | "autoload": { 3222 | "psr-4": { 3223 | "Symfony\\Component\\Filesystem\\": "" 3224 | }, 3225 | "exclude-from-classmap": [ 3226 | "/Tests/" 3227 | ] 3228 | }, 3229 | "notification-url": "https://packagist.org/downloads/", 3230 | "license": [ 3231 | "MIT" 3232 | ], 3233 | "authors": [ 3234 | { 3235 | "name": "Fabien Potencier", 3236 | "email": "fabien@symfony.com" 3237 | }, 3238 | { 3239 | "name": "Symfony Community", 3240 | "homepage": "https://symfony.com/contributors" 3241 | } 3242 | ], 3243 | "description": "Provides basic utilities for the filesystem", 3244 | "homepage": "https://symfony.com", 3245 | "support": { 3246 | "source": "https://github.com/symfony/filesystem/tree/v7.0.0" 3247 | }, 3248 | "funding": [ 3249 | { 3250 | "url": "https://symfony.com/sponsor", 3251 | "type": "custom" 3252 | }, 3253 | { 3254 | "url": "https://github.com/fabpot", 3255 | "type": "github" 3256 | }, 3257 | { 3258 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3259 | "type": "tidelift" 3260 | } 3261 | ], 3262 | "time": "2023-07-27T06:33:22+00:00" 3263 | }, 3264 | { 3265 | "name": "symfony/polyfill-ctype", 3266 | "version": "v1.28.0", 3267 | "source": { 3268 | "type": "git", 3269 | "url": "https://github.com/symfony/polyfill-ctype.git", 3270 | "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" 3271 | }, 3272 | "dist": { 3273 | "type": "zip", 3274 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", 3275 | "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", 3276 | "shasum": "" 3277 | }, 3278 | "require": { 3279 | "php": ">=7.1" 3280 | }, 3281 | "provide": { 3282 | "ext-ctype": "*" 3283 | }, 3284 | "suggest": { 3285 | "ext-ctype": "For best performance" 3286 | }, 3287 | "type": "library", 3288 | "extra": { 3289 | "branch-alias": { 3290 | "dev-main": "1.28-dev" 3291 | }, 3292 | "thanks": { 3293 | "name": "symfony/polyfill", 3294 | "url": "https://github.com/symfony/polyfill" 3295 | } 3296 | }, 3297 | "autoload": { 3298 | "files": [ 3299 | "bootstrap.php" 3300 | ], 3301 | "psr-4": { 3302 | "Symfony\\Polyfill\\Ctype\\": "" 3303 | } 3304 | }, 3305 | "notification-url": "https://packagist.org/downloads/", 3306 | "license": [ 3307 | "MIT" 3308 | ], 3309 | "authors": [ 3310 | { 3311 | "name": "Gert de Pagter", 3312 | "email": "BackEndTea@gmail.com" 3313 | }, 3314 | { 3315 | "name": "Symfony Community", 3316 | "homepage": "https://symfony.com/contributors" 3317 | } 3318 | ], 3319 | "description": "Symfony polyfill for ctype functions", 3320 | "homepage": "https://symfony.com", 3321 | "keywords": [ 3322 | "compatibility", 3323 | "ctype", 3324 | "polyfill", 3325 | "portable" 3326 | ], 3327 | "support": { 3328 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" 3329 | }, 3330 | "funding": [ 3331 | { 3332 | "url": "https://symfony.com/sponsor", 3333 | "type": "custom" 3334 | }, 3335 | { 3336 | "url": "https://github.com/fabpot", 3337 | "type": "github" 3338 | }, 3339 | { 3340 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3341 | "type": "tidelift" 3342 | } 3343 | ], 3344 | "time": "2023-01-26T09:26:14+00:00" 3345 | }, 3346 | { 3347 | "name": "symfony/polyfill-intl-grapheme", 3348 | "version": "v1.28.0", 3349 | "source": { 3350 | "type": "git", 3351 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 3352 | "reference": "875e90aeea2777b6f135677f618529449334a612" 3353 | }, 3354 | "dist": { 3355 | "type": "zip", 3356 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", 3357 | "reference": "875e90aeea2777b6f135677f618529449334a612", 3358 | "shasum": "" 3359 | }, 3360 | "require": { 3361 | "php": ">=7.1" 3362 | }, 3363 | "suggest": { 3364 | "ext-intl": "For best performance" 3365 | }, 3366 | "type": "library", 3367 | "extra": { 3368 | "branch-alias": { 3369 | "dev-main": "1.28-dev" 3370 | }, 3371 | "thanks": { 3372 | "name": "symfony/polyfill", 3373 | "url": "https://github.com/symfony/polyfill" 3374 | } 3375 | }, 3376 | "autoload": { 3377 | "files": [ 3378 | "bootstrap.php" 3379 | ], 3380 | "psr-4": { 3381 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 3382 | } 3383 | }, 3384 | "notification-url": "https://packagist.org/downloads/", 3385 | "license": [ 3386 | "MIT" 3387 | ], 3388 | "authors": [ 3389 | { 3390 | "name": "Nicolas Grekas", 3391 | "email": "p@tchwork.com" 3392 | }, 3393 | { 3394 | "name": "Symfony Community", 3395 | "homepage": "https://symfony.com/contributors" 3396 | } 3397 | ], 3398 | "description": "Symfony polyfill for intl's grapheme_* functions", 3399 | "homepage": "https://symfony.com", 3400 | "keywords": [ 3401 | "compatibility", 3402 | "grapheme", 3403 | "intl", 3404 | "polyfill", 3405 | "portable", 3406 | "shim" 3407 | ], 3408 | "support": { 3409 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" 3410 | }, 3411 | "funding": [ 3412 | { 3413 | "url": "https://symfony.com/sponsor", 3414 | "type": "custom" 3415 | }, 3416 | { 3417 | "url": "https://github.com/fabpot", 3418 | "type": "github" 3419 | }, 3420 | { 3421 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3422 | "type": "tidelift" 3423 | } 3424 | ], 3425 | "time": "2023-01-26T09:26:14+00:00" 3426 | }, 3427 | { 3428 | "name": "symfony/polyfill-intl-normalizer", 3429 | "version": "v1.28.0", 3430 | "source": { 3431 | "type": "git", 3432 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 3433 | "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" 3434 | }, 3435 | "dist": { 3436 | "type": "zip", 3437 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", 3438 | "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", 3439 | "shasum": "" 3440 | }, 3441 | "require": { 3442 | "php": ">=7.1" 3443 | }, 3444 | "suggest": { 3445 | "ext-intl": "For best performance" 3446 | }, 3447 | "type": "library", 3448 | "extra": { 3449 | "branch-alias": { 3450 | "dev-main": "1.28-dev" 3451 | }, 3452 | "thanks": { 3453 | "name": "symfony/polyfill", 3454 | "url": "https://github.com/symfony/polyfill" 3455 | } 3456 | }, 3457 | "autoload": { 3458 | "files": [ 3459 | "bootstrap.php" 3460 | ], 3461 | "psr-4": { 3462 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 3463 | }, 3464 | "classmap": [ 3465 | "Resources/stubs" 3466 | ] 3467 | }, 3468 | "notification-url": "https://packagist.org/downloads/", 3469 | "license": [ 3470 | "MIT" 3471 | ], 3472 | "authors": [ 3473 | { 3474 | "name": "Nicolas Grekas", 3475 | "email": "p@tchwork.com" 3476 | }, 3477 | { 3478 | "name": "Symfony Community", 3479 | "homepage": "https://symfony.com/contributors" 3480 | } 3481 | ], 3482 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 3483 | "homepage": "https://symfony.com", 3484 | "keywords": [ 3485 | "compatibility", 3486 | "intl", 3487 | "normalizer", 3488 | "polyfill", 3489 | "portable", 3490 | "shim" 3491 | ], 3492 | "support": { 3493 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" 3494 | }, 3495 | "funding": [ 3496 | { 3497 | "url": "https://symfony.com/sponsor", 3498 | "type": "custom" 3499 | }, 3500 | { 3501 | "url": "https://github.com/fabpot", 3502 | "type": "github" 3503 | }, 3504 | { 3505 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3506 | "type": "tidelift" 3507 | } 3508 | ], 3509 | "time": "2023-01-26T09:26:14+00:00" 3510 | }, 3511 | { 3512 | "name": "symfony/polyfill-mbstring", 3513 | "version": "v1.28.0", 3514 | "source": { 3515 | "type": "git", 3516 | "url": "https://github.com/symfony/polyfill-mbstring.git", 3517 | "reference": "42292d99c55abe617799667f454222c54c60e229" 3518 | }, 3519 | "dist": { 3520 | "type": "zip", 3521 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", 3522 | "reference": "42292d99c55abe617799667f454222c54c60e229", 3523 | "shasum": "" 3524 | }, 3525 | "require": { 3526 | "php": ">=7.1" 3527 | }, 3528 | "provide": { 3529 | "ext-mbstring": "*" 3530 | }, 3531 | "suggest": { 3532 | "ext-mbstring": "For best performance" 3533 | }, 3534 | "type": "library", 3535 | "extra": { 3536 | "branch-alias": { 3537 | "dev-main": "1.28-dev" 3538 | }, 3539 | "thanks": { 3540 | "name": "symfony/polyfill", 3541 | "url": "https://github.com/symfony/polyfill" 3542 | } 3543 | }, 3544 | "autoload": { 3545 | "files": [ 3546 | "bootstrap.php" 3547 | ], 3548 | "psr-4": { 3549 | "Symfony\\Polyfill\\Mbstring\\": "" 3550 | } 3551 | }, 3552 | "notification-url": "https://packagist.org/downloads/", 3553 | "license": [ 3554 | "MIT" 3555 | ], 3556 | "authors": [ 3557 | { 3558 | "name": "Nicolas Grekas", 3559 | "email": "p@tchwork.com" 3560 | }, 3561 | { 3562 | "name": "Symfony Community", 3563 | "homepage": "https://symfony.com/contributors" 3564 | } 3565 | ], 3566 | "description": "Symfony polyfill for the Mbstring extension", 3567 | "homepage": "https://symfony.com", 3568 | "keywords": [ 3569 | "compatibility", 3570 | "mbstring", 3571 | "polyfill", 3572 | "portable", 3573 | "shim" 3574 | ], 3575 | "support": { 3576 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" 3577 | }, 3578 | "funding": [ 3579 | { 3580 | "url": "https://symfony.com/sponsor", 3581 | "type": "custom" 3582 | }, 3583 | { 3584 | "url": "https://github.com/fabpot", 3585 | "type": "github" 3586 | }, 3587 | { 3588 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3589 | "type": "tidelift" 3590 | } 3591 | ], 3592 | "time": "2023-07-28T09:04:16+00:00" 3593 | }, 3594 | { 3595 | "name": "symfony/service-contracts", 3596 | "version": "v3.4.0", 3597 | "source": { 3598 | "type": "git", 3599 | "url": "https://github.com/symfony/service-contracts.git", 3600 | "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" 3601 | }, 3602 | "dist": { 3603 | "type": "zip", 3604 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", 3605 | "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", 3606 | "shasum": "" 3607 | }, 3608 | "require": { 3609 | "php": ">=8.1", 3610 | "psr/container": "^2.0" 3611 | }, 3612 | "conflict": { 3613 | "ext-psr": "<1.1|>=2" 3614 | }, 3615 | "type": "library", 3616 | "extra": { 3617 | "branch-alias": { 3618 | "dev-main": "3.4-dev" 3619 | }, 3620 | "thanks": { 3621 | "name": "symfony/contracts", 3622 | "url": "https://github.com/symfony/contracts" 3623 | } 3624 | }, 3625 | "autoload": { 3626 | "psr-4": { 3627 | "Symfony\\Contracts\\Service\\": "" 3628 | }, 3629 | "exclude-from-classmap": [ 3630 | "/Test/" 3631 | ] 3632 | }, 3633 | "notification-url": "https://packagist.org/downloads/", 3634 | "license": [ 3635 | "MIT" 3636 | ], 3637 | "authors": [ 3638 | { 3639 | "name": "Nicolas Grekas", 3640 | "email": "p@tchwork.com" 3641 | }, 3642 | { 3643 | "name": "Symfony Community", 3644 | "homepage": "https://symfony.com/contributors" 3645 | } 3646 | ], 3647 | "description": "Generic abstractions related to writing services", 3648 | "homepage": "https://symfony.com", 3649 | "keywords": [ 3650 | "abstractions", 3651 | "contracts", 3652 | "decoupling", 3653 | "interfaces", 3654 | "interoperability", 3655 | "standards" 3656 | ], 3657 | "support": { 3658 | "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" 3659 | }, 3660 | "funding": [ 3661 | { 3662 | "url": "https://symfony.com/sponsor", 3663 | "type": "custom" 3664 | }, 3665 | { 3666 | "url": "https://github.com/fabpot", 3667 | "type": "github" 3668 | }, 3669 | { 3670 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3671 | "type": "tidelift" 3672 | } 3673 | ], 3674 | "time": "2023-07-30T20:28:31+00:00" 3675 | }, 3676 | { 3677 | "name": "symfony/stopwatch", 3678 | "version": "v6.4.0", 3679 | "source": { 3680 | "type": "git", 3681 | "url": "https://github.com/symfony/stopwatch.git", 3682 | "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2" 3683 | }, 3684 | "dist": { 3685 | "type": "zip", 3686 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", 3687 | "reference": "fc47f1015ec80927ff64ba9094dfe8b9d48fe9f2", 3688 | "shasum": "" 3689 | }, 3690 | "require": { 3691 | "php": ">=8.1", 3692 | "symfony/service-contracts": "^2.5|^3" 3693 | }, 3694 | "type": "library", 3695 | "autoload": { 3696 | "psr-4": { 3697 | "Symfony\\Component\\Stopwatch\\": "" 3698 | }, 3699 | "exclude-from-classmap": [ 3700 | "/Tests/" 3701 | ] 3702 | }, 3703 | "notification-url": "https://packagist.org/downloads/", 3704 | "license": [ 3705 | "MIT" 3706 | ], 3707 | "authors": [ 3708 | { 3709 | "name": "Fabien Potencier", 3710 | "email": "fabien@symfony.com" 3711 | }, 3712 | { 3713 | "name": "Symfony Community", 3714 | "homepage": "https://symfony.com/contributors" 3715 | } 3716 | ], 3717 | "description": "Provides a way to profile code", 3718 | "homepage": "https://symfony.com", 3719 | "support": { 3720 | "source": "https://github.com/symfony/stopwatch/tree/v6.4.0" 3721 | }, 3722 | "funding": [ 3723 | { 3724 | "url": "https://symfony.com/sponsor", 3725 | "type": "custom" 3726 | }, 3727 | { 3728 | "url": "https://github.com/fabpot", 3729 | "type": "github" 3730 | }, 3731 | { 3732 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3733 | "type": "tidelift" 3734 | } 3735 | ], 3736 | "time": "2023-02-16T10:14:28+00:00" 3737 | }, 3738 | { 3739 | "name": "symfony/string", 3740 | "version": "v7.0.0", 3741 | "source": { 3742 | "type": "git", 3743 | "url": "https://github.com/symfony/string.git", 3744 | "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620" 3745 | }, 3746 | "dist": { 3747 | "type": "zip", 3748 | "url": "https://api.github.com/repos/symfony/string/zipball/92bd2bfbba476d4a1838e5e12168bef2fd1e6620", 3749 | "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620", 3750 | "shasum": "" 3751 | }, 3752 | "require": { 3753 | "php": ">=8.2", 3754 | "symfony/polyfill-ctype": "~1.8", 3755 | "symfony/polyfill-intl-grapheme": "~1.0", 3756 | "symfony/polyfill-intl-normalizer": "~1.0", 3757 | "symfony/polyfill-mbstring": "~1.0" 3758 | }, 3759 | "conflict": { 3760 | "symfony/translation-contracts": "<2.5" 3761 | }, 3762 | "require-dev": { 3763 | "symfony/error-handler": "^6.4|^7.0", 3764 | "symfony/http-client": "^6.4|^7.0", 3765 | "symfony/intl": "^6.4|^7.0", 3766 | "symfony/translation-contracts": "^2.5|^3.0", 3767 | "symfony/var-exporter": "^6.4|^7.0" 3768 | }, 3769 | "type": "library", 3770 | "autoload": { 3771 | "files": [ 3772 | "Resources/functions.php" 3773 | ], 3774 | "psr-4": { 3775 | "Symfony\\Component\\String\\": "" 3776 | }, 3777 | "exclude-from-classmap": [ 3778 | "/Tests/" 3779 | ] 3780 | }, 3781 | "notification-url": "https://packagist.org/downloads/", 3782 | "license": [ 3783 | "MIT" 3784 | ], 3785 | "authors": [ 3786 | { 3787 | "name": "Nicolas Grekas", 3788 | "email": "p@tchwork.com" 3789 | }, 3790 | { 3791 | "name": "Symfony Community", 3792 | "homepage": "https://symfony.com/contributors" 3793 | } 3794 | ], 3795 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 3796 | "homepage": "https://symfony.com", 3797 | "keywords": [ 3798 | "grapheme", 3799 | "i18n", 3800 | "string", 3801 | "unicode", 3802 | "utf-8", 3803 | "utf8" 3804 | ], 3805 | "support": { 3806 | "source": "https://github.com/symfony/string/tree/v7.0.0" 3807 | }, 3808 | "funding": [ 3809 | { 3810 | "url": "https://symfony.com/sponsor", 3811 | "type": "custom" 3812 | }, 3813 | { 3814 | "url": "https://github.com/fabpot", 3815 | "type": "github" 3816 | }, 3817 | { 3818 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3819 | "type": "tidelift" 3820 | } 3821 | ], 3822 | "time": "2023-11-29T08:40:23+00:00" 3823 | }, 3824 | { 3825 | "name": "symfony/yaml", 3826 | "version": "v6.4.0", 3827 | "source": { 3828 | "type": "git", 3829 | "url": "https://github.com/symfony/yaml.git", 3830 | "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" 3831 | }, 3832 | "dist": { 3833 | "type": "zip", 3834 | "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", 3835 | "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", 3836 | "shasum": "" 3837 | }, 3838 | "require": { 3839 | "php": ">=8.1", 3840 | "symfony/deprecation-contracts": "^2.5|^3", 3841 | "symfony/polyfill-ctype": "^1.8" 3842 | }, 3843 | "conflict": { 3844 | "symfony/console": "<5.4" 3845 | }, 3846 | "require-dev": { 3847 | "symfony/console": "^5.4|^6.0|^7.0" 3848 | }, 3849 | "bin": [ 3850 | "Resources/bin/yaml-lint" 3851 | ], 3852 | "type": "library", 3853 | "autoload": { 3854 | "psr-4": { 3855 | "Symfony\\Component\\Yaml\\": "" 3856 | }, 3857 | "exclude-from-classmap": [ 3858 | "/Tests/" 3859 | ] 3860 | }, 3861 | "notification-url": "https://packagist.org/downloads/", 3862 | "license": [ 3863 | "MIT" 3864 | ], 3865 | "authors": [ 3866 | { 3867 | "name": "Fabien Potencier", 3868 | "email": "fabien@symfony.com" 3869 | }, 3870 | { 3871 | "name": "Symfony Community", 3872 | "homepage": "https://symfony.com/contributors" 3873 | } 3874 | ], 3875 | "description": "Loads and dumps YAML files", 3876 | "homepage": "https://symfony.com", 3877 | "support": { 3878 | "source": "https://github.com/symfony/yaml/tree/v6.4.0" 3879 | }, 3880 | "funding": [ 3881 | { 3882 | "url": "https://symfony.com/sponsor", 3883 | "type": "custom" 3884 | }, 3885 | { 3886 | "url": "https://github.com/fabpot", 3887 | "type": "github" 3888 | }, 3889 | { 3890 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3891 | "type": "tidelift" 3892 | } 3893 | ], 3894 | "time": "2023-11-06T11:00:25+00:00" 3895 | }, 3896 | { 3897 | "name": "theseer/tokenizer", 3898 | "version": "1.2.2", 3899 | "source": { 3900 | "type": "git", 3901 | "url": "https://github.com/theseer/tokenizer.git", 3902 | "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" 3903 | }, 3904 | "dist": { 3905 | "type": "zip", 3906 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", 3907 | "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", 3908 | "shasum": "" 3909 | }, 3910 | "require": { 3911 | "ext-dom": "*", 3912 | "ext-tokenizer": "*", 3913 | "ext-xmlwriter": "*", 3914 | "php": "^7.2 || ^8.0" 3915 | }, 3916 | "type": "library", 3917 | "autoload": { 3918 | "classmap": [ 3919 | "src/" 3920 | ] 3921 | }, 3922 | "notification-url": "https://packagist.org/downloads/", 3923 | "license": [ 3924 | "BSD-3-Clause" 3925 | ], 3926 | "authors": [ 3927 | { 3928 | "name": "Arne Blankerts", 3929 | "email": "arne@blankerts.de", 3930 | "role": "Developer" 3931 | } 3932 | ], 3933 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 3934 | "support": { 3935 | "issues": "https://github.com/theseer/tokenizer/issues", 3936 | "source": "https://github.com/theseer/tokenizer/tree/1.2.2" 3937 | }, 3938 | "funding": [ 3939 | { 3940 | "url": "https://github.com/theseer", 3941 | "type": "github" 3942 | } 3943 | ], 3944 | "time": "2023-11-20T00:12:19+00:00" 3945 | }, 3946 | { 3947 | "name": "webmozart/assert", 3948 | "version": "1.11.0", 3949 | "source": { 3950 | "type": "git", 3951 | "url": "https://github.com/webmozarts/assert.git", 3952 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" 3953 | }, 3954 | "dist": { 3955 | "type": "zip", 3956 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", 3957 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", 3958 | "shasum": "" 3959 | }, 3960 | "require": { 3961 | "ext-ctype": "*", 3962 | "php": "^7.2 || ^8.0" 3963 | }, 3964 | "conflict": { 3965 | "phpstan/phpstan": "<0.12.20", 3966 | "vimeo/psalm": "<4.6.1 || 4.6.2" 3967 | }, 3968 | "require-dev": { 3969 | "phpunit/phpunit": "^8.5.13" 3970 | }, 3971 | "type": "library", 3972 | "extra": { 3973 | "branch-alias": { 3974 | "dev-master": "1.10-dev" 3975 | } 3976 | }, 3977 | "autoload": { 3978 | "psr-4": { 3979 | "Webmozart\\Assert\\": "src/" 3980 | } 3981 | }, 3982 | "notification-url": "https://packagist.org/downloads/", 3983 | "license": [ 3984 | "MIT" 3985 | ], 3986 | "authors": [ 3987 | { 3988 | "name": "Bernhard Schussek", 3989 | "email": "bschussek@gmail.com" 3990 | } 3991 | ], 3992 | "description": "Assertions to validate method input/output with nice error messages.", 3993 | "keywords": [ 3994 | "assert", 3995 | "check", 3996 | "validate" 3997 | ], 3998 | "support": { 3999 | "issues": "https://github.com/webmozarts/assert/issues", 4000 | "source": "https://github.com/webmozarts/assert/tree/1.11.0" 4001 | }, 4002 | "time": "2022-06-03T18:03:27+00:00" 4003 | } 4004 | ], 4005 | "aliases": [], 4006 | "minimum-stability": "stable", 4007 | "stability-flags": [], 4008 | "prefer-stable": false, 4009 | "prefer-lowest": false, 4010 | "platform": { 4011 | "php": ">=7.1" 4012 | }, 4013 | "platform-dev": [], 4014 | "plugin-api-version": "2.6.0" 4015 | } 4016 | -------------------------------------------------------------------------------- /phpunit.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | src 6 | 7 | 8 | vendor 9 | 10 | 11 | 12 | 13 | ./tests/ 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Cache.php: -------------------------------------------------------------------------------- 1 | type = $type; 23 | $this->isRedis = $type === "redis"; 24 | 25 | /** 26 | * @var \Predis\Client 27 | * @var \Filebase\Database 28 | */ 29 | if ($this->isRedis) { 30 | $redisOpts = [ 31 | 'scheme' => 'tcp', 32 | 'host' => '127.0.0.1', 33 | 'port' => 6379, 34 | 'password' => '', 35 | 'database' => 0, 36 | ]; 37 | foreach ($redisClientOptions as $key => $option) { 38 | $redisOpts[$key] = $option; 39 | } 40 | 41 | $this->redis = new \Predis\Client([ 42 | 'scheme' => $redisOpts['scheme'], 43 | 'host' => $redisOpts['host'], 44 | 'port' => $redisOpts['port'], 45 | ], [ 46 | 'parameters' => [ 47 | 'password' => $redisOpts['password'], 48 | 'database' => $redisOpts['database'], 49 | ], 50 | ]); 51 | } else { 52 | $this->cache = new \Filebase\Database([ 53 | 'dir' => __DIR__ . DIRECTORY_SEPARATOR . 'cache/films/', 54 | 'backupLocation' => __DIR__ . DIRECTORY_SEPARATOR . 'cache/films/backups/', 55 | 'format' => \Filebase\Format\Json::class, 56 | 'cache' => true, 57 | 'cache_expires' => 31540000, 58 | 'pretty' => false 59 | ]); 60 | } 61 | } 62 | 63 | public function isRedis() 64 | { 65 | return $this->isRedis; 66 | } 67 | 68 | /** 69 | * Add (or modify) an item in the cache 70 | * 71 | * @param string $key 72 | * @param string $value 73 | * @return bool 74 | */ 75 | public function add(string $key, $value) 76 | { 77 | if ($this->isRedis) { 78 | $this->redis->set($key, json_encode($value)); 79 | } else { 80 | $file = $this->get($key); 81 | $file->film = $value; 82 | $file->save(); 83 | } 84 | return true; 85 | } 86 | 87 | /** 88 | * Deletes an item from the cache 89 | * 90 | * @return bool 91 | */ 92 | public function delete(string $key): bool 93 | { 94 | if ($this->isRedis) { 95 | $this->redis->del($key); 96 | } else { 97 | $file = $this->get($key); 98 | $file->delete(); 99 | } 100 | return true; 101 | } 102 | 103 | /** 104 | * Get an item from the cache 105 | * 106 | * @param string $key 107 | * @return object 108 | */ 109 | public function get(string $key): object 110 | { 111 | if ($this->isRedis) return json_decode($this->redis->get($key)); 112 | else return $this->cache->get($key); 113 | } 114 | 115 | /** 116 | * Check if an item exists in the cache 117 | * 118 | * @param string $key 119 | * @return bool 120 | */ 121 | public function has(string $key): bool 122 | { 123 | if ($this->isRedis) return $this->redis->exists($key); 124 | else return $this->cache->has($key); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /src/Dom.php: -------------------------------------------------------------------------------- 1 | loadFromUrl($url, [ 25 | "curlHeaders" => $options["curlHeaders"] 26 | ]); 27 | return $dom; 28 | } 29 | 30 | /** 31 | * Find object within DOM (if it exists) and reutrn an attribute 32 | * 33 | * @param object $dom 34 | * @param string $selection 35 | * 36 | * @return array|object 37 | */ 38 | public function find(object $dom, string $selection) 39 | { 40 | $found = $dom->find($selection); 41 | if (count($found) > 0) { 42 | return $found; 43 | } 44 | else { 45 | return $this->emptyElement(); 46 | } 47 | } 48 | 49 | /** 50 | * Create and parse an empty html string as a DOM element 51 | * 52 | * @return \PHPHtmlParser\Dom 53 | */ 54 | private function emptyElement() 55 | { 56 | $dom = new \PHPHtmlParser\Dom; 57 | $dom->load(''); 58 | return $dom; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/HtmlPieces.php: -------------------------------------------------------------------------------- 1 | filmId = $filmId; 18 | } 19 | 20 | public function setFilmId(string $filmId = null) 21 | { 22 | $this->filmId = $filmId; 23 | } 24 | 25 | /** 26 | * Attempts to find and return a specific element 27 | * from the IMDB dom 28 | * 29 | * @param object $dom 30 | * @param string $element 31 | * @return string 32 | */ 33 | public function get(object $page, string $element, string $url='') 34 | { 35 | // Initiate dom object 36 | // -> handles page scraping 37 | $dom = new Dom; 38 | 39 | switch ($element) { 40 | case "title": 41 | $patterns = ["h1[data-testid=hero__pageTitle] span", "h1[data-testid=hero__pageTitle]", "h1[data-testid=hero-title-block__title]", ".title_wrapper h1"]; 42 | $title = $this->findMatchInPatterns($dom, $page, $patterns); 43 | 44 | return $this->strClean($title); 45 | break; 46 | 47 | case "genre": 48 | $patterns = ["div[data-testid=interests] a", "div[data-testid=genres] a"]; 49 | $allGenres = $dom->find($page, $patterns[0]); 50 | 51 | // Legacy 52 | if (!$this->count($allGenres)) { 53 | $allGenresLegacy = $dom->find($page, $patterns[1]); 54 | $allGenres = $allGenresLegacy; 55 | } 56 | 57 | $genres = []; 58 | 59 | if ($this->count($allGenres)) { 60 | foreach ($allGenres as $genre) { 61 | $genres[] = $this->strClean($genre->find('span')->text()); 62 | } 63 | } 64 | 65 | return $genres; 66 | break; 67 | 68 | case "year": 69 | $patterns = ["a[href='/title/{$this->filmId}/releaseinfo?ref_=tt_ov_rdat']", "[data-testid=hero-title-block__metadata] > li > a", ".title_wrapper h1 #titleYear a", ".title_wrapper .subtext a[title='See more release dates']", "section section div div div ul li a"]; 70 | $year = $this->findMatchInPatterns($dom, $page, $patterns); 71 | 72 | // Detect OLD IMDB + TV show 73 | if ($this->count($year) > 4) { 74 | // Extract year from text 75 | // \d{4}.\d{4} 76 | $matchYear = preg_replace(preg_quote("/[^\d{4}\-\-\d{4}]/"), "", $year); 77 | if ($this->count($matchYear) > 0) { 78 | $year = $matchYear; 79 | } 80 | } 81 | 82 | return $this->strClean($year); 83 | break; 84 | 85 | case "length": 86 | $patterns = ["section section div div div ul li", ".subtext time"]; 87 | $length = ""; 88 | 89 | $length = $dom->find($page, $patterns[1])->text; 90 | if ($this->count($length) > 0) return $this->strClean($length); 91 | 92 | $length = ""; 93 | $iter = $dom->find($page, $patterns[0]); 94 | if ($this->count($iter) === 0) return $length; 95 | 96 | // Loop row below main title 97 | // 2014 · 12A · 2h 49min 98 | foreach ($iter as $iterRow) { 99 | // Get row text 100 | $rowText = $iterRow->text; 101 | if ($this->count($rowText) === 0) continue; 102 | 103 | // Attempt to match length (runtime) from text 104 | $isMatch = preg_match("/([0-9]+[h|m] [0-9]+[h|m])|([0-9]+[h|m])/", $rowText); 105 | 106 | if ($isMatch > 0) { 107 | $length = $rowText; 108 | } 109 | } 110 | 111 | return $this->strClean($length); 112 | break; 113 | 114 | case "plot": 115 | $patterns = ["p[data-testid=plot] > span[data-testid=plot-xl]", "[data-testid=plot-xl]", ".plot_summary .summary_text"]; 116 | $plot = $this->findMatchInPatterns($dom, $page, $patterns); 117 | 118 | return $this->strClean($plot); 119 | break; 120 | 121 | case "rating": 122 | $patterns = ["[data-testid=hero-rating-bar__aggregate-rating__score] > span", ".ratings_wrapper .ratingValue span[itemprop=ratingValue]"]; 123 | $rating = $this->findMatchInPatterns($dom, $page, $patterns); 124 | 125 | return $this->strClean($rating); 126 | break; 127 | 128 | case "rating_votes": 129 | $patterns = [".sc-eb51e184-3", ".sc-bde20123-3", "[class*=TotalRatingAmount]", ".ratings_wrapper span[itemprop=ratingCount]"]; 130 | $rating_votes = $this->findMatchInPatterns($dom, $page, $patterns); 131 | $rating_votes = $this->unwrapFormattedNumber($rating_votes); 132 | 133 | return preg_replace("/[^0-9]/", "", $this->strClean($rating_votes)); 134 | break; 135 | 136 | case "poster": 137 | $patterns = [".ipc-poster .ipc-media img", ".poster img"]; 138 | $poster = $this->findMatchInPatterns($dom, $page, $patterns, "src"); 139 | $poster = preg_match('/@/', $poster) ? preg_split('~@(?=[^@]*$)~', $poster)[0] . "@.jpg" : $poster; 140 | 141 | return $this->strClean($poster); 142 | break; 143 | 144 | case "trailer": 145 | // section section div section section div div div div div a[aria-label^=Watch] 146 | // div a[class*=hero-media][aria-label^=Watch] 147 | $patterns = ["a[data-testid=videos-slate-overlay-1]", "div a[aria-label^=Watch]", ".slate a[data-video]"]; 148 | $trailerLinkOld = $dom->find($page, $patterns[1]); 149 | $trailerLink = $dom->find($page, $patterns[0]); 150 | 151 | if ($this->count($trailerLink)) { 152 | $href = $trailerLink->getAttribute("href"); 153 | preg_match("/\/video\/(vi[a-zA-Z0-9]+)/", $href, $matches); 154 | $trailerId = $this->count($matches) > 1 ? $matches[1] : ""; 155 | $trailerLink = $this->count($trailerId) ? "https://www.imdb.com/video/".$trailerId : ""; 156 | 157 | } elseif ($this->count($trailerLinkOld)) { 158 | $trailerId = $this->count($trailerLinkOld) ? $trailerLinkOld->getAttribute("data-video") : ""; 159 | $trailerLink = $this->count($trailerId) ? "https://www.imdb.com/video/".$trailerId : ""; 160 | } else { 161 | $trailerId = ""; 162 | $trailerLink = ""; 163 | } 164 | 165 | return [ 166 | "id" => $trailerId, 167 | "link" => $trailerLink 168 | ]; 169 | break; 170 | 171 | case "cast": 172 | $cast = []; 173 | $findAllCastOld = $dom->find($page, 'table.cast_list tr'); 174 | $findAllCast = $dom->find($page, '[data-testid=title-cast] [data-testid=shoveler-items-container] > div'); 175 | 176 | // Use $findAllCastOld 177 | if ($this->count($findAllCastOld)) { 178 | foreach ($findAllCastOld as $castRow) 179 | { 180 | if ($this->count($castRow->find('.primary_photo')) === 0) { 181 | continue; 182 | } 183 | $actor = []; 184 | 185 | $characterLink = $castRow->find('.character a'); 186 | $actor["character"] = count($characterLink) ? $characterLink->text : $dom->find($castRow, '.character')->text; 187 | 188 | $actorRow = $castRow->find('td')[1]; 189 | $actorLink = $actorRow->find('a'); 190 | if ($this->count($actorLink) > 0) { 191 | // Set actor name to text within link 192 | $actor["actor"] = $actorLink->text; 193 | $actor["actor_id"] = $this->extractImdbId($actorLink->href); 194 | } else { 195 | // No link found 196 | // Set actor name to whatever is there 197 | $actor["actor"] = $actorRow->text; 198 | } 199 | 200 | $actor["character"] = $this->strClean($actor["character"]); 201 | $actor["actor"] = $this->strClean($actor["actor"]); 202 | $actor["actor_id"] = $this->strClean($actor["actor_id"]); 203 | 204 | array_push($cast, $actor); 205 | } 206 | } 207 | 208 | // Use 'new' $findAllCast 209 | if ($this->count($findAllCast)) { 210 | foreach ($findAllCast as $castRow) 211 | { 212 | if ($this->count($castRow->find('img')) === 0) { 213 | continue; 214 | } 215 | 216 | $actor = []; 217 | $actor["actor"] = ""; 218 | $actor["avatar"] = ""; 219 | $actor["avatar_hq"] = ""; 220 | $actor["actor_id"] = ""; 221 | $actor["character"] = ""; 222 | 223 | // Actor 224 | $actorLink = $castRow->find('a[data-testid=title-cast-item__actor]'); 225 | if ($this->count($actorLink)) { 226 | $actor["actor"] = $actorLink->text; 227 | } 228 | 229 | // Avatar 230 | $actorAvatar = $castRow->find('img.ipc-image'); 231 | if ($this->count($actorAvatar)) { 232 | $actor["avatar"] = $actorAvatar->getAttribute('src'); 233 | $actor["avatar_hq"] = preg_match('/@/', $actor["avatar"]) ? preg_split('~@(?=[^@]*$)~', $actor["avatar"])[0] . "@.jpg" : $actor["avatar"]; 234 | 235 | if ($actor["avatar"] == $actor["avatar_hq"]) { 236 | $actor["avatar_hq"] = preg_match('/\.\_/', $actor["avatar_hq"]) ? preg_split('/\.\_.*/', $actor["avatar_hq"])[0] . ".jpg" : $actor["avatar_hq"]; 237 | } 238 | } 239 | 240 | // Actor ID 241 | $link = $castRow->find('a'); 242 | if ($this->count($link)) { 243 | $href = $link->getAttribute("href"); 244 | preg_match("/(nm[0-9]+)/", $href, $matches); 245 | if ($this->count($matches)) { 246 | $actor["actor_id"] = $matches[0]; 247 | } 248 | } 249 | 250 | // Character 251 | $characterLink = $castRow->find('[data-testid=cast-item-characters-link] span'); 252 | if ($this->count($characterLink)) { 253 | $actor["character"] = $characterLink->text; 254 | } 255 | 256 | $actor["character"] = $this->strClean($actor["character"]); 257 | $actor["actor"] = $this->strClean($actor["actor"]); 258 | $actor["avatar"] = $this->strClean($actor["avatar"]); 259 | $actor["actor_id"] = $this->strClean($actor["actor_id"]); 260 | 261 | array_push($cast, $actor); 262 | } 263 | } 264 | return $cast; 265 | break; 266 | 267 | case "tvShow": 268 | preg_match('/TV Series/i', $page, $matches, PREG_OFFSET_CAPTURE); 269 | return !!$this->count($matches); 270 | break; 271 | 272 | case "seasons": 273 | $seasons = []; 274 | $findAllSeasons = $dom->find($page, "#bySeason > option"); 275 | $dom = new \PHPHtmlParser\Dom(); 276 | foreach ($findAllSeasons as $seasonRow){ 277 | $season = []; 278 | $seasonValue = $seasonRow->getAttribute('value'); 279 | $season['season'] = $seasonValue; 280 | // Using imdb ajax api to get episodes 281 | $season['episodes'] = $this->get($dom->loadFromUrl($url."/_ajax?season=".$seasonValue), "episodes"); 282 | array_push($seasons, $season); 283 | } 284 | return $seasons; 285 | break; 286 | 287 | case "episodes": 288 | $episodes = []; 289 | $findAllEpisodes = $dom->find($page, ".eplist > .list_item"); 290 | foreach ($findAllEpisodes as $episodeRow){ 291 | $episode = []; 292 | $hyperlink = $episodeRow->find("a[itemprop=url]"); 293 | $episode["id"] = $this->extractImdbId($hyperlink->getAttribute("href")); 294 | $episode['title'] = $episodeRow->find('a[itemprop=name]')->text; 295 | $episode['description'] = $episodeRow->find(".item_description")->text; 296 | $rating = $episodeRow->find(".ipl-rating-star__rating"); 297 | $episode["poster"] = ""; 298 | if($this->count($rating)) { 299 | $episode['rating'] = $rating->text; 300 | } 301 | $image = $hyperlink->find("img"); 302 | if($this->count($image)) { 303 | $poster = $image->getAttribute("src"); 304 | $episode["poster"] = preg_match('/@/', $poster) ? preg_split('~@(?=[^@]*$)~', $poster)[0] . "@.jpg" : $poster; 305 | 306 | if ($poster == $episode["poster"]) { 307 | $episode["poster"] = preg_match('/\.\_/', $episode["poster"]) ? preg_split('/\.\_.*/', $episode["poster"])[0] . ".jpg" : $episode["poster"]; 308 | } 309 | } 310 | array_push($episodes, $episode); 311 | } 312 | return $episodes; 313 | break; 314 | 315 | case "technical_specs": 316 | $technical_specs = []; 317 | 318 | // Old ui 319 | $table = $dom->find($page, '.dataTable tr'); 320 | if ($this->count($table) > 0) { 321 | foreach ($table as $row) 322 | { 323 | $row_title = $row->find('td')[0]->text(true); 324 | $row_value = str_replace(" ", "
", $row->find('td')[1]->text(true)); 325 | $row = [ 326 | $this->strClean($row_title), 327 | $this->strClean($row_value) 328 | ]; 329 | array_push($technical_specs, $row); 330 | } 331 | } 332 | 333 | // New ui 334 | foreach ([ 335 | 'runtime', 336 | 'soundmixes', 337 | 'colorations', 338 | 'aspectratio', 339 | 'cameras', 340 | 'laboratory', 341 | 'filmLength', 342 | 'negativeFormat', 343 | 'process', 344 | 'printedFormat' 345 | ] as $itemId) 346 | { 347 | $row = $dom->find($page, "#$itemId"); 348 | $row_title = $row->find(".ipc-metadata-list-item__label"); 349 | if ($this->count($row_title) < 1) continue; 350 | $row_value_container = $row->find('.ipc-metadata-list-item__content-container'); 351 | $row_value_list = $row_value_container->find('li'); 352 | $row_value = ''; 353 | if ($this->count($row_value_list) > 0) { 354 | foreach ($row_value_list as $list_item) 355 | { 356 | $list_item_value = $list_item->find('.ipc-metadata-list-item__list-content-item'); 357 | $list_item_subtext = $list_item->find('.ipc-metadata-list-item__list-content-item--subText'); 358 | if ($this->count($list_item_value) > 0) { 359 | $delimiter = '|'; 360 | $textToAdd = $list_item_value->text(true); 361 | if ($this->count($list_item_subtext) > 0) $textToAdd = "$textToAdd " . $list_item_subtext->text(true); 362 | if ($this->count($row_value) > 0) $textToAdd .= " $delimiter $textToAdd"; 363 | $row_value .= $textToAdd; 364 | } 365 | } 366 | } else { 367 | $row_value = $row_value_container->text(true); 368 | } 369 | $row = [ 370 | $this->strClean($row_title->text(true)), 371 | $this->strClean($row_value) 372 | ]; 373 | array_push($technical_specs, $row); 374 | } 375 | 376 | return $technical_specs; 377 | break; 378 | 379 | case "titles": 380 | case "names": 381 | case "people": 382 | case "companies": 383 | $response = []; 384 | $sections = $dom->find($page, ".ipc-page-section"); 385 | if ($this->count($sections) > 0) 386 | { 387 | foreach ($sections as $section) 388 | { 389 | $sectionName = @strtolower($dom->find($section, ".ipc-title__text")->text); 390 | if ($sectionName === $element) { 391 | $sectionRows = $section->find("ul li"); 392 | if ($this->count($sectionRows) > 0) 393 | { 394 | foreach ($sectionRows as $sectionRow) 395 | { 396 | $row = []; 397 | 398 | $link = $dom->find($sectionRow, 'a'); 399 | $row["title"] = $link->text; 400 | if ($row["title"] == "") { 401 | continue; 402 | } 403 | 404 | $row["image"] = $dom->find($sectionRow, '.ipc-image')->src; 405 | if (preg_match('/@/', $row["image"])) 406 | { 407 | $row["image"] = preg_split('~@(?=[^@]*$)~', $row["image"])[0] . "@.jpg"; 408 | } 409 | $row["image"] = empty($row["image"]) ? "" : $row["image"]; 410 | 411 | $row["id"] = $this->extractImdbId($link->href); 412 | 413 | array_push($response, $row); 414 | } 415 | } 416 | } 417 | } 418 | } 419 | return $response; 420 | break; 421 | 422 | default: 423 | return ""; 424 | } 425 | } 426 | 427 | /** 428 | * Attempt to extract text using an array of match patterns 429 | * 430 | * @param object $page 431 | * @param array $patterns 432 | * @return string 433 | */ 434 | public function findMatchInPatterns(object $dom, object $page, array $patterns, string $type = "text") 435 | { 436 | $str = ""; 437 | foreach ($patterns as $pattern) 438 | { 439 | if ($type === "src") { 440 | $el = $dom->find($page, $pattern); 441 | $str = $this->count($el) > 0 ? $el->getAttribute("src") : ""; 442 | } elseif ($type === "href") { 443 | $el = $dom->find($page, $pattern); 444 | $str = $this->count($el) > 0 ? $el->getAttribute("href") : ""; 445 | } else { 446 | $str = $dom->find($page, $pattern)->text; 447 | } 448 | if ($this->count($str) > 0) break; 449 | } 450 | return $str; 451 | } 452 | 453 | /** 454 | * Unwrap formatted number to original int - 1.5K -> 1500 455 | * 456 | * @param string $str 457 | * @return string 458 | */ 459 | public function unwrapFormattedNumber($str) 460 | { 461 | $unwrap = $str; 462 | $divisors = ["K", "M", "B"]; 463 | $divisorMap = [ 464 | "K" => 1000, 465 | "M" => 1000000, 466 | "B" => 1000000000 467 | ]; 468 | 469 | $strDivisor = substr($str, -1); 470 | if (in_array($strDivisor, $divisors)) { 471 | // Remove last charactor 472 | $strNum = substr($str, 0, -1); 473 | $num = floatval($strNum); 474 | 475 | $numActual = $num * $divisorMap[$strDivisor]; 476 | 477 | $unwrap = strval($numActual); 478 | } 479 | 480 | return $unwrap; 481 | } 482 | 483 | /** 484 | * Extract an imdb-id from a string '/ttxxxxxxx/' 485 | * Returns string of id or empty string if none found 486 | * 487 | * @param string $str 488 | * @return string 489 | */ 490 | public function extractImdbId($str) 491 | { 492 | // Search string for 2 letters followed by numbers 493 | // '/yyxxxxxxx' 494 | preg_match('/\/[A-Za-z]{2}[0-9]+/', $str, $imdbIds); 495 | $id = substr($imdbIds[0], 1); 496 | if ($id == NULL) 497 | { 498 | $id = ""; 499 | } 500 | return $id; 501 | } 502 | 503 | /** 504 | * Cleans-up string 505 | * -> removes white-space and html entitys 506 | * turns null into empty string 507 | * 508 | * @param $string 509 | * @return string 510 | */ 511 | public function strClean($string) 512 | { 513 | return empty($string) ? "" : str_replace(chr(194).chr(160), '', html_entity_decode(trim($string), ENT_QUOTES)); 514 | } 515 | 516 | /** 517 | * Count (either array items or string length) 518 | * 519 | * @param array|string $item 520 | * @return string 521 | */ 522 | public function count($item) 523 | { 524 | return (is_countable($item) ? count($item) : (is_string($item) ? strlen($item) : 0)); 525 | } 526 | 527 | } 528 | -------------------------------------------------------------------------------- /src/Imdb.php: -------------------------------------------------------------------------------- 1 | true, 25 | 'cacheType' => 'file', 26 | 'cacheRedis' => [ 27 | 'scheme' => 'tcp', 28 | 'host' => '127.0.0.1', 29 | 'port' => 6379, 30 | 'password' => '', 31 | 'database' => 0, 32 | ], 33 | 'category' => 'all', 34 | 'curlHeaders' => ['Accept-Language: en-US,en;q=0.5'], 35 | 'techSpecs' => true, 36 | 'seasons' => false, 37 | ]; 38 | 39 | // Merge any user options with the default ones 40 | foreach ($options as $key => $option) { 41 | $defaults[$key] = $option; 42 | } 43 | 44 | // Return final options array 45 | return $defaults; 46 | } 47 | 48 | /** 49 | * Gets film data from IMDB. Will first search if the 50 | * film name is passed instead of film-id 51 | * @param string $filmId 52 | * @param array $options 53 | * @return array $response 54 | */ 55 | public function film(string $filmId, array $options = []): array 56 | { 57 | // Combine user options with default ones 58 | $options = $this->populateOptions($options); 59 | 60 | // Initiate response object 61 | // -> handles what the api returns 62 | $response = new Response; 63 | 64 | // Initiate cache object 65 | // -> handles storing/retrieving cached results 66 | $cache = new Cache($options["cacheType"], $options["cacheRedis"]); 67 | 68 | // Initiate dom object 69 | // -> handles page scraping 70 | $dom = new Dom; 71 | 72 | // Initiate html-pieces object 73 | // -> handles finding specific content from the dom 74 | $htmlPieces = new HtmlPieces; 75 | 76 | // Check for 'tt' at start of $filmId 77 | if (substr($filmId, 0, 2) !== "tt") 78 | { 79 | // Search $filmId and use first result 80 | $search_film = $this->search($filmId, [ "category" => "tt" ]); 81 | if ($htmlPieces->count($search_film["titles"]) > 0) 82 | { 83 | // Use first film returned from search 84 | $filmId = $search_film["titles"][0]["id"]; 85 | } else 86 | { 87 | // No film found 88 | // -> return default (empty) response 89 | return $response->default('film'); 90 | } 91 | } 92 | 93 | // If caching is enabled 94 | if ($options["cache"]) { 95 | // Check cache for film 96 | if ($cache->has($filmId)) { 97 | if ($cache->isRedis()) return (array) $cache->get($filmId); 98 | else return $cache->get($filmId)->film; 99 | } 100 | } 101 | 102 | // Load imdb film page and parse the dom 103 | $page = $dom->fetch("https://www.imdb.com/title/".$filmId."/", $options); 104 | $htmlPieces->setFilmId($filmId); 105 | 106 | // Add all film data to response $store 107 | $response->add("id", $filmId); 108 | $response->add("title", $htmlPieces->get($page, "title")); 109 | $response->add("genres", $htmlPieces->get($page, "genre")); 110 | $response->add("year", $htmlPieces->get($page, "year")); 111 | $response->add("length", $htmlPieces->get($page, "length")); 112 | $response->add("plot", $htmlPieces->get($page, "plot")); 113 | $response->add("rating", $htmlPieces->get($page, "rating")); 114 | $response->add("rating_votes", $htmlPieces->get($page, "rating_votes")); 115 | $response->add("poster", $htmlPieces->get($page, "poster")); 116 | $response->add("trailer", $htmlPieces->get($page, "trailer")); 117 | $response->add("tvShow", $htmlPieces->get($page, "tvShow")); 118 | $response->add("cast", $htmlPieces->get($page, "cast")); 119 | $response->add("seasons", []); 120 | $response->add("technical_specs", []); 121 | 122 | // If techSpecs is enabled in user $options 123 | // -> Make a second request to load the full techSpecs page 124 | if ($options["techSpecs"]) { 125 | $page_techSpecs = $dom->fetch("https://www.imdb.com/title/$filmId/technical", $options); 126 | $response->add("technical_specs", $htmlPieces->get($page_techSpecs, "technical_specs")); 127 | } 128 | 129 | // If seasons is enabled & is a tv show 130 | if ($options['seasons'] && $response->get("tvShow")) { 131 | $url = "https://www.imdb.com/title/$filmId/episodes"; 132 | $page_seasons = $dom->fetch($url, $options); 133 | // If film has episodes or seasons 134 | if (count($page_seasons->find(".error_code_404")) == 0) { 135 | $response->add("seasons", $htmlPieces->get($page_seasons, "seasons", $url)); 136 | } 137 | } 138 | 139 | // If caching is enabled 140 | if ($options["cache"]) { 141 | // Add result to the cache 142 | $cache->add($filmId, $response->return()); 143 | } 144 | 145 | // Return the response $store 146 | return $response->return(); 147 | } 148 | 149 | /** 150 | * Searches IMDB for films, people and companies 151 | * @param string $search 152 | * @param array $options 153 | * @return array $searchData 154 | */ 155 | public function search(string $search, array $options = []): array 156 | { 157 | // Combine user options with default ones 158 | $options = $this->populateOptions($options); 159 | 160 | // Initiate response object 161 | // -> handles what the api returns 162 | $response = new Response; 163 | 164 | // Initiate dom object 165 | // -> handles page scraping 166 | $dom = new Dom; 167 | 168 | // Initiate html-pieces object 169 | // -> handles finding specific content from the dom 170 | $htmlPieces = new HtmlPieces; 171 | 172 | // Encode search string as a standard URL string 173 | // -> ' ' => '%20' 174 | $search_url = urlencode(urldecode($search)); 175 | 176 | // Load imdb search page and parse the dom 177 | $page = $dom->fetch("https://www.imdb.com/find?q=$search_url&s=".$options["category"], $options); 178 | 179 | // Add all search data to response $store 180 | $response->add("titles", $htmlPieces->get($page, "titles")); 181 | $response->add("names", $htmlPieces->get($page, "people")); 182 | $response->add("companies", $htmlPieces->get($page, "companies")); 183 | 184 | return $response->return(); 185 | } 186 | 187 | } 188 | -------------------------------------------------------------------------------- /src/Response.php: -------------------------------------------------------------------------------- 1 | store[$key] = $value; 32 | 33 | return $this->store; 34 | } 35 | 36 | /** 37 | * Get an individual value from the response $store 38 | * 39 | * @param string $key 40 | * @return $store[$key] 41 | */ 42 | public function get(string $key) 43 | { 44 | return $this->store[$key]; 45 | } 46 | 47 | /** 48 | * Returns the entire $store array 49 | * 50 | * @return array $store 51 | */ 52 | public function return(): array 53 | { 54 | return $this->store; 55 | } 56 | 57 | /** 58 | * Returns default response for an endpoint 59 | * 60 | * @param string $endpoint 61 | * @return array $defaults 62 | */ 63 | public function default(string $endpoint): array 64 | { 65 | $response = []; 66 | switch($endpoint) 67 | { 68 | case "film": 69 | $response = [ 70 | "id" => "", 71 | "title" => "", 72 | "genres" => [], 73 | "year" => "", 74 | "length" => "", 75 | "plot" => "", 76 | "rating" => "", 77 | "rating_votes" => "", 78 | "poster" => "", 79 | "trailer" => [ 80 | "id" => "", 81 | "link" => "" 82 | ], 83 | "tvShow" => false, 84 | "cast" => [], 85 | "seasons" => [], 86 | "technical_specs" => [] 87 | ]; 88 | break; 89 | 90 | case "search": 91 | $response = [ 92 | "titles" => [], 93 | "names" => [], 94 | "companies" => [] 95 | ]; 96 | break; 97 | } 98 | return $response; 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /tests/CacheTest.php: -------------------------------------------------------------------------------- 1 | "Interstellar" 15 | ]; 16 | 17 | $cache->add("test", $testData); 18 | $testFile = $cache->get("test"); 19 | 20 | $this->assertEquals($testData, $testFile->film); 21 | 22 | $cache->delete("test"); 23 | } 24 | 25 | public function testHasCache() 26 | { 27 | $cache = new Cache; 28 | $cache->add("testHas", [ "test" => "has" ]); 29 | 30 | $this->assertEquals(true, $cache->has("testHas")); 31 | $this->assertEquals(false, $cache->has("testHasNot")); 32 | 33 | $cache->delete("testHas"); 34 | } 35 | 36 | public function testDeleteFromCache() 37 | { 38 | $cache = new Cache; 39 | $cache->add("testHas", [ "test" => "has" ]); 40 | 41 | $this->assertEquals(true, $cache->has("testHas")); 42 | $cache->delete("testHas"); 43 | $this->assertEquals(false, $cache->has("testHas")); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /tests/HtmlPiecesTest.php: -------------------------------------------------------------------------------- 1 | assertEquals("1500000", $htmlPieces->unwrapFormattedNumber("1.5M")); 13 | $this->assertEquals("1200", $htmlPieces->unwrapFormattedNumber("1.2K")); 14 | $this->assertEquals("1.8", $htmlPieces->unwrapFormattedNumber("1.8")); 15 | // $this->assertEquals($expected, $actual); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /tests/ImdbTest.php: -------------------------------------------------------------------------------- 1 | film('tt0816692', [ 'cache' => false ]); 14 | 15 | $this->assertEquals('tt0816692', $film['id']); 16 | $this->assertEquals('Interstellar', $film['title']); 17 | $this->assertEquals('Adventure Epic', $film['genres'][0]); 18 | $this->assertEquals('Epic', $film['genres'][1]); 19 | $this->assertEquals('Quest', $film['genres'][2]); 20 | $this->assertEquals('2h 49m', $film['length']); 21 | $this->assertEquals('2014', $film['year']); 22 | $this->assertEquals("When Earth becomes uninhabitable in the future, a farmer and ex-NASA pilot, Joseph Cooper, is tasked to pilot a spacecraft, along with a team of researchers, to find a new planet for humans.", $film['plot']); 23 | $this->assertEquals('8.7', $film['rating']); 24 | $this->assertEquals('vi1586278169', $film['trailer']["id"]); 25 | $this->assertEquals('https://www.imdb.com/video/vi1586278169', $film['trailer']["link"]); 26 | $this->assertContains($film['cast'][0]["character"], ['Cooper']); 27 | $this->assertContains($film['cast'][0]["actor"], ['Matthew McConaughey']); 28 | $this->assertContains($film['cast'][0]["actor_id"], ['nm0000190']); 29 | $this->assertContains($film['cast'][0]["avatar"], ['https://m.media-amazon.com/images/M/MV5BMTg0MDc3ODUwOV5BMl5BanBnXkFtZTcwMTk2NjY4Nw@@._V1_QL75_UX140_CR0,21,140,140_.jpg']); 30 | } 31 | 32 | public function testFilmBySearching() 33 | { 34 | $imdb = new Imdb; 35 | $film = $imdb->film('Interstellar', [ 'cache' => false ]); 36 | 37 | $this->assertEquals('tt0816692', $film['id']); 38 | $this->assertEquals('Interstellar', $film['title']); 39 | $this->assertEquals('Adventure Epic', $film['genres'][0]); 40 | $this->assertEquals('Epic', $film['genres'][1]); 41 | $this->assertEquals('Quest', $film['genres'][2]); 42 | $this->assertEquals('2h 49m', $film['length']); 43 | $this->assertEquals('2014', $film['year']); 44 | $this->assertEquals("When Earth becomes uninhabitable in the future, a farmer and ex-NASA pilot, Joseph Cooper, is tasked to pilot a spacecraft, along with a team of researchers, to find a new planet for humans.", $film['plot']); 45 | $this->assertEquals('8.7', $film['rating']); 46 | $this->assertEquals('vi1586278169', $film['trailer']["id"]); 47 | $this->assertEquals('https://www.imdb.com/video/vi1586278169', $film['trailer']["link"]); 48 | $this->assertContains($film['cast'][0]["character"], ['Cooper']); 49 | $this->assertContains($film['cast'][0]["actor"], ['Matthew McConaughey']); 50 | $this->assertContains($film['cast'][0]["actor_id"], ['nm0000190']); 51 | $this->assertContains($film['cast'][0]["avatar"], ['https://m.media-amazon.com/images/M/MV5BMTg0MDc3ODUwOV5BMl5BanBnXkFtZTcwMTk2NjY4Nw@@._V1_QL75_UX140_CR0,21,140,140_.jpg']); 52 | $this->assertContains($film['cast'][0]["avatar_hq"], ['https://m.media-amazon.com/images/M/MV5BMTg0MDc3ODUwOV5BMl5BanBnXkFtZTcwMTk2NjY4Nw@@.jpg']); 53 | } 54 | 55 | public function testFilmOptions() 56 | { 57 | $imdb = new Imdb; 58 | $cache = new Cache; 59 | $film = $imdb->film('tt0065531', [ 60 | 'cache' => false, 61 | 'curlHeaders' => ['Accept-Language: de-DE, de;q=0.5'], 62 | 'techSpecs' => false 63 | ]); 64 | 65 | $this->assertEquals('Vier im roten Kreis', $film['title']); 66 | $this->assertEquals(0, count($film['technical_specs'])); 67 | $this->assertEquals(false, $cache->has('tt0065531')); 68 | } 69 | 70 | public function testFilmCache() 71 | { 72 | $imdb = new Imdb; 73 | $cache = new Cache; 74 | $film = $imdb->film('tt0816692', [ 'cache' => true, 'techSpecs' => false ]); 75 | $cache_film = $cache->get('tt0816692')->film; 76 | 77 | $this->assertEquals(true, $cache->has('tt0816692')); 78 | $this->assertEquals('Interstellar', $cache_film['title']); 79 | } 80 | 81 | public function testSearch() 82 | { 83 | $imdb = new Imdb; 84 | $search = $imdb->search('Interstellar'); 85 | 86 | $this->assertEquals('Interstellar', $search['titles'][0]['title']); 87 | $this->assertEquals('tt0816692', $search['titles'][0]['id']); 88 | 89 | $search_2 = $imdb->search('The Life and Death of Colonel Blimp'); 90 | 91 | $this->assertEquals('The Life and Death of Colonel Blimp', $search_2['titles'][0]['title']); 92 | $this->assertEquals('tt0036112', $search_2['titles'][0]['id']); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /tests/ResponseTest.php: -------------------------------------------------------------------------------- 1 | add("id", "tt0816692"); 12 | $response->add("title", "Interstellar"); 13 | 14 | $expected = [ 15 | "id" => "tt0816692", 16 | "title" => "Interstellar" 17 | ]; 18 | 19 | $this->assertEquals($expected, $response->store); 20 | } 21 | 22 | public function testGetFunction() 23 | { 24 | $response = new Response; 25 | $response->add("title", "Interstellar"); 26 | 27 | $this->assertEquals("Interstellar", $response->get("title")); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /tests/index.php: -------------------------------------------------------------------------------- 1 | film($query, [ 'cache' => false, 'techSpecs' => true ]); 22 | // $response = $imdb->film($query, [ 'cache' => true, 'cacheType' => 'redis', 'cacheRedis' => [ 23 | // 'host' => '127.0.0.1', 24 | // 'password' => '', 25 | // ], 'techSpecs' => true ]); 26 | break; 27 | 28 | case "search": 29 | $response = $imdb->search($query); 30 | break; 31 | } 32 | 33 | // -> Return loaded film data 34 | echo json_encode($response, JSON_PRETTY_PRINT); 35 | --------------------------------------------------------------------------------