├── .github └── workflows │ └── build.yml ├── .gitignore ├── README.md ├── composer.json ├── composer.lock ├── docker-compose.yml ├── docker └── app │ └── Dockerfile ├── phpargsdetector └── src ├── Commands └── InspectCommand.php ├── Detector.php ├── Method.php ├── NodeMethodExplorer.php ├── Printers └── Console.php └── Visitors └── FileVisitor.php /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | php: [7.3, 7.4, 8.0, 8.1] 12 | 13 | steps: 14 | - uses: actions/checkout@v1 15 | 16 | - name: Set PHP version 17 | uses: shivammathur/setup-php@v2 18 | with: 19 | php-version: ${{ matrix.php }} 20 | 21 | - name: Install composer dependencies 22 | run: composer update --quiet --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | vendor/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![build](https://github.com/DeGraciaMathieu/php-arguments-detector/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/DeGraciaMathieu/php-arguments-detector/actions/workflows/build.yml) 2 | [![packagist](https://img.shields.io/packagist/v/DeGraciaMathieu/php-arguments-detector)]([https://github.com/DeGraciaMathieu/php-arguments-detector/actions/workflows/build.yml](https://img.shields.io/packagist/v/DeGraciaMathieu/php-arguments-detector)) 3 | [![packagist](https://img.shields.io/badge/php%20versions-7.3%20%7C%207.4%20%7C%20%5E8-blue)]([https://img.shields.io/badge/php%20versions-7.3%20%7C%207.4%20%7C%20%5E8-blue](https://img.shields.io/badge/php%20versions-7.3%20%7C%207.4%20%7C%20%5E8-blue)) 4 | 5 | # php arguments detector 6 | > The ideal number of arguments for a function is zero. ~ Robert C. Martin 7 | 8 | Keep control over the complexity of your methods by checking that they do not have too many arguments with this package. 9 | ## Installation 10 | Requires >= PHP 7.3 11 | ``` 12 | composer require degraciamathieu/php-arguments-detector --dev 13 | ``` 14 | ## Usage 15 | ``` 16 | vendor/bin/phpargsdetector inspect {folder} 17 | ``` 18 | ## Options 19 | | options | description | 20 | |-----------------------|-------------| 21 | | --min-args= | Ignore methods with less than --min-args arguments. | 22 | | --max-args= | Ignore methods with more than --max-args arguments. | 23 | | --min-weight= | Ignore methods with less than --min-weight weight. | 24 | | --max-weight= | Ignore methods with more than --max-weight weight. | 25 | | --limit= | Number of methods displayed. | 26 | | --without-constructor | Ignore method constructors from detection. | 27 | | --sort-by-weight | Sort the results by the weight of methods. | 28 | ## Examples 29 | ``` 30 | vendor/bin/phpargsdetector inspect app/Services/Saml/ 31 | 32 | +------------------------------------------+------------------+-----------+--------+ 33 | | Files | Methods | Arguments | Weight | 34 | +------------------------------------------+------------------+-----------+--------+ 35 | | app/Services/Saml/SamlMessageFactory.php | __construct | 2 | 2 | 36 | | app/Services/Saml/SamlMessageFactory.php | makeSamlResponse | 2 | 68 | 37 | | app/Services/Saml/SamlSecurity.php | checkSignature | 2 | 18 | 38 | | app/Services/Saml/SamlIssuer.php | find | 1 | 3 | 39 | | app/Services/Saml/SamlKeeper.php | keep | 1 | 1 | 40 | | app/Services/Saml/SamlMessageFactory.php | addAttributes | 1 | 26 | 41 | | app/Services/Saml/SamlMessageFactory.php | sign | 1 | 12 | 42 | | app/Services/Saml/SamlResponder.php | launch | 1 | 10 | 43 | | app/Services/Saml/SamlKeeper.php | has | 0 | 0 | 44 | | app/Services/Saml/SamlKeeper.php | retrieve | 0 | 0 | 45 | +------------------------------------------+------------------+-----------+--------+ 46 | Total of methods : 10 47 | ``` 48 | ``` 49 | vendor/bin/phpargsdetector inspect app/ --limit=3 --min-args=2 --without-constructor 50 | 51 | +-------------------------------------------------+---------+-----------+--------+ 52 | | Files | Methods | Arguments | Weight | 53 | +-------------------------------------------------+---------+-----------+--------+ 54 | | app/Http/Middleware/RedirectIfAuthenticated.php | handle | 3 | 27 | 55 | | app/Http/Controllers/IssuerController.php | update | 2 | 24 | 56 | | app/Http/Controllers/RestrictionController.php | update | 2 | 28 | 57 | +-------------------------------------------------+---------+-----------+--------+ 58 | Total of methods : 3 59 | ``` 60 | ``` 61 | vendor/bin/phpargsdetector inspect app/ --limit=3 --sort-by-weight 62 | 63 | +-------------------------------------------------+------------------+-----------+--------+ 64 | | Files | Methods | Arguments | Weight | 65 | +-------------------------------------------------+------------------+-----------+--------+ 66 | | app/Services/Saml/SamlMessageFactory.php | makeSamlResponse | 2 | 68 | 67 | | app/Http/Controllers/RestrictionController.php | update | 2 | 28 | 68 | | app/Http/Middleware/RedirectIfAuthenticated.php | handle | 3 | 27 | 69 | +-------------------------------------------------+------------------+-----------+--------+ 70 | Total of methods : 3 71 | ``` 72 | ## Weight 73 | The weight is the number of arguments multiplied by the number of lines of the method. 74 | 75 | The weight of the `foo` method is 10 : 2 arguments * 5 lines. 76 | 77 | ```php 78 | class Bar { 79 | public function foo($a, $b) 80 | { 81 | if ($a) { 82 | // 83 | } 84 | 85 | return $b; 86 | } 87 | } 88 | ``` 89 | 90 | You can use it as a complexity indicator. 91 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "degraciamathieu/php-arguments-detector", 3 | "type": "package", 4 | "description": "Keep control over the complexity of your methods by checking that they do not have too many arguments.", 5 | "homepage": "https://github.com/DeGraciaMathieu/php-arguments-detector", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "De Gracia Mathieu", 10 | "email": "dev@degracia-mathieu.fr" 11 | } 12 | ], 13 | "require": { 14 | "php": "^7.3 || ^7.4 || ^8.0", 15 | "symfony/console": "^4.4 || ^5.0 || ^6.0", 16 | "symfony/finder": "^4.4 || ^5.0 || ^6.0", 17 | "nikic/php-parser": "^4.13" 18 | }, 19 | "require-dev": { 20 | "phpunit/phpunit": "^9.5", 21 | "symfony/var-dumper": "^5.1|^6.1" 22 | }, 23 | "autoload": { 24 | "psr-4": { 25 | "DeGraciaMathieu\\PhpArgsDetector\\": "src/" 26 | } 27 | }, 28 | "autoload-dev": { 29 | "psr-4": { 30 | "DeGraciaMathieu\\PhpArgsDetector\\Tests\\": "tests/" 31 | } 32 | }, 33 | "bin": [ 34 | "phpargsdetector" 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /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": "5309496091b626c228d4bd1e9a9b2005", 8 | "packages": [ 9 | { 10 | "name": "nikic/php-parser", 11 | "version": "v4.14.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/nikic/PHP-Parser.git", 15 | "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", 20 | "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-tokenizer": "*", 25 | "php": ">=7.0" 26 | }, 27 | "require-dev": { 28 | "ircmaxell/php-yacc": "^0.0.7", 29 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 30 | }, 31 | "bin": [ 32 | "bin/php-parse" 33 | ], 34 | "type": "library", 35 | "extra": { 36 | "branch-alias": { 37 | "dev-master": "4.9-dev" 38 | } 39 | }, 40 | "autoload": { 41 | "psr-4": { 42 | "PhpParser\\": "lib/PhpParser" 43 | } 44 | }, 45 | "notification-url": "https://packagist.org/downloads/", 46 | "license": [ 47 | "BSD-3-Clause" 48 | ], 49 | "authors": [ 50 | { 51 | "name": "Nikita Popov" 52 | } 53 | ], 54 | "description": "A PHP parser written in PHP", 55 | "keywords": [ 56 | "parser", 57 | "php" 58 | ], 59 | "support": { 60 | "issues": "https://github.com/nikic/PHP-Parser/issues", 61 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" 62 | }, 63 | "time": "2022-05-31T20:59:12+00:00" 64 | }, 65 | { 66 | "name": "phpunit/php-timer", 67 | "version": "5.0.3", 68 | "source": { 69 | "type": "git", 70 | "url": "https://github.com/sebastianbergmann/php-timer.git", 71 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 72 | }, 73 | "dist": { 74 | "type": "zip", 75 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 76 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 77 | "shasum": "" 78 | }, 79 | "require": { 80 | "php": ">=7.3" 81 | }, 82 | "require-dev": { 83 | "phpunit/phpunit": "^9.3" 84 | }, 85 | "type": "library", 86 | "extra": { 87 | "branch-alias": { 88 | "dev-master": "5.0-dev" 89 | } 90 | }, 91 | "autoload": { 92 | "classmap": [ 93 | "src/" 94 | ] 95 | }, 96 | "notification-url": "https://packagist.org/downloads/", 97 | "license": [ 98 | "BSD-3-Clause" 99 | ], 100 | "authors": [ 101 | { 102 | "name": "Sebastian Bergmann", 103 | "email": "sebastian@phpunit.de", 104 | "role": "lead" 105 | } 106 | ], 107 | "description": "Utility class for timing", 108 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 109 | "keywords": [ 110 | "timer" 111 | ], 112 | "support": { 113 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 114 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 115 | }, 116 | "funding": [ 117 | { 118 | "url": "https://github.com/sebastianbergmann", 119 | "type": "github" 120 | } 121 | ], 122 | "time": "2020-10-26T13:16:10+00:00" 123 | }, 124 | { 125 | "name": "psr/container", 126 | "version": "2.0.2", 127 | "source": { 128 | "type": "git", 129 | "url": "https://github.com/php-fig/container.git", 130 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 131 | }, 132 | "dist": { 133 | "type": "zip", 134 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 135 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 136 | "shasum": "" 137 | }, 138 | "require": { 139 | "php": ">=7.4.0" 140 | }, 141 | "type": "library", 142 | "extra": { 143 | "branch-alias": { 144 | "dev-master": "2.0.x-dev" 145 | } 146 | }, 147 | "autoload": { 148 | "psr-4": { 149 | "Psr\\Container\\": "src/" 150 | } 151 | }, 152 | "notification-url": "https://packagist.org/downloads/", 153 | "license": [ 154 | "MIT" 155 | ], 156 | "authors": [ 157 | { 158 | "name": "PHP-FIG", 159 | "homepage": "https://www.php-fig.org/" 160 | } 161 | ], 162 | "description": "Common Container Interface (PHP FIG PSR-11)", 163 | "homepage": "https://github.com/php-fig/container", 164 | "keywords": [ 165 | "PSR-11", 166 | "container", 167 | "container-interface", 168 | "container-interop", 169 | "psr" 170 | ], 171 | "support": { 172 | "issues": "https://github.com/php-fig/container/issues", 173 | "source": "https://github.com/php-fig/container/tree/2.0.2" 174 | }, 175 | "time": "2021-11-05T16:47:00+00:00" 176 | }, 177 | { 178 | "name": "symfony/console", 179 | "version": "v6.1.3", 180 | "source": { 181 | "type": "git", 182 | "url": "https://github.com/symfony/console.git", 183 | "reference": "43fcb5c5966b43c56bcfa481368d90d748936ab8" 184 | }, 185 | "dist": { 186 | "type": "zip", 187 | "url": "https://api.github.com/repos/symfony/console/zipball/43fcb5c5966b43c56bcfa481368d90d748936ab8", 188 | "reference": "43fcb5c5966b43c56bcfa481368d90d748936ab8", 189 | "shasum": "" 190 | }, 191 | "require": { 192 | "php": ">=8.1", 193 | "symfony/deprecation-contracts": "^2.1|^3", 194 | "symfony/polyfill-mbstring": "~1.0", 195 | "symfony/service-contracts": "^1.1|^2|^3", 196 | "symfony/string": "^5.4|^6.0" 197 | }, 198 | "conflict": { 199 | "symfony/dependency-injection": "<5.4", 200 | "symfony/dotenv": "<5.4", 201 | "symfony/event-dispatcher": "<5.4", 202 | "symfony/lock": "<5.4", 203 | "symfony/process": "<5.4" 204 | }, 205 | "provide": { 206 | "psr/log-implementation": "1.0|2.0|3.0" 207 | }, 208 | "require-dev": { 209 | "psr/log": "^1|^2|^3", 210 | "symfony/config": "^5.4|^6.0", 211 | "symfony/dependency-injection": "^5.4|^6.0", 212 | "symfony/event-dispatcher": "^5.4|^6.0", 213 | "symfony/lock": "^5.4|^6.0", 214 | "symfony/process": "^5.4|^6.0", 215 | "symfony/var-dumper": "^5.4|^6.0" 216 | }, 217 | "suggest": { 218 | "psr/log": "For using the console logger", 219 | "symfony/event-dispatcher": "", 220 | "symfony/lock": "", 221 | "symfony/process": "" 222 | }, 223 | "type": "library", 224 | "autoload": { 225 | "psr-4": { 226 | "Symfony\\Component\\Console\\": "" 227 | }, 228 | "exclude-from-classmap": [ 229 | "/Tests/" 230 | ] 231 | }, 232 | "notification-url": "https://packagist.org/downloads/", 233 | "license": [ 234 | "MIT" 235 | ], 236 | "authors": [ 237 | { 238 | "name": "Fabien Potencier", 239 | "email": "fabien@symfony.com" 240 | }, 241 | { 242 | "name": "Symfony Community", 243 | "homepage": "https://symfony.com/contributors" 244 | } 245 | ], 246 | "description": "Eases the creation of beautiful and testable command line interfaces", 247 | "homepage": "https://symfony.com", 248 | "keywords": [ 249 | "cli", 250 | "command line", 251 | "console", 252 | "terminal" 253 | ], 254 | "support": { 255 | "source": "https://github.com/symfony/console/tree/v6.1.3" 256 | }, 257 | "funding": [ 258 | { 259 | "url": "https://symfony.com/sponsor", 260 | "type": "custom" 261 | }, 262 | { 263 | "url": "https://github.com/fabpot", 264 | "type": "github" 265 | }, 266 | { 267 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 268 | "type": "tidelift" 269 | } 270 | ], 271 | "time": "2022-07-22T14:17:57+00:00" 272 | }, 273 | { 274 | "name": "symfony/deprecation-contracts", 275 | "version": "v3.1.1", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/symfony/deprecation-contracts.git", 279 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", 284 | "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "php": ">=8.1" 289 | }, 290 | "type": "library", 291 | "extra": { 292 | "branch-alias": { 293 | "dev-main": "3.1-dev" 294 | }, 295 | "thanks": { 296 | "name": "symfony/contracts", 297 | "url": "https://github.com/symfony/contracts" 298 | } 299 | }, 300 | "autoload": { 301 | "files": [ 302 | "function.php" 303 | ] 304 | }, 305 | "notification-url": "https://packagist.org/downloads/", 306 | "license": [ 307 | "MIT" 308 | ], 309 | "authors": [ 310 | { 311 | "name": "Nicolas Grekas", 312 | "email": "p@tchwork.com" 313 | }, 314 | { 315 | "name": "Symfony Community", 316 | "homepage": "https://symfony.com/contributors" 317 | } 318 | ], 319 | "description": "A generic function and convention to trigger deprecation notices", 320 | "homepage": "https://symfony.com", 321 | "support": { 322 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" 323 | }, 324 | "funding": [ 325 | { 326 | "url": "https://symfony.com/sponsor", 327 | "type": "custom" 328 | }, 329 | { 330 | "url": "https://github.com/fabpot", 331 | "type": "github" 332 | }, 333 | { 334 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 335 | "type": "tidelift" 336 | } 337 | ], 338 | "time": "2022-02-25T11:15:52+00:00" 339 | }, 340 | { 341 | "name": "symfony/finder", 342 | "version": "v6.1.3", 343 | "source": { 344 | "type": "git", 345 | "url": "https://github.com/symfony/finder.git", 346 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" 347 | }, 348 | "dist": { 349 | "type": "zip", 350 | "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", 351 | "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", 352 | "shasum": "" 353 | }, 354 | "require": { 355 | "php": ">=8.1" 356 | }, 357 | "require-dev": { 358 | "symfony/filesystem": "^6.0" 359 | }, 360 | "type": "library", 361 | "autoload": { 362 | "psr-4": { 363 | "Symfony\\Component\\Finder\\": "" 364 | }, 365 | "exclude-from-classmap": [ 366 | "/Tests/" 367 | ] 368 | }, 369 | "notification-url": "https://packagist.org/downloads/", 370 | "license": [ 371 | "MIT" 372 | ], 373 | "authors": [ 374 | { 375 | "name": "Fabien Potencier", 376 | "email": "fabien@symfony.com" 377 | }, 378 | { 379 | "name": "Symfony Community", 380 | "homepage": "https://symfony.com/contributors" 381 | } 382 | ], 383 | "description": "Finds files and directories via an intuitive fluent interface", 384 | "homepage": "https://symfony.com", 385 | "support": { 386 | "source": "https://github.com/symfony/finder/tree/v6.1.3" 387 | }, 388 | "funding": [ 389 | { 390 | "url": "https://symfony.com/sponsor", 391 | "type": "custom" 392 | }, 393 | { 394 | "url": "https://github.com/fabpot", 395 | "type": "github" 396 | }, 397 | { 398 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 399 | "type": "tidelift" 400 | } 401 | ], 402 | "time": "2022-07-29T07:42:06+00:00" 403 | }, 404 | { 405 | "name": "symfony/polyfill-ctype", 406 | "version": "v1.26.0", 407 | "source": { 408 | "type": "git", 409 | "url": "https://github.com/symfony/polyfill-ctype.git", 410 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" 411 | }, 412 | "dist": { 413 | "type": "zip", 414 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", 415 | "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", 416 | "shasum": "" 417 | }, 418 | "require": { 419 | "php": ">=7.1" 420 | }, 421 | "provide": { 422 | "ext-ctype": "*" 423 | }, 424 | "suggest": { 425 | "ext-ctype": "For best performance" 426 | }, 427 | "type": "library", 428 | "extra": { 429 | "branch-alias": { 430 | "dev-main": "1.26-dev" 431 | }, 432 | "thanks": { 433 | "name": "symfony/polyfill", 434 | "url": "https://github.com/symfony/polyfill" 435 | } 436 | }, 437 | "autoload": { 438 | "files": [ 439 | "bootstrap.php" 440 | ], 441 | "psr-4": { 442 | "Symfony\\Polyfill\\Ctype\\": "" 443 | } 444 | }, 445 | "notification-url": "https://packagist.org/downloads/", 446 | "license": [ 447 | "MIT" 448 | ], 449 | "authors": [ 450 | { 451 | "name": "Gert de Pagter", 452 | "email": "BackEndTea@gmail.com" 453 | }, 454 | { 455 | "name": "Symfony Community", 456 | "homepage": "https://symfony.com/contributors" 457 | } 458 | ], 459 | "description": "Symfony polyfill for ctype functions", 460 | "homepage": "https://symfony.com", 461 | "keywords": [ 462 | "compatibility", 463 | "ctype", 464 | "polyfill", 465 | "portable" 466 | ], 467 | "support": { 468 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" 469 | }, 470 | "funding": [ 471 | { 472 | "url": "https://symfony.com/sponsor", 473 | "type": "custom" 474 | }, 475 | { 476 | "url": "https://github.com/fabpot", 477 | "type": "github" 478 | }, 479 | { 480 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 481 | "type": "tidelift" 482 | } 483 | ], 484 | "time": "2022-05-24T11:49:31+00:00" 485 | }, 486 | { 487 | "name": "symfony/polyfill-intl-grapheme", 488 | "version": "v1.26.0", 489 | "source": { 490 | "type": "git", 491 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 492 | "reference": "433d05519ce6990bf3530fba6957499d327395c2" 493 | }, 494 | "dist": { 495 | "type": "zip", 496 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", 497 | "reference": "433d05519ce6990bf3530fba6957499d327395c2", 498 | "shasum": "" 499 | }, 500 | "require": { 501 | "php": ">=7.1" 502 | }, 503 | "suggest": { 504 | "ext-intl": "For best performance" 505 | }, 506 | "type": "library", 507 | "extra": { 508 | "branch-alias": { 509 | "dev-main": "1.26-dev" 510 | }, 511 | "thanks": { 512 | "name": "symfony/polyfill", 513 | "url": "https://github.com/symfony/polyfill" 514 | } 515 | }, 516 | "autoload": { 517 | "files": [ 518 | "bootstrap.php" 519 | ], 520 | "psr-4": { 521 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 522 | } 523 | }, 524 | "notification-url": "https://packagist.org/downloads/", 525 | "license": [ 526 | "MIT" 527 | ], 528 | "authors": [ 529 | { 530 | "name": "Nicolas Grekas", 531 | "email": "p@tchwork.com" 532 | }, 533 | { 534 | "name": "Symfony Community", 535 | "homepage": "https://symfony.com/contributors" 536 | } 537 | ], 538 | "description": "Symfony polyfill for intl's grapheme_* functions", 539 | "homepage": "https://symfony.com", 540 | "keywords": [ 541 | "compatibility", 542 | "grapheme", 543 | "intl", 544 | "polyfill", 545 | "portable", 546 | "shim" 547 | ], 548 | "support": { 549 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" 550 | }, 551 | "funding": [ 552 | { 553 | "url": "https://symfony.com/sponsor", 554 | "type": "custom" 555 | }, 556 | { 557 | "url": "https://github.com/fabpot", 558 | "type": "github" 559 | }, 560 | { 561 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 562 | "type": "tidelift" 563 | } 564 | ], 565 | "time": "2022-05-24T11:49:31+00:00" 566 | }, 567 | { 568 | "name": "symfony/polyfill-intl-normalizer", 569 | "version": "v1.26.0", 570 | "source": { 571 | "type": "git", 572 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 573 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd" 574 | }, 575 | "dist": { 576 | "type": "zip", 577 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", 578 | "reference": "219aa369ceff116e673852dce47c3a41794c14bd", 579 | "shasum": "" 580 | }, 581 | "require": { 582 | "php": ">=7.1" 583 | }, 584 | "suggest": { 585 | "ext-intl": "For best performance" 586 | }, 587 | "type": "library", 588 | "extra": { 589 | "branch-alias": { 590 | "dev-main": "1.26-dev" 591 | }, 592 | "thanks": { 593 | "name": "symfony/polyfill", 594 | "url": "https://github.com/symfony/polyfill" 595 | } 596 | }, 597 | "autoload": { 598 | "files": [ 599 | "bootstrap.php" 600 | ], 601 | "psr-4": { 602 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 603 | }, 604 | "classmap": [ 605 | "Resources/stubs" 606 | ] 607 | }, 608 | "notification-url": "https://packagist.org/downloads/", 609 | "license": [ 610 | "MIT" 611 | ], 612 | "authors": [ 613 | { 614 | "name": "Nicolas Grekas", 615 | "email": "p@tchwork.com" 616 | }, 617 | { 618 | "name": "Symfony Community", 619 | "homepage": "https://symfony.com/contributors" 620 | } 621 | ], 622 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 623 | "homepage": "https://symfony.com", 624 | "keywords": [ 625 | "compatibility", 626 | "intl", 627 | "normalizer", 628 | "polyfill", 629 | "portable", 630 | "shim" 631 | ], 632 | "support": { 633 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" 634 | }, 635 | "funding": [ 636 | { 637 | "url": "https://symfony.com/sponsor", 638 | "type": "custom" 639 | }, 640 | { 641 | "url": "https://github.com/fabpot", 642 | "type": "github" 643 | }, 644 | { 645 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 646 | "type": "tidelift" 647 | } 648 | ], 649 | "time": "2022-05-24T11:49:31+00:00" 650 | }, 651 | { 652 | "name": "symfony/polyfill-mbstring", 653 | "version": "v1.26.0", 654 | "source": { 655 | "type": "git", 656 | "url": "https://github.com/symfony/polyfill-mbstring.git", 657 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" 658 | }, 659 | "dist": { 660 | "type": "zip", 661 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", 662 | "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", 663 | "shasum": "" 664 | }, 665 | "require": { 666 | "php": ">=7.1" 667 | }, 668 | "provide": { 669 | "ext-mbstring": "*" 670 | }, 671 | "suggest": { 672 | "ext-mbstring": "For best performance" 673 | }, 674 | "type": "library", 675 | "extra": { 676 | "branch-alias": { 677 | "dev-main": "1.26-dev" 678 | }, 679 | "thanks": { 680 | "name": "symfony/polyfill", 681 | "url": "https://github.com/symfony/polyfill" 682 | } 683 | }, 684 | "autoload": { 685 | "files": [ 686 | "bootstrap.php" 687 | ], 688 | "psr-4": { 689 | "Symfony\\Polyfill\\Mbstring\\": "" 690 | } 691 | }, 692 | "notification-url": "https://packagist.org/downloads/", 693 | "license": [ 694 | "MIT" 695 | ], 696 | "authors": [ 697 | { 698 | "name": "Nicolas Grekas", 699 | "email": "p@tchwork.com" 700 | }, 701 | { 702 | "name": "Symfony Community", 703 | "homepage": "https://symfony.com/contributors" 704 | } 705 | ], 706 | "description": "Symfony polyfill for the Mbstring extension", 707 | "homepage": "https://symfony.com", 708 | "keywords": [ 709 | "compatibility", 710 | "mbstring", 711 | "polyfill", 712 | "portable", 713 | "shim" 714 | ], 715 | "support": { 716 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" 717 | }, 718 | "funding": [ 719 | { 720 | "url": "https://symfony.com/sponsor", 721 | "type": "custom" 722 | }, 723 | { 724 | "url": "https://github.com/fabpot", 725 | "type": "github" 726 | }, 727 | { 728 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 729 | "type": "tidelift" 730 | } 731 | ], 732 | "time": "2022-05-24T11:49:31+00:00" 733 | }, 734 | { 735 | "name": "symfony/service-contracts", 736 | "version": "v3.1.1", 737 | "source": { 738 | "type": "git", 739 | "url": "https://github.com/symfony/service-contracts.git", 740 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" 741 | }, 742 | "dist": { 743 | "type": "zip", 744 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", 745 | "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", 746 | "shasum": "" 747 | }, 748 | "require": { 749 | "php": ">=8.1", 750 | "psr/container": "^2.0" 751 | }, 752 | "conflict": { 753 | "ext-psr": "<1.1|>=2" 754 | }, 755 | "suggest": { 756 | "symfony/service-implementation": "" 757 | }, 758 | "type": "library", 759 | "extra": { 760 | "branch-alias": { 761 | "dev-main": "3.1-dev" 762 | }, 763 | "thanks": { 764 | "name": "symfony/contracts", 765 | "url": "https://github.com/symfony/contracts" 766 | } 767 | }, 768 | "autoload": { 769 | "psr-4": { 770 | "Symfony\\Contracts\\Service\\": "" 771 | }, 772 | "exclude-from-classmap": [ 773 | "/Test/" 774 | ] 775 | }, 776 | "notification-url": "https://packagist.org/downloads/", 777 | "license": [ 778 | "MIT" 779 | ], 780 | "authors": [ 781 | { 782 | "name": "Nicolas Grekas", 783 | "email": "p@tchwork.com" 784 | }, 785 | { 786 | "name": "Symfony Community", 787 | "homepage": "https://symfony.com/contributors" 788 | } 789 | ], 790 | "description": "Generic abstractions related to writing services", 791 | "homepage": "https://symfony.com", 792 | "keywords": [ 793 | "abstractions", 794 | "contracts", 795 | "decoupling", 796 | "interfaces", 797 | "interoperability", 798 | "standards" 799 | ], 800 | "support": { 801 | "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" 802 | }, 803 | "funding": [ 804 | { 805 | "url": "https://symfony.com/sponsor", 806 | "type": "custom" 807 | }, 808 | { 809 | "url": "https://github.com/fabpot", 810 | "type": "github" 811 | }, 812 | { 813 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 814 | "type": "tidelift" 815 | } 816 | ], 817 | "time": "2022-05-30T19:18:58+00:00" 818 | }, 819 | { 820 | "name": "symfony/string", 821 | "version": "v6.1.3", 822 | "source": { 823 | "type": "git", 824 | "url": "https://github.com/symfony/string.git", 825 | "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b" 826 | }, 827 | "dist": { 828 | "type": "zip", 829 | "url": "https://api.github.com/repos/symfony/string/zipball/f35241f45c30bcd9046af2bb200a7086f70e1d6b", 830 | "reference": "f35241f45c30bcd9046af2bb200a7086f70e1d6b", 831 | "shasum": "" 832 | }, 833 | "require": { 834 | "php": ">=8.1", 835 | "symfony/polyfill-ctype": "~1.8", 836 | "symfony/polyfill-intl-grapheme": "~1.0", 837 | "symfony/polyfill-intl-normalizer": "~1.0", 838 | "symfony/polyfill-mbstring": "~1.0" 839 | }, 840 | "conflict": { 841 | "symfony/translation-contracts": "<2.0" 842 | }, 843 | "require-dev": { 844 | "symfony/error-handler": "^5.4|^6.0", 845 | "symfony/http-client": "^5.4|^6.0", 846 | "symfony/translation-contracts": "^2.0|^3.0", 847 | "symfony/var-exporter": "^5.4|^6.0" 848 | }, 849 | "type": "library", 850 | "autoload": { 851 | "files": [ 852 | "Resources/functions.php" 853 | ], 854 | "psr-4": { 855 | "Symfony\\Component\\String\\": "" 856 | }, 857 | "exclude-from-classmap": [ 858 | "/Tests/" 859 | ] 860 | }, 861 | "notification-url": "https://packagist.org/downloads/", 862 | "license": [ 863 | "MIT" 864 | ], 865 | "authors": [ 866 | { 867 | "name": "Nicolas Grekas", 868 | "email": "p@tchwork.com" 869 | }, 870 | { 871 | "name": "Symfony Community", 872 | "homepage": "https://symfony.com/contributors" 873 | } 874 | ], 875 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 876 | "homepage": "https://symfony.com", 877 | "keywords": [ 878 | "grapheme", 879 | "i18n", 880 | "string", 881 | "unicode", 882 | "utf-8", 883 | "utf8" 884 | ], 885 | "support": { 886 | "source": "https://github.com/symfony/string/tree/v6.1.3" 887 | }, 888 | "funding": [ 889 | { 890 | "url": "https://symfony.com/sponsor", 891 | "type": "custom" 892 | }, 893 | { 894 | "url": "https://github.com/fabpot", 895 | "type": "github" 896 | }, 897 | { 898 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 899 | "type": "tidelift" 900 | } 901 | ], 902 | "time": "2022-07-27T15:50:51+00:00" 903 | } 904 | ], 905 | "packages-dev": [ 906 | { 907 | "name": "doctrine/instantiator", 908 | "version": "1.4.1", 909 | "source": { 910 | "type": "git", 911 | "url": "https://github.com/doctrine/instantiator.git", 912 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" 913 | }, 914 | "dist": { 915 | "type": "zip", 916 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", 917 | "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", 918 | "shasum": "" 919 | }, 920 | "require": { 921 | "php": "^7.1 || ^8.0" 922 | }, 923 | "require-dev": { 924 | "doctrine/coding-standard": "^9", 925 | "ext-pdo": "*", 926 | "ext-phar": "*", 927 | "phpbench/phpbench": "^0.16 || ^1", 928 | "phpstan/phpstan": "^1.4", 929 | "phpstan/phpstan-phpunit": "^1", 930 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 931 | "vimeo/psalm": "^4.22" 932 | }, 933 | "type": "library", 934 | "autoload": { 935 | "psr-4": { 936 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 937 | } 938 | }, 939 | "notification-url": "https://packagist.org/downloads/", 940 | "license": [ 941 | "MIT" 942 | ], 943 | "authors": [ 944 | { 945 | "name": "Marco Pivetta", 946 | "email": "ocramius@gmail.com", 947 | "homepage": "https://ocramius.github.io/" 948 | } 949 | ], 950 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 951 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 952 | "keywords": [ 953 | "constructor", 954 | "instantiate" 955 | ], 956 | "support": { 957 | "issues": "https://github.com/doctrine/instantiator/issues", 958 | "source": "https://github.com/doctrine/instantiator/tree/1.4.1" 959 | }, 960 | "funding": [ 961 | { 962 | "url": "https://www.doctrine-project.org/sponsorship.html", 963 | "type": "custom" 964 | }, 965 | { 966 | "url": "https://www.patreon.com/phpdoctrine", 967 | "type": "patreon" 968 | }, 969 | { 970 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 971 | "type": "tidelift" 972 | } 973 | ], 974 | "time": "2022-03-03T08:28:38+00:00" 975 | }, 976 | { 977 | "name": "myclabs/deep-copy", 978 | "version": "1.11.0", 979 | "source": { 980 | "type": "git", 981 | "url": "https://github.com/myclabs/DeepCopy.git", 982 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" 983 | }, 984 | "dist": { 985 | "type": "zip", 986 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", 987 | "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", 988 | "shasum": "" 989 | }, 990 | "require": { 991 | "php": "^7.1 || ^8.0" 992 | }, 993 | "conflict": { 994 | "doctrine/collections": "<1.6.8", 995 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 996 | }, 997 | "require-dev": { 998 | "doctrine/collections": "^1.6.8", 999 | "doctrine/common": "^2.13.3 || ^3.2.2", 1000 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 1001 | }, 1002 | "type": "library", 1003 | "autoload": { 1004 | "files": [ 1005 | "src/DeepCopy/deep_copy.php" 1006 | ], 1007 | "psr-4": { 1008 | "DeepCopy\\": "src/DeepCopy/" 1009 | } 1010 | }, 1011 | "notification-url": "https://packagist.org/downloads/", 1012 | "license": [ 1013 | "MIT" 1014 | ], 1015 | "description": "Create deep copies (clones) of your objects", 1016 | "keywords": [ 1017 | "clone", 1018 | "copy", 1019 | "duplicate", 1020 | "object", 1021 | "object graph" 1022 | ], 1023 | "support": { 1024 | "issues": "https://github.com/myclabs/DeepCopy/issues", 1025 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" 1026 | }, 1027 | "funding": [ 1028 | { 1029 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 1030 | "type": "tidelift" 1031 | } 1032 | ], 1033 | "time": "2022-03-03T13:19:32+00:00" 1034 | }, 1035 | { 1036 | "name": "phar-io/manifest", 1037 | "version": "2.0.3", 1038 | "source": { 1039 | "type": "git", 1040 | "url": "https://github.com/phar-io/manifest.git", 1041 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 1042 | }, 1043 | "dist": { 1044 | "type": "zip", 1045 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 1046 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 1047 | "shasum": "" 1048 | }, 1049 | "require": { 1050 | "ext-dom": "*", 1051 | "ext-phar": "*", 1052 | "ext-xmlwriter": "*", 1053 | "phar-io/version": "^3.0.1", 1054 | "php": "^7.2 || ^8.0" 1055 | }, 1056 | "type": "library", 1057 | "extra": { 1058 | "branch-alias": { 1059 | "dev-master": "2.0.x-dev" 1060 | } 1061 | }, 1062 | "autoload": { 1063 | "classmap": [ 1064 | "src/" 1065 | ] 1066 | }, 1067 | "notification-url": "https://packagist.org/downloads/", 1068 | "license": [ 1069 | "BSD-3-Clause" 1070 | ], 1071 | "authors": [ 1072 | { 1073 | "name": "Arne Blankerts", 1074 | "email": "arne@blankerts.de", 1075 | "role": "Developer" 1076 | }, 1077 | { 1078 | "name": "Sebastian Heuer", 1079 | "email": "sebastian@phpeople.de", 1080 | "role": "Developer" 1081 | }, 1082 | { 1083 | "name": "Sebastian Bergmann", 1084 | "email": "sebastian@phpunit.de", 1085 | "role": "Developer" 1086 | } 1087 | ], 1088 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 1089 | "support": { 1090 | "issues": "https://github.com/phar-io/manifest/issues", 1091 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 1092 | }, 1093 | "time": "2021-07-20T11:28:43+00:00" 1094 | }, 1095 | { 1096 | "name": "phar-io/version", 1097 | "version": "3.2.1", 1098 | "source": { 1099 | "type": "git", 1100 | "url": "https://github.com/phar-io/version.git", 1101 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 1102 | }, 1103 | "dist": { 1104 | "type": "zip", 1105 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 1106 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 1107 | "shasum": "" 1108 | }, 1109 | "require": { 1110 | "php": "^7.2 || ^8.0" 1111 | }, 1112 | "type": "library", 1113 | "autoload": { 1114 | "classmap": [ 1115 | "src/" 1116 | ] 1117 | }, 1118 | "notification-url": "https://packagist.org/downloads/", 1119 | "license": [ 1120 | "BSD-3-Clause" 1121 | ], 1122 | "authors": [ 1123 | { 1124 | "name": "Arne Blankerts", 1125 | "email": "arne@blankerts.de", 1126 | "role": "Developer" 1127 | }, 1128 | { 1129 | "name": "Sebastian Heuer", 1130 | "email": "sebastian@phpeople.de", 1131 | "role": "Developer" 1132 | }, 1133 | { 1134 | "name": "Sebastian Bergmann", 1135 | "email": "sebastian@phpunit.de", 1136 | "role": "Developer" 1137 | } 1138 | ], 1139 | "description": "Library for handling version information and constraints", 1140 | "support": { 1141 | "issues": "https://github.com/phar-io/version/issues", 1142 | "source": "https://github.com/phar-io/version/tree/3.2.1" 1143 | }, 1144 | "time": "2022-02-21T01:04:05+00:00" 1145 | }, 1146 | { 1147 | "name": "phpdocumentor/reflection-common", 1148 | "version": "2.2.0", 1149 | "source": { 1150 | "type": "git", 1151 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1152 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 1153 | }, 1154 | "dist": { 1155 | "type": "zip", 1156 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 1157 | "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 1158 | "shasum": "" 1159 | }, 1160 | "require": { 1161 | "php": "^7.2 || ^8.0" 1162 | }, 1163 | "type": "library", 1164 | "extra": { 1165 | "branch-alias": { 1166 | "dev-2.x": "2.x-dev" 1167 | } 1168 | }, 1169 | "autoload": { 1170 | "psr-4": { 1171 | "phpDocumentor\\Reflection\\": "src/" 1172 | } 1173 | }, 1174 | "notification-url": "https://packagist.org/downloads/", 1175 | "license": [ 1176 | "MIT" 1177 | ], 1178 | "authors": [ 1179 | { 1180 | "name": "Jaap van Otterdijk", 1181 | "email": "opensource@ijaap.nl" 1182 | } 1183 | ], 1184 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1185 | "homepage": "http://www.phpdoc.org", 1186 | "keywords": [ 1187 | "FQSEN", 1188 | "phpDocumentor", 1189 | "phpdoc", 1190 | "reflection", 1191 | "static analysis" 1192 | ], 1193 | "support": { 1194 | "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", 1195 | "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" 1196 | }, 1197 | "time": "2020-06-27T09:03:43+00:00" 1198 | }, 1199 | { 1200 | "name": "phpdocumentor/reflection-docblock", 1201 | "version": "5.3.0", 1202 | "source": { 1203 | "type": "git", 1204 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1205 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" 1206 | }, 1207 | "dist": { 1208 | "type": "zip", 1209 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", 1210 | "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", 1211 | "shasum": "" 1212 | }, 1213 | "require": { 1214 | "ext-filter": "*", 1215 | "php": "^7.2 || ^8.0", 1216 | "phpdocumentor/reflection-common": "^2.2", 1217 | "phpdocumentor/type-resolver": "^1.3", 1218 | "webmozart/assert": "^1.9.1" 1219 | }, 1220 | "require-dev": { 1221 | "mockery/mockery": "~1.3.2", 1222 | "psalm/phar": "^4.8" 1223 | }, 1224 | "type": "library", 1225 | "extra": { 1226 | "branch-alias": { 1227 | "dev-master": "5.x-dev" 1228 | } 1229 | }, 1230 | "autoload": { 1231 | "psr-4": { 1232 | "phpDocumentor\\Reflection\\": "src" 1233 | } 1234 | }, 1235 | "notification-url": "https://packagist.org/downloads/", 1236 | "license": [ 1237 | "MIT" 1238 | ], 1239 | "authors": [ 1240 | { 1241 | "name": "Mike van Riel", 1242 | "email": "me@mikevanriel.com" 1243 | }, 1244 | { 1245 | "name": "Jaap van Otterdijk", 1246 | "email": "account@ijaap.nl" 1247 | } 1248 | ], 1249 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1250 | "support": { 1251 | "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", 1252 | "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" 1253 | }, 1254 | "time": "2021-10-19T17:43:47+00:00" 1255 | }, 1256 | { 1257 | "name": "phpdocumentor/type-resolver", 1258 | "version": "1.6.1", 1259 | "source": { 1260 | "type": "git", 1261 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1262 | "reference": "77a32518733312af16a44300404e945338981de3" 1263 | }, 1264 | "dist": { 1265 | "type": "zip", 1266 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", 1267 | "reference": "77a32518733312af16a44300404e945338981de3", 1268 | "shasum": "" 1269 | }, 1270 | "require": { 1271 | "php": "^7.2 || ^8.0", 1272 | "phpdocumentor/reflection-common": "^2.0" 1273 | }, 1274 | "require-dev": { 1275 | "ext-tokenizer": "*", 1276 | "psalm/phar": "^4.8" 1277 | }, 1278 | "type": "library", 1279 | "extra": { 1280 | "branch-alias": { 1281 | "dev-1.x": "1.x-dev" 1282 | } 1283 | }, 1284 | "autoload": { 1285 | "psr-4": { 1286 | "phpDocumentor\\Reflection\\": "src" 1287 | } 1288 | }, 1289 | "notification-url": "https://packagist.org/downloads/", 1290 | "license": [ 1291 | "MIT" 1292 | ], 1293 | "authors": [ 1294 | { 1295 | "name": "Mike van Riel", 1296 | "email": "me@mikevanriel.com" 1297 | } 1298 | ], 1299 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 1300 | "support": { 1301 | "issues": "https://github.com/phpDocumentor/TypeResolver/issues", 1302 | "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" 1303 | }, 1304 | "time": "2022-03-15T21:29:03+00:00" 1305 | }, 1306 | { 1307 | "name": "phpspec/prophecy", 1308 | "version": "v1.15.0", 1309 | "source": { 1310 | "type": "git", 1311 | "url": "https://github.com/phpspec/prophecy.git", 1312 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" 1313 | }, 1314 | "dist": { 1315 | "type": "zip", 1316 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", 1317 | "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", 1318 | "shasum": "" 1319 | }, 1320 | "require": { 1321 | "doctrine/instantiator": "^1.2", 1322 | "php": "^7.2 || ~8.0, <8.2", 1323 | "phpdocumentor/reflection-docblock": "^5.2", 1324 | "sebastian/comparator": "^3.0 || ^4.0", 1325 | "sebastian/recursion-context": "^3.0 || ^4.0" 1326 | }, 1327 | "require-dev": { 1328 | "phpspec/phpspec": "^6.0 || ^7.0", 1329 | "phpunit/phpunit": "^8.0 || ^9.0" 1330 | }, 1331 | "type": "library", 1332 | "extra": { 1333 | "branch-alias": { 1334 | "dev-master": "1.x-dev" 1335 | } 1336 | }, 1337 | "autoload": { 1338 | "psr-4": { 1339 | "Prophecy\\": "src/Prophecy" 1340 | } 1341 | }, 1342 | "notification-url": "https://packagist.org/downloads/", 1343 | "license": [ 1344 | "MIT" 1345 | ], 1346 | "authors": [ 1347 | { 1348 | "name": "Konstantin Kudryashov", 1349 | "email": "ever.zet@gmail.com", 1350 | "homepage": "http://everzet.com" 1351 | }, 1352 | { 1353 | "name": "Marcello Duarte", 1354 | "email": "marcello.duarte@gmail.com" 1355 | } 1356 | ], 1357 | "description": "Highly opinionated mocking framework for PHP 5.3+", 1358 | "homepage": "https://github.com/phpspec/prophecy", 1359 | "keywords": [ 1360 | "Double", 1361 | "Dummy", 1362 | "fake", 1363 | "mock", 1364 | "spy", 1365 | "stub" 1366 | ], 1367 | "support": { 1368 | "issues": "https://github.com/phpspec/prophecy/issues", 1369 | "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" 1370 | }, 1371 | "time": "2021-12-08T12:19:24+00:00" 1372 | }, 1373 | { 1374 | "name": "phpunit/php-code-coverage", 1375 | "version": "9.2.15", 1376 | "source": { 1377 | "type": "git", 1378 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1379 | "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" 1380 | }, 1381 | "dist": { 1382 | "type": "zip", 1383 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", 1384 | "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", 1385 | "shasum": "" 1386 | }, 1387 | "require": { 1388 | "ext-dom": "*", 1389 | "ext-libxml": "*", 1390 | "ext-xmlwriter": "*", 1391 | "nikic/php-parser": "^4.13.0", 1392 | "php": ">=7.3", 1393 | "phpunit/php-file-iterator": "^3.0.3", 1394 | "phpunit/php-text-template": "^2.0.2", 1395 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 1396 | "sebastian/complexity": "^2.0", 1397 | "sebastian/environment": "^5.1.2", 1398 | "sebastian/lines-of-code": "^1.0.3", 1399 | "sebastian/version": "^3.0.1", 1400 | "theseer/tokenizer": "^1.2.0" 1401 | }, 1402 | "require-dev": { 1403 | "phpunit/phpunit": "^9.3" 1404 | }, 1405 | "suggest": { 1406 | "ext-pcov": "*", 1407 | "ext-xdebug": "*" 1408 | }, 1409 | "type": "library", 1410 | "extra": { 1411 | "branch-alias": { 1412 | "dev-master": "9.2-dev" 1413 | } 1414 | }, 1415 | "autoload": { 1416 | "classmap": [ 1417 | "src/" 1418 | ] 1419 | }, 1420 | "notification-url": "https://packagist.org/downloads/", 1421 | "license": [ 1422 | "BSD-3-Clause" 1423 | ], 1424 | "authors": [ 1425 | { 1426 | "name": "Sebastian Bergmann", 1427 | "email": "sebastian@phpunit.de", 1428 | "role": "lead" 1429 | } 1430 | ], 1431 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1432 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1433 | "keywords": [ 1434 | "coverage", 1435 | "testing", 1436 | "xunit" 1437 | ], 1438 | "support": { 1439 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 1440 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" 1441 | }, 1442 | "funding": [ 1443 | { 1444 | "url": "https://github.com/sebastianbergmann", 1445 | "type": "github" 1446 | } 1447 | ], 1448 | "time": "2022-03-07T09:28:20+00:00" 1449 | }, 1450 | { 1451 | "name": "phpunit/php-file-iterator", 1452 | "version": "3.0.6", 1453 | "source": { 1454 | "type": "git", 1455 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1456 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 1457 | }, 1458 | "dist": { 1459 | "type": "zip", 1460 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 1461 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 1462 | "shasum": "" 1463 | }, 1464 | "require": { 1465 | "php": ">=7.3" 1466 | }, 1467 | "require-dev": { 1468 | "phpunit/phpunit": "^9.3" 1469 | }, 1470 | "type": "library", 1471 | "extra": { 1472 | "branch-alias": { 1473 | "dev-master": "3.0-dev" 1474 | } 1475 | }, 1476 | "autoload": { 1477 | "classmap": [ 1478 | "src/" 1479 | ] 1480 | }, 1481 | "notification-url": "https://packagist.org/downloads/", 1482 | "license": [ 1483 | "BSD-3-Clause" 1484 | ], 1485 | "authors": [ 1486 | { 1487 | "name": "Sebastian Bergmann", 1488 | "email": "sebastian@phpunit.de", 1489 | "role": "lead" 1490 | } 1491 | ], 1492 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1493 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1494 | "keywords": [ 1495 | "filesystem", 1496 | "iterator" 1497 | ], 1498 | "support": { 1499 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 1500 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 1501 | }, 1502 | "funding": [ 1503 | { 1504 | "url": "https://github.com/sebastianbergmann", 1505 | "type": "github" 1506 | } 1507 | ], 1508 | "time": "2021-12-02T12:48:52+00:00" 1509 | }, 1510 | { 1511 | "name": "phpunit/php-invoker", 1512 | "version": "3.1.1", 1513 | "source": { 1514 | "type": "git", 1515 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 1516 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 1517 | }, 1518 | "dist": { 1519 | "type": "zip", 1520 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 1521 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 1522 | "shasum": "" 1523 | }, 1524 | "require": { 1525 | "php": ">=7.3" 1526 | }, 1527 | "require-dev": { 1528 | "ext-pcntl": "*", 1529 | "phpunit/phpunit": "^9.3" 1530 | }, 1531 | "suggest": { 1532 | "ext-pcntl": "*" 1533 | }, 1534 | "type": "library", 1535 | "extra": { 1536 | "branch-alias": { 1537 | "dev-master": "3.1-dev" 1538 | } 1539 | }, 1540 | "autoload": { 1541 | "classmap": [ 1542 | "src/" 1543 | ] 1544 | }, 1545 | "notification-url": "https://packagist.org/downloads/", 1546 | "license": [ 1547 | "BSD-3-Clause" 1548 | ], 1549 | "authors": [ 1550 | { 1551 | "name": "Sebastian Bergmann", 1552 | "email": "sebastian@phpunit.de", 1553 | "role": "lead" 1554 | } 1555 | ], 1556 | "description": "Invoke callables with a timeout", 1557 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 1558 | "keywords": [ 1559 | "process" 1560 | ], 1561 | "support": { 1562 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 1563 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 1564 | }, 1565 | "funding": [ 1566 | { 1567 | "url": "https://github.com/sebastianbergmann", 1568 | "type": "github" 1569 | } 1570 | ], 1571 | "time": "2020-09-28T05:58:55+00:00" 1572 | }, 1573 | { 1574 | "name": "phpunit/php-text-template", 1575 | "version": "2.0.4", 1576 | "source": { 1577 | "type": "git", 1578 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1579 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 1580 | }, 1581 | "dist": { 1582 | "type": "zip", 1583 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1584 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 1585 | "shasum": "" 1586 | }, 1587 | "require": { 1588 | "php": ">=7.3" 1589 | }, 1590 | "require-dev": { 1591 | "phpunit/phpunit": "^9.3" 1592 | }, 1593 | "type": "library", 1594 | "extra": { 1595 | "branch-alias": { 1596 | "dev-master": "2.0-dev" 1597 | } 1598 | }, 1599 | "autoload": { 1600 | "classmap": [ 1601 | "src/" 1602 | ] 1603 | }, 1604 | "notification-url": "https://packagist.org/downloads/", 1605 | "license": [ 1606 | "BSD-3-Clause" 1607 | ], 1608 | "authors": [ 1609 | { 1610 | "name": "Sebastian Bergmann", 1611 | "email": "sebastian@phpunit.de", 1612 | "role": "lead" 1613 | } 1614 | ], 1615 | "description": "Simple template engine.", 1616 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1617 | "keywords": [ 1618 | "template" 1619 | ], 1620 | "support": { 1621 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 1622 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 1623 | }, 1624 | "funding": [ 1625 | { 1626 | "url": "https://github.com/sebastianbergmann", 1627 | "type": "github" 1628 | } 1629 | ], 1630 | "time": "2020-10-26T05:33:50+00:00" 1631 | }, 1632 | { 1633 | "name": "phpunit/phpunit", 1634 | "version": "9.5.21", 1635 | "source": { 1636 | "type": "git", 1637 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1638 | "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1" 1639 | }, 1640 | "dist": { 1641 | "type": "zip", 1642 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1", 1643 | "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1", 1644 | "shasum": "" 1645 | }, 1646 | "require": { 1647 | "doctrine/instantiator": "^1.3.1", 1648 | "ext-dom": "*", 1649 | "ext-json": "*", 1650 | "ext-libxml": "*", 1651 | "ext-mbstring": "*", 1652 | "ext-xml": "*", 1653 | "ext-xmlwriter": "*", 1654 | "myclabs/deep-copy": "^1.10.1", 1655 | "phar-io/manifest": "^2.0.3", 1656 | "phar-io/version": "^3.0.2", 1657 | "php": ">=7.3", 1658 | "phpspec/prophecy": "^1.12.1", 1659 | "phpunit/php-code-coverage": "^9.2.13", 1660 | "phpunit/php-file-iterator": "^3.0.5", 1661 | "phpunit/php-invoker": "^3.1.1", 1662 | "phpunit/php-text-template": "^2.0.3", 1663 | "phpunit/php-timer": "^5.0.2", 1664 | "sebastian/cli-parser": "^1.0.1", 1665 | "sebastian/code-unit": "^1.0.6", 1666 | "sebastian/comparator": "^4.0.5", 1667 | "sebastian/diff": "^4.0.3", 1668 | "sebastian/environment": "^5.1.3", 1669 | "sebastian/exporter": "^4.0.3", 1670 | "sebastian/global-state": "^5.0.1", 1671 | "sebastian/object-enumerator": "^4.0.3", 1672 | "sebastian/resource-operations": "^3.0.3", 1673 | "sebastian/type": "^3.0", 1674 | "sebastian/version": "^3.0.2" 1675 | }, 1676 | "require-dev": { 1677 | "phpspec/prophecy-phpunit": "^2.0.1" 1678 | }, 1679 | "suggest": { 1680 | "ext-soap": "*", 1681 | "ext-xdebug": "*" 1682 | }, 1683 | "bin": [ 1684 | "phpunit" 1685 | ], 1686 | "type": "library", 1687 | "extra": { 1688 | "branch-alias": { 1689 | "dev-master": "9.5-dev" 1690 | } 1691 | }, 1692 | "autoload": { 1693 | "files": [ 1694 | "src/Framework/Assert/Functions.php" 1695 | ], 1696 | "classmap": [ 1697 | "src/" 1698 | ] 1699 | }, 1700 | "notification-url": "https://packagist.org/downloads/", 1701 | "license": [ 1702 | "BSD-3-Clause" 1703 | ], 1704 | "authors": [ 1705 | { 1706 | "name": "Sebastian Bergmann", 1707 | "email": "sebastian@phpunit.de", 1708 | "role": "lead" 1709 | } 1710 | ], 1711 | "description": "The PHP Unit Testing framework.", 1712 | "homepage": "https://phpunit.de/", 1713 | "keywords": [ 1714 | "phpunit", 1715 | "testing", 1716 | "xunit" 1717 | ], 1718 | "support": { 1719 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1720 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" 1721 | }, 1722 | "funding": [ 1723 | { 1724 | "url": "https://phpunit.de/sponsors.html", 1725 | "type": "custom" 1726 | }, 1727 | { 1728 | "url": "https://github.com/sebastianbergmann", 1729 | "type": "github" 1730 | } 1731 | ], 1732 | "time": "2022-06-19T12:14:25+00:00" 1733 | }, 1734 | { 1735 | "name": "sebastian/cli-parser", 1736 | "version": "1.0.1", 1737 | "source": { 1738 | "type": "git", 1739 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1740 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 1741 | }, 1742 | "dist": { 1743 | "type": "zip", 1744 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1745 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1746 | "shasum": "" 1747 | }, 1748 | "require": { 1749 | "php": ">=7.3" 1750 | }, 1751 | "require-dev": { 1752 | "phpunit/phpunit": "^9.3" 1753 | }, 1754 | "type": "library", 1755 | "extra": { 1756 | "branch-alias": { 1757 | "dev-master": "1.0-dev" 1758 | } 1759 | }, 1760 | "autoload": { 1761 | "classmap": [ 1762 | "src/" 1763 | ] 1764 | }, 1765 | "notification-url": "https://packagist.org/downloads/", 1766 | "license": [ 1767 | "BSD-3-Clause" 1768 | ], 1769 | "authors": [ 1770 | { 1771 | "name": "Sebastian Bergmann", 1772 | "email": "sebastian@phpunit.de", 1773 | "role": "lead" 1774 | } 1775 | ], 1776 | "description": "Library for parsing CLI options", 1777 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1778 | "support": { 1779 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1780 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 1781 | }, 1782 | "funding": [ 1783 | { 1784 | "url": "https://github.com/sebastianbergmann", 1785 | "type": "github" 1786 | } 1787 | ], 1788 | "time": "2020-09-28T06:08:49+00:00" 1789 | }, 1790 | { 1791 | "name": "sebastian/code-unit", 1792 | "version": "1.0.8", 1793 | "source": { 1794 | "type": "git", 1795 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1796 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1797 | }, 1798 | "dist": { 1799 | "type": "zip", 1800 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1801 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1802 | "shasum": "" 1803 | }, 1804 | "require": { 1805 | "php": ">=7.3" 1806 | }, 1807 | "require-dev": { 1808 | "phpunit/phpunit": "^9.3" 1809 | }, 1810 | "type": "library", 1811 | "extra": { 1812 | "branch-alias": { 1813 | "dev-master": "1.0-dev" 1814 | } 1815 | }, 1816 | "autoload": { 1817 | "classmap": [ 1818 | "src/" 1819 | ] 1820 | }, 1821 | "notification-url": "https://packagist.org/downloads/", 1822 | "license": [ 1823 | "BSD-3-Clause" 1824 | ], 1825 | "authors": [ 1826 | { 1827 | "name": "Sebastian Bergmann", 1828 | "email": "sebastian@phpunit.de", 1829 | "role": "lead" 1830 | } 1831 | ], 1832 | "description": "Collection of value objects that represent the PHP code units", 1833 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1834 | "support": { 1835 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1836 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1837 | }, 1838 | "funding": [ 1839 | { 1840 | "url": "https://github.com/sebastianbergmann", 1841 | "type": "github" 1842 | } 1843 | ], 1844 | "time": "2020-10-26T13:08:54+00:00" 1845 | }, 1846 | { 1847 | "name": "sebastian/code-unit-reverse-lookup", 1848 | "version": "2.0.3", 1849 | "source": { 1850 | "type": "git", 1851 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1852 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1853 | }, 1854 | "dist": { 1855 | "type": "zip", 1856 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1857 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1858 | "shasum": "" 1859 | }, 1860 | "require": { 1861 | "php": ">=7.3" 1862 | }, 1863 | "require-dev": { 1864 | "phpunit/phpunit": "^9.3" 1865 | }, 1866 | "type": "library", 1867 | "extra": { 1868 | "branch-alias": { 1869 | "dev-master": "2.0-dev" 1870 | } 1871 | }, 1872 | "autoload": { 1873 | "classmap": [ 1874 | "src/" 1875 | ] 1876 | }, 1877 | "notification-url": "https://packagist.org/downloads/", 1878 | "license": [ 1879 | "BSD-3-Clause" 1880 | ], 1881 | "authors": [ 1882 | { 1883 | "name": "Sebastian Bergmann", 1884 | "email": "sebastian@phpunit.de" 1885 | } 1886 | ], 1887 | "description": "Looks up which function or method a line of code belongs to", 1888 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1889 | "support": { 1890 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1891 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1892 | }, 1893 | "funding": [ 1894 | { 1895 | "url": "https://github.com/sebastianbergmann", 1896 | "type": "github" 1897 | } 1898 | ], 1899 | "time": "2020-09-28T05:30:19+00:00" 1900 | }, 1901 | { 1902 | "name": "sebastian/comparator", 1903 | "version": "4.0.6", 1904 | "source": { 1905 | "type": "git", 1906 | "url": "https://github.com/sebastianbergmann/comparator.git", 1907 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382" 1908 | }, 1909 | "dist": { 1910 | "type": "zip", 1911 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", 1912 | "reference": "55f4261989e546dc112258c7a75935a81a7ce382", 1913 | "shasum": "" 1914 | }, 1915 | "require": { 1916 | "php": ">=7.3", 1917 | "sebastian/diff": "^4.0", 1918 | "sebastian/exporter": "^4.0" 1919 | }, 1920 | "require-dev": { 1921 | "phpunit/phpunit": "^9.3" 1922 | }, 1923 | "type": "library", 1924 | "extra": { 1925 | "branch-alias": { 1926 | "dev-master": "4.0-dev" 1927 | } 1928 | }, 1929 | "autoload": { 1930 | "classmap": [ 1931 | "src/" 1932 | ] 1933 | }, 1934 | "notification-url": "https://packagist.org/downloads/", 1935 | "license": [ 1936 | "BSD-3-Clause" 1937 | ], 1938 | "authors": [ 1939 | { 1940 | "name": "Sebastian Bergmann", 1941 | "email": "sebastian@phpunit.de" 1942 | }, 1943 | { 1944 | "name": "Jeff Welch", 1945 | "email": "whatthejeff@gmail.com" 1946 | }, 1947 | { 1948 | "name": "Volker Dusch", 1949 | "email": "github@wallbash.com" 1950 | }, 1951 | { 1952 | "name": "Bernhard Schussek", 1953 | "email": "bschussek@2bepublished.at" 1954 | } 1955 | ], 1956 | "description": "Provides the functionality to compare PHP values for equality", 1957 | "homepage": "https://github.com/sebastianbergmann/comparator", 1958 | "keywords": [ 1959 | "comparator", 1960 | "compare", 1961 | "equality" 1962 | ], 1963 | "support": { 1964 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1965 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" 1966 | }, 1967 | "funding": [ 1968 | { 1969 | "url": "https://github.com/sebastianbergmann", 1970 | "type": "github" 1971 | } 1972 | ], 1973 | "time": "2020-10-26T15:49:45+00:00" 1974 | }, 1975 | { 1976 | "name": "sebastian/complexity", 1977 | "version": "2.0.2", 1978 | "source": { 1979 | "type": "git", 1980 | "url": "https://github.com/sebastianbergmann/complexity.git", 1981 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 1982 | }, 1983 | "dist": { 1984 | "type": "zip", 1985 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 1986 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 1987 | "shasum": "" 1988 | }, 1989 | "require": { 1990 | "nikic/php-parser": "^4.7", 1991 | "php": ">=7.3" 1992 | }, 1993 | "require-dev": { 1994 | "phpunit/phpunit": "^9.3" 1995 | }, 1996 | "type": "library", 1997 | "extra": { 1998 | "branch-alias": { 1999 | "dev-master": "2.0-dev" 2000 | } 2001 | }, 2002 | "autoload": { 2003 | "classmap": [ 2004 | "src/" 2005 | ] 2006 | }, 2007 | "notification-url": "https://packagist.org/downloads/", 2008 | "license": [ 2009 | "BSD-3-Clause" 2010 | ], 2011 | "authors": [ 2012 | { 2013 | "name": "Sebastian Bergmann", 2014 | "email": "sebastian@phpunit.de", 2015 | "role": "lead" 2016 | } 2017 | ], 2018 | "description": "Library for calculating the complexity of PHP code units", 2019 | "homepage": "https://github.com/sebastianbergmann/complexity", 2020 | "support": { 2021 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 2022 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 2023 | }, 2024 | "funding": [ 2025 | { 2026 | "url": "https://github.com/sebastianbergmann", 2027 | "type": "github" 2028 | } 2029 | ], 2030 | "time": "2020-10-26T15:52:27+00:00" 2031 | }, 2032 | { 2033 | "name": "sebastian/diff", 2034 | "version": "4.0.4", 2035 | "source": { 2036 | "type": "git", 2037 | "url": "https://github.com/sebastianbergmann/diff.git", 2038 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" 2039 | }, 2040 | "dist": { 2041 | "type": "zip", 2042 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", 2043 | "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", 2044 | "shasum": "" 2045 | }, 2046 | "require": { 2047 | "php": ">=7.3" 2048 | }, 2049 | "require-dev": { 2050 | "phpunit/phpunit": "^9.3", 2051 | "symfony/process": "^4.2 || ^5" 2052 | }, 2053 | "type": "library", 2054 | "extra": { 2055 | "branch-alias": { 2056 | "dev-master": "4.0-dev" 2057 | } 2058 | }, 2059 | "autoload": { 2060 | "classmap": [ 2061 | "src/" 2062 | ] 2063 | }, 2064 | "notification-url": "https://packagist.org/downloads/", 2065 | "license": [ 2066 | "BSD-3-Clause" 2067 | ], 2068 | "authors": [ 2069 | { 2070 | "name": "Sebastian Bergmann", 2071 | "email": "sebastian@phpunit.de" 2072 | }, 2073 | { 2074 | "name": "Kore Nordmann", 2075 | "email": "mail@kore-nordmann.de" 2076 | } 2077 | ], 2078 | "description": "Diff implementation", 2079 | "homepage": "https://github.com/sebastianbergmann/diff", 2080 | "keywords": [ 2081 | "diff", 2082 | "udiff", 2083 | "unidiff", 2084 | "unified diff" 2085 | ], 2086 | "support": { 2087 | "issues": "https://github.com/sebastianbergmann/diff/issues", 2088 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" 2089 | }, 2090 | "funding": [ 2091 | { 2092 | "url": "https://github.com/sebastianbergmann", 2093 | "type": "github" 2094 | } 2095 | ], 2096 | "time": "2020-10-26T13:10:38+00:00" 2097 | }, 2098 | { 2099 | "name": "sebastian/environment", 2100 | "version": "5.1.4", 2101 | "source": { 2102 | "type": "git", 2103 | "url": "https://github.com/sebastianbergmann/environment.git", 2104 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" 2105 | }, 2106 | "dist": { 2107 | "type": "zip", 2108 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", 2109 | "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", 2110 | "shasum": "" 2111 | }, 2112 | "require": { 2113 | "php": ">=7.3" 2114 | }, 2115 | "require-dev": { 2116 | "phpunit/phpunit": "^9.3" 2117 | }, 2118 | "suggest": { 2119 | "ext-posix": "*" 2120 | }, 2121 | "type": "library", 2122 | "extra": { 2123 | "branch-alias": { 2124 | "dev-master": "5.1-dev" 2125 | } 2126 | }, 2127 | "autoload": { 2128 | "classmap": [ 2129 | "src/" 2130 | ] 2131 | }, 2132 | "notification-url": "https://packagist.org/downloads/", 2133 | "license": [ 2134 | "BSD-3-Clause" 2135 | ], 2136 | "authors": [ 2137 | { 2138 | "name": "Sebastian Bergmann", 2139 | "email": "sebastian@phpunit.de" 2140 | } 2141 | ], 2142 | "description": "Provides functionality to handle HHVM/PHP environments", 2143 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2144 | "keywords": [ 2145 | "Xdebug", 2146 | "environment", 2147 | "hhvm" 2148 | ], 2149 | "support": { 2150 | "issues": "https://github.com/sebastianbergmann/environment/issues", 2151 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" 2152 | }, 2153 | "funding": [ 2154 | { 2155 | "url": "https://github.com/sebastianbergmann", 2156 | "type": "github" 2157 | } 2158 | ], 2159 | "time": "2022-04-03T09:37:03+00:00" 2160 | }, 2161 | { 2162 | "name": "sebastian/exporter", 2163 | "version": "4.0.4", 2164 | "source": { 2165 | "type": "git", 2166 | "url": "https://github.com/sebastianbergmann/exporter.git", 2167 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" 2168 | }, 2169 | "dist": { 2170 | "type": "zip", 2171 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", 2172 | "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", 2173 | "shasum": "" 2174 | }, 2175 | "require": { 2176 | "php": ">=7.3", 2177 | "sebastian/recursion-context": "^4.0" 2178 | }, 2179 | "require-dev": { 2180 | "ext-mbstring": "*", 2181 | "phpunit/phpunit": "^9.3" 2182 | }, 2183 | "type": "library", 2184 | "extra": { 2185 | "branch-alias": { 2186 | "dev-master": "4.0-dev" 2187 | } 2188 | }, 2189 | "autoload": { 2190 | "classmap": [ 2191 | "src/" 2192 | ] 2193 | }, 2194 | "notification-url": "https://packagist.org/downloads/", 2195 | "license": [ 2196 | "BSD-3-Clause" 2197 | ], 2198 | "authors": [ 2199 | { 2200 | "name": "Sebastian Bergmann", 2201 | "email": "sebastian@phpunit.de" 2202 | }, 2203 | { 2204 | "name": "Jeff Welch", 2205 | "email": "whatthejeff@gmail.com" 2206 | }, 2207 | { 2208 | "name": "Volker Dusch", 2209 | "email": "github@wallbash.com" 2210 | }, 2211 | { 2212 | "name": "Adam Harvey", 2213 | "email": "aharvey@php.net" 2214 | }, 2215 | { 2216 | "name": "Bernhard Schussek", 2217 | "email": "bschussek@gmail.com" 2218 | } 2219 | ], 2220 | "description": "Provides the functionality to export PHP variables for visualization", 2221 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 2222 | "keywords": [ 2223 | "export", 2224 | "exporter" 2225 | ], 2226 | "support": { 2227 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 2228 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" 2229 | }, 2230 | "funding": [ 2231 | { 2232 | "url": "https://github.com/sebastianbergmann", 2233 | "type": "github" 2234 | } 2235 | ], 2236 | "time": "2021-11-11T14:18:36+00:00" 2237 | }, 2238 | { 2239 | "name": "sebastian/global-state", 2240 | "version": "5.0.5", 2241 | "source": { 2242 | "type": "git", 2243 | "url": "https://github.com/sebastianbergmann/global-state.git", 2244 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" 2245 | }, 2246 | "dist": { 2247 | "type": "zip", 2248 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", 2249 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", 2250 | "shasum": "" 2251 | }, 2252 | "require": { 2253 | "php": ">=7.3", 2254 | "sebastian/object-reflector": "^2.0", 2255 | "sebastian/recursion-context": "^4.0" 2256 | }, 2257 | "require-dev": { 2258 | "ext-dom": "*", 2259 | "phpunit/phpunit": "^9.3" 2260 | }, 2261 | "suggest": { 2262 | "ext-uopz": "*" 2263 | }, 2264 | "type": "library", 2265 | "extra": { 2266 | "branch-alias": { 2267 | "dev-master": "5.0-dev" 2268 | } 2269 | }, 2270 | "autoload": { 2271 | "classmap": [ 2272 | "src/" 2273 | ] 2274 | }, 2275 | "notification-url": "https://packagist.org/downloads/", 2276 | "license": [ 2277 | "BSD-3-Clause" 2278 | ], 2279 | "authors": [ 2280 | { 2281 | "name": "Sebastian Bergmann", 2282 | "email": "sebastian@phpunit.de" 2283 | } 2284 | ], 2285 | "description": "Snapshotting of global state", 2286 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2287 | "keywords": [ 2288 | "global state" 2289 | ], 2290 | "support": { 2291 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 2292 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" 2293 | }, 2294 | "funding": [ 2295 | { 2296 | "url": "https://github.com/sebastianbergmann", 2297 | "type": "github" 2298 | } 2299 | ], 2300 | "time": "2022-02-14T08:28:10+00:00" 2301 | }, 2302 | { 2303 | "name": "sebastian/lines-of-code", 2304 | "version": "1.0.3", 2305 | "source": { 2306 | "type": "git", 2307 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 2308 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 2309 | }, 2310 | "dist": { 2311 | "type": "zip", 2312 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 2313 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 2314 | "shasum": "" 2315 | }, 2316 | "require": { 2317 | "nikic/php-parser": "^4.6", 2318 | "php": ">=7.3" 2319 | }, 2320 | "require-dev": { 2321 | "phpunit/phpunit": "^9.3" 2322 | }, 2323 | "type": "library", 2324 | "extra": { 2325 | "branch-alias": { 2326 | "dev-master": "1.0-dev" 2327 | } 2328 | }, 2329 | "autoload": { 2330 | "classmap": [ 2331 | "src/" 2332 | ] 2333 | }, 2334 | "notification-url": "https://packagist.org/downloads/", 2335 | "license": [ 2336 | "BSD-3-Clause" 2337 | ], 2338 | "authors": [ 2339 | { 2340 | "name": "Sebastian Bergmann", 2341 | "email": "sebastian@phpunit.de", 2342 | "role": "lead" 2343 | } 2344 | ], 2345 | "description": "Library for counting the lines of code in PHP source code", 2346 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 2347 | "support": { 2348 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 2349 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 2350 | }, 2351 | "funding": [ 2352 | { 2353 | "url": "https://github.com/sebastianbergmann", 2354 | "type": "github" 2355 | } 2356 | ], 2357 | "time": "2020-11-28T06:42:11+00:00" 2358 | }, 2359 | { 2360 | "name": "sebastian/object-enumerator", 2361 | "version": "4.0.4", 2362 | "source": { 2363 | "type": "git", 2364 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2365 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 2366 | }, 2367 | "dist": { 2368 | "type": "zip", 2369 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 2370 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 2371 | "shasum": "" 2372 | }, 2373 | "require": { 2374 | "php": ">=7.3", 2375 | "sebastian/object-reflector": "^2.0", 2376 | "sebastian/recursion-context": "^4.0" 2377 | }, 2378 | "require-dev": { 2379 | "phpunit/phpunit": "^9.3" 2380 | }, 2381 | "type": "library", 2382 | "extra": { 2383 | "branch-alias": { 2384 | "dev-master": "4.0-dev" 2385 | } 2386 | }, 2387 | "autoload": { 2388 | "classmap": [ 2389 | "src/" 2390 | ] 2391 | }, 2392 | "notification-url": "https://packagist.org/downloads/", 2393 | "license": [ 2394 | "BSD-3-Clause" 2395 | ], 2396 | "authors": [ 2397 | { 2398 | "name": "Sebastian Bergmann", 2399 | "email": "sebastian@phpunit.de" 2400 | } 2401 | ], 2402 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2403 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2404 | "support": { 2405 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 2406 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 2407 | }, 2408 | "funding": [ 2409 | { 2410 | "url": "https://github.com/sebastianbergmann", 2411 | "type": "github" 2412 | } 2413 | ], 2414 | "time": "2020-10-26T13:12:34+00:00" 2415 | }, 2416 | { 2417 | "name": "sebastian/object-reflector", 2418 | "version": "2.0.4", 2419 | "source": { 2420 | "type": "git", 2421 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2422 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 2423 | }, 2424 | "dist": { 2425 | "type": "zip", 2426 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2427 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 2428 | "shasum": "" 2429 | }, 2430 | "require": { 2431 | "php": ">=7.3" 2432 | }, 2433 | "require-dev": { 2434 | "phpunit/phpunit": "^9.3" 2435 | }, 2436 | "type": "library", 2437 | "extra": { 2438 | "branch-alias": { 2439 | "dev-master": "2.0-dev" 2440 | } 2441 | }, 2442 | "autoload": { 2443 | "classmap": [ 2444 | "src/" 2445 | ] 2446 | }, 2447 | "notification-url": "https://packagist.org/downloads/", 2448 | "license": [ 2449 | "BSD-3-Clause" 2450 | ], 2451 | "authors": [ 2452 | { 2453 | "name": "Sebastian Bergmann", 2454 | "email": "sebastian@phpunit.de" 2455 | } 2456 | ], 2457 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2458 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2459 | "support": { 2460 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 2461 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 2462 | }, 2463 | "funding": [ 2464 | { 2465 | "url": "https://github.com/sebastianbergmann", 2466 | "type": "github" 2467 | } 2468 | ], 2469 | "time": "2020-10-26T13:14:26+00:00" 2470 | }, 2471 | { 2472 | "name": "sebastian/recursion-context", 2473 | "version": "4.0.4", 2474 | "source": { 2475 | "type": "git", 2476 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2477 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" 2478 | }, 2479 | "dist": { 2480 | "type": "zip", 2481 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", 2482 | "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", 2483 | "shasum": "" 2484 | }, 2485 | "require": { 2486 | "php": ">=7.3" 2487 | }, 2488 | "require-dev": { 2489 | "phpunit/phpunit": "^9.3" 2490 | }, 2491 | "type": "library", 2492 | "extra": { 2493 | "branch-alias": { 2494 | "dev-master": "4.0-dev" 2495 | } 2496 | }, 2497 | "autoload": { 2498 | "classmap": [ 2499 | "src/" 2500 | ] 2501 | }, 2502 | "notification-url": "https://packagist.org/downloads/", 2503 | "license": [ 2504 | "BSD-3-Clause" 2505 | ], 2506 | "authors": [ 2507 | { 2508 | "name": "Sebastian Bergmann", 2509 | "email": "sebastian@phpunit.de" 2510 | }, 2511 | { 2512 | "name": "Jeff Welch", 2513 | "email": "whatthejeff@gmail.com" 2514 | }, 2515 | { 2516 | "name": "Adam Harvey", 2517 | "email": "aharvey@php.net" 2518 | } 2519 | ], 2520 | "description": "Provides functionality to recursively process PHP variables", 2521 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2522 | "support": { 2523 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2524 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" 2525 | }, 2526 | "funding": [ 2527 | { 2528 | "url": "https://github.com/sebastianbergmann", 2529 | "type": "github" 2530 | } 2531 | ], 2532 | "time": "2020-10-26T13:17:30+00:00" 2533 | }, 2534 | { 2535 | "name": "sebastian/resource-operations", 2536 | "version": "3.0.3", 2537 | "source": { 2538 | "type": "git", 2539 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2540 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 2541 | }, 2542 | "dist": { 2543 | "type": "zip", 2544 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2545 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2546 | "shasum": "" 2547 | }, 2548 | "require": { 2549 | "php": ">=7.3" 2550 | }, 2551 | "require-dev": { 2552 | "phpunit/phpunit": "^9.0" 2553 | }, 2554 | "type": "library", 2555 | "extra": { 2556 | "branch-alias": { 2557 | "dev-master": "3.0-dev" 2558 | } 2559 | }, 2560 | "autoload": { 2561 | "classmap": [ 2562 | "src/" 2563 | ] 2564 | }, 2565 | "notification-url": "https://packagist.org/downloads/", 2566 | "license": [ 2567 | "BSD-3-Clause" 2568 | ], 2569 | "authors": [ 2570 | { 2571 | "name": "Sebastian Bergmann", 2572 | "email": "sebastian@phpunit.de" 2573 | } 2574 | ], 2575 | "description": "Provides a list of PHP built-in functions that operate on resources", 2576 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2577 | "support": { 2578 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 2579 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 2580 | }, 2581 | "funding": [ 2582 | { 2583 | "url": "https://github.com/sebastianbergmann", 2584 | "type": "github" 2585 | } 2586 | ], 2587 | "time": "2020-09-28T06:45:17+00:00" 2588 | }, 2589 | { 2590 | "name": "sebastian/type", 2591 | "version": "3.0.0", 2592 | "source": { 2593 | "type": "git", 2594 | "url": "https://github.com/sebastianbergmann/type.git", 2595 | "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" 2596 | }, 2597 | "dist": { 2598 | "type": "zip", 2599 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", 2600 | "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", 2601 | "shasum": "" 2602 | }, 2603 | "require": { 2604 | "php": ">=7.3" 2605 | }, 2606 | "require-dev": { 2607 | "phpunit/phpunit": "^9.5" 2608 | }, 2609 | "type": "library", 2610 | "extra": { 2611 | "branch-alias": { 2612 | "dev-master": "3.0-dev" 2613 | } 2614 | }, 2615 | "autoload": { 2616 | "classmap": [ 2617 | "src/" 2618 | ] 2619 | }, 2620 | "notification-url": "https://packagist.org/downloads/", 2621 | "license": [ 2622 | "BSD-3-Clause" 2623 | ], 2624 | "authors": [ 2625 | { 2626 | "name": "Sebastian Bergmann", 2627 | "email": "sebastian@phpunit.de", 2628 | "role": "lead" 2629 | } 2630 | ], 2631 | "description": "Collection of value objects that represent the types of the PHP type system", 2632 | "homepage": "https://github.com/sebastianbergmann/type", 2633 | "support": { 2634 | "issues": "https://github.com/sebastianbergmann/type/issues", 2635 | "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" 2636 | }, 2637 | "funding": [ 2638 | { 2639 | "url": "https://github.com/sebastianbergmann", 2640 | "type": "github" 2641 | } 2642 | ], 2643 | "time": "2022-03-15T09:54:48+00:00" 2644 | }, 2645 | { 2646 | "name": "sebastian/version", 2647 | "version": "3.0.2", 2648 | "source": { 2649 | "type": "git", 2650 | "url": "https://github.com/sebastianbergmann/version.git", 2651 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2652 | }, 2653 | "dist": { 2654 | "type": "zip", 2655 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2656 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2657 | "shasum": "" 2658 | }, 2659 | "require": { 2660 | "php": ">=7.3" 2661 | }, 2662 | "type": "library", 2663 | "extra": { 2664 | "branch-alias": { 2665 | "dev-master": "3.0-dev" 2666 | } 2667 | }, 2668 | "autoload": { 2669 | "classmap": [ 2670 | "src/" 2671 | ] 2672 | }, 2673 | "notification-url": "https://packagist.org/downloads/", 2674 | "license": [ 2675 | "BSD-3-Clause" 2676 | ], 2677 | "authors": [ 2678 | { 2679 | "name": "Sebastian Bergmann", 2680 | "email": "sebastian@phpunit.de", 2681 | "role": "lead" 2682 | } 2683 | ], 2684 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2685 | "homepage": "https://github.com/sebastianbergmann/version", 2686 | "support": { 2687 | "issues": "https://github.com/sebastianbergmann/version/issues", 2688 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2689 | }, 2690 | "funding": [ 2691 | { 2692 | "url": "https://github.com/sebastianbergmann", 2693 | "type": "github" 2694 | } 2695 | ], 2696 | "time": "2020-09-28T06:39:44+00:00" 2697 | }, 2698 | { 2699 | "name": "squizlabs/php_codesniffer", 2700 | "version": "3.7.1", 2701 | "source": { 2702 | "type": "git", 2703 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 2704 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" 2705 | }, 2706 | "dist": { 2707 | "type": "zip", 2708 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", 2709 | "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", 2710 | "shasum": "" 2711 | }, 2712 | "require": { 2713 | "ext-simplexml": "*", 2714 | "ext-tokenizer": "*", 2715 | "ext-xmlwriter": "*", 2716 | "php": ">=5.4.0" 2717 | }, 2718 | "require-dev": { 2719 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 2720 | }, 2721 | "bin": [ 2722 | "bin/phpcs", 2723 | "bin/phpcbf" 2724 | ], 2725 | "type": "library", 2726 | "extra": { 2727 | "branch-alias": { 2728 | "dev-master": "3.x-dev" 2729 | } 2730 | }, 2731 | "notification-url": "https://packagist.org/downloads/", 2732 | "license": [ 2733 | "BSD-3-Clause" 2734 | ], 2735 | "authors": [ 2736 | { 2737 | "name": "Greg Sherwood", 2738 | "role": "lead" 2739 | } 2740 | ], 2741 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 2742 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", 2743 | "keywords": [ 2744 | "phpcs", 2745 | "standards" 2746 | ], 2747 | "support": { 2748 | "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", 2749 | "source": "https://github.com/squizlabs/PHP_CodeSniffer", 2750 | "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" 2751 | }, 2752 | "time": "2022-06-18T07:21:10+00:00" 2753 | }, 2754 | { 2755 | "name": "symfony/var-dumper", 2756 | "version": "v6.1.3", 2757 | "source": { 2758 | "type": "git", 2759 | "url": "https://github.com/symfony/var-dumper.git", 2760 | "reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427" 2761 | }, 2762 | "dist": { 2763 | "type": "zip", 2764 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427", 2765 | "reference": "d5a5e44a2260c5eb5e746bf4f1fbd12ee6ceb427", 2766 | "shasum": "" 2767 | }, 2768 | "require": { 2769 | "php": ">=8.1", 2770 | "symfony/polyfill-mbstring": "~1.0" 2771 | }, 2772 | "conflict": { 2773 | "phpunit/phpunit": "<5.4.3", 2774 | "symfony/console": "<5.4" 2775 | }, 2776 | "require-dev": { 2777 | "ext-iconv": "*", 2778 | "symfony/console": "^5.4|^6.0", 2779 | "symfony/process": "^5.4|^6.0", 2780 | "symfony/uid": "^5.4|^6.0", 2781 | "twig/twig": "^2.13|^3.0.4" 2782 | }, 2783 | "suggest": { 2784 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 2785 | "ext-intl": "To show region name in time zone dump", 2786 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" 2787 | }, 2788 | "bin": [ 2789 | "Resources/bin/var-dump-server" 2790 | ], 2791 | "type": "library", 2792 | "autoload": { 2793 | "files": [ 2794 | "Resources/functions/dump.php" 2795 | ], 2796 | "psr-4": { 2797 | "Symfony\\Component\\VarDumper\\": "" 2798 | }, 2799 | "exclude-from-classmap": [ 2800 | "/Tests/" 2801 | ] 2802 | }, 2803 | "notification-url": "https://packagist.org/downloads/", 2804 | "license": [ 2805 | "MIT" 2806 | ], 2807 | "authors": [ 2808 | { 2809 | "name": "Nicolas Grekas", 2810 | "email": "p@tchwork.com" 2811 | }, 2812 | { 2813 | "name": "Symfony Community", 2814 | "homepage": "https://symfony.com/contributors" 2815 | } 2816 | ], 2817 | "description": "Provides mechanisms for walking through any arbitrary PHP variable", 2818 | "homepage": "https://symfony.com", 2819 | "keywords": [ 2820 | "debug", 2821 | "dump" 2822 | ], 2823 | "support": { 2824 | "source": "https://github.com/symfony/var-dumper/tree/v6.1.3" 2825 | }, 2826 | "funding": [ 2827 | { 2828 | "url": "https://symfony.com/sponsor", 2829 | "type": "custom" 2830 | }, 2831 | { 2832 | "url": "https://github.com/fabpot", 2833 | "type": "github" 2834 | }, 2835 | { 2836 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2837 | "type": "tidelift" 2838 | } 2839 | ], 2840 | "time": "2022-07-20T13:46:29+00:00" 2841 | }, 2842 | { 2843 | "name": "theseer/tokenizer", 2844 | "version": "1.2.1", 2845 | "source": { 2846 | "type": "git", 2847 | "url": "https://github.com/theseer/tokenizer.git", 2848 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" 2849 | }, 2850 | "dist": { 2851 | "type": "zip", 2852 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", 2853 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", 2854 | "shasum": "" 2855 | }, 2856 | "require": { 2857 | "ext-dom": "*", 2858 | "ext-tokenizer": "*", 2859 | "ext-xmlwriter": "*", 2860 | "php": "^7.2 || ^8.0" 2861 | }, 2862 | "type": "library", 2863 | "autoload": { 2864 | "classmap": [ 2865 | "src/" 2866 | ] 2867 | }, 2868 | "notification-url": "https://packagist.org/downloads/", 2869 | "license": [ 2870 | "BSD-3-Clause" 2871 | ], 2872 | "authors": [ 2873 | { 2874 | "name": "Arne Blankerts", 2875 | "email": "arne@blankerts.de", 2876 | "role": "Developer" 2877 | } 2878 | ], 2879 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2880 | "support": { 2881 | "issues": "https://github.com/theseer/tokenizer/issues", 2882 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1" 2883 | }, 2884 | "funding": [ 2885 | { 2886 | "url": "https://github.com/theseer", 2887 | "type": "github" 2888 | } 2889 | ], 2890 | "time": "2021-07-28T10:34:58+00:00" 2891 | }, 2892 | { 2893 | "name": "webmozart/assert", 2894 | "version": "1.11.0", 2895 | "source": { 2896 | "type": "git", 2897 | "url": "https://github.com/webmozarts/assert.git", 2898 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" 2899 | }, 2900 | "dist": { 2901 | "type": "zip", 2902 | "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", 2903 | "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", 2904 | "shasum": "" 2905 | }, 2906 | "require": { 2907 | "ext-ctype": "*", 2908 | "php": "^7.2 || ^8.0" 2909 | }, 2910 | "conflict": { 2911 | "phpstan/phpstan": "<0.12.20", 2912 | "vimeo/psalm": "<4.6.1 || 4.6.2" 2913 | }, 2914 | "require-dev": { 2915 | "phpunit/phpunit": "^8.5.13" 2916 | }, 2917 | "type": "library", 2918 | "extra": { 2919 | "branch-alias": { 2920 | "dev-master": "1.10-dev" 2921 | } 2922 | }, 2923 | "autoload": { 2924 | "psr-4": { 2925 | "Webmozart\\Assert\\": "src/" 2926 | } 2927 | }, 2928 | "notification-url": "https://packagist.org/downloads/", 2929 | "license": [ 2930 | "MIT" 2931 | ], 2932 | "authors": [ 2933 | { 2934 | "name": "Bernhard Schussek", 2935 | "email": "bschussek@gmail.com" 2936 | } 2937 | ], 2938 | "description": "Assertions to validate method input/output with nice error messages.", 2939 | "keywords": [ 2940 | "assert", 2941 | "check", 2942 | "validate" 2943 | ], 2944 | "support": { 2945 | "issues": "https://github.com/webmozarts/assert/issues", 2946 | "source": "https://github.com/webmozarts/assert/tree/1.11.0" 2947 | }, 2948 | "time": "2022-06-03T18:03:27+00:00" 2949 | } 2950 | ], 2951 | "aliases": [], 2952 | "minimum-stability": "stable", 2953 | "stability-flags": [], 2954 | "prefer-stable": false, 2955 | "prefer-lowest": false, 2956 | "platform": { 2957 | "php": "^7.4 || ^8.0" 2958 | }, 2959 | "platform-dev": [], 2960 | "plugin-api-version": "2.3.0" 2961 | } 2962 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | networks: 4 | app: 5 | driver: bridge 6 | 7 | services: 8 | app: 9 | build: 10 | context: ./docker/app 11 | volumes: 12 | - '.:/var/www' 13 | -------------------------------------------------------------------------------- /docker/app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.1-fpm 2 | 3 | # Set working directory 4 | WORKDIR /var/www 5 | 6 | # Install system dependencies 7 | RUN apt-get update && apt-get install -y \ 8 | git \ 9 | curl \ 10 | libpng-dev \ 11 | libjpeg-dev \ 12 | libfreetype6-dev \ 13 | libonig-dev \ 14 | libxml2-dev \ 15 | libpq-dev \ 16 | libzip-dev \ 17 | libcurl4-openssl-dev \ 18 | zip \ 19 | unzip 20 | 21 | # Install PHP extensions 22 | RUN docker-php-ext-install mbstring exif pcntl bcmath gd zip curl 23 | 24 | # Install xdebug 25 | RUN pecl install xdebug-3.1.3 \ 26 | && docker-php-ext-enable xdebug 27 | 28 | # Get latest Composer 29 | RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer 30 | 31 | # Clear cache 32 | RUN apt-get -y autoremove \ 33 | && apt-get clean \ 34 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ 35 | -------------------------------------------------------------------------------- /phpargsdetector: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | add(new InspectCommand()); 28 | 29 | $application->run(); 30 | -------------------------------------------------------------------------------- /src/Commands/InspectCommand.php: -------------------------------------------------------------------------------- 1 | addArgument( 27 | 'directories', 28 | InputArgument::REQUIRED, 29 | 'Directories to analyze', 30 | ) 31 | ->addOption( 32 | 'min-args', 33 | null, 34 | InputOption::VALUE_REQUIRED, 35 | '', 36 | ) 37 | ->addOption( 38 | 'max-args', 39 | null, 40 | InputOption::VALUE_REQUIRED, 41 | '', 42 | ) 43 | ->addOption( 44 | 'min-weight', 45 | null, 46 | InputOption::VALUE_REQUIRED, 47 | '', 48 | ) 49 | ->addOption( 50 | 'max-weight', 51 | null, 52 | InputOption::VALUE_REQUIRED, 53 | '', 54 | ) 55 | ->addOption( 56 | 'limit', 57 | null, 58 | InputOption::VALUE_REQUIRED, 59 | '', 60 | ) 61 | ->addOption( 62 | 'without-constructor', 63 | null, 64 | InputOption::VALUE_NONE, 65 | ) 66 | ->addOption( 67 | 'sort-by-weight', 68 | null, 69 | InputOption::VALUE_NONE, 70 | ); 71 | } 72 | 73 | protected function execute(InputInterface $input, OutputInterface $output) 74 | { 75 | $output->writeln('❀ PHP Arguments Detector ❀'); 76 | 77 | $finder = $this->createFinder($input); 78 | 79 | if ($this->noFilesFound($finder)) { 80 | 81 | $output->writeln('No files found to scan'); 82 | 83 | return self::SUCCESS; 84 | } 85 | 86 | $methods = $this->diveIntoNodes($output, $finder); 87 | 88 | $output->writeln(PHP_EOL); 89 | 90 | $options = $input->getOptions([ 91 | 'without-constructor', 92 | 'sort-by-weight', 93 | 'min-args', 94 | 'max-args', 95 | 'min-weight', 96 | 'max-weight', 97 | 'limit', 98 | ]); 99 | 100 | $printer = new Console($options); 101 | 102 | $printer->printData($output, $methods); 103 | 104 | return self::SUCCESS; 105 | } 106 | 107 | protected function createFinder(InputInterface $input): Finder 108 | { 109 | $finder = new Finder(); 110 | 111 | $directories = $input->getArgument('directories'); 112 | 113 | $finder->files()->in($directories); 114 | 115 | return $finder; 116 | } 117 | 118 | protected function noFilesFound(Finder $finder): bool 119 | { 120 | $filesCount = $finder->count(); 121 | 122 | return $filesCount === 0; 123 | } 124 | 125 | protected function startProgressBar(OutputInterface $output, Finder $finder): void 126 | { 127 | $this->progressBar = new ProgressBar($output, $finder->count()); 128 | 129 | $this->progressBar->start(); 130 | } 131 | 132 | protected function diveIntoNodes(OutputInterface $output, Finder $finder): array 133 | { 134 | $this->startProgressBar($output, $finder); 135 | 136 | $methods = []; 137 | $detector = new Detector(); 138 | 139 | foreach ($finder as $file) { 140 | 141 | try { 142 | 143 | $tokens = $detector->parse($file); 144 | 145 | $fileVisitor = new FileVisitor( 146 | new NodeMethodExplorer($file), 147 | ); 148 | 149 | $traverser = new NodeTraverser(); 150 | 151 | $traverser->addVisitor($fileVisitor); 152 | 153 | $traverser->traverse($tokens); 154 | 155 | foreach ($fileVisitor->getMethods() as $method) { 156 | $methods[] = $method; 157 | } 158 | 159 | } catch (Error $e) { 160 | // 161 | } 162 | 163 | $this->progressBar->advance(); 164 | } 165 | 166 | $this->progressBar->finish(); 167 | 168 | return $methods; 169 | } 170 | } -------------------------------------------------------------------------------- /src/Detector.php: -------------------------------------------------------------------------------- 1 | parserFactory = new ParserFactory(); 14 | } 15 | 16 | public function parse(string $file): array 17 | { 18 | $parser = $this->parserFactory->create(ParserFactory::PREFER_PHP7); 19 | 20 | $buffer = file_get_contents($file); 21 | 22 | return $parser->parse($buffer); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Method.php: -------------------------------------------------------------------------------- 1 | path = $path; 17 | $this->name = $name; 18 | $this->line = $line; 19 | $this->arguments = $arguments; 20 | } 21 | 22 | public function getPath(): string 23 | { 24 | return $this->path; 25 | } 26 | 27 | public function getName(): string 28 | { 29 | return $this->name; 30 | } 31 | 32 | public function getLine(): int 33 | { 34 | return $this->line - 2; 35 | } 36 | 37 | public function countArguments(): int 38 | { 39 | return count($this->arguments); 40 | } 41 | 42 | public function getWeight(): int 43 | { 44 | $weight = $this->getLine() * $this->countArguments(); 45 | 46 | return $weight > 0 ? $weight : 0; 47 | } 48 | 49 | public function isConstructor(): bool 50 | { 51 | return $this->name === '__construct'; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/NodeMethodExplorer.php: -------------------------------------------------------------------------------- 1 | file = $file; 17 | } 18 | 19 | public function get(Node $node): iterable 20 | { 21 | if ($this->isNotClassMethod($node)) { 22 | return; 23 | } 24 | 25 | yield new Method( 26 | $this->file->getPathname(), 27 | $node->name->name, 28 | $node->getEndLine() - $node->getStartLine(), 29 | $node->getParams(), 30 | ); 31 | } 32 | 33 | public function isNotClassMethod(Node $node): bool 34 | { 35 | return ! $node instanceof ClassMethod; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Printers/Console.php: -------------------------------------------------------------------------------- 1 | options = $options; 17 | } 18 | 19 | public function printData(OutputInterface $output, array $methods) 20 | { 21 | $rows = $this->getRows($methods); 22 | 23 | if (count($rows) === 0) { 24 | $output->writeln('No methods found.'); 25 | return; 26 | } 27 | 28 | $rows = $this->sortRows($rows); 29 | 30 | if ($this->options['limit']) { 31 | $rows = $this->cutRows($rows); 32 | } 33 | 34 | $this->printTable($output, $rows); 35 | 36 | $output->writeln('Total of methods : ' . count($rows) . ''); 37 | 38 | return Command::SUCCESS; 39 | } 40 | 41 | protected function getRows(array $methods): array 42 | { 43 | $rows = []; 44 | 45 | foreach ($methods as $method) { 46 | 47 | if ($this->constructorIsUnwelcome($method)) { 48 | continue; 49 | } 50 | 51 | if ($this->outsideThresholds($method)) { 52 | continue; 53 | } 54 | 55 | $rows[] = [ 56 | $method->getPath(), 57 | $method->getName(), 58 | $method->countArguments(), 59 | $method->getWeight(), 60 | ]; 61 | } 62 | 63 | return $rows; 64 | } 65 | 66 | protected function constructorIsUnwelcome(Method $method): bool 67 | { 68 | return $this->options['without-constructor'] && $method->isConstructor(); 69 | } 70 | 71 | protected function outsideThresholds(Method $method): bool 72 | { 73 | return $this->outsideArgsThresholds($method) 74 | || $this->outsideWeightThresholds($method); 75 | } 76 | 77 | protected function outsideArgsThresholds(Method $method): bool 78 | { 79 | $count = $method->countArguments(); 80 | 81 | if ($this->options['min-args'] && $count < (int) $this->options['min-args']) { 82 | return true; 83 | } 84 | 85 | if ($this->options['max-args'] && $count > (int) $this->options['max-args']) { 86 | return true; 87 | } 88 | 89 | return false; 90 | } 91 | 92 | protected function outsideWeightThresholds(Method $method): bool 93 | { 94 | $weight = $method->getWeight(); 95 | 96 | if ($this->options['min-weight'] && $weight < (int) $this->options['min-weight']) { 97 | return true; 98 | } 99 | 100 | if ($this->options['max-weight'] && $weight > (int) $this->options['max-weight']) { 101 | return true; 102 | } 103 | 104 | return false; 105 | } 106 | 107 | protected function sortRows(array $rows): array 108 | { 109 | $sort = $this->options['sort-by-weight'] ? 3 : 2; 110 | 111 | uasort($rows, function ($a, $b) use ($sort) { 112 | 113 | if ($a[$sort] == $b[$sort]) { 114 | return 0; 115 | } 116 | 117 | return ($a[$sort] < $b[$sort]) ? 1 : -1; 118 | }); 119 | 120 | return $rows; 121 | } 122 | 123 | protected function cutRows(array $rows): array 124 | { 125 | $limit = $this->options['limit']; 126 | 127 | return array_slice($rows, 0, $limit); 128 | } 129 | 130 | protected function printTable(OutputInterface $output, array $rows): void 131 | { 132 | $table = new Table($output); 133 | 134 | $table 135 | ->setHeaders(['Files', 'Methods', 'Arguments', 'Weight']) 136 | ->setRows($rows); 137 | 138 | $table->render(); 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/Visitors/FileVisitor.php: -------------------------------------------------------------------------------- 1 | nodeExplorer = $nodeExplorer; 17 | } 18 | 19 | public function beforeTraverse(array $nodes): void 20 | { 21 | $this->methods = []; 22 | } 23 | 24 | public function leaveNode(Node $node): void 25 | { 26 | $this->methods[] = $this->nodeExplorer->get($node); 27 | } 28 | 29 | public function getMethods(): iterable 30 | { 31 | foreach ($this->methods as $method) { 32 | yield from $method; 33 | } 34 | } 35 | } 36 | --------------------------------------------------------------------------------