├── .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 | [](https://packagist.org/packages/hmerritt/imdb-api)
4 | [](https://circleci.com/gh/hmerritt/php-imdb-api/tree/master)
5 | [](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 |
--------------------------------------------------------------------------------