diff options
| author | Daniel Weipert <code@drogueronin.de> | 2020-12-13 20:34:09 +0100 | 
|---|---|---|
| committer | Daniel Weipert <code@drogueronin.de> | 2020-12-13 20:34:09 +0100 | 
| commit | d79154b3612ec5c79c2fd81adf3ee40b53f83c69 (patch) | |
| tree | ce0e761c765eb92e8796d17f8488e36556e55145 | |
Initial commitv1.0.0
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | Readme.md | 37 | ||||
| -rw-r--r-- | composer.json | 34 | ||||
| -rw-r--r-- | composer.lock | 2489 | ||||
| -rw-r--r-- | phpunit.xml | 13 | ||||
| -rw-r--r-- | src/OAuthMiddleware.php | 66 | ||||
| -rw-r--r-- | tests/Test.php | 42 | 
7 files changed, 2683 insertions, 0 deletions
| diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f721ec2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/vendor +/.phpunit.result.cache diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..f3fc3b7 --- /dev/null +++ b/Readme.md @@ -0,0 +1,37 @@ +# guzzle-cardmarket-api-middleware + +to use with the [Cardmarket API](https://api.cardmarket.com/ws/documentation) + +## Installation +``` +composer require drogueronin/guzzle-cardmarket-api-middleware +``` + +## How to use + +```php +use GuzzleHttp\Client; +use GuzzleHttp\HandlerStack; +use CardmarketApi\OAuthMiddleware; + +// Create default HandlerStack +$stack = HandlerStack::create(); + +// Add this middleware to the top with `push` +$stack->push(new OAuthMiddleware(), 'oauth'); + +// Initialize the client with the handler option and cardmarket oauth data +$client = new Client([ +    'handler' => $stack, +    'base_uri' => 'https://api.cardmarket.com/ws/v2.0/output.json/', +    'cardmarket' => [ +        'app_token' => 'your_app_token', +        'app_secret' => 'your_app_secret', +        'access_token' => 'your_access_token', +        'access_token_secret' => 'your_access_token_secret', +    ], +]); + +// Request a resource +$response = $client->get('account'); +``` diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..b8e7f69 --- /dev/null +++ b/composer.json @@ -0,0 +1,34 @@ +{ +    "name": "drogueronin/guzzle-cardmarket-api-middleware", +    "version": "1.0.0", +    "type": "library", +    "authors": [ +        { +            "name": "Daniel Weipert", +            "email": "code@drogueronin.de" +        } +    ], +    "scripts": { +        "test": "vendor/bin/phpunit tests" +    }, +    "require": { +        "php": ">=7.4", +        "guzzlehttp/guzzle": "^7.2" +    }, +    "require-dev": { +        "phpunit/phpunit": "^9.5" +    }, +    "config": { +        "sort-packages": true +    }, +    "autoload": { +        "psr-4": { +            "CardmarketApi\\": "src/" +        } +    }, +    "autoload-dev": { +        "psr-4": { +            "CardmarketApi\\Tests\\": "tests/" +        } +    } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..4a57a73 --- /dev/null +++ b/composer.lock @@ -0,0 +1,2489 @@ +{ +    "_readme": [ +        "This file locks the dependencies of your project to a known state", +        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", +        "This file is @generated automatically" +    ], +    "content-hash": "af9df7c79dbb61bd18bf260e62edd2ae", +    "packages": [ +        { +            "name": "guzzlehttp/guzzle", +            "version": "7.2.0", +            "source": { +                "type": "git", +                "url": "https://github.com/guzzle/guzzle.git", +                "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79", +                "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79", +                "shasum": "" +            }, +            "require": { +                "ext-json": "*", +                "guzzlehttp/promises": "^1.4", +                "guzzlehttp/psr7": "^1.7", +                "php": "^7.2.5 || ^8.0", +                "psr/http-client": "^1.0" +            }, +            "provide": { +                "psr/http-client-implementation": "1.0" +            }, +            "require-dev": { +                "ext-curl": "*", +                "php-http/client-integration-tests": "^3.0", +                "phpunit/phpunit": "^8.5.5 || ^9.3.5", +                "psr/log": "^1.1" +            }, +            "suggest": { +                "ext-curl": "Required for CURL handler support", +                "ext-intl": "Required for Internationalized Domain Name (IDN) support", +                "psr/log": "Required for using the Log middleware" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "7.1-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "GuzzleHttp\\": "src/" +                }, +                "files": [ +                    "src/functions_include.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Michael Dowling", +                    "email": "mtdowling@gmail.com", +                    "homepage": "https://github.com/mtdowling" +                }, +                { +                    "name": "Márk Sági-Kazár", +                    "email": "mark.sagikazar@gmail.com", +                    "homepage": "https://sagikazarmark.hu" +                } +            ], +            "description": "Guzzle is a PHP HTTP client library", +            "homepage": "http://guzzlephp.org/", +            "keywords": [ +                "client", +                "curl", +                "framework", +                "http", +                "http client", +                "psr-18", +                "psr-7", +                "rest", +                "web service" +            ], +            "support": { +                "issues": "https://github.com/guzzle/guzzle/issues", +                "source": "https://github.com/guzzle/guzzle/tree/7.2.0" +            }, +            "funding": [ +                { +                    "url": "https://github.com/GrahamCampbell", +                    "type": "github" +                }, +                { +                    "url": "https://github.com/Nyholm", +                    "type": "github" +                }, +                { +                    "url": "https://github.com/alexeyshockov", +                    "type": "github" +                }, +                { +                    "url": "https://github.com/gmponos", +                    "type": "github" +                } +            ], +            "time": "2020-10-10T11:47:56+00:00" +        }, +        { +            "name": "guzzlehttp/promises", +            "version": "1.4.0", +            "source": { +                "type": "git", +                "url": "https://github.com/guzzle/promises.git", +                "reference": "60d379c243457e073cff02bc323a2a86cb355631" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", +                "reference": "60d379c243457e073cff02bc323a2a86cb355631", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.5" +            }, +            "require-dev": { +                "symfony/phpunit-bridge": "^4.4 || ^5.1" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.4-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "GuzzleHttp\\Promise\\": "src/" +                }, +                "files": [ +                    "src/functions_include.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Michael Dowling", +                    "email": "mtdowling@gmail.com", +                    "homepage": "https://github.com/mtdowling" +                } +            ], +            "description": "Guzzle promises library", +            "keywords": [ +                "promise" +            ], +            "support": { +                "issues": "https://github.com/guzzle/promises/issues", +                "source": "https://github.com/guzzle/promises/tree/1.4.0" +            }, +            "time": "2020-09-30T07:37:28+00:00" +        }, +        { +            "name": "guzzlehttp/psr7", +            "version": "1.7.0", +            "source": { +                "type": "git", +                "url": "https://github.com/guzzle/psr7.git", +                "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", +                "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.4.0", +                "psr/http-message": "~1.0", +                "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" +            }, +            "provide": { +                "psr/http-message-implementation": "1.0" +            }, +            "require-dev": { +                "ext-zlib": "*", +                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" +            }, +            "suggest": { +                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.7-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "GuzzleHttp\\Psr7\\": "src/" +                }, +                "files": [ +                    "src/functions_include.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Michael Dowling", +                    "email": "mtdowling@gmail.com", +                    "homepage": "https://github.com/mtdowling" +                }, +                { +                    "name": "Tobias Schultze", +                    "homepage": "https://github.com/Tobion" +                } +            ], +            "description": "PSR-7 message implementation that also provides common utility methods", +            "keywords": [ +                "http", +                "message", +                "psr-7", +                "request", +                "response", +                "stream", +                "uri", +                "url" +            ], +            "support": { +                "issues": "https://github.com/guzzle/psr7/issues", +                "source": "https://github.com/guzzle/psr7/tree/1.7.0" +            }, +            "time": "2020-09-30T07:37:11+00:00" +        }, +        { +            "name": "psr/http-client", +            "version": "1.0.1", +            "source": { +                "type": "git", +                "url": "https://github.com/php-fig/http-client.git", +                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", +                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", +                "shasum": "" +            }, +            "require": { +                "php": "^7.0 || ^8.0", +                "psr/http-message": "^1.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "Psr\\Http\\Client\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "PHP-FIG", +                    "homepage": "http://www.php-fig.org/" +                } +            ], +            "description": "Common interface for HTTP clients", +            "homepage": "https://github.com/php-fig/http-client", +            "keywords": [ +                "http", +                "http-client", +                "psr", +                "psr-18" +            ], +            "support": { +                "source": "https://github.com/php-fig/http-client/tree/master" +            }, +            "time": "2020-06-29T06:28:15+00:00" +        }, +        { +            "name": "psr/http-message", +            "version": "1.0.1", +            "source": { +                "type": "git", +                "url": "https://github.com/php-fig/http-message.git", +                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", +                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.3.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "Psr\\Http\\Message\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "PHP-FIG", +                    "homepage": "http://www.php-fig.org/" +                } +            ], +            "description": "Common interface for HTTP messages", +            "homepage": "https://github.com/php-fig/http-message", +            "keywords": [ +                "http", +                "http-message", +                "psr", +                "psr-7", +                "request", +                "response" +            ], +            "support": { +                "source": "https://github.com/php-fig/http-message/tree/master" +            }, +            "time": "2016-08-06T14:39:51+00:00" +        }, +        { +            "name": "ralouphie/getallheaders", +            "version": "3.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/ralouphie/getallheaders.git", +                "reference": "120b605dfeb996808c31b6477290a714d356e822" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", +                "reference": "120b605dfeb996808c31b6477290a714d356e822", +                "shasum": "" +            }, +            "require": { +                "php": ">=5.6" +            }, +            "require-dev": { +                "php-coveralls/php-coveralls": "^2.1", +                "phpunit/phpunit": "^5 || ^6.5" +            }, +            "type": "library", +            "autoload": { +                "files": [ +                    "src/getallheaders.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Ralph Khattar", +                    "email": "ralph.khattar@gmail.com" +                } +            ], +            "description": "A polyfill for getallheaders.", +            "support": { +                "issues": "https://github.com/ralouphie/getallheaders/issues", +                "source": "https://github.com/ralouphie/getallheaders/tree/develop" +            }, +            "time": "2019-03-08T08:55:37+00:00" +        } +    ], +    "packages-dev": [ +        { +            "name": "doctrine/instantiator", +            "version": "1.4.0", +            "source": { +                "type": "git", +                "url": "https://github.com/doctrine/instantiator.git", +                "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", +                "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", +                "shasum": "" +            }, +            "require": { +                "php": "^7.1 || ^8.0" +            }, +            "require-dev": { +                "doctrine/coding-standard": "^8.0", +                "ext-pdo": "*", +                "ext-phar": "*", +                "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", +                "phpstan/phpstan": "^0.12", +                "phpstan/phpstan-phpunit": "^0.12", +                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" +            }, +            "type": "library", +            "autoload": { +                "psr-4": { +                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Marco Pivetta", +                    "email": "ocramius@gmail.com", +                    "homepage": "https://ocramius.github.io/" +                } +            ], +            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", +            "homepage": "https://www.doctrine-project.org/projects/instantiator.html", +            "keywords": [ +                "constructor", +                "instantiate" +            ], +            "support": { +                "issues": "https://github.com/doctrine/instantiator/issues", +                "source": "https://github.com/doctrine/instantiator/tree/1.4.0" +            }, +            "funding": [ +                { +                    "url": "https://www.doctrine-project.org/sponsorship.html", +                    "type": "custom" +                }, +                { +                    "url": "https://www.patreon.com/phpdoctrine", +                    "type": "patreon" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", +                    "type": "tidelift" +                } +            ], +            "time": "2020-11-10T18:47:58+00:00" +        }, +        { +            "name": "myclabs/deep-copy", +            "version": "1.10.2", +            "source": { +                "type": "git", +                "url": "https://github.com/myclabs/DeepCopy.git", +                "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", +                "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", +                "shasum": "" +            }, +            "require": { +                "php": "^7.1 || ^8.0" +            }, +            "replace": { +                "myclabs/deep-copy": "self.version" +            }, +            "require-dev": { +                "doctrine/collections": "^1.0", +                "doctrine/common": "^2.6", +                "phpunit/phpunit": "^7.1" +            }, +            "type": "library", +            "autoload": { +                "psr-4": { +                    "DeepCopy\\": "src/DeepCopy/" +                }, +                "files": [ +                    "src/DeepCopy/deep_copy.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "description": "Create deep copies (clones) of your objects", +            "keywords": [ +                "clone", +                "copy", +                "duplicate", +                "object", +                "object graph" +            ], +            "support": { +                "issues": "https://github.com/myclabs/DeepCopy/issues", +                "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" +            }, +            "funding": [ +                { +                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", +                    "type": "tidelift" +                } +            ], +            "time": "2020-11-13T09:40:50+00:00" +        }, +        { +            "name": "nikic/php-parser", +            "version": "v4.10.3", +            "source": { +                "type": "git", +                "url": "https://github.com/nikic/PHP-Parser.git", +                "reference": "dbe56d23de8fcb157bbc0cfb3ad7c7de0cfb0984" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dbe56d23de8fcb157bbc0cfb3ad7c7de0cfb0984", +                "reference": "dbe56d23de8fcb157bbc0cfb3ad7c7de0cfb0984", +                "shasum": "" +            }, +            "require": { +                "ext-tokenizer": "*", +                "php": ">=7.0" +            }, +            "require-dev": { +                "ircmaxell/php-yacc": "^0.0.7", +                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" +            }, +            "bin": [ +                "bin/php-parse" +            ], +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "4.9-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "PhpParser\\": "lib/PhpParser" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Nikita Popov" +                } +            ], +            "description": "A PHP parser written in PHP", +            "keywords": [ +                "parser", +                "php" +            ], +            "support": { +                "issues": "https://github.com/nikic/PHP-Parser/issues", +                "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.3" +            }, +            "time": "2020-12-03T17:45:45+00:00" +        }, +        { +            "name": "phar-io/manifest", +            "version": "2.0.1", +            "source": { +                "type": "git", +                "url": "https://github.com/phar-io/manifest.git", +                "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", +                "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-phar": "*", +                "ext-xmlwriter": "*", +                "phar-io/version": "^3.0.1", +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0.x-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Arne Blankerts", +                    "email": "arne@blankerts.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Heuer", +                    "email": "sebastian@phpeople.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "Developer" +                } +            ], +            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", +            "support": { +                "issues": "https://github.com/phar-io/manifest/issues", +                "source": "https://github.com/phar-io/manifest/tree/master" +            }, +            "time": "2020-06-27T14:33:11+00:00" +        }, +        { +            "name": "phar-io/version", +            "version": "3.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/phar-io/version.git", +                "reference": "726c026815142e4f8677b7cb7f2249c9ffb7ecae" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phar-io/version/zipball/726c026815142e4f8677b7cb7f2249c9ffb7ecae", +                "reference": "726c026815142e4f8677b7cb7f2249c9ffb7ecae", +                "shasum": "" +            }, +            "require": { +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Arne Blankerts", +                    "email": "arne@blankerts.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Heuer", +                    "email": "sebastian@phpeople.de", +                    "role": "Developer" +                }, +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "Developer" +                } +            ], +            "description": "Library for handling version information and constraints", +            "support": { +                "issues": "https://github.com/phar-io/version/issues", +                "source": "https://github.com/phar-io/version/tree/3.0.3" +            }, +            "time": "2020-11-30T09:21:21+00:00" +        }, +        { +            "name": "phpdocumentor/reflection-common", +            "version": "2.2.0", +            "source": { +                "type": "git", +                "url": "https://github.com/phpDocumentor/ReflectionCommon.git", +                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", +                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", +                "shasum": "" +            }, +            "require": { +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-2.x": "2.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "phpDocumentor\\Reflection\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Jaap van Otterdijk", +                    "email": "opensource@ijaap.nl" +                } +            ], +            "description": "Common reflection classes used by phpdocumentor to reflect the code structure", +            "homepage": "http://www.phpdoc.org", +            "keywords": [ +                "FQSEN", +                "phpDocumentor", +                "phpdoc", +                "reflection", +                "static analysis" +            ], +            "support": { +                "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", +                "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" +            }, +            "time": "2020-06-27T09:03:43+00:00" +        }, +        { +            "name": "phpdocumentor/reflection-docblock", +            "version": "5.2.2", +            "source": { +                "type": "git", +                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", +                "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", +                "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", +                "shasum": "" +            }, +            "require": { +                "ext-filter": "*", +                "php": "^7.2 || ^8.0", +                "phpdocumentor/reflection-common": "^2.2", +                "phpdocumentor/type-resolver": "^1.3", +                "webmozart/assert": "^1.9.1" +            }, +            "require-dev": { +                "mockery/mockery": "~1.3.2" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "5.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "phpDocumentor\\Reflection\\": "src" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Mike van Riel", +                    "email": "me@mikevanriel.com" +                }, +                { +                    "name": "Jaap van Otterdijk", +                    "email": "account@ijaap.nl" +                } +            ], +            "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", +            "support": { +                "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", +                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" +            }, +            "time": "2020-09-03T19:13:55+00:00" +        }, +        { +            "name": "phpdocumentor/type-resolver", +            "version": "1.4.0", +            "source": { +                "type": "git", +                "url": "https://github.com/phpDocumentor/TypeResolver.git", +                "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", +                "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", +                "shasum": "" +            }, +            "require": { +                "php": "^7.2 || ^8.0", +                "phpdocumentor/reflection-common": "^2.0" +            }, +            "require-dev": { +                "ext-tokenizer": "*" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-1.x": "1.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "phpDocumentor\\Reflection\\": "src" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Mike van Riel", +                    "email": "me@mikevanriel.com" +                } +            ], +            "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", +            "support": { +                "issues": "https://github.com/phpDocumentor/TypeResolver/issues", +                "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" +            }, +            "time": "2020-09-17T18:55:26+00:00" +        }, +        { +            "name": "phpspec/prophecy", +            "version": "1.12.1", +            "source": { +                "type": "git", +                "url": "https://github.com/phpspec/prophecy.git", +                "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", +                "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", +                "shasum": "" +            }, +            "require": { +                "doctrine/instantiator": "^1.2", +                "php": "^7.2 || ~8.0, <8.1", +                "phpdocumentor/reflection-docblock": "^5.2", +                "sebastian/comparator": "^3.0 || ^4.0", +                "sebastian/recursion-context": "^3.0 || ^4.0" +            }, +            "require-dev": { +                "phpspec/phpspec": "^6.0", +                "phpunit/phpunit": "^8.0 || ^9.0 <9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.11.x-dev" +                } +            }, +            "autoload": { +                "psr-4": { +                    "Prophecy\\": "src/Prophecy" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Konstantin Kudryashov", +                    "email": "ever.zet@gmail.com", +                    "homepage": "http://everzet.com" +                }, +                { +                    "name": "Marcello Duarte", +                    "email": "marcello.duarte@gmail.com" +                } +            ], +            "description": "Highly opinionated mocking framework for PHP 5.3+", +            "homepage": "https://github.com/phpspec/prophecy", +            "keywords": [ +                "Double", +                "Dummy", +                "fake", +                "mock", +                "spy", +                "stub" +            ], +            "support": { +                "issues": "https://github.com/phpspec/prophecy/issues", +                "source": "https://github.com/phpspec/prophecy/tree/1.12.1" +            }, +            "time": "2020-09-29T09:10:42+00:00" +        }, +        { +            "name": "phpunit/php-code-coverage", +            "version": "9.2.5", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-code-coverage.git", +                "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1", +                "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-libxml": "*", +                "ext-xmlwriter": "*", +                "nikic/php-parser": "^4.10.2", +                "php": ">=7.3", +                "phpunit/php-file-iterator": "^3.0.3", +                "phpunit/php-text-template": "^2.0.2", +                "sebastian/code-unit-reverse-lookup": "^2.0.2", +                "sebastian/complexity": "^2.0", +                "sebastian/environment": "^5.1.2", +                "sebastian/lines-of-code": "^1.0.3", +                "sebastian/version": "^3.0.1", +                "theseer/tokenizer": "^1.2.0" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "suggest": { +                "ext-pcov": "*", +                "ext-xdebug": "*" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "9.2-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", +            "homepage": "https://github.com/sebastianbergmann/php-code-coverage", +            "keywords": [ +                "coverage", +                "testing", +                "xunit" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", +                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-11-28T06:44:49+00:00" +        }, +        { +            "name": "phpunit/php-file-iterator", +            "version": "3.0.5", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-file-iterator.git", +                "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", +                "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "3.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "FilterIterator implementation that filters files based on a list of suffixes.", +            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", +            "keywords": [ +                "filesystem", +                "iterator" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", +                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T05:57:25+00:00" +        }, +        { +            "name": "phpunit/php-invoker", +            "version": "3.1.1", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-invoker.git", +                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", +                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "ext-pcntl": "*", +                "phpunit/phpunit": "^9.3" +            }, +            "suggest": { +                "ext-pcntl": "*" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "3.1-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Invoke callables with a timeout", +            "homepage": "https://github.com/sebastianbergmann/php-invoker/", +            "keywords": [ +                "process" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-invoker/issues", +                "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T05:58:55+00:00" +        }, +        { +            "name": "phpunit/php-text-template", +            "version": "2.0.4", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-text-template.git", +                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", +                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Simple template engine.", +            "homepage": "https://github.com/sebastianbergmann/php-text-template/", +            "keywords": [ +                "template" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-text-template/issues", +                "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T05:33:50+00:00" +        }, +        { +            "name": "phpunit/php-timer", +            "version": "5.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/php-timer.git", +                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", +                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "5.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Utility class for timing", +            "homepage": "https://github.com/sebastianbergmann/php-timer/", +            "keywords": [ +                "timer" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/php-timer/issues", +                "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T13:16:10+00:00" +        }, +        { +            "name": "phpunit/phpunit", +            "version": "9.5.0", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/phpunit.git", +                "reference": "8e16c225d57c3d6808014df6b1dd7598d0a5bbbe" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8e16c225d57c3d6808014df6b1dd7598d0a5bbbe", +                "reference": "8e16c225d57c3d6808014df6b1dd7598d0a5bbbe", +                "shasum": "" +            }, +            "require": { +                "doctrine/instantiator": "^1.3.1", +                "ext-dom": "*", +                "ext-json": "*", +                "ext-libxml": "*", +                "ext-mbstring": "*", +                "ext-xml": "*", +                "ext-xmlwriter": "*", +                "myclabs/deep-copy": "^1.10.1", +                "phar-io/manifest": "^2.0.1", +                "phar-io/version": "^3.0.2", +                "php": ">=7.3", +                "phpspec/prophecy": "^1.12.1", +                "phpunit/php-code-coverage": "^9.2.3", +                "phpunit/php-file-iterator": "^3.0.5", +                "phpunit/php-invoker": "^3.1.1", +                "phpunit/php-text-template": "^2.0.3", +                "phpunit/php-timer": "^5.0.2", +                "sebastian/cli-parser": "^1.0.1", +                "sebastian/code-unit": "^1.0.6", +                "sebastian/comparator": "^4.0.5", +                "sebastian/diff": "^4.0.3", +                "sebastian/environment": "^5.1.3", +                "sebastian/exporter": "^4.0.3", +                "sebastian/global-state": "^5.0.1", +                "sebastian/object-enumerator": "^4.0.3", +                "sebastian/resource-operations": "^3.0.3", +                "sebastian/type": "^2.3", +                "sebastian/version": "^3.0.2" +            }, +            "require-dev": { +                "ext-pdo": "*", +                "phpspec/prophecy-phpunit": "^2.0.1" +            }, +            "suggest": { +                "ext-soap": "*", +                "ext-xdebug": "*" +            }, +            "bin": [ +                "phpunit" +            ], +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "9.5-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ], +                "files": [ +                    "src/Framework/Assert/Functions.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "The PHP Unit Testing framework.", +            "homepage": "https://phpunit.de/", +            "keywords": [ +                "phpunit", +                "testing", +                "xunit" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/phpunit/issues", +                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.0" +            }, +            "funding": [ +                { +                    "url": "https://phpunit.de/donate.html", +                    "type": "custom" +                }, +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-12-04T05:05:53+00:00" +        }, +        { +            "name": "sebastian/cli-parser", +            "version": "1.0.1", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/cli-parser.git", +                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", +                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library for parsing CLI options", +            "homepage": "https://github.com/sebastianbergmann/cli-parser", +            "support": { +                "issues": "https://github.com/sebastianbergmann/cli-parser/issues", +                "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T06:08:49+00:00" +        }, +        { +            "name": "sebastian/code-unit", +            "version": "1.0.8", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/code-unit.git", +                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", +                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Collection of value objects that represent the PHP code units", +            "homepage": "https://github.com/sebastianbergmann/code-unit", +            "support": { +                "issues": "https://github.com/sebastianbergmann/code-unit/issues", +                "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T13:08:54+00:00" +        }, +        { +            "name": "sebastian/code-unit-reverse-lookup", +            "version": "2.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", +                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", +                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Looks up which function or method a line of code belongs to", +            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", +            "support": { +                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", +                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T05:30:19+00:00" +        }, +        { +            "name": "sebastian/comparator", +            "version": "4.0.6", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/comparator.git", +                "reference": "55f4261989e546dc112258c7a75935a81a7ce382" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", +                "reference": "55f4261989e546dc112258c7a75935a81a7ce382", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3", +                "sebastian/diff": "^4.0", +                "sebastian/exporter": "^4.0" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "4.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Jeff Welch", +                    "email": "whatthejeff@gmail.com" +                }, +                { +                    "name": "Volker Dusch", +                    "email": "github@wallbash.com" +                }, +                { +                    "name": "Bernhard Schussek", +                    "email": "bschussek@2bepublished.at" +                } +            ], +            "description": "Provides the functionality to compare PHP values for equality", +            "homepage": "https://github.com/sebastianbergmann/comparator", +            "keywords": [ +                "comparator", +                "compare", +                "equality" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/comparator/issues", +                "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T15:49:45+00:00" +        }, +        { +            "name": "sebastian/complexity", +            "version": "2.0.2", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/complexity.git", +                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", +                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", +                "shasum": "" +            }, +            "require": { +                "nikic/php-parser": "^4.7", +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library for calculating the complexity of PHP code units", +            "homepage": "https://github.com/sebastianbergmann/complexity", +            "support": { +                "issues": "https://github.com/sebastianbergmann/complexity/issues", +                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T15:52:27+00:00" +        }, +        { +            "name": "sebastian/diff", +            "version": "4.0.4", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/diff.git", +                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", +                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3", +                "symfony/process": "^4.2 || ^5" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "4.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Kore Nordmann", +                    "email": "mail@kore-nordmann.de" +                } +            ], +            "description": "Diff implementation", +            "homepage": "https://github.com/sebastianbergmann/diff", +            "keywords": [ +                "diff", +                "udiff", +                "unidiff", +                "unified diff" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/diff/issues", +                "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T13:10:38+00:00" +        }, +        { +            "name": "sebastian/environment", +            "version": "5.1.3", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/environment.git", +                "reference": "388b6ced16caa751030f6a69e588299fa09200ac" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", +                "reference": "388b6ced16caa751030f6a69e588299fa09200ac", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "suggest": { +                "ext-posix": "*" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "5.1-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Provides functionality to handle HHVM/PHP environments", +            "homepage": "http://www.github.com/sebastianbergmann/environment", +            "keywords": [ +                "Xdebug", +                "environment", +                "hhvm" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/environment/issues", +                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T05:52:38+00:00" +        }, +        { +            "name": "sebastian/exporter", +            "version": "4.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/exporter.git", +                "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", +                "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3", +                "sebastian/recursion-context": "^4.0" +            }, +            "require-dev": { +                "ext-mbstring": "*", +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "4.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Jeff Welch", +                    "email": "whatthejeff@gmail.com" +                }, +                { +                    "name": "Volker Dusch", +                    "email": "github@wallbash.com" +                }, +                { +                    "name": "Adam Harvey", +                    "email": "aharvey@php.net" +                }, +                { +                    "name": "Bernhard Schussek", +                    "email": "bschussek@gmail.com" +                } +            ], +            "description": "Provides the functionality to export PHP variables for visualization", +            "homepage": "http://www.github.com/sebastianbergmann/exporter", +            "keywords": [ +                "export", +                "exporter" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/exporter/issues", +                "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T05:24:23+00:00" +        }, +        { +            "name": "sebastian/global-state", +            "version": "5.0.2", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/global-state.git", +                "reference": "a90ccbddffa067b51f574dea6eb25d5680839455" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455", +                "reference": "a90ccbddffa067b51f574dea6eb25d5680839455", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3", +                "sebastian/object-reflector": "^2.0", +                "sebastian/recursion-context": "^4.0" +            }, +            "require-dev": { +                "ext-dom": "*", +                "phpunit/phpunit": "^9.3" +            }, +            "suggest": { +                "ext-uopz": "*" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "5.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Snapshotting of global state", +            "homepage": "http://www.github.com/sebastianbergmann/global-state", +            "keywords": [ +                "global state" +            ], +            "support": { +                "issues": "https://github.com/sebastianbergmann/global-state/issues", +                "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T15:55:19+00:00" +        }, +        { +            "name": "sebastian/lines-of-code", +            "version": "1.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/lines-of-code.git", +                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", +                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", +                "shasum": "" +            }, +            "require": { +                "nikic/php-parser": "^4.6", +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "1.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library for counting the lines of code in PHP source code", +            "homepage": "https://github.com/sebastianbergmann/lines-of-code", +            "support": { +                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", +                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-11-28T06:42:11+00:00" +        }, +        { +            "name": "sebastian/object-enumerator", +            "version": "4.0.4", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/object-enumerator.git", +                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", +                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3", +                "sebastian/object-reflector": "^2.0", +                "sebastian/recursion-context": "^4.0" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "4.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Traverses array structures and object graphs to enumerate all referenced objects", +            "homepage": "https://github.com/sebastianbergmann/object-enumerator/", +            "support": { +                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", +                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T13:12:34+00:00" +        }, +        { +            "name": "sebastian/object-reflector", +            "version": "2.0.4", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/object-reflector.git", +                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", +                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Allows reflection of object attributes, including inherited and non-public ones", +            "homepage": "https://github.com/sebastianbergmann/object-reflector/", +            "support": { +                "issues": "https://github.com/sebastianbergmann/object-reflector/issues", +                "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T13:14:26+00:00" +        }, +        { +            "name": "sebastian/recursion-context", +            "version": "4.0.4", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/recursion-context.git", +                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", +                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "4.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                }, +                { +                    "name": "Jeff Welch", +                    "email": "whatthejeff@gmail.com" +                }, +                { +                    "name": "Adam Harvey", +                    "email": "aharvey@php.net" +                } +            ], +            "description": "Provides functionality to recursively process PHP variables", +            "homepage": "http://www.github.com/sebastianbergmann/recursion-context", +            "support": { +                "issues": "https://github.com/sebastianbergmann/recursion-context/issues", +                "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T13:17:30+00:00" +        }, +        { +            "name": "sebastian/resource-operations", +            "version": "3.0.3", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/resource-operations.git", +                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", +                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.0" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "3.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de" +                } +            ], +            "description": "Provides a list of PHP built-in functions that operate on resources", +            "homepage": "https://www.github.com/sebastianbergmann/resource-operations", +            "support": { +                "issues": "https://github.com/sebastianbergmann/resource-operations/issues", +                "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T06:45:17+00:00" +        }, +        { +            "name": "sebastian/type", +            "version": "2.3.1", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/type.git", +                "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", +                "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "require-dev": { +                "phpunit/phpunit": "^9.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "2.3-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Collection of value objects that represent the types of the PHP type system", +            "homepage": "https://github.com/sebastianbergmann/type", +            "support": { +                "issues": "https://github.com/sebastianbergmann/type/issues", +                "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-10-26T13:18:59+00:00" +        }, +        { +            "name": "sebastian/version", +            "version": "3.0.2", +            "source": { +                "type": "git", +                "url": "https://github.com/sebastianbergmann/version.git", +                "reference": "c6c1022351a901512170118436c764e473f6de8c" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", +                "reference": "c6c1022351a901512170118436c764e473f6de8c", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.3" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-master": "3.0-dev" +                } +            }, +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Sebastian Bergmann", +                    "email": "sebastian@phpunit.de", +                    "role": "lead" +                } +            ], +            "description": "Library that helps with managing the version number of Git-hosted PHP projects", +            "homepage": "https://github.com/sebastianbergmann/version", +            "support": { +                "issues": "https://github.com/sebastianbergmann/version/issues", +                "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" +            }, +            "funding": [ +                { +                    "url": "https://github.com/sebastianbergmann", +                    "type": "github" +                } +            ], +            "time": "2020-09-28T06:39:44+00:00" +        }, +        { +            "name": "symfony/polyfill-ctype", +            "version": "v1.20.0", +            "source": { +                "type": "git", +                "url": "https://github.com/symfony/polyfill-ctype.git", +                "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", +                "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", +                "shasum": "" +            }, +            "require": { +                "php": ">=7.1" +            }, +            "suggest": { +                "ext-ctype": "For best performance" +            }, +            "type": "library", +            "extra": { +                "branch-alias": { +                    "dev-main": "1.20-dev" +                }, +                "thanks": { +                    "name": "symfony/polyfill", +                    "url": "https://github.com/symfony/polyfill" +                } +            }, +            "autoload": { +                "psr-4": { +                    "Symfony\\Polyfill\\Ctype\\": "" +                }, +                "files": [ +                    "bootstrap.php" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Gert de Pagter", +                    "email": "BackEndTea@gmail.com" +                }, +                { +                    "name": "Symfony Community", +                    "homepage": "https://symfony.com/contributors" +                } +            ], +            "description": "Symfony polyfill for ctype functions", +            "homepage": "https://symfony.com", +            "keywords": [ +                "compatibility", +                "ctype", +                "polyfill", +                "portable" +            ], +            "support": { +                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0" +            }, +            "funding": [ +                { +                    "url": "https://symfony.com/sponsor", +                    "type": "custom" +                }, +                { +                    "url": "https://github.com/fabpot", +                    "type": "github" +                }, +                { +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", +                    "type": "tidelift" +                } +            ], +            "time": "2020-10-23T14:02:19+00:00" +        }, +        { +            "name": "theseer/tokenizer", +            "version": "1.2.0", +            "source": { +                "type": "git", +                "url": "https://github.com/theseer/tokenizer.git", +                "reference": "75a63c33a8577608444246075ea0af0d052e452a" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", +                "reference": "75a63c33a8577608444246075ea0af0d052e452a", +                "shasum": "" +            }, +            "require": { +                "ext-dom": "*", +                "ext-tokenizer": "*", +                "ext-xmlwriter": "*", +                "php": "^7.2 || ^8.0" +            }, +            "type": "library", +            "autoload": { +                "classmap": [ +                    "src/" +                ] +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "BSD-3-Clause" +            ], +            "authors": [ +                { +                    "name": "Arne Blankerts", +                    "email": "arne@blankerts.de", +                    "role": "Developer" +                } +            ], +            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", +            "support": { +                "issues": "https://github.com/theseer/tokenizer/issues", +                "source": "https://github.com/theseer/tokenizer/tree/master" +            }, +            "funding": [ +                { +                    "url": "https://github.com/theseer", +                    "type": "github" +                } +            ], +            "time": "2020-07-12T23:59:07+00:00" +        }, +        { +            "name": "webmozart/assert", +            "version": "1.9.1", +            "source": { +                "type": "git", +                "url": "https://github.com/webmozart/assert.git", +                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" +            }, +            "dist": { +                "type": "zip", +                "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", +                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", +                "shasum": "" +            }, +            "require": { +                "php": "^5.3.3 || ^7.0 || ^8.0", +                "symfony/polyfill-ctype": "^1.8" +            }, +            "conflict": { +                "phpstan/phpstan": "<0.12.20", +                "vimeo/psalm": "<3.9.1" +            }, +            "require-dev": { +                "phpunit/phpunit": "^4.8.36 || ^7.5.13" +            }, +            "type": "library", +            "autoload": { +                "psr-4": { +                    "Webmozart\\Assert\\": "src/" +                } +            }, +            "notification-url": "https://packagist.org/downloads/", +            "license": [ +                "MIT" +            ], +            "authors": [ +                { +                    "name": "Bernhard Schussek", +                    "email": "bschussek@gmail.com" +                } +            ], +            "description": "Assertions to validate method input/output with nice error messages.", +            "keywords": [ +                "assert", +                "check", +                "validate" +            ], +            "support": { +                "issues": "https://github.com/webmozart/assert/issues", +                "source": "https://github.com/webmozart/assert/tree/master" +            }, +            "time": "2020-07-08T17:02:28+00:00" +        } +    ], +    "aliases": [], +    "minimum-stability": "stable", +    "stability-flags": [], +    "prefer-stable": false, +    "prefer-lowest": false, +    "platform": { +        "php": ">=7.4" +    }, +    "platform-dev": [], +    "plugin-api-version": "2.0.0" +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..dbb27b2 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" +         bootstrap="vendor/autoload.php" +         colors="true" +> +    <php> +        <env name="CARDMARKET_APP_TOKEN" value="QfT4G1q8rWtkLVvF"/> +        <env name="CARDMARKET_APP_SECRET" value="Nc315fmcLlet6QIgdb0ZWkNC5PGbZNR7"/> +        <env name="CARDMARKET_ACCESS_TOKEN" value="l5AJN9S7a7B1fWqcVlLWMB73PIL5lvxb"/> +        <env name="CARDMARKET_ACCESS_TOKEN_SECRET" value="rY1sexQ4wKpHTeqTl3GwSf7dwBQMV3TP"/> +    </php> +</phpunit> diff --git a/src/OAuthMiddleware.php b/src/OAuthMiddleware.php new file mode 100644 index 0000000..aeb28c7 --- /dev/null +++ b/src/OAuthMiddleware.php @@ -0,0 +1,66 @@ +<?php + +namespace CardmarketApi; + +use Psr\Http\Message\RequestInterface; + +class OAuthMiddleware +{ +    public function __invoke(callable $handler): callable +    { +        return function (RequestInterface $request, array $options) use ($handler) { +            $cardMarketConfig = $options['cardmarket']; +            $oAuthParams = [ +                'oauth_consumer_key' => $cardMarketConfig['app_token'], +                'oauth_token' => $cardMarketConfig['access_token'], +                'oauth_nonce' => uniqid(), +                'oauth_timestamp' => time(), +                'oauth_signature_method' => 'HMAC-SHA1', +                'oauth_version' => '1.0', +            ]; + +            $oAuthHeaderParams = $oAuthParams + [ +                'realm' => $request->getUri(), +                'oauth_signature' => $this->getOAuthSignature($request->getMethod(), $request->getUri(), $options, $oAuthParams) +            ]; +            $oAuthHeader = 'OAuth ' . +                implode(',', array_map( +                    fn ($key, $value) => "$key=\"$value\"", +                    array_keys($oAuthHeaderParams), +                    $oAuthHeaderParams +                )); + +            $request = $request->withHeader('Authorization', $oAuthHeader); + +            return $handler($request, $options); +        }; +    } + +    /** +     * Generates the OAuthSignature +     * @see https://api.cardmarket.com/ws/documentation/API:Auth_libcurl +     * +     * @param string $method +     * @param string $uri +     * @param array  $options +     * @param array  $oAuthParams +     * +     * @return string +     */ +    private function getOAuthSignature(string $method, string $uri, array $options, array $oAuthParams): string +    { +        $cardMarketConfig = $options['cardmarket']; + +        ksort($oAuthParams); +        $baseStringParams = [ +            strtoupper($method), +            rawurlencode($uri), +            rawurlencode(http_build_query($oAuthParams)), +        ]; +        $baseString = implode('&', $baseStringParams); +        $signatureKey = rawurlencode($cardMarketConfig['app_secret']) . '&' . rawurlencode($cardMarketConfig['access_token_secret']); +        $rawSignature = hash_hmac('sha1', $baseString, $signatureKey, true); + +        return base64_encode($rawSignature); +    } +} diff --git a/tests/Test.php b/tests/Test.php new file mode 100644 index 0000000..fd99ace --- /dev/null +++ b/tests/Test.php @@ -0,0 +1,42 @@ +<?php + +namespace CardmarketApi\Tests; + +use CardmarketApi\OAuthMiddleware; +use GuzzleHttp\Client; +use GuzzleHttp\HandlerStack; +use PHPUnit\Framework\TestCase; + +class Test extends TestCase +{ +    private Client $client; + +    public function setUp(): void +    { +        // Create default HandlerStack +        $stack = HandlerStack::create(); + +        // Add this middleware to the top with `push` +        $stack->push(new OAuthMiddleware(), 'oauth'); + +        // Initialize the client with the handler option and cardmarket oauth data +        $this->client = new Client([ +            'handler' => $stack, +            'http_errors' => false, +            'base_uri' => 'https://sandbox.cardmarket.com/ws/v2.0/output.json/', +            'cardmarket' => [ +                'app_token' => $_ENV['CARDMARKET_APP_TOKEN'], +                'app_secret' => $_ENV['CARDMARKET_APP_SECRET'], +                'access_token' => $_ENV['CARDMARKET_ACCESS_TOKEN'], +                'access_token_secret' => $_ENV['CARDMARKET_ACCESS_TOKEN_SECRET'], +            ], +        ]); +    } + +    public function testOAuthSuccess() +    { +        $response = $this->client->get('account'); + +        $this->assertEquals(200, $response->getStatusCode()); +    } +} | 
