From 13be361b356d50ac7107846703a058a3a99d700d Mon Sep 17 00:00:00 2001 From: Dmitriy Sviridov Date: Fri, 4 Sep 2020 22:32:48 +0300 Subject: [PATCH] Initial --- .gitignore | 5 + README.md | 42 + codeception.yml | 15 + composer.json | 38 + composer.lock | 4191 +++++++++++++++++ src/ApiClient.php | 101 + src/ApiException.php | 10 + src/Config.php | 61 + src/DateRange.php | 55 + src/Filters/Filter.php | 18 + src/Filters/GamesFilter.php | 284 ++ src/Filters/OrderingFilter.php | 51 + src/Filters/PaginationFilter.php | 36 + src/Resources/CreatorsResource.php | 44 + src/Resources/DevelopersResource.php | 34 + src/Resources/GamesResource.php | 153 + src/Resources/GenresResource.php | 34 + src/Resources/PlatformsResource.php | 45 + src/Resources/PublishersResource.php | 34 + src/Resources/Resource.php | 61 + src/Resources/StoresResource.php | 34 + src/Resources/TagsResource.php | 34 + src/Response.php | 38 + tests/_data/.gitkeep | 0 tests/_data/creator-roles.json | 17 + tests/_data/creators.creator.json | 326 ++ tests/_data/creators.creators.json | 123 + tests/_data/developers.developer.json | 8 + tests/_data/developers.developers.json | 97 + tests/_data/games.additions.json | 658 +++ tests/_data/games.archievements.json | 77 + tests/_data/games.development-team.json | 1533 ++++++ tests/_data/games.game.json | 526 +++ tests/_data/games.games.json | 1298 +++++ tests/_data/games.movies.json | 6 + tests/_data/games.parent-games.json | 6 + tests/_data/games.reddit.json | 6 + tests/_data/games.screenshots.json | 49 + tests/_data/games.series.json | 1139 +++++ tests/_data/games.stores.json | 37 + tests/_data/games.suggested.json | 1052 +++++ tests/_data/games.twitch.json | 117 + tests/_data/games.youtube.json | 409 ++ tests/_data/genres.genre.json | 8 + tests/_data/genres.genres.json | 97 + tests/_data/platforms.lists.parents.json | 101 + tests/_data/platforms.platform.json | 11 + tests/_data/platforms.platforms.json | 103 + tests/_data/publishers.publisher.json | 8 + tests/_data/publishers.publishers.json | 97 + tests/_data/stores.store.json | 9 + tests/_data/stores.stores.json | 105 + tests/_data/tags.tag.json | 8 + tests/_data/tags.tags.json | 99 + tests/_output/.gitignore | 2 + tests/_support/AcceptanceTester.php | 26 + tests/_support/FunctionalTester.php | 26 + tests/_support/Helper/Acceptance.php | 10 + tests/_support/Helper/Functional.php | 10 + tests/_support/Helper/Unit.php | 10 + tests/_support/UnitTester.php | 26 + tests/_support/_generated/.gitignore | 2 + tests/acceptance.suite.yml | 13 + tests/functional.suite.yml | 13 + tests/unit.suite.yml | 11 + tests/unit/ApiClientTest.php | 54 + tests/unit/ApiExceptionTest.php | 19 + tests/unit/ConfigTest.php | 29 + tests/unit/DateRangeTest.php | 31 + tests/unit/Filters/GamesFilterTest.php | 64 + tests/unit/Filters/OrderingFilterTest.php | 27 + tests/unit/Filters/PaginationFilterTest.php | 25 + tests/unit/Resources/CreatorsResourceTest.php | 75 + .../unit/Resources/DevelopersResourceTest.php | 57 + tests/unit/Resources/DummyResource.php | 26 + tests/unit/Resources/GamesResourceTest.php | 276 ++ tests/unit/Resources/GenresResourceTest.php | 58 + .../unit/Resources/PlatformsResourceTest.php | 75 + .../unit/Resources/PublishersResourceTest.php | 57 + tests/unit/Resources/ResourceTest.php | 125 + tests/unit/Resources/StoresResourceTest.php | 57 + tests/unit/Resources/TagsResourceTest.php | 59 + tests/unit/_bootstrap.php | 3 + 83 files changed, 14814 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 codeception.yml create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 src/ApiClient.php create mode 100644 src/ApiException.php create mode 100644 src/Config.php create mode 100644 src/DateRange.php create mode 100644 src/Filters/Filter.php create mode 100644 src/Filters/GamesFilter.php create mode 100644 src/Filters/OrderingFilter.php create mode 100644 src/Filters/PaginationFilter.php create mode 100644 src/Resources/CreatorsResource.php create mode 100644 src/Resources/DevelopersResource.php create mode 100644 src/Resources/GamesResource.php create mode 100644 src/Resources/GenresResource.php create mode 100644 src/Resources/PlatformsResource.php create mode 100644 src/Resources/PublishersResource.php create mode 100644 src/Resources/Resource.php create mode 100644 src/Resources/StoresResource.php create mode 100644 src/Resources/TagsResource.php create mode 100644 src/Response.php create mode 100644 tests/_data/.gitkeep create mode 100644 tests/_data/creator-roles.json create mode 100644 tests/_data/creators.creator.json create mode 100644 tests/_data/creators.creators.json create mode 100644 tests/_data/developers.developer.json create mode 100644 tests/_data/developers.developers.json create mode 100644 tests/_data/games.additions.json create mode 100644 tests/_data/games.archievements.json create mode 100644 tests/_data/games.development-team.json create mode 100644 tests/_data/games.game.json create mode 100644 tests/_data/games.games.json create mode 100644 tests/_data/games.movies.json create mode 100644 tests/_data/games.parent-games.json create mode 100644 tests/_data/games.reddit.json create mode 100644 tests/_data/games.screenshots.json create mode 100644 tests/_data/games.series.json create mode 100644 tests/_data/games.stores.json create mode 100644 tests/_data/games.suggested.json create mode 100644 tests/_data/games.twitch.json create mode 100644 tests/_data/games.youtube.json create mode 100644 tests/_data/genres.genre.json create mode 100644 tests/_data/genres.genres.json create mode 100644 tests/_data/platforms.lists.parents.json create mode 100644 tests/_data/platforms.platform.json create mode 100644 tests/_data/platforms.platforms.json create mode 100644 tests/_data/publishers.publisher.json create mode 100644 tests/_data/publishers.publishers.json create mode 100644 tests/_data/stores.store.json create mode 100644 tests/_data/stores.stores.json create mode 100644 tests/_data/tags.tag.json create mode 100644 tests/_data/tags.tags.json create mode 100644 tests/_output/.gitignore create mode 100644 tests/_support/AcceptanceTester.php create mode 100644 tests/_support/FunctionalTester.php create mode 100644 tests/_support/Helper/Acceptance.php create mode 100644 tests/_support/Helper/Functional.php create mode 100644 tests/_support/Helper/Unit.php create mode 100644 tests/_support/UnitTester.php create mode 100644 tests/_support/_generated/.gitignore create mode 100644 tests/acceptance.suite.yml create mode 100644 tests/functional.suite.yml create mode 100644 tests/unit.suite.yml create mode 100644 tests/unit/ApiClientTest.php create mode 100644 tests/unit/ApiExceptionTest.php create mode 100644 tests/unit/ConfigTest.php create mode 100644 tests/unit/DateRangeTest.php create mode 100644 tests/unit/Filters/GamesFilterTest.php create mode 100644 tests/unit/Filters/OrderingFilterTest.php create mode 100644 tests/unit/Filters/PaginationFilterTest.php create mode 100644 tests/unit/Resources/CreatorsResourceTest.php create mode 100644 tests/unit/Resources/DevelopersResourceTest.php create mode 100644 tests/unit/Resources/DummyResource.php create mode 100644 tests/unit/Resources/GamesResourceTest.php create mode 100644 tests/unit/Resources/GenresResourceTest.php create mode 100644 tests/unit/Resources/PlatformsResourceTest.php create mode 100644 tests/unit/Resources/PublishersResourceTest.php create mode 100644 tests/unit/Resources/ResourceTest.php create mode 100644 tests/unit/Resources/StoresResourceTest.php create mode 100644 tests/unit/Resources/TagsResourceTest.php create mode 100644 tests/unit/_bootstrap.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..279fd5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +vendor +.idea +tmp +tests/_output/* +index.php \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6af000 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# RAWG Video Games Database PHP client + +This is RAWG PHP SDK. This library contains methods for interacting with RAWG API. + +## Installation + +`composer require dimuska139/rawg-sdk-php` + +## Usage + +```php +require 'vendor/autoload.php'; +use Rawg\ApiClient; +use Rawg\Config; +use Rawg\DateRange; +use Rawg\Filters\GamesFilter; +use Rawg\Filters\PaginationFilter; + +$cfg = new Config('YourAppName', 'en'); // 'YourAppName' will be set as User-Agent header +$client = new ApiClient($cfg); + +$additionsFilter = (new PaginationFilter())->setPage(1)->setPageSize(5); +print_r($client->games()->getAdditions(47, $additionsFilter)->getData()); + +$gamesFilter = (new GamesFilter()) + ->setPage(1) + ->setPageSize(20) + ->setDates([ + DateRange::create(new DateTime( '2012-02-01' ), new DateTime( '2015-06-25' )) + ]) + ->setOrdering('-name') + ->setTags([1,2,3]); + +print_r($client->games()->getGames($gamesFilter)->getData()); +``` + +The tests should be considered a part of the documentation. + +## License + +RAWG PHP SDK is released under the +[MIT License](http://www.opensource.org/licenses/MIT). \ No newline at end of file diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 0000000..9eea28f --- /dev/null +++ b/codeception.yml @@ -0,0 +1,15 @@ +paths: + tests: tests + output: tests/_output + data: tests/_data + support: tests/_support + envs: tests/_envs +actor_suffix: Tester +extensions: + enabled: + - Codeception\Extension\RunFailed +coverage: + enabled: true + show_only_summary: true + include: + - src/* diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..d6823b8 --- /dev/null +++ b/composer.json @@ -0,0 +1,38 @@ +{ + "name": "dimuska139/rawg-sdk-php", + "description": "", + "keywords": [ "php", "rawg", "sdk"], + "homepage": "https://github.com/dimuska139/rawg-sdk-php", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Dmitriy Sviridov", + "email": "dimuska139@gmail.com" + } + ], + "require": { + "php": ">=7.0", + "guzzlehttp/guzzle": "^7.0", + "ext-json": "*", + "lukasoppermann/http-status": "^2.0" + }, + "autoload": { + "psr-4": { + "Rawg\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Rawg\\Tests\\": "tests/unit/" + } + }, + "require-dev": { + "codeception/codeception": "^4.1", + "codeception/module-phpbrowser": "^1.0.0", + "codeception/module-asserts": "^1.0.0" + }, + "scripts": { + "test": "vendor/bin/codecept run unit --coverage-text --no-colors" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..7fdce5a --- /dev/null +++ b/composer.lock @@ -0,0 +1,4191 @@ +{ + "_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": "32213f898599912617fc4ec4034987d0", + "packages": [ + { + "name": "fzaninotto/faker", + "version": "v1.9.1", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2019-12-12T13:22:17+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "2d9d3c186a6637a43193e66b097c50e4451eaab2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/2d9d3c186a6637a43193e66b097c50e4451eaab2", + "reference": "2d9d3c186a6637a43193e66b097c50e4451eaab2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": "^7.2.5", + "psr/http-client": "^1.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.0", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-phpunit8", + "phpunit/phpunit": "^8.5.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.0-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" + ], + "time": "2020-06-27T10:33:25+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "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" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "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.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-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" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "lukasoppermann/http-status", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/lukasoppermann/http-status.git", + "reference": "c123b3844d1dafb94ef6efc08ea6a14c27a02cc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lukasoppermann/http-status/zipball/c123b3844d1dafb94ef6efc08ea6a14c27a02cc4", + "reference": "c123b3844d1dafb94ef6efc08ea6a14c27a02cc4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "^1.10", + "league/csv": "^7.1", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "^0.6.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Lukasoppermann\\Httpstatus\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukas Oppermann", + "email": "lukas@vea.re", + "homepage": "http://vea.re", + "role": "Developer" + } + ], + "description": "A minimal package for working with HTTP statuses.", + "homepage": "https://github.com/lukasoppermann/http-status", + "keywords": [ + "httpstatus", + "status codes" + ], + "time": "2016-10-19T09:02:03+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" + ], + "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" + ], + "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.", + "time": "2019-03-08T08:55:37+00:00" + } + ], + "packages-dev": [ + { + "name": "behat/gherkin", + "version": "v4.6.2", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/51ac4500c4dc30cbaaabcd2f25694299df666a31", + "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "~4.5|~5", + "symfony/phpunit-bridge": "~2.7|~3|~4", + "symfony/yaml": "~2.3|~3|~4" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP 5.3", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "time": "2020-03-17T14:03:26+00:00" + }, + { + "name": "codeception/codeception", + "version": "4.1.7", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "220ad18d3c192137d9dc2d0dd8d69a0d82083a26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/220ad18d3c192137d9dc2d0dd8d69a0d82083a26", + "reference": "220ad18d3c192137d9dc2d0dd8d69a0d82083a26", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.4.0", + "codeception/lib-asserts": "^1.0", + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0", + "codeception/stub": "^2.0 | ^3.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "~1.4", + "php": ">=5.6.0 <8.0", + "symfony/console": ">=2.7 <6.0", + "symfony/css-selector": ">=2.7 <6.0", + "symfony/event-dispatcher": ">=2.7 <6.0", + "symfony/finder": ">=2.7 <6.0", + "symfony/yaml": ">=2.7 <6.0" + }, + "require-dev": { + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", + "codeception/specify": "~0.3", + "codeception/util-universalframework": "*@dev", + "monolog/monolog": "~1.8", + "squizlabs/php_codesniffer": "~2.0", + "symfony/process": ">=2.7 <6.0", + "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "hoa/console": "For interactive console functionality", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/phpunit-bridge": "For phpunit-bridge support" + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": [] + }, + "autoload": { + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "http://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2020-08-28T06:37:06+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "1.13.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "263ef0b7eff80643e82f4cf55351eca553a09a10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/263ef0b7eff80643e82f4cf55351eca553a09a10", + "reference": "263ef0b7eff80643e82f4cf55351eca553a09a10", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": ">=5.6.0 <8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "time": "2020-08-28T07:49:36+00:00" + }, + { + "name": "codeception/lib-innerbrowser", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-innerbrowser.git", + "reference": "7bdcee4cf654cfeeedd00405edd4f06f85255659" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/7bdcee4cf654cfeeedd00405edd4f06f85255659", + "reference": "7bdcee4cf654cfeeedd00405edd4f06f85255659", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0 <8.0", + "symfony/browser-kit": ">=2.7 <6.0", + "symfony/dom-crawler": ">=2.7 <6.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-universalframework": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Parent library for all Codeception framework modules and PhpBrowser", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception" + ], + "time": "2020-07-05T14:21:45+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "32e5be519faaeb60ed3692383dcd1b3390ec2667" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/32e5be519faaeb60ed3692383dcd1b3390ec2667", + "reference": "32e5be519faaeb60ed3692383dcd1b3390ec2667", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^1.13.1", + "php": ">=5.6.0 <8.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-robohelpers": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "time": "2020-08-28T08:06:29+00:00" + }, + { + "name": "codeception/module-phpbrowser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-phpbrowser.git", + "reference": "c1962657504a2a476b8dbd1f1ee05e0c912e5645" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/c1962657504a2a476b8dbd1f1ee05e0c912e5645", + "reference": "c1962657504a2a476b8dbd1f1ee05e0c912e5645", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-innerbrowser": "^1.3.2", + "guzzlehttp/guzzle": "^6.3.0|^7.0.0", + "php": ">=5.6.0 <8.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/module-rest": "dev-master | ^1.0", + "codeception/util-robohelpers": "dev-master" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing web application over HTTP", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "functional-testing", + "http" + ], + "time": "2020-07-05T15:29:32+00:00" + }, + { + "name": "codeception/phpunit-wrapper", + "version": "9.0.4", + "source": { + "type": "git", + "url": "https://github.com/Codeception/phpunit-wrapper.git", + "reference": "bb0925f1fe7a30105208352e619a11d6096e7047" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/bb0925f1fe7a30105208352e619a11d6096e7047", + "reference": "bb0925f1fe7a30105208352e619a11d6096e7047", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "phpunit/phpunit": "^9.0" + }, + "require-dev": { + "codeception/specify": "*", + "vlucas/phpdotenv": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\PHPUnit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + }, + { + "name": "Naktibalda" + } + ], + "description": "PHPUnit classes used by Codeception", + "time": "2020-08-26T18:15:09+00:00" + }, + { + "name": "codeception/stub", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304", + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304", + "shasum": "" + }, + "require": { + "phpunit/phpunit": "^8.4 | ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "time": "2020-07-03T15:54:43+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "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": "http://ocramius.github.com/" + } + ], + "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" + ], + "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-05-29T17:27:14+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", + "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" + ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-06-29T13:22:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.9.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "88e519766fc58bd46b8265561fb79b54e2e00b28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/88e519766fc58bd46b8265561fb79b54e2e00b28", + "reference": "88e519766fc58bd46b8265561fb79b54e2e00b28", + "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" + ], + "time": "2020-08-30T16:15:20+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)", + "time": "2020-06-27T14:33:11+00:00" + }, + { + "name": "phar-io/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/c6bb6825def89e0a32220f88337f8ceaf1975fa0", + "reference": "c6bb6825def89e0a32220f88337f8ceaf1975fa0", + "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", + "time": "2020-06-27T14:39:04+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" + ], + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.2.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d870572532cd70bc3fab58f2e23ad423c8404c44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d870572532cd70bc3fab58f2e23ad423c8404c44", + "reference": "d870572532cd70bc3fab58f2e23ad423c8404c44", + "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.", + "time": "2020-08-15T11:14:08+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "e878a14a65245fbe78f8080eba03b47c3b705651" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651", + "reference": "e878a14a65245fbe78f8080eba03b47c3b705651", + "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", + "time": "2020-06-27T10:12:23+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160", + "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2", + "phpdocumentor/reflection-docblock": "^5.0", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0" + }, + "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" + ], + "time": "2020-07-08T12:44:21+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.1.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "2ef92bec3186a827faf7362ff92ae4e8ec2e49d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2ef92bec3186a827faf7362ff92ae4e8ec2e49d2", + "reference": "2ef92bec3186a827faf7362ff92ae4e8ec2e49d2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.8", + "php": "^7.3 || ^8.0", + "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", + "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.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": "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-03T07:09:19+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/25fefc5b19835ca653877fe081644a3f8c1d915e", + "reference": "25fefc5b19835ca653877fe081644a3f8c1d915e", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "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", + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-07-11T05:18:21+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "7a85b66acc48cacffdf87dadd3694e7123674298" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/7a85b66acc48cacffdf87dadd3694e7123674298", + "reference": "7a85b66acc48cacffdf87dadd3694e7123674298", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.0" + }, + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-08-06T07:04:15+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/6ff9c8ea4d3212b88fcf74e25e516e2c51c99324", + "reference": "6ff9c8ea4d3212b88fcf74e25e516e2c51c99324", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T11:55:37+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/cc49734779cbb302bf51a44297dab8c4bbf941e7", + "reference": "cc49734779cbb302bf51a44297dab8c4bbf941e7", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.2" + }, + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T11:58:13+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.3.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "93d78d8e2a06393a0d0c1ead6fe9984f1af1f88c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/93d78d8e2a06393a0d0c1ead6fe9984f1af1f88c", + "reference": "93d78d8e2a06393a0d0c1ead6fe9984f1af1f88c", + "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 || ^8.0", + "phpspec/prophecy": "^1.11.1", + "phpunit/php-code-coverage": "^9.1.5", + "phpunit/php-file-iterator": "^3.0.4", + "phpunit/php-invoker": "^3.1", + "phpunit/php-text-template": "^2.0.2", + "phpunit/php-timer": "^5.0.1", + "sebastian/cli-parser": "^1.0", + "sebastian/code-unit": "^1.0.5", + "sebastian/comparator": "^4.0.3", + "sebastian/diff": "^4.0.2", + "sebastian/environment": "^5.1.2", + "sebastian/exporter": "^4.0.2", + "sebastian/global-state": "^5.0", + "sebastian/object-enumerator": "^4.0.2", + "sebastian/resource-operations": "^3.0.2", + "sebastian/type": "^2.2.1", + "sebastian/version": "^3.0.1" + }, + "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.3-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" + ], + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-08-27T06:30:58+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2a4a38c56e62f7295bedb8b1b7439ad523d4ea82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2a4a38c56e62f7295bedb8b1b7439ad523d4ea82", + "reference": "2a4a38c56e62f7295bedb8b1b7439ad523d4ea82", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "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", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-08-12T10:49:21+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "c1e2df332c905079980b119c4db103117e5e5c90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/c1e2df332c905079980b119c4db103117e5e5c90", + "reference": "c1e2df332c905079980b119c4db103117e5e5c90", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "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", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:50:45+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ee51f9bb0c6d8a43337055db3120829fa14da819", + "reference": "ee51f9bb0c6d8a43337055db3120829fa14da819", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "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/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:04:00+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", + "reference": "dcc580eadfaa4e7f9d2cf9ae1922134ea962e14f", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:05:46+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "33fcd6a26656c6546f70871244ecba4b4dced097" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/33fcd6a26656c6546f70871244ecba4b4dced097", + "reference": "33fcd6a26656c6546f70871244ecba4b4dced097", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.2" + }, + "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", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-07-25T14:01:34+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", + "reference": "1e90b4cf905a7d06c420b1d2e9d11a4dc8a13113", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0", + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-30T04:46:02+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2", + "reference": "0a757cab9d5b7ef49a619f1143e6c9c1bc0fe9d2", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "suggest": { + "ext-posix": "*" + }, + "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": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:07:24+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "571d721db4aec847a0e59690b954af33ebf9f023" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/571d721db4aec847a0e59690b954af33ebf9f023", + "reference": "571d721db4aec847a0e59690b954af33ebf9f023", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.2" + }, + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:08:55+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "22ae663c951bdc39da96603edc3239ed3a299097" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/22ae663c951bdc39da96603edc3239ed3a299097", + "reference": "22ae663c951bdc39da96603edc3239ed3a299097", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0", + "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" + ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-08-07T04:09:03+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e02bf626f404b5daec382a7b8a6a4456e49017e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e02bf626f404b5daec382a7b8a6a4456e49017e5", + "reference": "e02bf626f404b5daec382a7b8a6a4456e49017e5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.2" + }, + "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", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-07-22T18:33:42+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/074fed2d0a6d08e1677dd8ce9d32aecb384917b8", + "reference": "074fed2d0a6d08e1677dd8ce9d32aecb384917b8", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "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/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:11:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "127a46f6b057441b201253526f81d5406d6c7840" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/127a46f6b057441b201253526f81d5406d6c7840", + "reference": "127a46f6b057441b201253526f81d5406d6c7840", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "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/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:12:55+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/062231bf61d2b9448c4fa5a7643b5e1829c11d63", + "reference": "062231bf61d2b9448c4fa5a7643b5e1829c11d63", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "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", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:14:17+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0653718a5a629b065e91f774595267f8dc32e213" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0653718a5a629b065e91f774595267f8dc32e213", + "reference": "0653718a5a629b065e91f774595267f8dc32e213", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "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", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:16:22+00:00" + }, + { + "name": "sebastian/type", + "version": "2.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/86991e2b33446cd96e648c18bcdb1e95afb2c05a", + "reference": "86991e2b33446cd96e648c18bcdb1e95afb2c05a", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-07-05T08:31:53+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "626586115d0ed31cb71483be55beb759b5af5a3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/626586115d0ed31cb71483be55beb759b5af5a3c", + "reference": "626586115d0ed31cb71483be55beb759b5af5a3c", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.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", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-06-26T12:18:43+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "b9545e08790be2d3d7d92306e339bbcd79f461e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b9545e08790be2d3d7d92306e339bbcd79f461e4", + "reference": "b9545e08790be2d3d7d92306e339bbcd79f461e4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/dom-crawler": "^4.4|^5.0" + }, + "require-dev": { + "symfony/css-selector": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony BrowserKit Component", + "homepage": "https://symfony.com", + "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-06-24T13:36:18+00:00" + }, + { + "name": "symfony/console", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "186f395b256065ba9b890c0a4e48a91d598fa2cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/186f395b256065ba9b890c0a4e48a91d598fa2cf", + "reference": "186f395b256065ba9b890c0a4e48a91d598fa2cf", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "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-09-02T07:07:40+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e544e24472d4c97b2d11ade7caacd446727c6bf9", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "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-05-20T17:43:50+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5e20b83385a77593259c9f8beb2c43cd03b2ac14", + "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "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-06-06T08:49:21+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "3ac31ffbc596e41ca081037b7d78fc7a853c0315" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/3ac31ffbc596e41ca081037b7d78fc7a853c0315", + "reference": "3ac31ffbc596e41ca081037b7d78fc7a853c0315", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DomCrawler Component", + "homepage": "https://symfony.com", + "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-08-12T08:45:47+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "94871fc0a69c3c5da57764187724cdce0755899c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/94871fc0a69c3c5da57764187724cdce0755899c", + "reference": "94871fc0a69c3c5da57764187724cdce0755899c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "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-08-13T14:19:42+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f6f613d74cfc5a623fc36294d3451eb7fa5a042b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f6f613d74cfc5a623fc36294d3451eb7fa5a042b", + "reference": "f6f613d74cfc5a623fc36294d3451eb7fa5a042b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "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-07-06T13:23:11+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2b765f0cf6612b3636e738c0689b29aa63088d5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2b765f0cf6612b3636e738c0689b29aa63088d5d", + "reference": "2b765f0cf6612b3636e738c0689b29aa63088d5d", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "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-08-17T10:01:29+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", + "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-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" + ], + "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-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b740103edbdcc39602239ee8860f0f45a8eb9aa5", + "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "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-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "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-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a", + "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "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-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "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-07-14T12:35:20+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.18.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981", + "shasum": "" + }, + "require": { + "php": ">=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "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-07-14T12:35:20+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/58c7475e5457c5492c26cc740cc0ad7464be9442", + "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "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-07-06T13:23:11+00:00" + }, + { + "name": "symfony/string", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "0de4cc1e18bb596226c06a82e2e7e9bc6001a63a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/0de4cc1e18bb596226c06a82e2e7e9bc6001a63a", + "reference": "0de4cc1e18bb596226c06a82e2e7e9bc6001a63a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony String component", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "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-08-17T07:48:54+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "a44bd3a91bfbf8db12367fa6ffac9c3eb1a8804a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a44bd3a91bfbf8db12367fa6ffac9c3eb1a8804a", + "reference": "a44bd3a91bfbf8db12367fa6ffac9c3eb1a8804a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "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-08-26T08:30:57+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", + "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" + ], + "time": "2020-07-08T17:02:28+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.0", + "ext-json": "*" + }, + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/src/ApiClient.php b/src/ApiClient.php new file mode 100644 index 0000000..1ae6a53 --- /dev/null +++ b/src/ApiClient.php @@ -0,0 +1,101 @@ +config = $cfg; + $this->httpClient = $httpClient ?? new HttpClient(); + } + + /** + * @return CreatorsResource + */ + public function creators(): CreatorsResource + { + return new CreatorsResource($this->config, $this->httpClient); + } + + /** + * @return DevelopersResource + */ + public function developers(): DevelopersResource + { + return new DevelopersResource($this->config, $this->httpClient); + } + + /** + * @return GamesResource + */ + public function games(): GamesResource + { + return new GamesResource($this->config, $this->httpClient); + } + + /** + * @return GenresResource + */ + public function genres(): GenresResource + { + return new GenresResource($this->config, $this->httpClient); + } + + /** + * @return PlatformsResource + */ + public function platforms(): PlatformsResource + { + return new PlatformsResource($this->config, $this->httpClient); + } + + /** + * @return PublishersResource + */ + public function publishers(): PublishersResource + { + return new PublishersResource($this->config, $this->httpClient); + } + + /** + * @return StoresResource + */ + public function stores(): StoresResource + { + return new StoresResource($this->config, $this->httpClient); + } + + /** + * @return TagsResource + */ + public function tags(): TagsResource + { + return new TagsResource($this->config, $this->httpClient); + } +} \ No newline at end of file diff --git a/src/ApiException.php b/src/ApiException.php new file mode 100644 index 0000000..3c74687 --- /dev/null +++ b/src/ApiException.php @@ -0,0 +1,10 @@ +appName = $appName; + if ($language) { + $this->language = $language; + } + } + + /** + * @return string + */ + public function getBaseUrl(): string + { + return $this->baseUrl; + } + + /** + * @return string + */ + public function getAppName(): string + { + return $this->appName; + } + + /** + * @return string + */ + public function getLanguage(): string + { + return $this->language; + } +} \ No newline at end of file diff --git a/src/DateRange.php b/src/DateRange.php new file mode 100644 index 0000000..e7ac889 --- /dev/null +++ b/src/DateRange.php @@ -0,0 +1,55 @@ +from = $from; + $this->to = $to; + } + + /** + * @return DateTime + */ + public function getFrom(): DateTime + { + return $this->from; + } + + /** + * @return DateTime + */ + public function getTo(): DateTime + { + return $this->to; + } + + /** + * @param DateTime $from + * @param DateTime $to + * @return DateRange + */ + static function create(DateTime $from, DateTime $to): DateRange + { + return new self($from, $to); + } +} \ No newline at end of file diff --git a/src/Filters/Filter.php b/src/Filters/Filter.php new file mode 100644 index 0000000..096342d --- /dev/null +++ b/src/Filters/Filter.php @@ -0,0 +1,18 @@ +search = $search; + return $this; + } + + /** + * @param array $ids + * @return GamesFilter + */ + public function setParentPlatforms(array $ids): GamesFilter + { + $this->parent_platforms = implode(',', $ids); + return $this; + } + + /** + * @param array $ids + * @return GamesFilter + */ + public function setPlatforms(array $ids): GamesFilter + { + $this->platforms = implode(',', $ids); + return $this; + } + + /** + * @param array $ids + * @return GamesFilter + */ + public function setStores(array $ids): GamesFilter + { + $this->stores = implode(',', $ids); + return $this; + } + + /** + * @param array $developers + * @return GamesFilter + */ + public function setDevelopers(array $developers): GamesFilter + { + $this->developers = implode(',', $developers); + return $this; + } + + /** + * @param array $publishers + * @return GamesFilter + */ + public function setPublishers(array $publishers): GamesFilter + { + $this->publishers = implode(',', $publishers); + return $this; + } + + /** + * @param array $genres + * @return GamesFilter + */ + public function setGenres(array $genres): GamesFilter + { + $this->genres = implode(',', $genres); + return $this; + } + + /** + * @param array $tags + * @return GamesFilter + */ + public function setTags(array $tags): GamesFilter + { + $this->tags = implode(',', $tags); + return $this; + } + + /** + * @param array $creators + * @return GamesFilter + */ + public function setCreators(array $creators): GamesFilter + { + $this->creators = implode(',', $creators); + return $this; + } + + /** + * @param DateRange[] $ranges + * @return GamesFilter + */ + public function setDates(array $ranges): GamesFilter + { + $this->dates = implode('.', array_map(function ($value) { + /** + * @var DateRange $value + */ + return $value->getFrom()->format('Y-m-d') . ',' . $value->getTo()->format('Y-m-d'); + }, $ranges)); + return $this; + } + + /** + * @param int|null $platforms_count + * @return GamesFilter + */ + public function setPlatformsCount(int $platforms_count): GamesFilter + { + $this->platforms_count = $platforms_count; + return $this; + } + + /** + * @param int|null $exclude_collection + * @return GamesFilter + */ + public function setExcludeCollection(int $exclude_collection): GamesFilter + { + $this->exclude_collection = $exclude_collection; + return $this; + } + + /** + * @param bool|null $exclude_additions + * @return GamesFilter + */ + public function setExcludeAdditions(bool $exclude_additions): GamesFilter + { + $this->exclude_additions = $exclude_additions; + return $this; + } + + /** + * @param bool|null $exclude_parents + * @return GamesFilter + */ + public function setExcludeParents(bool $exclude_parents): GamesFilter + { + $this->exclude_parents = $exclude_parents; + return $this; + } + + /** + * @param bool|null $exclude_game_series + * @return GamesFilter + */ + public function setExcludeGameSeries(bool $exclude_game_series): GamesFilter + { + $this->exclude_game_series = $exclude_game_series; + return $this; + } + + /** + * @param string $ordering + * @return GamesFilter + */ + public function setOrdering(string $ordering): GamesFilter + { + $this->ordering = $ordering; + return $this; + } + + /** + * @param int $page + * @return GamesFilter + */ + public function setPage(int $page): GamesFilter + { + $this->page = $page; + return $this; + } + + /** + * @param int $pageSize + * @return GamesFilter + */ + public function setPageSize(int $pageSize): GamesFilter + { + $this->page_size = $pageSize; + return $this; + } +} \ No newline at end of file diff --git a/src/Filters/OrderingFilter.php b/src/Filters/OrderingFilter.php new file mode 100644 index 0000000..d2a2d20 --- /dev/null +++ b/src/Filters/OrderingFilter.php @@ -0,0 +1,51 @@ +ordering = $ordering; + return $this; + } + + /** + * @param int $page + * @return OrderingFilter + */ + public function setPage(int $page): OrderingFilter + { + $this->page = $page; + return $this; + } + + /** + * @param int $pageSize + * @return OrderingFilter + */ + public function setPageSize(int $pageSize): OrderingFilter + { + $this->page_size = $pageSize; + return $this; + } +} \ No newline at end of file diff --git a/src/Filters/PaginationFilter.php b/src/Filters/PaginationFilter.php new file mode 100644 index 0000000..e309a1a --- /dev/null +++ b/src/Filters/PaginationFilter.php @@ -0,0 +1,36 @@ +page = $page; + return $this; + } + + /** + * @param int $pageSize + * @return PaginationFilter + */ + public function setPageSize(int $pageSize): PaginationFilter + { + $this->page_size = $pageSize; + return $this; + } +} \ No newline at end of file diff --git a/src/Resources/CreatorsResource.php b/src/Resources/CreatorsResource.php new file mode 100644 index 0000000..9bc8d9c --- /dev/null +++ b/src/Resources/CreatorsResource.php @@ -0,0 +1,44 @@ +get("/creator-roles", $filter->toArray()); + } + + /** + * @param PaginationFilter $filter + * @return Response + * @throws ApiException + */ + public function getCreators(PaginationFilter $filter): Response + { + return $this->get("/creators", $filter->toArray()); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getCreator(int $id): Response + { + return $this->get("/creators/$id"); + } +} \ No newline at end of file diff --git a/src/Resources/DevelopersResource.php b/src/Resources/DevelopersResource.php new file mode 100644 index 0000000..0016594 --- /dev/null +++ b/src/Resources/DevelopersResource.php @@ -0,0 +1,34 @@ +get("/developers/$id"); + } + + /** + * @param PaginationFilter $filter + * @return Response + * @throws ApiException + */ + public function getDevelopers(PaginationFilter $filter): Response + { + return $this->get("/developers", $filter->toArray()); + } +} \ No newline at end of file diff --git a/src/Resources/GamesResource.php b/src/Resources/GamesResource.php new file mode 100644 index 0000000..586173b --- /dev/null +++ b/src/Resources/GamesResource.php @@ -0,0 +1,153 @@ +get("/games", $filter->toArray()); + } + + /** + * @param int $id + * @param PaginationFilter $filter + * @return Response + * @throws ApiException + */ + public function getAdditions(int $id, PaginationFilter $filter): Response + { + return $this->get("/games/$id/additions", $filter->toArray()); + } + + /** + * @param int $id + * @param OrderingFilter $filter + * @return Response + * @throws ApiException + */ + public function getDevelopmentTeam(int $id, OrderingFilter $filter): Response + { + return $this->get("/games/$id/development-team", $filter->toArray()); + } + + /** + * @param int $id + * @param PaginationFilter $filter + * @return Response + * @throws ApiException + */ + public function getGameSeries(int $id, PaginationFilter $filter): Response + { + return $this->get("/games/$id/game-series", $filter->toArray()); + } + + /** + * @param int $id + * @param PaginationFilter $filter + * @return Response + * @throws ApiException + */ + public function getParentGames(int $id, PaginationFilter $filter): Response + { + return $this->get("/games/$id/parent-games", $filter->toArray()); + } + + /** + * @param int $id + * @param OrderingFilter $filter + * @return Response + * @throws ApiException + */ + public function getScreenshots(int $id, OrderingFilter $filter): Response + { + return $this->get("/games/$id/screenshots", $filter->toArray()); + } + + /** + * @param int $id + * @param OrderingFilter $filter + * @return Response + * @throws ApiException + */ + public function getStores(int $id, OrderingFilter $filter): Response + { + return $this->get("/games/$id/stores", $filter->toArray()); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getGame(int $id): Response + { + return $this->get("/games/$id"); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getArchievements(int $id): Response + { + return $this->get("/games/$id/achievements"); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getMovies(int $id): Response + { + return $this->get("/games/$id/movies"); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getRedditPosts(int $id): Response + { + return $this->get("/games/$id/reddit"); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getSuggested(int $id): Response + { + return $this->get("/games/$id/suggested"); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getTwitchVideos(int $id): Response + { + return $this->get("/games/$id/twitch"); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getYoutubeVideos(int $id): Response + { + return $this->get("/games/$id/youtube"); + } +} \ No newline at end of file diff --git a/src/Resources/GenresResource.php b/src/Resources/GenresResource.php new file mode 100644 index 0000000..c752e88 --- /dev/null +++ b/src/Resources/GenresResource.php @@ -0,0 +1,34 @@ +get("/genres", $filter->toArray()); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getGenre(int $id): Response + { + return $this->get("/genres/$id"); + } +} \ No newline at end of file diff --git a/src/Resources/PlatformsResource.php b/src/Resources/PlatformsResource.php new file mode 100644 index 0000000..e5c2203 --- /dev/null +++ b/src/Resources/PlatformsResource.php @@ -0,0 +1,45 @@ +get("/platforms", $filter->toArray()); + } + + /** + * @param OrderingFilter $filter + * @return Response + * @throws ApiException + */ + public function getPlatformsParents(OrderingFilter $filter): Response + { + return $this->get("/platforms/lists/parents", $filter->toArray()); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getPlatform(int $id): Response + { + return $this->get("/platforms/$id"); + } + +} \ No newline at end of file diff --git a/src/Resources/PublishersResource.php b/src/Resources/PublishersResource.php new file mode 100644 index 0000000..a889065 --- /dev/null +++ b/src/Resources/PublishersResource.php @@ -0,0 +1,34 @@ +get("/publishers", $filter->toArray()); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getPublisher(int $id): Response + { + return $this->get("/publishers/$id"); + } +} \ No newline at end of file diff --git a/src/Resources/Resource.php b/src/Resources/Resource.php new file mode 100644 index 0000000..53a323b --- /dev/null +++ b/src/Resources/Resource.php @@ -0,0 +1,61 @@ +config = $config; + $this->httpClient = $httpClient ?? new HttpClient(); + } + + /** + * @param string $path + * @param array $queryParams + * @param array $headers + * @return Response + * @throws ApiException + */ + protected function get(string $path, array $queryParams = [], array $headers = []): Response + { + $fullUrl = $this->config->getBaseUrl() . $path; + $headers['User-Agent'] = $this->config->getAppName(); + + $queryParams = array_filter($queryParams, function($item) { + return !is_null($item); + }); + + $queryParams['lang'] = $this->config->getLanguage(); + try { + $response = $this->httpClient->request("GET", $fullUrl, [ + 'query' => $queryParams, + 'headers' => $headers + ]); + return new Response($response); + } catch (GuzzleException $exception) { + throw new ApiException("Invalid API request: " . $exception->getMessage(), 0, $exception); + } + } +} \ No newline at end of file diff --git a/src/Resources/StoresResource.php b/src/Resources/StoresResource.php new file mode 100644 index 0000000..d550826 --- /dev/null +++ b/src/Resources/StoresResource.php @@ -0,0 +1,34 @@ +get("/stores", $filter->toArray()); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getStore(int $id): Response + { + return $this->get("/stores/$id"); + } +} \ No newline at end of file diff --git a/src/Resources/TagsResource.php b/src/Resources/TagsResource.php new file mode 100644 index 0000000..80180eb --- /dev/null +++ b/src/Resources/TagsResource.php @@ -0,0 +1,34 @@ +get("/tags", $filter->toArray()); + } + + /** + * @param int $id + * @return Response + * @throws ApiException + */ + public function getTag(int $id): Response + { + return $this->get("/tags/$id"); + } +} \ No newline at end of file diff --git a/src/Response.php b/src/Response.php new file mode 100644 index 0000000..dd6b650 --- /dev/null +++ b/src/Response.php @@ -0,0 +1,38 @@ +resp = $resp; + } + + /** + * @return array + */ + public function getData(): array + { + return json_decode($this->resp->getBody(), true); + } + + /** + * @return ResponseInterface + */ + public function getResponse(): ResponseInterface + { + return $this->resp; + } +} \ No newline at end of file diff --git a/tests/_data/.gitkeep b/tests/_data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/_data/creator-roles.json b/tests/_data/creator-roles.json new file mode 100644 index 0000000..bfa14ec --- /dev/null +++ b/tests/_data/creator-roles.json @@ -0,0 +1,17 @@ +{ + "count": 7, + "next": "https://api.rawg.io/api/creator-roles?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 1, + "name": "writer", + "slug": "writer" + }, + { + "id": 2, + "name": "director", + "slug": "director" + } + ] +} \ No newline at end of file diff --git a/tests/_data/creators.creator.json b/tests/_data/creators.creator.json new file mode 100644 index 0000000..f416717 --- /dev/null +++ b/tests/_data/creators.creator.json @@ -0,0 +1,326 @@ +{ + "id": 1, + "name": "Michael Unsworth", + "slug": "michael-unsworth", + "image": null, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg", + "description": "

Michael Unsworth is a games writer. Unsworth has been working with Rockstar Games, Rockstar North and Rockstar San Diego. Unsworth's first published game was Red Dead Redemption released in 2010. After that, Michael Unsworth took part as the writer of Max Payne 3. Unsworth also worked on Red Dead Redemption 2 developed by Rockstar Games for PC, Xbox One and PlayStation 4. Most recently, Michael Unsworth was involved in the development of Red Dead Online.

", + "games_count": 5, + "reviews_count": 9359, + "rating": "4.46", + "rating_top": 5, + "updated": "2020-05-14T12:51:28", + "positions": [ + { + "id": 1, + "name": "writer", + "slug": "writer" + } + ], + "platforms": { + "total": 8, + "results": [ + { + "count": 7, + "percent": 38.9, + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "count": 7, + "percent": 38.9, + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "count": 3, + "percent": 16.67, + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "count": 1, + "percent": 5.56, + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + } + ], + "count": 4 + }, + "ratings": [ + { + "id": 5, + "title": "exceptional", + "count": 5647, + "percent": 60.34 + }, + { + "id": 4, + "title": "recommended", + "count": 2844, + "percent": 30.39 + }, + { + "id": 3, + "title": "meh", + "count": 640, + "percent": 6.84 + }, + { + "id": 1, + "title": "skip", + "count": 228, + "percent": 2.44 + } + ], + "timeline": [ + { + "year": 1962, + "count": 0 + }, + { + "year": 1963, + "count": 0 + }, + { + "year": 1964, + "count": 0 + }, + { + "year": 1965, + "count": 0 + }, + { + "year": 1966, + "count": 0 + }, + { + "year": 1967, + "count": 0 + }, + { + "year": 1968, + "count": 0 + }, + { + "year": 1969, + "count": 0 + }, + { + "year": 1970, + "count": 0 + }, + { + "year": 1971, + "count": 0 + }, + { + "year": 1972, + "count": 0 + }, + { + "year": 1973, + "count": 0 + }, + { + "year": 1974, + "count": 0 + }, + { + "year": 1975, + "count": 0 + }, + { + "year": 1976, + "count": 0 + }, + { + "year": 1977, + "count": 0 + }, + { + "year": 1978, + "count": 0 + }, + { + "year": 1979, + "count": 0 + }, + { + "year": 1980, + "count": 0 + }, + { + "year": 1981, + "count": 0 + }, + { + "year": 1982, + "count": 0 + }, + { + "year": 1983, + "count": 0 + }, + { + "year": 1984, + "count": 0 + }, + { + "year": 1985, + "count": 0 + }, + { + "year": 1986, + "count": 0 + }, + { + "year": 1987, + "count": 0 + }, + { + "year": 1988, + "count": 0 + }, + { + "year": 1989, + "count": 0 + }, + { + "year": 1990, + "count": 0 + }, + { + "year": 1991, + "count": 0 + }, + { + "year": 1992, + "count": 0 + }, + { + "year": 1993, + "count": 0 + }, + { + "year": 1994, + "count": 0 + }, + { + "year": 1995, + "count": 0 + }, + { + "year": 1996, + "count": 0 + }, + { + "year": 1997, + "count": 0 + }, + { + "year": 1998, + "count": 0 + }, + { + "year": 1999, + "count": 0 + }, + { + "year": 2000, + "count": 0 + }, + { + "year": 2001, + "count": 0 + }, + { + "year": 2002, + "count": 0 + }, + { + "year": 2003, + "count": 0 + }, + { + "year": 2004, + "count": 0 + }, + { + "year": 2005, + "count": 0 + }, + { + "year": 2006, + "count": 0 + }, + { + "year": 2007, + "count": 0 + }, + { + "year": 2008, + "count": 0 + }, + { + "year": 2009, + "count": 0 + }, + { + "year": 2010, + "count": 1 + }, + { + "year": 2011, + "count": 0 + }, + { + "year": 2012, + "count": 1 + }, + { + "year": 2013, + "count": 1 + }, + { + "year": 2014, + "count": 0 + }, + { + "year": 2015, + "count": 0 + }, + { + "year": 2016, + "count": 0 + }, + { + "year": 2017, + "count": 0 + }, + { + "year": 2018, + "count": 1 + }, + { + "year": 2019, + "count": 1 + }, + { + "year": 2020, + "count": 0 + } + ] +} \ No newline at end of file diff --git a/tests/_data/creators.creators.json b/tests/_data/creators.creators.json new file mode 100644 index 0000000..8e68550 --- /dev/null +++ b/tests/_data/creators.creators.json @@ -0,0 +1,123 @@ +{ + "count": 24259, + "next": "https://api.rawg.io/api/creators?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 70, + "name": "Cris Velasco", + "slug": "cris-velasco", + "image": "https://media.rawg.io/media/persons/6ea/6ea06e2ddd6c0190e5134f61d826f30f.jpg", + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg", + "games_count": 48, + "positions": [ + { + "id": 3, + "name": "composer", + "slug": "composer" + } + ], + "games": [ + { + "id": 802, + "slug": "borderlands-2", + "name": "Borderlands 2", + "added": 9614 + }, + { + "id": 4828, + "slug": "borderlands", + "name": "Borderlands", + "added": 6176 + }, + { + "id": 17540, + "slug": "injustice-gods-among-us-ultimate-edition", + "name": "Injustice: Gods Among Us Ultimate Edition", + "added": 5700 + }, + { + "id": 3387, + "slug": "bloodborne", + "name": "Bloodborne", + "added": 5561 + }, + { + "id": 10243, + "slug": "company-of-heroes-2", + "name": "Company of Heroes 2", + "added": 5233 + }, + { + "id": 4502, + "slug": "darksiders", + "name": "Darksiders", + "added": 5089 + } + ] + }, + { + "id": 3, + "name": "Dan Houser", + "slug": "dan-houser", + "image": "https://media.rawg.io/media/persons/8ba/8babec5b685ff0be2beee43f3b7b3eb5.jpg", + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg", + "games_count": 28, + "positions": [ + { + "id": 1, + "name": "writer", + "slug": "writer" + }, + { + "id": 5, + "name": "producer", + "slug": "producer" + }, + { + "id": 6, + "name": "designer", + "slug": "designer" + } + ], + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 28, + "slug": "red-dead-redemption-2", + "name": "Red Dead Redemption 2", + "added": 8204 + }, + { + "id": 4459, + "slug": "grand-theft-auto-iv", + "name": "Grand Theft Auto IV", + "added": 7676 + }, + { + "id": 416, + "slug": "grand-theft-auto-san-andreas", + "name": "Grand Theft Auto: San Andreas", + "added": 6252 + }, + { + "id": 4514, + "slug": "la-noire", + "name": "L.A. Noire", + "added": 6138 + }, + { + "id": 430, + "slug": "grand-theft-auto-vice-city", + "name": "Grand Theft Auto: Vice City", + "added": 5367 + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/developers.developer.json b/tests/_data/developers.developer.json new file mode 100644 index 0000000..c8873bf --- /dev/null +++ b/tests/_data/developers.developer.json @@ -0,0 +1,8 @@ +{ + "id": 1, + "name": "D3 Publisher of America", + "slug": "d3-publisher-of-america", + "games_count": 12, + "image_background": "https://media.rawg.io/media/screenshots/c1c/c1c5b7d617614a672e89b24ea32ee35e.jpg", + "description": "" +} \ No newline at end of file diff --git a/tests/_data/developers.developers.json b/tests/_data/developers.developers.json new file mode 100644 index 0000000..8a98556 --- /dev/null +++ b/tests/_data/developers.developers.json @@ -0,0 +1,97 @@ +{ + "count": 203063, + "next": "https://api.rawg.io/api/developers?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 18893, + "name": "Feral Interactive", + "slug": "feral-interactive", + "games_count": 107, + "image_background": "https://media.rawg.io/media/games/a12/a12f806432cb385bc286f0935c49cd14.jpg", + "games": [ + { + "id": 7689, + "slug": "rise-of-the-tomb-raider", + "name": "Rise of the Tomb Raider", + "added": 6841 + }, + { + "id": 11973, + "slug": "shadow-of-mordor", + "name": "Middle-earth: Shadow of Mordor", + "added": 6695 + }, + { + "id": 10035, + "slug": "hitman", + "name": "HITMAN", + "added": 6647 + }, + { + "id": 4427, + "slug": "bioshock-2", + "name": "BioShock 2", + "added": 6514 + }, + { + "id": 10754, + "slug": "bioshock-remastered", + "name": "BioShock Remastered", + "added": 6059 + }, + { + "id": 13910, + "slug": "xcom-enemy-unknown", + "name": "XCOM: Enemy Unknown", + "added": 5609 + } + ] + }, + { + "id": 1612, + "name": "Valve Software", + "slug": "valve-software", + "games_count": 39, + "image_background": "https://media.rawg.io/media/games/7a2/7a2500ee8b2c0e1ff268bb4479463dea.jpg", + "games": [ + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "added": 11199 + }, + { + "id": 12020, + "slug": "left-4-dead-2", + "name": "Left 4 Dead 2", + "added": 9642 + }, + { + "id": 13536, + "slug": "portal", + "name": "Portal", + "added": 9511 + }, + { + "id": 4291, + "slug": "counter-strike-global-offensive", + "name": "Counter-Strike: Global Offensive", + "added": 9294 + }, + { + "id": 13537, + "slug": "half-life-2", + "name": "Half-Life 2", + "added": 8644 + }, + { + "id": 11859, + "slug": "team-fortress-2", + "name": "Team Fortress 2", + "added": 8110 + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.additions.json b/tests/_data/games.additions.json new file mode 100644 index 0000000..73fb08e --- /dev/null +++ b/tests/_data/games.additions.json @@ -0,0 +1,658 @@ +{ + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 11142, + "slug": "bioshock-2-remastered", + "name": "BioShock 2 Remastered", + "released": "2016-09-15", + "tba": false, + "background_image": "https://media.rawg.io/media/games/7c4/7c448374df84b607f67ce9182a3a3ca7.jpg", + "rating": 4.02, + "rating_top": 4, + "ratings": [ + { + "id": 4, + "title": "recommended", + "count": 286, + "percent": 51.07 + }, + { + "id": 5, + "title": "exceptional", + "count": 181, + "percent": 32.32 + }, + { + "id": 3, + "title": "meh", + "count": 54, + "percent": 9.64 + }, + { + "id": 1, + "title": "skip", + "count": 39, + "percent": 6.96 + } + ], + "ratings_count": 560, + "reviews_text_count": 0, + "added": 4881, + "added_by_status": { + "yet": 485, + "owned": 3801, + "beaten": 409, + "toplay": 69, + "dropped": 98, + "playing": 19 + }, + "metacritic": null, + "playtime": 4, + "suggestions_count": 457, + "user_game": null, + "reviews_count": 560, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2016-09-15", + "requirements_en": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + }, + "requirements_ru": null + }, + { + "platform": { + "id": 5, + "name": "macOS", + "slug": "macos", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 57222, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + "released_at": "2016-09-15", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2016-09-15", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2020-05-29", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 5, + "name": "RPG", + "slug": "role-playing-games-rpg", + "games_count": 29996, + "image_background": "https://media.rawg.io/media/games/3cf/3cff89996570cf29a10eb9cd967dcf73.jpg" + } + ], + "stores": [ + { + "id": 440394, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP1001-CUSA13050_00-BIO2REMASTERED00", + "url_ru": "" + }, + { + "id": 276208, + "store": { + "id": 5, + "name": "GOG", + "slug": "gog", + "domain": "gog.com", + "games_count": 2703, + "image_background": "https://media.rawg.io/media/games/7c4/7c448374df84b607f67ce9182a3a3ca7.jpg" + }, + "url_en": "http://www.gog.com/game/bioshock_2_remastered", + "url_ru": null + }, + { + "id": 12220, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "http://store.steampowered.com/app/409720/", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/56b/56b913ca5e4953ae91b700818c97e552.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/6eb/6ebb353814c1e6e209967ce4ded6b48a.mp4", + "640": "https://media.rawg.io/media/stories-640/56b/56b913ca5e4953ae91b700818c97e552.mp4", + "full": "https://media.rawg.io/media/stories/4dc/4dc5c605a6ff3b0c678ab1a793a7bcaf.mp4" + }, + "video": "-lvjxlNFJN0", + "preview": "https://media.rawg.io/media/stories-previews/c5b/c5be08e4ca106ed5e729eba57f93e488.jpg" + }, + "tags": [ + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 40849, + "name": "Steam Cloud", + "slug": "steam-cloud", + "language": "eng", + "games_count": 8804, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 119, + "name": "Dystopian", + "slug": "dystopian", + "language": "eng", + "games_count": 729, + "image_background": "https://media.rawg.io/media/screenshots/67e/67e5be6ad7a555248f50bd367e9a071c.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 30, + "name": "FPS", + "slug": "fps", + "language": "eng", + "games_count": 5477, + "image_background": "https://media.rawg.io/media/games/c24/c24ec439abf4a2e92f3429dfa83f7f94.jpg" + }, + { + "id": 16, + "name": "Horror", + "slug": "horror", + "language": "eng", + "games_count": 15044, + "image_background": "https://media.rawg.io/media/games/4ba/4ba9b4b68ffcc7019b112174883ba4d6.jpg" + }, + { + "id": 7, + "name": "Multiplayer", + "slug": "multiplayer", + "language": "eng", + "games_count": 21140, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 32, + "name": "Sci-fi", + "slug": "sci-fi", + "language": "eng", + "games_count": 7475, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 154, + "name": "Steampunk", + "slug": "steampunk", + "language": "eng", + "games_count": 612, + "image_background": "https://media.rawg.io/media/games/0b5/0b5410b1e4b3fb72696dcefbf4f1cf40.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/7c4/7c448374df84b607f67ce9182a3a3ca7.jpg" + }, + { + "id": 89556, + "image": "https://media.rawg.io/media/screenshots/f8f/f8f97169e49ff503f182cb480c75d377.jpg" + }, + { + "id": 89557, + "image": "https://media.rawg.io/media/screenshots/be7/be7ba98fad14386322335d9d87f4cf05.jpg" + }, + { + "id": 89558, + "image": "https://media.rawg.io/media/screenshots/d0e/d0e70feaab57195e8286f3501e95fc5e.jpg" + }, + { + "id": 89559, + "image": "https://media.rawg.io/media/screenshots/f6e/f6e3977b58906b54d43232262521e7c6.jpg" + }, + { + "id": 89560, + "image": "https://media.rawg.io/media/screenshots/932/932a57c6958406a255b36d90d7eb62cd.jpg" + }, + { + "id": 89561, + "image": "https://media.rawg.io/media/screenshots/dd5/dd5c9b494d356ecc6b06115e51bf95c4.jpg" + } + ] + }, + { + "id": 41961, + "slug": "bioshock-2-minervas-den", + "name": "BioShock 2: Minerva's Den", + "released": "2010-08-23", + "tba": false, + "background_image": "https://media.rawg.io/media/screenshots/24b/24bf1868b81ba0f70e99020fcda24679.jpg", + "rating": 4, + "rating_top": 4, + "ratings": [ + { + "id": 4, + "title": "recommended", + "count": 16, + "percent": 61.54 + }, + { + "id": 5, + "title": "exceptional", + "count": 6, + "percent": 23.08 + }, + { + "id": 3, + "title": "meh", + "count": 3, + "percent": 11.54 + }, + { + "id": 1, + "title": "skip", + "count": 1, + "percent": 3.85 + } + ], + "ratings_count": 25, + "reviews_text_count": 0, + "added": 44, + "added_by_status": { + "yet": 4, + "owned": 7, + "beaten": 27, + "toplay": 5, + "dropped": 1 + }, + "metacritic": 82, + "playtime": 0, + "suggestions_count": 391, + "user_game": null, + "reviews_count": 26, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2010-08-23", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2010-08-23", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2010-08-23", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "stores": [], + "clip": null, + "tags": [], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/screenshots/24b/24bf1868b81ba0f70e99020fcda24679.jpg" + }, + { + "id": 605942, + "image": "https://media.rawg.io/media/screenshots/38b/38b8371e81cf152117c5a28d1f9eead5.jpg" + }, + { + "id": 605943, + "image": "https://media.rawg.io/media/screenshots/41f/41f899a81d708f679641d655d9a1cef1.jpg" + }, + { + "id": 605944, + "image": "https://media.rawg.io/media/screenshots/4f7/4f718a20a01fe632c66ee1cc75f51124.jpg" + }, + { + "id": 605945, + "image": "https://media.rawg.io/media/screenshots/9f8/9f8862d97cdc864d85edf991b7fb76b5.jpg" + }, + { + "id": 605946, + "image": "https://media.rawg.io/media/screenshots/362/362746bfff9b1fe5355b07865324ef77.jpg" + }, + { + "id": 605947, + "image": "https://media.rawg.io/media/screenshots/fe6/fe63d38a190ecb7bcf28b2fe832560f6.jpg" + } + ] + }, + { + "id": 41962, + "slug": "bioshock-2-sinclair-solutions-test-pack", + "name": "BioShock 2: Sinclair Solutions Test Pack", + "released": "2010-03-11", + "tba": false, + "background_image": "https://media.rawg.io/media/screenshots/135/1355a72e90f3d561c9ad94b8a09a4849.jpg", + "rating": 0, + "rating_top": 0, + "ratings": [ + { + "id": 1, + "title": "skip", + "count": 1, + "percent": 100 + } + ], + "ratings_count": 1, + "reviews_text_count": 0, + "added": 4, + "added_by_status": { + "beaten": 2, + "toplay": 1, + "dropped": 1 + }, + "metacritic": null, + "playtime": 0, + "suggestions_count": 220, + "user_game": null, + "reviews_count": 1, + "community_rating": 0, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2010-03-11", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2010-03-11", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "stores": [], + "clip": null, + "tags": [], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/screenshots/135/1355a72e90f3d561c9ad94b8a09a4849.jpg" + }, + { + "id": 605948, + "image": "https://media.rawg.io/media/screenshots/c08/c082f88d24a9f759146c4c26a63aa9e9.jpg" + }, + { + "id": 605949, + "image": "https://media.rawg.io/media/screenshots/d9d/d9d42cc3d9a15e63b5b594dcfac481bc.jpg" + }, + { + "id": 605950, + "image": "https://media.rawg.io/media/screenshots/135/1355a72e90f3d561c9ad94b8a09a4849.jpg" + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.archievements.json b/tests/_data/games.archievements.json new file mode 100644 index 0000000..6acc121 --- /dev/null +++ b/tests/_data/games.archievements.json @@ -0,0 +1,77 @@ +{ + "count": 100, + "next": "https://api.rawg.io/api/games/4427/achievements?page=2", + "previous": null, + "results": [ + { + "id": 997443, + "name": "Test à l'acide", + "description": "Gagnez 18 étoiles dans les épreuves de Protecteur", + "image": "https://media.rawg.io/media/achievements/f7d/f7d4849fd71ac98298c7189f9c272ed7.jpg", + "percent": "0.10" + }, + { + "id": 997442, + "name": "Une faim de loup", + "description": "Récupérez 50% de l'ADAM disponible dans toutes les épreuves de Protecteur", + "image": "https://media.rawg.io/media/achievements/761/761afb93fbadec5f8bb136e37f421fcb.jpg", + "percent": "0.10" + }, + { + "id": 998893, + "name": "Ange gardien", + "description": "Terminez toutes les épreuves de Protecteur", + "image": "https://media.rawg.io/media/achievements/f79/f79358287e8bbd50774ca7d334e00607_Ewb4yGn.jpg", + "percent": "0.10" + }, + { + "id": 973430, + "name": "Ennemi de la famille", + "description": "Finissez toutes les épreuves de Protecteur avec un rang A", + "image": "https://media.rawg.io/media/achievements/d7e/d7e72f92795f01465480b8179da88d98.jpg", + "percent": "0.10" + }, + { + "id": 969014, + "name": "Épreuve du feu", + "description": "Gagnez 36 étoiles dans les épreuves de Protecteur", + "image": "https://media.rawg.io/media/achievements/98f/98f5546aecc3e39070108d59261bbb01.jpg", + "percent": "0.10" + }, + { + "id": 100716, + "name": "Test décisif", + "description": "Gagnez 6 étoiles dans les épreuves de Protecteur", + "image": "https://media.rawg.io/media/achievements/0f3/0f3a070bc678774f7de7ef7e33536cc8.jpg", + "percent": "0.15" + }, + { + "id": 102997, + "name": "Protecteur parfait", + "description": "Récupérez 100% de l'ADAM dans une épreuve de Protecteur", + "image": "https://media.rawg.io/media/achievements/fc0/fc04cb6d9559524f188ca0e545e8d7a5.jpg", + "percent": "0.25" + }, + { + "id": 102998, + "name": "Contre toute attente", + "description": "Terminez le jeu en difficulté maximale.", + "image": "https://media.rawg.io/media/achievements/cc9/cc96e2bf1b702606398003a97ba91f9d_H3cFKm9.jpg", + "percent": "0.30" + }, + { + "id": 105928, + "name": "Expert en recherches", + "description": "Atteignez le dernier niveau de recherche sur les 9 sujets de recherche.", + "image": "https://media.rawg.io/media/achievements/f03/f03e7bea081a8d3c97be53a860ec7aec.jpg", + "percent": "0.50" + }, + { + "id": 105925, + "name": "Collecte des déchets", + "description": "Détruisez les 10 robots de nettoyage de l'Antre de Minerve.", + "image": "https://media.rawg.io/media/achievements/5d7/5d7fd9830ce0dec47b31c42f67baeec1.jpg", + "percent": "0.50" + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.development-team.json b/tests/_data/games.development-team.json new file mode 100644 index 0000000..c820a39 --- /dev/null +++ b/tests/_data/games.development-team.json @@ -0,0 +1,1533 @@ +{ + "count": 4, + "next": "https://api.rawg.io/api/games/4427/development-team?page=2&page_size=1", + "previous": null, + "results": [ + { + "id": 35, + "name": "Garry Schyman", + "slug": "garry-schyman", + "image": "https://media.rawg.io/media/persons/21b/21b08dda57a48c1679e26a4b46f0d34f.jpg", + "image_background": "https://media.rawg.io/media/screenshots/553/553cc3ab82d9e90682a925da39d959c7.jpg", + "games_count": 13, + "games": [ + { + "id": 4062, + "slug": "bioshock-infinite", + "name": "BioShock Infinite", + "released": "2013-03-26", + "tba": false, + "background_image": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg", + "rating": 4.39, + "rating_top": 5, + "ratings": [ + { + "id": 5, + "title": "exceptional", + "count": 1436, + "percent": 55.7 + }, + { + "id": 4, + "title": "recommended", + "count": 847, + "percent": 32.85 + }, + { + "id": 3, + "title": "meh", + "count": 231, + "percent": 8.96 + }, + { + "id": 1, + "title": "skip", + "count": 64, + "percent": 2.48 + } + ], + "ratings_count": 2559, + "reviews_text_count": 12, + "added": 9541, + "added_by_status": { + "yet": 449, + "owned": 5930, + "beaten": 2613, + "toplay": 216, + "dropped": 267, + "playing": 66 + }, + "metacritic": 94, + "playtime": 12, + "suggestions_count": 606, + "user_game": null, + "reviews_count": 2578, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + }, + "requirements_ru": { + "minimum": "Win Vista 32\nCore 2 Duo E4600/Athlon 64 X2 5200+\nGeForce GT 340/Radeon HD 3800\n2 GB RAM\n20 GB HDD", + "recommended": "Win 7 64\nCore 2 Quad Q6600/Athlon II X4 610e\nGeForce GTX 560/Radeon HD 6950\n4 GB RAM\n20 GB HDD" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo Switch", + "slug": "nintendo-switch", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3341, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 39347, + "image_background": "https://media.rawg.io/media/games/b7b/b7b8381707152afc7d91f5d95de70e39.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo", + "slug": "nintendo" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "stores": [ + { + "id": 461035, + "store": { + "id": 6, + "name": "Nintendo Store", + "slug": "nintendo", + "domain": "nintendo.com", + "games_count": 7777, + "image_background": "https://media.rawg.io/media/games/e04/e04963f3ac4c4fa83a1dc0b9231e50db.jpg" + }, + "url_en": "https://www.nintendo.com/games/detail/bioshock-infinite-the-complete-edition-switch/", + "url_ru": null + }, + { + "id": 440409, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/p/bioshock-infinite/btc8br7v276x?cid=msft_web_chart", + "url_ru": "" + }, + { + "id": 71727, + "store": { + "id": 4, + "name": "App Store", + "slug": "apple-appstore", + "domain": "apps.apple.com", + "games_count": 65298, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + "url_en": "https://apps.apple.com/us/app/bioshock-infinite/id658448783?mt=12&uo=4", + "url_ru": null + }, + { + "id": 33810, + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + }, + "url_en": "https://marketplace.xbox.com/en-US/Product/BioShock-Infinite/66acd000-77fe-1000-9115-d8025454085d", + "url_ru": null + }, + { + "id": 13084, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "http://store.steampowered.com/app/8870/", + "url_ru": null + }, + { + "id": 4382, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP1001-NPUB31128_00-BSIPSNEFIGSPSCEA", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/151/151157e3bb2dd3e3f1e5fbee39ccc69d.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/675/6757abdfbef0ef1de5bb4ff12cddd854.mp4", + "640": "https://media.rawg.io/media/stories-640/151/151157e3bb2dd3e3f1e5fbee39ccc69d.mp4", + "full": "https://media.rawg.io/media/stories/08b/08bc3708d9cd197262ba60123cfa60f3.mp4" + }, + "video": "PsqD6W818CA", + "preview": "https://media.rawg.io/media/stories-previews/d93/d93cf264a5fbcee92a3c80de89052ba6.jpg" + }, + "tags": [ + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 208, + "name": "Alternate History", + "slug": "alternate-history", + "language": "eng", + "games_count": 629, + "image_background": "https://media.rawg.io/media/games/9eb/9ebae11c9f394b12c24901c9afb867ce.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 40849, + "name": "Steam Cloud", + "slug": "steam-cloud", + "language": "eng", + "games_count": 8804, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 115, + "name": "Controller", + "slug": "controller", + "language": "eng", + "games_count": 4582, + "image_background": "https://media.rawg.io/media/games/8ee/8eed88e297441ef9202b5d1d35d7d86f.jpg" + }, + { + "id": 119, + "name": "Dystopian", + "slug": "dystopian", + "language": "eng", + "games_count": 729, + "image_background": "https://media.rawg.io/media/screenshots/67e/67e5be6ad7a555248f50bd367e9a071c.jpg" + }, + { + "id": 64, + "name": "Fantasy", + "slug": "fantasy", + "language": "eng", + "games_count": 9418, + "image_background": "https://media.rawg.io/media/games/c06/c06d88c35785c8003147cb53c84af033.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 30, + "name": "FPS", + "slug": "fps", + "language": "eng", + "games_count": 5477, + "image_background": "https://media.rawg.io/media/games/c24/c24ec439abf4a2e92f3429dfa83f7f94.jpg" + }, + { + "id": 26, + "name": "Gore", + "slug": "gore", + "language": "eng", + "games_count": 3217, + "image_background": "https://media.rawg.io/media/games/9dd/9ddabb34840ea9227556670606cf8ea3.jpg" + }, + { + "id": 42, + "name": "Great Soundtrack", + "slug": "great-soundtrack", + "language": "eng", + "games_count": 3002, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 305, + "name": "Linear", + "slug": "linear", + "language": "eng", + "games_count": 176, + "image_background": "https://media.rawg.io/media/games/120/1201a40e4364557b124392ee50317b99.jpg" + }, + { + "id": 287, + "name": "Political", + "slug": "political", + "language": "eng", + "games_count": 240, + "image_background": "https://media.rawg.io/media/screenshots/7f7/7f7159db791f6423da090c1359cd672d.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 32, + "name": "Sci-fi", + "slug": "sci-fi", + "language": "eng", + "games_count": 7475, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 154, + "name": "Steampunk", + "slug": "steampunk", + "language": "eng", + "games_count": 612, + "image_background": "https://media.rawg.io/media/games/0b5/0b5410b1e4b3fb72696dcefbf4f1cf40.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + }, + { + "id": 317, + "name": "Time Travel", + "slug": "time-travel", + "language": "eng", + "games_count": 790, + "image_background": "https://media.rawg.io/media/screenshots/120/120530499012ea0149cfe358330b10c9.jpg" + }, + { + "id": 7808, + "name": "steam-trading-cards", + "slug": "steam-trading-cards", + "language": "eng", + "games_count": 7608, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 98549, + "image": "https://media.rawg.io/media/screenshots/bf0/bf07e2c6d2c888d372917d9ef453c8a4.jpg" + }, + { + "id": 98550, + "image": "https://media.rawg.io/media/screenshots/9d3/9d38833952812ad7888a6dc21699934f.jpg" + }, + { + "id": 98551, + "image": "https://media.rawg.io/media/screenshots/595/59572d257b6797986e4eabcd1ee023fd.jpg" + }, + { + "id": 98552, + "image": "https://media.rawg.io/media/screenshots/f71/f71c23eb76f050d6180490e82d58d799.jpg" + }, + { + "id": 98553, + "image": "https://media.rawg.io/media/screenshots/871/8713411d5332ceb2b4092073a6f5f3f2.jpg" + }, + { + "id": 98554, + "image": "https://media.rawg.io/media/screenshots/985/985b56daa78e0a23133518d4226e9f97.jpg" + } + ] + }, + { + "id": 4286, + "slug": "bioshock", + "name": "BioShock", + "released": "2007-08-21", + "tba": false, + "background_image": "https://media.rawg.io/media/games/bc0/bc06a29ceac58652b684deefe7d56099.jpg", + "rating": 4.39, + "rating_top": 5, + "ratings": [ + { + "id": 5, + "title": "exceptional", + "count": 1168, + "percent": 53.73 + }, + { + "id": 4, + "title": "recommended", + "count": 797, + "percent": 36.66 + }, + { + "id": 3, + "title": "meh", + "count": 148, + "percent": 6.81 + }, + { + "id": 1, + "title": "skip", + "count": 61, + "percent": 2.81 + } + ], + "ratings_count": 2155, + "reviews_text_count": 14, + "added": 8694, + "added_by_status": { + "yet": 365, + "owned": 5695, + "beaten": 1972, + "toplay": 163, + "dropped": 413, + "playing": 86 + }, + "metacritic": 96, + "playtime": 3, + "suggestions_count": 642, + "user_game": null, + "reviews_count": 2174, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2010-07-06", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": { + "minimum": "

Minimum:

", + "recommended": "

Recommended:

" + }, + "requirements_ru": { + "minimum": "Pentium 4/Athlon 64 2.5 ГГц,1 Гб памяти,3D-ускоритель со 128 Мб памяти и SM 3.0, 7.5 Гб на винчестере, Windows XP SP2 или Vista,Интернет-соединение", + "recommended": "Core 2 Duo/Athlon 64 X2 3 ГГц,2 Гб памяти,3D-ускоритель с 512 Мб памяти и SM 3.0, 7.5 Гб на винчестере, Windows Vista,Интернет-соединение" + } + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 5, + "name": "macOS", + "slug": "macos", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 57222, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 3, + "name": "iOS", + "slug": "ios", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 66842, + "image_background": "https://media.rawg.io/media/games/4cb/4cb855e8ef1578415a928e53c9f51867.png" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 4, + "name": "iOS", + "slug": "ios" + } + }, + { + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "stores": [ + { + "id": 440407, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/p/bioshock/bncbcs5rjwh7?cid=msft_web_chart", + "url_ru": "" + }, + { + "id": 79531, + "store": { + "id": 4, + "name": "App Store", + "slug": "apple-appstore", + "domain": "apps.apple.com", + "games_count": 65298, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + "url_en": "https://apps.apple.com/us/app/bioshock/id414198302?mt=12&uo=4", + "url_ru": null + }, + { + "id": 4614, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP1001-NPUB30393_00-BIOSHOCKPSN00001", + "url_ru": null + }, + { + "id": 33844, + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + }, + "url_en": "https://marketplace.xbox.com/en-US/Product/BioShock/66acd000-77fe-1000-9115-d802545407d8", + "url_ru": null + }, + { + "id": 20580, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "http://store.steampowered.com/app/7670/", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/812/81238e77897b40294fce96e82601aba5.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/6af/6afdafa07a421d6300afcec772559fe0.mp4", + "640": "https://media.rawg.io/media/stories-640/812/81238e77897b40294fce96e82601aba5.mp4", + "full": "https://media.rawg.io/media/stories/f82/f8211f5933005d1c3587f06e9164225d.mp4" + }, + "video": "FoCmjOB0KHo", + "preview": "https://media.rawg.io/media/stories-previews/e4e/e4ef5474302c8e73e4af663aefc84360.jpg" + }, + "tags": [ + { + "id": 97, + "name": "Action RPG", + "slug": "action-rpg", + "language": "eng", + "games_count": 2586, + "image_background": "https://media.rawg.io/media/games/c06/c06d88c35785c8003147cb53c84af033.jpg" + }, + { + "id": 208, + "name": "Alternate History", + "slug": "alternate-history", + "language": "eng", + "games_count": 629, + "image_background": "https://media.rawg.io/media/games/9eb/9ebae11c9f394b12c24901c9afb867ce.jpg" + }, + { + "id": 40845, + "name": "Partial Controller Support", + "slug": "partial-controller-support", + "language": "eng", + "games_count": 6343, + "image_background": "https://media.rawg.io/media/games/c89/c89ca70716080733d03724277df2c6c7.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 193, + "name": "Classic", + "slug": "classic", + "language": "eng", + "games_count": 1459, + "image_background": "https://media.rawg.io/media/games/b7b/b7b8381707152afc7d91f5d95de70e39.jpg" + }, + { + "id": 41, + "name": "Dark", + "slug": "dark", + "language": "eng", + "games_count": 5405, + "image_background": "https://media.rawg.io/media/games/157/15742f2f67eacff546738e1ab5c19d20.jpg" + }, + { + "id": 119, + "name": "Dystopian", + "slug": "dystopian", + "language": "eng", + "games_count": 729, + "image_background": "https://media.rawg.io/media/screenshots/67e/67e5be6ad7a555248f50bd367e9a071c.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 30, + "name": "FPS", + "slug": "fps", + "language": "eng", + "games_count": 5477, + "image_background": "https://media.rawg.io/media/games/c24/c24ec439abf4a2e92f3429dfa83f7f94.jpg" + }, + { + "id": 42, + "name": "Great Soundtrack", + "slug": "great-soundtrack", + "language": "eng", + "games_count": 3002, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 16, + "name": "Horror", + "slug": "horror", + "language": "eng", + "games_count": 15044, + "image_background": "https://media.rawg.io/media/games/4ba/4ba9b4b68ffcc7019b112174883ba4d6.jpg" + }, + { + "id": 287, + "name": "Political", + "slug": "political", + "language": "eng", + "games_count": 240, + "image_background": "https://media.rawg.io/media/screenshots/7f7/7f7159db791f6423da090c1359cd672d.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 32, + "name": "Sci-fi", + "slug": "sci-fi", + "language": "eng", + "games_count": 7475, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 154, + "name": "Steampunk", + "slug": "steampunk", + "language": "eng", + "games_count": 612, + "image_background": "https://media.rawg.io/media/games/0b5/0b5410b1e4b3fb72696dcefbf4f1cf40.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + }, + { + "id": 250, + "name": "Underwater", + "slug": "underwater", + "language": "eng", + "games_count": 935, + "image_background": "https://media.rawg.io/media/screenshots/5af/5af1974e330a1ba6f4319400dde88129.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/bc0/bc06a29ceac58652b684deefe7d56099.jpg" + }, + { + "id": 170993, + "image": "https://media.rawg.io/media/screenshots/01f/01f62d7064838a5c3202acfc61503487.jpg" + }, + { + "id": 170994, + "image": "https://media.rawg.io/media/screenshots/7f5/7f517e07e36e4af5a7c0b86a7d42853f.jpg" + }, + { + "id": 170995, + "image": "https://media.rawg.io/media/screenshots/aca/aca089b963a42ec4cbf56b5e5334af8e.jpg" + }, + { + "id": 170996, + "image": "https://media.rawg.io/media/screenshots/3aa/3aa6f71eba1d64e671bd45826ca96560.jpg" + }, + { + "id": 170997, + "image": "https://media.rawg.io/media/screenshots/d8e/d8ed29c7c0b41e4013588847944ed446.jpg" + }, + { + "id": 170998, + "image": "https://media.rawg.io/media/screenshots/146/146e418797aca19296f90d259207414c.jpg" + } + ] + }, + { + "id": 11973, + "slug": "shadow-of-mordor", + "name": "Middle-earth: Shadow of Mordor", + "released": "2014-09-30", + "tba": false, + "background_image": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg", + "rating": 3.88, + "rating_top": 4, + "ratings": [ + { + "id": 4, + "title": "recommended", + "count": 980, + "percent": 61.06 + }, + { + "id": 3, + "title": "meh", + "count": 282, + "percent": 17.57 + }, + { + "id": 5, + "title": "exceptional", + "count": 281, + "percent": 17.51 + }, + { + "id": 1, + "title": "skip", + "count": 62, + "percent": 3.86 + } + ], + "ratings_count": 1597, + "reviews_text_count": 6, + "added": 6695, + "added_by_status": { + "yet": 286, + "owned": 4521, + "beaten": 1263, + "toplay": 177, + "dropped": 392, + "playing": 56 + }, + "metacritic": 85, + "playtime": 14, + "suggestions_count": 667, + "user_game": null, + "reviews_count": 1605, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 39347, + "image_background": "https://media.rawg.io/media/games/b7b/b7b8381707152afc7d91f5d95de70e39.jpg" + }, + "released_at": "2014-09-30", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2014-09-30", + "requirements_en": { + "minimum": "OS: 64-bit: Vista SP2, Win 7 SP1, Win 8.1\r\nProcessor: Intel Core i5-750, 2.67 GHz | AMD Phenom II X4 965, 3.4 GHz\r\nMemory: 3 GB RAM\r\nGraphics: NVIDIA GeForce GTX 460 | AMD Radeon HD 5850\r\nDirectX: Version 11\r\nNetwork: Broadband Internet connection\r\nStorage: 44 GB available space", + "recommended": "OS: 64-bit: Win 7 SP1, Win 8.1\r\nProcessor: Intel Core i7-3770, 3.4 GHz | AMD FX-8350, 4.0 GHz\r\nMemory: 8 GB RAM\r\nGraphics: NVIDIA GeForce GTX 660 | AMD Radeon HD 7950\r\nDirectX: Version 11\r\nNetwork: Broadband Internet connection\r\nStorage: 57 GB available space" + }, + "requirements_ru": null + }, + { + "platform": { + "id": 5, + "name": "macOS", + "slug": "macos", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 57222, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + "released_at": "2014-09-30", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2014-09-30", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2014-09-30", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2014-09-30", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2014-09-30", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 5, + "name": "RPG", + "slug": "role-playing-games-rpg", + "games_count": 29996, + "image_background": "https://media.rawg.io/media/games/3cf/3cff89996570cf29a10eb9cd967dcf73.jpg" + } + ], + "stores": [ + { + "id": 300508, + "store": { + "id": 4, + "name": "App Store", + "slug": "apple-appstore", + "domain": "apps.apple.com", + "games_count": 65298, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + "url_en": "https://apps.apple.com/us/app/middle-earth-shadow-of-mordor-goty/id948293565?mt=12&uo=4", + "url_ru": null + }, + { + "id": 284606, + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + }, + "url_en": "https://marketplace.xbox.com/en-US/Product/Shadow-of-Mordor/66acd000-77fe-1000-9115-d8025752082c", + "url_ru": null + }, + { + "id": 49398, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/p/middle-earth-shadow-of-mordor-game-of-the-year-edition/bpbktsc16mwt", + "url_ru": null + }, + { + "id": 49397, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP1018-CUSA01939_00-SHADOWMORDORGOTY", + "url_ru": null + }, + { + "id": 13149, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "https://store.steampowered.com/app/241930/Middleearth_Shadow_of_Mordor/", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/ea2/ea20fb360426b90baa1863988461856e.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/038/038dd9143bb31c6c33f2e1ee6c60cd00.mp4", + "640": "https://media.rawg.io/media/stories-640/ea2/ea20fb360426b90baa1863988461856e.mp4", + "full": "https://media.rawg.io/media/stories/804/80404c72fb083182b65ccd7a79ffa445.mp4" + }, + "video": "z_3xavJpQPQ", + "preview": "https://media.rawg.io/media/stories-previews/e33/e33f52aa254515c77c3c6920e4db2f7d.jpg" + }, + "tags": [ + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 97, + "name": "Action RPG", + "slug": "action-rpg", + "language": "eng", + "games_count": 2586, + "image_background": "https://media.rawg.io/media/games/c06/c06d88c35785c8003147cb53c84af033.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 278, + "name": "Assassin", + "slug": "assassin", + "language": "eng", + "games_count": 485, + "image_background": "https://media.rawg.io/media/games/c35/c354856af9151dc63844be4f9843d2c2.jpg" + }, + { + "id": 40849, + "name": "Steam Cloud", + "slug": "steam-cloud", + "language": "eng", + "games_count": 8804, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 283, + "name": "Based On A Novel", + "slug": "based-on-a-novel", + "language": "eng", + "games_count": 32, + "image_background": "https://media.rawg.io/media/screenshots/45a/45af988f5b4de2f1be0c9bcdeb4d67c2.jpg" + }, + { + "id": 40, + "name": "Dark Fantasy", + "slug": "dark-fantasy", + "language": "eng", + "games_count": 1119, + "image_background": "https://media.rawg.io/media/games/1dc/1dc45435c09f844b24eb96cd66eb6325.jpg" + }, + { + "id": 64, + "name": "Fantasy", + "slug": "fantasy", + "language": "eng", + "games_count": 9418, + "image_background": "https://media.rawg.io/media/games/c06/c06d88c35785c8003147cb53c84af033.jpg" + }, + { + "id": 26, + "name": "Gore", + "slug": "gore", + "language": "eng", + "games_count": 3217, + "image_background": "https://media.rawg.io/media/games/9dd/9ddabb34840ea9227556670606cf8ea3.jpg" + }, + { + "id": 68, + "name": "Hack and Slash", + "slug": "hack-and-slash", + "language": "eng", + "games_count": 1313, + "image_background": "https://media.rawg.io/media/games/9fb/9fbf956a16249def7625ab5dc3d09515.jpg" + }, + { + "id": 205, + "name": "Lore-Rich", + "slug": "lore-rich", + "language": "eng", + "games_count": 86, + "image_background": "https://media.rawg.io/media/screenshots/bb8/bb8dc95abb262b65c4f4956c86b92cb3.jpg" + }, + { + "id": 82, + "name": "Magic", + "slug": "magic", + "language": "eng", + "games_count": 3562, + "image_background": "https://media.rawg.io/media/games/c7a/c7a71a0531a9518236d99d0d60abe447.jpg" + }, + { + "id": 36, + "name": "Open World", + "slug": "open-world", + "language": "eng", + "games_count": 2797, + "image_background": "https://media.rawg.io/media/games/15c/15c95a4915f88a3e89c821526afe05fc.jpg" + }, + { + "id": 188, + "name": "Parkour", + "slug": "parkour", + "language": "eng", + "games_count": 960, + "image_background": "https://media.rawg.io/media/games/59a/59a3ebcba3d08c51532c6ca877aff256.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 37, + "name": "Sandbox", + "slug": "sandbox", + "language": "eng", + "games_count": 2698, + "image_background": "https://media.rawg.io/media/games/15c/15c95a4915f88a3e89c821526afe05fc.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 15, + "name": "Stealth", + "slug": "stealth", + "language": "eng", + "games_count": 2928, + "image_background": "https://media.rawg.io/media/games/4e6/4e6e8e7f50c237d76f38f3c885dae3d2.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + }, + { + "id": 149, + "name": "Third Person", + "slug": "third-person", + "language": "eng", + "games_count": 2616, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg" + }, + { + "id": 5842, + "name": "steam", + "slug": "steam", + "language": "eng", + "games_count": 553, + "image_background": "https://media.rawg.io/media/screenshots/4b9/4b9dab03293839a16f19dc701f4eedc7.jpg" + }, + { + "id": 7517, + "name": "category", + "slug": "category", + "language": "eng", + "games_count": 5, + "image_background": "https://media.rawg.io/media/games/152/152e788b7504aa2753c86dae912fb34c.jpg" + }, + { + "id": 7808, + "name": "steam-trading-cards", + "slug": "steam-trading-cards", + "language": "eng", + "games_count": 7608, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + { + "id": 44631, + "name": "microtranzations", + "slug": "microtranzations", + "language": "eng", + "games_count": 1, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + { + "id": 99148, + "image": "https://media.rawg.io/media/screenshots/123/1239cbfc3e25664170e8c1d5049a6d91.jpg" + }, + { + "id": 99149, + "image": "https://media.rawg.io/media/screenshots/47c/47cf2d5a0c37a6262a431a490a57d58d.jpg" + }, + { + "id": 99150, + "image": "https://media.rawg.io/media/screenshots/9e7/9e7f6fad3ee317a7edf7f3bc6001ba9d.jpg" + }, + { + "id": 99151, + "image": "https://media.rawg.io/media/screenshots/97f/97fdbb526196705e25ee503bc248b63f.jpg" + }, + { + "id": 99152, + "image": "https://media.rawg.io/media/screenshots/770/77011e668d64fe192691d56f364fb561.jpg" + }, + { + "id": 1827308, + "image": "https://media.rawg.io/media/screenshots/1f2/1f2851c47112ca8e1edf7c2c377632a9.jpg" + } + ] + } + ], + "positions": [ + { + "id": 3, + "name": "composer", + "slug": "composer" + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.game.json b/tests/_data/games.game.json new file mode 100644 index 0000000..8584deb --- /dev/null +++ b/tests/_data/games.game.json @@ -0,0 +1,526 @@ +{ + "id": 4427, + "slug": "bioshock-2", + "name": "BioShock 2", + "name_original": "BioShock 2", + "description": "

The second game returns us to the city of Rapture, on the New Year’s Eve, but this time player takes control of Subject Delta, Big Daddy, that’s been separated from his little sister and has been forced to shoot himself 2 years before the events of the first game took place. And after his awakening 10 years later, players will help to save the last sane citizens of Rapture. As seen in the previous game, the player will have access to new weapons, unique to Big Daddies, power drill and a rivet gun, alongside an array of plasmids, Tonics, and guns. Now players will be able not only save Little Sisters from other Big Daddies, and then either harvest ADAM directly, or protect them while they collect ADAM for their new guardian. Bioshock introduces a new enemy type, Big Sisters, which are extremely agile and fast versions of Big Daddies. Newly added multiplayer brings several never seen formats to the series. Aside from expected Deathmatches, the game added story-driven mode Fall of Rapture.

", + "metacritic": 88, + "metacritic_platforms": [], + "released": "2010-02-09", + "tba": false, + "updated": "2020-07-28T18:04:47", + "background_image": "https://media.rawg.io/media/games/157/15742f2f67eacff546738e1ab5c19d20.jpg", + "background_image_additional": "https://media.rawg.io/media/screenshots/296/296b946eb8438f48e1dd2f6753e78566.jpg", + "website": "http://www.bioshockgame.com", + "rating": 4.05, + "rating_top": 4, + "ratings": [ + { + "id": 4, + "title": "recommended", + "count": 639, + "percent": 53.21 + }, + { + "id": 5, + "title": "exceptional", + "count": 369, + "percent": 30.72 + }, + { + "id": 3, + "title": "meh", + "count": 135, + "percent": 11.24 + }, + { + "id": 1, + "title": "skip", + "count": 58, + "percent": 4.83 + } + ], + "reactions": { + "4": 1, + "9": 1, + "10": 1 + }, + "added": 6514, + "added_by_status": { + "yet": 440, + "owned": 4619, + "beaten": 1096, + "toplay": 101, + "dropped": 234, + "playing": 24 + }, + "playtime": 3, + "screenshots_count": 37, + "movies_count": 0, + "creators_count": 4, + "achievements_count": 381, + "parent_achievements_count": 100, + "reddit_url": "", + "reddit_name": "", + "reddit_description": "", + "reddit_logo": "", + "reddit_count": 0, + "twitch_count": 102, + "youtube_count": 1000000, + "reviews_text_count": 5, + "ratings_count": 1196, + "suggestions_count": 652, + "alternative_names": [], + "metacritic_url": "", + "parents_count": 0, + "additions_count": 3, + "game_series_count": 4, + "user_game": null, + "reviews_count": 1201, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo", + "slug": "nintendo" + } + } + ], + "platforms": [ + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2010-02-09", + "requirements": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2010-02-09", + "requirements": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo Switch", + "slug": "nintendo-switch", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3341, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + "released_at": "2010-02-09", + "requirements": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2010-02-09", + "requirements": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2010-02-09", + "requirements": null + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2010-02-09", + "requirements": null + }, + { + "platform": { + "id": 5, + "name": "macOS", + "slug": "macos", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 57222, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + "released_at": "2010-02-09", + "requirements": null + } + ], + "stores": [ + { + "id": 440408, + "url": "https://www.microsoft.com/en-us/p/bioshock-2/bp8t903fzl2x?cid=msft_web_chart", + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + } + }, + { + "id": 79405, + "url": "https://apps.apple.com/app/bioshock-2/id469377135?mt=12&uo=4", + "store": { + "id": 4, + "name": "App Store", + "slug": "apple-appstore", + "domain": "apps.apple.com", + "games_count": 65298, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + } + }, + { + "id": 33604, + "url": "https://marketplace.xbox.com/en-us/product/bioshock-2/66acd000-77fe-1000-9115-d8025454082d", + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + } + }, + { + "id": 4755, + "url": "https://store.playstation.com/en-us/product/UP1001-NPUB30392_00-BIOSHOCK2PSN0001", + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + } + }, + { + "id": 19732, + "url": "http://store.steampowered.com/app/8850/", + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + } + } + ], + "developers": [ + { + "id": 383, + "name": "2K", + "slug": "2k", + "games_count": 60, + "image_background": "https://media.rawg.io/media/games/fdb/fdb65025dee2f0edb8c2b587afaff853.jpg" + }, + { + "id": 4149, + "name": "2K Australia", + "slug": "2k-australia", + "games_count": 11, + "image_background": "https://media.rawg.io/media/games/7c4/7c448374df84b607f67ce9182a3a3ca7.jpg" + }, + { + "id": 5113, + "name": "2K China", + "slug": "2k-china", + "games_count": 8, + "image_background": "https://media.rawg.io/media/games/d43/d4357402bfcf2cf06650aab2e3bbf2a3.jpg" + }, + { + "id": 5114, + "name": "2K Marin", + "slug": "2k-marin", + "games_count": 8, + "image_background": "https://media.rawg.io/media/games/5cc/5cc765484c6df567ed9207c1781b88cb.jpg" + }, + { + "id": 1072, + "name": "Digital Extremes", + "slug": "digital-extremes", + "games_count": 21, + "image_background": "https://media.rawg.io/media/games/657/657574cd437df9102f511b3be095b0ea.jpg" + }, + { + "id": 18893, + "name": "Feral Interactive", + "slug": "feral-interactive", + "games_count": 107, + "image_background": "https://media.rawg.io/media/games/a12/a12f806432cb385bc286f0935c49cd14.jpg" + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "tags": [ + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 97, + "name": "Action RPG", + "slug": "action-rpg", + "language": "eng", + "games_count": 2586, + "image_background": "https://media.rawg.io/media/games/c06/c06d88c35785c8003147cb53c84af033.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 41, + "name": "Dark", + "slug": "dark", + "language": "eng", + "games_count": 5405, + "image_background": "https://media.rawg.io/media/games/157/15742f2f67eacff546738e1ab5c19d20.jpg" + }, + { + "id": 119, + "name": "Dystopian", + "slug": "dystopian", + "language": "eng", + "games_count": 729, + "image_background": "https://media.rawg.io/media/screenshots/67e/67e5be6ad7a555248f50bd367e9a071c.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 30, + "name": "FPS", + "slug": "fps", + "language": "eng", + "games_count": 5477, + "image_background": "https://media.rawg.io/media/games/c24/c24ec439abf4a2e92f3429dfa83f7f94.jpg" + }, + { + "id": 42, + "name": "Great Soundtrack", + "slug": "great-soundtrack", + "language": "eng", + "games_count": 3002, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 16, + "name": "Horror", + "slug": "horror", + "language": "eng", + "games_count": 15044, + "image_background": "https://media.rawg.io/media/games/4ba/4ba9b4b68ffcc7019b112174883ba4d6.jpg" + }, + { + "id": 305, + "name": "Linear", + "slug": "linear", + "language": "eng", + "games_count": 176, + "image_background": "https://media.rawg.io/media/games/120/1201a40e4364557b124392ee50317b99.jpg" + }, + { + "id": 7, + "name": "Multiplayer", + "slug": "multiplayer", + "language": "eng", + "games_count": 21140, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 281, + "name": "Philisophical", + "slug": "philisophical", + "language": "eng", + "games_count": 38, + "image_background": "https://media.rawg.io/media/screenshots/3a8/3a8e1d0414ab6cbb36eebabf889e6391.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 32, + "name": "Sci-fi", + "slug": "sci-fi", + "language": "eng", + "games_count": 7475, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 154, + "name": "Steampunk", + "slug": "steampunk", + "language": "eng", + "games_count": 612, + "image_background": "https://media.rawg.io/media/games/0b5/0b5410b1e4b3fb72696dcefbf4f1cf40.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + }, + { + "id": 250, + "name": "Underwater", + "slug": "underwater", + "language": "eng", + "games_count": 935, + "image_background": "https://media.rawg.io/media/screenshots/5af/5af1974e330a1ba6f4319400dde88129.jpg" + } + ], + "publishers": [ + { + "id": 358, + "name": "2K Games", + "slug": "2k-games", + "games_count": 189, + "image_background": "https://media.rawg.io/media/screenshots/740/7400097027269944f4fd3ee597cb93d8.jpg" + }, + { + "id": 19651, + "name": "Feral Interactive", + "slug": "feral-interactive", + "games_count": 108, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + } + ], + "esrb_rating": null, + "clip": { + "clip": "https://media.rawg.io/media/stories-640/37c/37c80abc0c63ca998fb255acf5740104.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/bff/bffa3b54314a2f9588901852cdeb29ee.mp4", + "640": "https://media.rawg.io/media/stories-640/37c/37c80abc0c63ca998fb255acf5740104.mp4", + "full": "https://media.rawg.io/media/stories/73a/73a4bc13e1b6342d398e6a563f86084a.mp4" + }, + "video": "FZh6g-71OAI", + "preview": "https://media.rawg.io/media/stories-previews/efa/efa665228a8da9098b17fbcf3b9cc4ff.jpg" + }, + "description_raw": "The second game returns us to the city of Rapture, on the New Year’s Eve, but this time player takes control of Subject Delta, Big Daddy, that’s been separated from his little sister and has been forced to shoot himself 2 years before the events of the first game took place. And after his awakening 10 years later, players will help to save the last sane citizens of Rapture. As seen in the previous game, the player will have access to new weapons, unique to Big Daddies, power drill and a rivet gun, alongside an array of plasmids, Tonics, and guns. Now players will be able not only save Little Sisters from other Big Daddies, and then either harvest ADAM directly, or protect them while they collect ADAM for their new guardian. Bioshock introduces a new enemy type, Big Sisters, which are extremely agile and fast versions of Big Daddies. Newly added multiplayer brings several never seen formats to the series. Aside from expected Deathmatches, the game added story-driven mode Fall of Rapture." +} diff --git a/tests/_data/games.games.json b/tests/_data/games.games.json new file mode 100644 index 0000000..a51e95c --- /dev/null +++ b/tests/_data/games.games.json @@ -0,0 +1,1298 @@ +{ + "count": 438659, + "next": "https://api.rawg.io/api/games?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "released": "2013-09-17", + "tba": false, + "background_image": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg", + "rating": 4.48, + "rating_top": 5, + "ratings": [ + { + "id": 5, + "title": "exceptional", + "count": 2366, + "percent": 59.19 + }, + { + "id": 4, + "title": "recommended", + "count": 1325, + "percent": 33.15 + }, + { + "id": 3, + "title": "meh", + "count": 240, + "percent": 6 + }, + { + "id": 1, + "title": "skip", + "count": 66, + "percent": 1.65 + } + ], + "ratings_count": 3958, + "reviews_text_count": 23, + "added": 12781, + "added_by_status": { + "yet": 296, + "owned": 7834, + "beaten": 3243, + "toplay": 368, + "dropped": 580, + "playing": 460 + }, + "metacritic": 97, + "playtime": 68, + "suggestions_count": 424, + "user_game": null, + "reviews_count": 3997, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2013-09-17", + "requirements_en": { + "minimum": "Minimum:OS: Windows 10 64 Bit, Windows 8.1 64 Bit, Windows 8 64 Bit, Windows 7 64 Bit Service Pack 1, Windows Vista 64 Bit Service Pack 2* (*NVIDIA video card recommended if running Vista OS)Processor: Intel Core 2 Quad CPU Q6600 @ 2.40GHz (4 CPUs) / AMD Phenom 9850 Quad-Core Processor (4 CPUs) @ 2.5GHzMemory: 4 GB RAMGraphics: NVIDIA 9800 GT 1GB / AMD HD 4870 1GB (DX 10, 10.1, 11)Storage: 72 GB available spaceSound Card: 100% DirectX 10 compatibleAdditional Notes: Over time downloadable content and programming changes will change the system requirements for this game. Please refer to your hardware manufacturer and www.rockstargames.com/support for current compatibility information. Some system components such as mobile chipsets, integrated, and AGP graphics cards may be incompatible. Unlisted specifications may not be supported by publisher. Other requirements: Installation and online play requires log-in to Rockstar Games Social Club (13+) network; internet connection required for activation, online play, and periodic entitlement verification; software installations required including Rockstar Games Social Club platform, DirectX , Chromium, and Microsoft Visual C++ 2008 sp1 Redistributable Package, and authentication software that recognizes certain hardware attributes for entitlement, digital rights management, system, and other support purposes. SINGLE USE SERIAL CODE REGISTRATION VIA INTERNET REQUIRED; REGISTRATION IS LIMITED TO ONE ROCKSTAR GAMES SOCIAL CLUB ACCOUNT (13+) PER SERIAL CODE; ONLY ONE PC LOG-IN ALLOWED PER SOCIAL CLUB ACCOUNT AT ANY TIME; SERIAL CODE(S) ARE NON-TRANSFERABLE ONCE USED; SOCIAL CLUB ACCOUNTS ARE NON-TRANSFERABLE. Partner Requirements: Please check the terms of service of this site before purchasing this software.", + "recommended": "Recommended:OS: Windows 10 64 Bit, Windows 8.1 64 Bit, Windows 8 64 Bit, Windows 7 64 Bit Service Pack 1Processor: Intel Core i5 3470 @ 3.2GHz (4 CPUs) / AMD X8 FX-8350 @ 4GHz (8 CPUs)Memory: 8 GB RAMGraphics: NVIDIA GTX 660 2GB / AMD HD 7870 2GBStorage: 72 GB available spaceSound Card: 100% DirectX 10 compatibleAdditional Notes:" + }, + "requirements_ru": null + }, + { + "platform": { + "id": 186, + "name": "Xbox Series X", + "slug": "xbox-series-x", + "image": null, + "year_end": null, + "year_start": 2020, + "games_count": 74, + "image_background": "https://media.rawg.io/media/games/54a/54a14917b3298bbaacdf9873c3af7229.jpg" + }, + "released_at": "2013-09-17", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 187, + "name": "PlayStation 5", + "slug": "playstation5", + "image": null, + "year_end": null, + "year_start": 2020, + "games_count": 74, + "image_background": "https://media.rawg.io/media/games/fb5/fb5e0fdb1f6bb0e8b5da5d08bb83a5fc.jpg" + }, + "released_at": "2013-09-17", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2013-09-17", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2013-09-17", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2013-09-17", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2013-09-17", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + } + ], + "stores": [ + { + "id": 438095, + "store": { + "id": 11, + "name": "Epic Games", + "slug": "epic-games", + "domain": "epicgames.com", + "games_count": 280, + "image_background": "https://media.rawg.io/media/games/fd8/fd882c8267a44621a0de6f9cec77ae90.jpg" + }, + "url_en": "https://www.epicgames.com/store/en-US/product/grand-theft-auto-v/home", + "url_ru": null + }, + { + "id": 290375, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP1004-CUSA00419_00-GTAVDIGITALDOWNL", + "url_ru": "https://store.playstation.com/ru-ru/product/EP1004-CUSA00411_00-GTAVDIGITALDOWNL" + }, + { + "id": 290378, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/store/p/grand-theft-auto-v/bpj686w6s0nh?cid=msft_web_chart", + "url_ru": null + }, + { + "id": 290377, + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + }, + "url_en": "https://marketplace.xbox.com/en-US/Product/GTA-V/66acd000-77fe-1000-9115-d802545408a7", + "url_ru": null + }, + { + "id": 290376, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "http://store.steampowered.com/app/271590/", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/5b0/5b0cfff8c606c5e4db4f74f108c4413b.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/91d/91d6b5963064a5f686f635c302095b55.mp4", + "640": "https://media.rawg.io/media/stories-640/5b0/5b0cfff8c606c5e4db4f74f108c4413b.mp4", + "full": "https://media.rawg.io/media/stories/f64/f64ce0b857918b0c202f2a5d3217848e.mp4" + }, + "video": "dZubIhK-Z6w", + "preview": "https://media.rawg.io/media/stories-previews/f65/f6593df6c8df32c7f4763f9cb112a514.jpg" + }, + "tags": [ + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 123, + "name": "Comedy", + "slug": "comedy", + "language": "eng", + "games_count": 4687, + "image_background": "https://media.rawg.io/media/games/0be/0bea0a08a4d954337305391b778a7f37.jpg" + }, + { + "id": 18, + "name": "Co-op", + "slug": "co-op", + "language": "eng", + "games_count": 5466, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg" + }, + { + "id": 144, + "name": "Crime", + "slug": "crime", + "language": "eng", + "games_count": 1517, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 4, + "name": "Funny", + "slug": "funny", + "language": "eng", + "games_count": 9656, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 42, + "name": "Great Soundtrack", + "slug": "great-soundtrack", + "language": "eng", + "games_count": 3002, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 62, + "name": "Moddable", + "slug": "moddable", + "language": "eng", + "games_count": 441, + "image_background": "https://media.rawg.io/media/games/9af/9af24c1886e2c7b52a4a2c65aa874638.jpg" + }, + { + "id": 7, + "name": "Multiplayer", + "slug": "multiplayer", + "language": "eng", + "games_count": 21140, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 36, + "name": "Open World", + "slug": "open-world", + "language": "eng", + "games_count": 2797, + "image_background": "https://media.rawg.io/media/games/15c/15c95a4915f88a3e89c821526afe05fc.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 37, + "name": "Sandbox", + "slug": "sandbox", + "language": "eng", + "games_count": 2698, + "image_background": "https://media.rawg.io/media/games/15c/15c95a4915f88a3e89c821526afe05fc.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 149, + "name": "Third Person", + "slug": "third-person", + "language": "eng", + "games_count": 2616, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg" + }, + { + "id": 150, + "name": "Third-Person Shooter", + "slug": "third-person-shooter", + "language": "eng", + "games_count": 1007, + "image_background": "https://media.rawg.io/media/games/13a/13a528ac9cf48bbb6be5d35fe029336d.jpg" + }, + { + "id": 411, + "name": "cooperative", + "slug": "cooperative", + "language": "eng", + "games_count": 2323, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg" + }, + { + "id": 1827221, + "image": "https://media.rawg.io/media/screenshots/a7c/a7c43871a54bed6573a6a429451564ef.jpg" + }, + { + "id": 1827222, + "image": "https://media.rawg.io/media/screenshots/cf4/cf4367daf6a1e33684bf19adb02d16d6.jpg" + }, + { + "id": 1827223, + "image": "https://media.rawg.io/media/screenshots/f95/f9518b1d99210c0cae21fc09e95b4e31.jpg" + }, + { + "id": 1827224, + "image": "https://media.rawg.io/media/screenshots/2dc/2dc7ea94641f7329d177f228564b968a.jpg" + }, + { + "id": 1827225, + "image": "https://media.rawg.io/media/screenshots/a5c/a5c95ea539c87d5f538763e16e18fb99.jpg" + }, + { + "id": 1827226, + "image": "https://media.rawg.io/media/screenshots/a7e/a7e990bc574f4d34e03b5926361d1ee7.jpg" + } + ] + }, + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "released": "2011-04-18", + "tba": false, + "background_image": "https://media.rawg.io/media/games/328/3283617cb7d75d67257fc58339188742.jpg", + "rating": 4.61, + "rating_top": 5, + "ratings": [ + { + "id": 5, + "title": "exceptional", + "count": 2367, + "percent": 69.82 + }, + { + "id": 4, + "title": "recommended", + "count": 869, + "percent": 25.63 + }, + { + "id": 3, + "title": "meh", + "count": 89, + "percent": 2.63 + }, + { + "id": 1, + "title": "skip", + "count": 65, + "percent": 1.92 + } + ], + "ratings_count": 3364, + "reviews_text_count": 18, + "added": 11199, + "added_by_status": { + "yet": 359, + "owned": 7093, + "beaten": 3160, + "toplay": 193, + "dropped": 300, + "playing": 94 + }, + "metacritic": 95, + "playtime": 11, + "suggestions_count": 587, + "user_game": null, + "reviews_count": 3390, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2011-04-18", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2011-04-19", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2011-04-19", + "requirements_en": null, + "requirements_ru": { + "minimum": "Core 2 Duo/Athlon X2 2 ГГц,1 Гб памяти,GeForce 7600/Radeon X800,10 Гб на винчестере,интернет-соединение", + "recommended": "Core 2 Duo/Athlon X2 2.5 ГГц,2 Гб памяти,GeForce GTX 280/Radeon HD 2600,10 Гб на винчестере,интернет-соединение" + } + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2011-04-19", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 39347, + "image_background": "https://media.rawg.io/media/games/b7b/b7b8381707152afc7d91f5d95de70e39.jpg" + }, + "released_at": "2011-04-19", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 5, + "name": "macOS", + "slug": "macos", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 57222, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + "released_at": "2011-04-19", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux" + } + } + ], + "genres": [ + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + }, + { + "id": 7, + "name": "Puzzle", + "slug": "puzzle", + "games_count": 51292, + "image_background": "https://media.rawg.io/media/games/e07/e07737df8469bf32d132ba9eaffc3461.jpg" + } + ], + "stores": [ + { + "id": 465889, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/p/portal-2/bt2b17v20d1p?cid=msft_web_chart", + "url_ru": "" + }, + { + "id": 33916, + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + }, + "url_en": "https://marketplace.xbox.com/en-US/Product/Portal-2/66acd000-77fe-1000-9115-d80245410912", + "url_ru": null + }, + { + "id": 4526, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP2061-NPUB31077_00-PORTAL2DIGITAL01", + "url_ru": null + }, + { + "id": 13134, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "http://store.steampowered.com/app/620/", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/fde/fde8aaeeab956f6b705bbb4161b09004.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/b26/b265f65b9f16dc20245863636d4094b2.mp4", + "640": "https://media.rawg.io/media/stories-640/fde/fde8aaeeab956f6b705bbb4161b09004.mp4", + "full": "https://media.rawg.io/media/stories/671/67196dea179367b70212bdaed88ba451.mp4" + }, + "video": "dVVZaZ8yO6o", + "preview": "https://media.rawg.io/media/stories-previews/faf/faf0bb37b806db65f1c76395c8f36c7c.jpg" + }, + "tags": [ + { + "id": 40833, + "name": "Captions available", + "slug": "captions-available", + "language": "eng", + "games_count": 982, + "image_background": "https://media.rawg.io/media/games/bce/bce62fbc7cf74bf6a1a37340993ec148.jpg" + }, + { + "id": 40834, + "name": "Commentary available", + "slug": "commentary-available", + "language": "eng", + "games_count": 207, + "image_background": "https://media.rawg.io/media/screenshots/b6c/b6ca8ba20caa7677aa2f5a506d9d84aa.jpg" + }, + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 40838, + "name": "Includes level editor", + "slug": "includes-level-editor", + "language": "eng", + "games_count": 1251, + "image_background": "https://media.rawg.io/media/games/bce/bce62fbc7cf74bf6a1a37340993ec148.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 40849, + "name": "Steam Cloud", + "slug": "steam-cloud", + "language": "eng", + "games_count": 8804, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 40852, + "name": "Steam Workshop", + "slug": "steam-workshop", + "language": "eng", + "games_count": 1014, + "image_background": "https://media.rawg.io/media/games/0bd/0bd5646a3d8ee0ac3314bced91ea306d.jpg" + }, + { + "id": 123, + "name": "Comedy", + "slug": "comedy", + "language": "eng", + "games_count": 4687, + "image_background": "https://media.rawg.io/media/games/0be/0bea0a08a4d954337305391b778a7f37.jpg" + }, + { + "id": 18, + "name": "Co-op", + "slug": "co-op", + "language": "eng", + "games_count": 5466, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg" + }, + { + "id": 189, + "name": "Female Protagonist", + "slug": "female-protagonist", + "language": "eng", + "games_count": 4511, + "image_background": "https://media.rawg.io/media/games/530/5302dd22a190e664531236ca724e8726.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 30, + "name": "FPS", + "slug": "fps", + "language": "eng", + "games_count": 5477, + "image_background": "https://media.rawg.io/media/games/c24/c24ec439abf4a2e92f3429dfa83f7f94.jpg" + }, + { + "id": 4, + "name": "Funny", + "slug": "funny", + "language": "eng", + "games_count": 9656, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 75, + "name": "Local Co-Op", + "slug": "local-co-op", + "language": "eng", + "games_count": 3317, + "image_background": "https://media.rawg.io/media/games/9cc/9cc11e2e81403186c7fa9c00c143d6e4.jpg" + }, + { + "id": 7, + "name": "Multiplayer", + "slug": "multiplayer", + "language": "eng", + "games_count": 21140, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 9, + "name": "Online Co-Op", + "slug": "online-co-op", + "language": "eng", + "games_count": 2149, + "image_background": "https://media.rawg.io/media/games/1a1/1a17e9b6286edb7e1f1e510110ccb0c0.jpg" + }, + { + "id": 87, + "name": "Science", + "slug": "science", + "language": "eng", + "games_count": 803, + "image_background": "https://media.rawg.io/media/screenshots/d7b/d7bf14ce235e7dbb2f83ffd383ae97ed.jpg" + }, + { + "id": 32, + "name": "Sci-fi", + "slug": "sci-fi", + "language": "eng", + "games_count": 7475, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 25, + "name": "Space", + "slug": "space", + "language": "eng", + "games_count": 20669, + "image_background": "https://media.rawg.io/media/games/daa/daaee07fcb40744d90cf8142f94a241f.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + }, + { + "id": 411, + "name": "cooperative", + "slug": "cooperative", + "language": "eng", + "games_count": 2323, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + { + "id": 7808, + "name": "steam-trading-cards", + "slug": "steam-trading-cards", + "language": "eng", + "games_count": 7608, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + { + "id": 11669, + "name": "stats", + "slug": "stats", + "language": "eng", + "games_count": 3288, + "image_background": "https://media.rawg.io/media/games/7a2/7a2500ee8b2c0e1ff268bb4479463dea.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/328/3283617cb7d75d67257fc58339188742.jpg" + }, + { + "id": 99018, + "image": "https://media.rawg.io/media/screenshots/221/221a03c11e5ff9f765d62f60d4b4cbf5.jpg" + }, + { + "id": 99019, + "image": "https://media.rawg.io/media/screenshots/173/1737ff43c14f40294011a209b1012875.jpg" + }, + { + "id": 99020, + "image": "https://media.rawg.io/media/screenshots/b11/b11a2ae0664f0e8a1ef2346f99df26e1.jpg" + }, + { + "id": 99021, + "image": "https://media.rawg.io/media/screenshots/9b1/9b107a790909b31918ebe2f40547cc85.jpg" + }, + { + "id": 99022, + "image": "https://media.rawg.io/media/screenshots/d05/d058fc7f7fa6128916c311eb14267fed.jpg" + }, + { + "id": 99023, + "image": "https://media.rawg.io/media/screenshots/415/41543dcc12dffc8e97d85a56ad42cda8.jpg" + } + ] + } + ], + "seo_title": "All Games", + "seo_description": "", + "seo_keywords": "", + "seo_h1": "All Games", + "noindex": false, + "nofollow": false, + "description": "", + "filters": { + "years": [ + { + "from": 2020, + "to": 2020, + "filter": "2020-01-01,2020-12-31", + "decade": 2020, + "years": [ + { + "year": 2020, + "count": 83515, + "nofollow": false + } + ], + "nofollow": true, + "count": 83515 + }, + { + "from": 2010, + "to": 2019, + "filter": "2010-01-01,2019-12-31", + "decade": 2010, + "years": [ + { + "year": 2019, + "count": 79171, + "nofollow": false + }, + { + "year": 2018, + "count": 71173, + "nofollow": false + }, + { + "year": 2017, + "count": 56193, + "nofollow": true + }, + { + "year": 2016, + "count": 41069, + "nofollow": true + }, + { + "year": 2015, + "count": 26228, + "nofollow": true + }, + { + "year": 2014, + "count": 15447, + "nofollow": true + }, + { + "year": 2013, + "count": 6220, + "nofollow": true + }, + { + "year": 2012, + "count": 5267, + "nofollow": true + }, + { + "year": 2011, + "count": 4212, + "nofollow": true + }, + { + "year": 2010, + "count": 3781, + "nofollow": true + } + ], + "nofollow": true, + "count": 308761 + }, + { + "from": 2000, + "to": 2009, + "filter": "2000-01-01,2009-12-31", + "decade": 2000, + "years": [ + { + "year": 2009, + "count": 3009, + "nofollow": true + }, + { + "year": 2008, + "count": 1933, + "nofollow": true + }, + { + "year": 2007, + "count": 1476, + "nofollow": true + }, + { + "year": 2006, + "count": 1193, + "nofollow": true + }, + { + "year": 2005, + "count": 1071, + "nofollow": true + }, + { + "year": 2004, + "count": 1074, + "nofollow": true + }, + { + "year": 2003, + "count": 1063, + "nofollow": true + }, + { + "year": 2002, + "count": 933, + "nofollow": true + }, + { + "year": 2001, + "count": 1054, + "nofollow": true + }, + { + "year": 2000, + "count": 923, + "nofollow": true + } + ], + "nofollow": true, + "count": 13729 + }, + { + "from": 1990, + "to": 1999, + "filter": "1990-01-01,1999-12-31", + "decade": 1990, + "years": [ + { + "year": 1999, + "count": 712, + "nofollow": true + }, + { + "year": 1998, + "count": 653, + "nofollow": true + }, + { + "year": 1997, + "count": 818, + "nofollow": true + }, + { + "year": 1996, + "count": 675, + "nofollow": true + }, + { + "year": 1995, + "count": 806, + "nofollow": true + }, + { + "year": 1994, + "count": 743, + "nofollow": true + }, + { + "year": 1993, + "count": 698, + "nofollow": true + }, + { + "year": 1992, + "count": 606, + "nofollow": true + }, + { + "year": 1991, + "count": 529, + "nofollow": true + }, + { + "year": 1990, + "count": 494, + "nofollow": true + } + ], + "nofollow": true, + "count": 6734 + }, + { + "from": 1980, + "to": 1989, + "filter": "1980-01-01,1989-12-31", + "decade": 1980, + "years": [ + { + "year": 1989, + "count": 388, + "nofollow": true + }, + { + "year": 1988, + "count": 295, + "nofollow": true + }, + { + "year": 1987, + "count": 325, + "nofollow": true + }, + { + "year": 1986, + "count": 239, + "nofollow": true + }, + { + "year": 1985, + "count": 221, + "nofollow": true + }, + { + "year": 1984, + "count": 178, + "nofollow": true + }, + { + "year": 1983, + "count": 202, + "nofollow": true + }, + { + "year": 1982, + "count": 139, + "nofollow": true + }, + { + "year": 1981, + "count": 63, + "nofollow": true + }, + { + "year": 1980, + "count": 33, + "nofollow": true + } + ], + "nofollow": true, + "count": 2083 + }, + { + "from": 1970, + "to": 1979, + "filter": "1970-01-01,1979-12-31", + "decade": 1970, + "years": [ + { + "year": 1979, + "count": 15, + "nofollow": true + }, + { + "year": 1978, + "count": 16, + "nofollow": true + }, + { + "year": 1977, + "count": 12, + "nofollow": true + }, + { + "year": 1976, + "count": 7, + "nofollow": true + }, + { + "year": 1975, + "count": 2, + "nofollow": true + }, + { + "year": 1974, + "count": 1, + "nofollow": true + }, + { + "year": 1973, + "count": 1, + "nofollow": true + }, + { + "year": 1972, + "count": 1, + "nofollow": true + }, + { + "year": 1971, + "count": 5, + "nofollow": true + }, + { + "year": 1970, + "count": 1, + "nofollow": true + } + ], + "nofollow": true, + "count": 61 + }, + { + "from": 1960, + "to": 1969, + "filter": "1960-01-01,1969-12-31", + "decade": 1960, + "years": [ + { + "year": 1962, + "count": 1, + "nofollow": true + } + ], + "nofollow": true, + "count": 1 + } + ] + }, + "nofollow_collections": [ + "stores" + ] +} \ No newline at end of file diff --git a/tests/_data/games.movies.json b/tests/_data/games.movies.json new file mode 100644 index 0000000..d2bde88 --- /dev/null +++ b/tests/_data/games.movies.json @@ -0,0 +1,6 @@ +{ + "count": 0, + "next": null, + "previous": null, + "results": [] +} \ No newline at end of file diff --git a/tests/_data/games.parent-games.json b/tests/_data/games.parent-games.json new file mode 100644 index 0000000..d2bde88 --- /dev/null +++ b/tests/_data/games.parent-games.json @@ -0,0 +1,6 @@ +{ + "count": 0, + "next": null, + "previous": null, + "results": [] +} \ No newline at end of file diff --git a/tests/_data/games.reddit.json b/tests/_data/games.reddit.json new file mode 100644 index 0000000..d2bde88 --- /dev/null +++ b/tests/_data/games.reddit.json @@ -0,0 +1,6 @@ +{ + "count": 0, + "next": null, + "previous": null, + "results": [] +} \ No newline at end of file diff --git a/tests/_data/games.screenshots.json b/tests/_data/games.screenshots.json new file mode 100644 index 0000000..8a0d9cb --- /dev/null +++ b/tests/_data/games.screenshots.json @@ -0,0 +1,49 @@ +{ + "count": 6, + "next": null, + "previous": null, + "results": [ + { + "id": 162566, + "image": "https://media.rawg.io/media/screenshots/a13/a130b342c9830f9c56d65c204638fe17.jpg", + "width": 1280, + "height": 720, + "is_deleted": false + }, + { + "id": 162567, + "image": "https://media.rawg.io/media/screenshots/f38/f38a519f1545ef5cda66676c155cc5b8.jpg", + "width": 1280, + "height": 720, + "is_deleted": false + }, + { + "id": 162568, + "image": "https://media.rawg.io/media/screenshots/996/996d1459d3f2ec1f03daba488d96c521.jpg", + "width": 1280, + "height": 720, + "is_deleted": false + }, + { + "id": 162569, + "image": "https://media.rawg.io/media/screenshots/8da/8daab3b2c3d9e355f636e7d408a08315.jpg", + "width": 1280, + "height": 720, + "is_deleted": false + }, + { + "id": 162570, + "image": "https://media.rawg.io/media/screenshots/f5c/f5c713b706c6b153b6a22ca1b08a1f5a.jpg", + "width": 1280, + "height": 720, + "is_deleted": false + }, + { + "id": 162571, + "image": "https://media.rawg.io/media/screenshots/b7c/b7c32275a6be8134744322f1204ce176.jpg", + "width": 1280, + "height": 720, + "is_deleted": false + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.series.json b/tests/_data/games.series.json new file mode 100644 index 0000000..df98441 --- /dev/null +++ b/tests/_data/games.series.json @@ -0,0 +1,1139 @@ +{ + "count": 4, + "next": "https://api.rawg.io/api/games/4427/game-series?page=2&page_size=3", + "previous": null, + "results": [ + { + "id": 422857, + "slug": "bioshock-2-minervas-den-remastered", + "name": "BioShock 2: Minerva's Den Remastered", + "released": "2016-09-16", + "tba": false, + "background_image": null, + "rating": 0, + "rating_top": 0, + "ratings": [], + "ratings_count": 0, + "reviews_text_count": 0, + "added": 0, + "added_by_status": {}, + "metacritic": null, + "playtime": 0, + "suggestions_count": 0, + "user_game": null, + "reviews_count": 0, + "community_rating": 0, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 7, + "name": "Nintendo Switch", + "slug": "nintendo-switch", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3341, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + "released_at": "2016-09-16", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2016-09-16", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2016-09-16", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251793, + "image_background": "https://media.rawg.io/media/games/88c/88c5b4d7c80276c03ff62aebb1a99ad4.jpg" + }, + "released_at": "2016-09-16", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo", + "slug": "nintendo" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94969, + "image_background": "https://media.rawg.io/media/games/ad2/ad2ffdf80ba993654f31da045bc02456.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "stores": [ + { + "id": 413561, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42622, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + "url_en": "https://store.steampowered.com/app/525720/BioShock_2_Minervas_Den_Remastered/", + "url_ru": null + } + ], + "clip": null, + "tags": [], + "short_screenshots": [] + }, + { + "id": 4062, + "slug": "bioshock-infinite", + "name": "BioShock Infinite", + "released": "2013-03-26", + "tba": false, + "background_image": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg", + "rating": 4.39, + "rating_top": 5, + "ratings": [ + { + "id": 5, + "title": "exceptional", + "count": 1436, + "percent": 55.7 + }, + { + "id": 4, + "title": "recommended", + "count": 847, + "percent": 32.85 + }, + { + "id": 3, + "title": "meh", + "count": 231, + "percent": 8.96 + }, + { + "id": 1, + "title": "skip", + "count": 64, + "percent": 2.48 + } + ], + "ratings_count": 2559, + "reviews_text_count": 12, + "added": 9541, + "added_by_status": { + "yet": 449, + "owned": 5930, + "beaten": 2613, + "toplay": 216, + "dropped": 267, + "playing": 66 + }, + "metacritic": 94, + "playtime": 12, + "suggestions_count": 606, + "user_game": null, + "reviews_count": 2578, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + }, + "requirements_ru": { + "minimum": "Win Vista 32\nCore 2 Duo E4600/Athlon 64 X2 5200+\nGeForce GT 340/Radeon HD 3800\n2 GB RAM\n20 GB HDD", + "recommended": "Win 7 64\nCore 2 Quad Q6600/Athlon II X4 610e\nGeForce GTX 560/Radeon HD 6950\n4 GB RAM\n20 GB HDD" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo Switch", + "slug": "nintendo-switch", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3341, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 39347, + "image_background": "https://media.rawg.io/media/games/b7b/b7b8381707152afc7d91f5d95de70e39.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2013-03-26", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo", + "slug": "nintendo" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "stores": [ + { + "id": 461035, + "store": { + "id": 6, + "name": "Nintendo Store", + "slug": "nintendo", + "domain": "nintendo.com", + "games_count": 7777, + "image_background": "https://media.rawg.io/media/games/e04/e04963f3ac4c4fa83a1dc0b9231e50db.jpg" + }, + "url_en": "https://www.nintendo.com/games/detail/bioshock-infinite-the-complete-edition-switch/", + "url_ru": null + }, + { + "id": 440409, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/p/bioshock-infinite/btc8br7v276x?cid=msft_web_chart", + "url_ru": "" + }, + { + "id": 71727, + "store": { + "id": 4, + "name": "App Store", + "slug": "apple-appstore", + "domain": "apps.apple.com", + "games_count": 65298, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + "url_en": "https://apps.apple.com/us/app/bioshock-infinite/id658448783?mt=12&uo=4", + "url_ru": null + }, + { + "id": 33810, + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + }, + "url_en": "https://marketplace.xbox.com/en-US/Product/BioShock-Infinite/66acd000-77fe-1000-9115-d8025454085d", + "url_ru": null + }, + { + "id": 13084, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "http://store.steampowered.com/app/8870/", + "url_ru": null + }, + { + "id": 4382, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP1001-NPUB31128_00-BSIPSNEFIGSPSCEA", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/151/151157e3bb2dd3e3f1e5fbee39ccc69d.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/675/6757abdfbef0ef1de5bb4ff12cddd854.mp4", + "640": "https://media.rawg.io/media/stories-640/151/151157e3bb2dd3e3f1e5fbee39ccc69d.mp4", + "full": "https://media.rawg.io/media/stories/08b/08bc3708d9cd197262ba60123cfa60f3.mp4" + }, + "video": "PsqD6W818CA", + "preview": "https://media.rawg.io/media/stories-previews/d93/d93cf264a5fbcee92a3c80de89052ba6.jpg" + }, + "tags": [ + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 208, + "name": "Alternate History", + "slug": "alternate-history", + "language": "eng", + "games_count": 629, + "image_background": "https://media.rawg.io/media/games/9eb/9ebae11c9f394b12c24901c9afb867ce.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 40849, + "name": "Steam Cloud", + "slug": "steam-cloud", + "language": "eng", + "games_count": 8804, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 115, + "name": "Controller", + "slug": "controller", + "language": "eng", + "games_count": 4582, + "image_background": "https://media.rawg.io/media/games/8ee/8eed88e297441ef9202b5d1d35d7d86f.jpg" + }, + { + "id": 119, + "name": "Dystopian", + "slug": "dystopian", + "language": "eng", + "games_count": 729, + "image_background": "https://media.rawg.io/media/screenshots/67e/67e5be6ad7a555248f50bd367e9a071c.jpg" + }, + { + "id": 64, + "name": "Fantasy", + "slug": "fantasy", + "language": "eng", + "games_count": 9418, + "image_background": "https://media.rawg.io/media/games/c06/c06d88c35785c8003147cb53c84af033.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 30, + "name": "FPS", + "slug": "fps", + "language": "eng", + "games_count": 5477, + "image_background": "https://media.rawg.io/media/games/c24/c24ec439abf4a2e92f3429dfa83f7f94.jpg" + }, + { + "id": 26, + "name": "Gore", + "slug": "gore", + "language": "eng", + "games_count": 3217, + "image_background": "https://media.rawg.io/media/games/9dd/9ddabb34840ea9227556670606cf8ea3.jpg" + }, + { + "id": 42, + "name": "Great Soundtrack", + "slug": "great-soundtrack", + "language": "eng", + "games_count": 3002, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 305, + "name": "Linear", + "slug": "linear", + "language": "eng", + "games_count": 176, + "image_background": "https://media.rawg.io/media/games/120/1201a40e4364557b124392ee50317b99.jpg" + }, + { + "id": 287, + "name": "Political", + "slug": "political", + "language": "eng", + "games_count": 240, + "image_background": "https://media.rawg.io/media/screenshots/7f7/7f7159db791f6423da090c1359cd672d.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 32, + "name": "Sci-fi", + "slug": "sci-fi", + "language": "eng", + "games_count": 7475, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 154, + "name": "Steampunk", + "slug": "steampunk", + "language": "eng", + "games_count": 612, + "image_background": "https://media.rawg.io/media/games/0b5/0b5410b1e4b3fb72696dcefbf4f1cf40.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + }, + { + "id": 317, + "name": "Time Travel", + "slug": "time-travel", + "language": "eng", + "games_count": 790, + "image_background": "https://media.rawg.io/media/screenshots/120/120530499012ea0149cfe358330b10c9.jpg" + }, + { + "id": 7808, + "name": "steam-trading-cards", + "slug": "steam-trading-cards", + "language": "eng", + "games_count": 7608, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 98549, + "image": "https://media.rawg.io/media/screenshots/bf0/bf07e2c6d2c888d372917d9ef453c8a4.jpg" + }, + { + "id": 98550, + "image": "https://media.rawg.io/media/screenshots/9d3/9d38833952812ad7888a6dc21699934f.jpg" + }, + { + "id": 98551, + "image": "https://media.rawg.io/media/screenshots/595/59572d257b6797986e4eabcd1ee023fd.jpg" + }, + { + "id": 98552, + "image": "https://media.rawg.io/media/screenshots/f71/f71c23eb76f050d6180490e82d58d799.jpg" + }, + { + "id": 98553, + "image": "https://media.rawg.io/media/screenshots/871/8713411d5332ceb2b4092073a6f5f3f2.jpg" + }, + { + "id": 98554, + "image": "https://media.rawg.io/media/screenshots/985/985b56daa78e0a23133518d4226e9f97.jpg" + } + ] + }, + { + "id": 4286, + "slug": "bioshock", + "name": "BioShock", + "released": "2007-08-21", + "tba": false, + "background_image": "https://media.rawg.io/media/games/bc0/bc06a29ceac58652b684deefe7d56099.jpg", + "rating": 4.39, + "rating_top": 5, + "ratings": [ + { + "id": 5, + "title": "exceptional", + "count": 1168, + "percent": 53.73 + }, + { + "id": 4, + "title": "recommended", + "count": 797, + "percent": 36.66 + }, + { + "id": 3, + "title": "meh", + "count": 148, + "percent": 6.81 + }, + { + "id": 1, + "title": "skip", + "count": 61, + "percent": 2.81 + } + ], + "ratings_count": 2155, + "reviews_text_count": 14, + "added": 8694, + "added_by_status": { + "yet": 365, + "owned": 5695, + "beaten": 1972, + "toplay": 163, + "dropped": 413, + "playing": 86 + }, + "metacritic": 96, + "playtime": 3, + "suggestions_count": 642, + "user_game": null, + "reviews_count": 2174, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2010-07-06", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251794, + "image_background": "https://media.rawg.io/media/games/511/5118aff5091cb3efec399c808f8c598f.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": { + "minimum": "

Minimum:

", + "recommended": "

Recommended:

" + }, + "requirements_ru": { + "minimum": "Pentium 4/Athlon 64 2.5 ГГц,1 Гб памяти,3D-ускоритель со 128 Мб памяти и SM 3.0, 7.5 Гб на винчестере, Windows XP SP2 или Vista,Интернет-соединение", + "recommended": "Core 2 Duo/Athlon 64 X2 3 ГГц,2 Гб памяти,3D-ускоритель с 512 Мб памяти и SM 3.0, 7.5 Гб на винчестере, Windows Vista,Интернет-соединение" + } + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 5, + "name": "macOS", + "slug": "macos", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 57222, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 3, + "name": "iOS", + "slug": "ios", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 66842, + "image_background": "https://media.rawg.io/media/games/4cb/4cb855e8ef1578415a928e53c9f51867.png" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 14, + "name": "Xbox 360", + "slug": "xbox360", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 2550, + "image_background": "https://media.rawg.io/media/games/1bb/1bb86c35ffa3eb0d299b01a7c65bf908.jpg" + }, + "released_at": "2007-08-21", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 4, + "name": "iOS", + "slug": "ios" + } + }, + { + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94970, + "image_background": "https://media.rawg.io/media/games/736/73619bd336c894d6941d926bfd563946.jpg" + }, + { + "id": 2, + "name": "Shooter", + "slug": "shooter", + "games_count": 29057, + "image_background": "https://media.rawg.io/media/games/c80/c80bcf321da44d69b18a06c04d942662.jpg" + } + ], + "stores": [ + { + "id": 440407, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/p/bioshock/bncbcs5rjwh7?cid=msft_web_chart", + "url_ru": "" + }, + { + "id": 79531, + "store": { + "id": 4, + "name": "App Store", + "slug": "apple-appstore", + "domain": "apps.apple.com", + "games_count": 65298, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + "url_en": "https://apps.apple.com/us/app/bioshock/id414198302?mt=12&uo=4", + "url_ru": null + }, + { + "id": 4614, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP1001-NPUB30393_00-BIOSHOCKPSN00001", + "url_ru": null + }, + { + "id": 33844, + "store": { + "id": 7, + "name": "Xbox 360 Store", + "slug": "xbox360", + "domain": "marketplace.xbox.com", + "games_count": 1765, + "image_background": "https://media.rawg.io/media/games/b45/b45575f34285f2c4479c9a5f719d972e.jpg" + }, + "url_en": "https://marketplace.xbox.com/en-US/Product/BioShock/66acd000-77fe-1000-9115-d802545407d8", + "url_ru": null + }, + { + "id": 20580, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42623, + "image_background": "https://media.rawg.io/media/games/c4b/c4b0cab189e73432de3a250d8cf1c84e.jpg" + }, + "url_en": "http://store.steampowered.com/app/7670/", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/812/81238e77897b40294fce96e82601aba5.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/6af/6afdafa07a421d6300afcec772559fe0.mp4", + "640": "https://media.rawg.io/media/stories-640/812/81238e77897b40294fce96e82601aba5.mp4", + "full": "https://media.rawg.io/media/stories/f82/f8211f5933005d1c3587f06e9164225d.mp4" + }, + "video": "FoCmjOB0KHo", + "preview": "https://media.rawg.io/media/stories-previews/e4e/e4ef5474302c8e73e4af663aefc84360.jpg" + }, + "tags": [ + { + "id": 97, + "name": "Action RPG", + "slug": "action-rpg", + "language": "eng", + "games_count": 2586, + "image_background": "https://media.rawg.io/media/games/c06/c06d88c35785c8003147cb53c84af033.jpg" + }, + { + "id": 208, + "name": "Alternate History", + "slug": "alternate-history", + "language": "eng", + "games_count": 629, + "image_background": "https://media.rawg.io/media/games/9eb/9ebae11c9f394b12c24901c9afb867ce.jpg" + }, + { + "id": 40845, + "name": "Partial Controller Support", + "slug": "partial-controller-support", + "language": "eng", + "games_count": 6343, + "image_background": "https://media.rawg.io/media/games/c89/c89ca70716080733d03724277df2c6c7.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 193, + "name": "Classic", + "slug": "classic", + "language": "eng", + "games_count": 1459, + "image_background": "https://media.rawg.io/media/games/b7b/b7b8381707152afc7d91f5d95de70e39.jpg" + }, + { + "id": 41, + "name": "Dark", + "slug": "dark", + "language": "eng", + "games_count": 5405, + "image_background": "https://media.rawg.io/media/games/157/15742f2f67eacff546738e1ab5c19d20.jpg" + }, + { + "id": 119, + "name": "Dystopian", + "slug": "dystopian", + "language": "eng", + "games_count": 729, + "image_background": "https://media.rawg.io/media/screenshots/67e/67e5be6ad7a555248f50bd367e9a071c.jpg" + }, + { + "id": 8, + "name": "First-Person", + "slug": "first-person", + "language": "eng", + "games_count": 8234, + "image_background": "https://media.rawg.io/media/games/198/1988a337305e008b41d7f536ce9b73f6.jpg" + }, + { + "id": 30, + "name": "FPS", + "slug": "fps", + "language": "eng", + "games_count": 5477, + "image_background": "https://media.rawg.io/media/games/c24/c24ec439abf4a2e92f3429dfa83f7f94.jpg" + }, + { + "id": 42, + "name": "Great Soundtrack", + "slug": "great-soundtrack", + "language": "eng", + "games_count": 3002, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 16, + "name": "Horror", + "slug": "horror", + "language": "eng", + "games_count": 15044, + "image_background": "https://media.rawg.io/media/games/4ba/4ba9b4b68ffcc7019b112174883ba4d6.jpg" + }, + { + "id": 287, + "name": "Political", + "slug": "political", + "language": "eng", + "games_count": 240, + "image_background": "https://media.rawg.io/media/screenshots/7f7/7f7159db791f6423da090c1359cd672d.jpg" + }, + { + "id": 24, + "name": "RPG", + "slug": "rpg", + "language": "eng", + "games_count": 9829, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + { + "id": 32, + "name": "Sci-fi", + "slug": "sci-fi", + "language": "eng", + "games_count": 7475, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 154, + "name": "Steampunk", + "slug": "steampunk", + "language": "eng", + "games_count": 612, + "image_background": "https://media.rawg.io/media/games/0b5/0b5410b1e4b3fb72696dcefbf4f1cf40.jpg" + }, + { + "id": 118, + "name": "Story Rich", + "slug": "story-rich", + "language": "eng", + "games_count": 7025, + "image_background": "https://media.rawg.io/media/games/16b/16b1b7b36e2042d1128d5a3e852b3b2f.jpg" + }, + { + "id": 250, + "name": "Underwater", + "slug": "underwater", + "language": "eng", + "games_count": 935, + "image_background": "https://media.rawg.io/media/screenshots/5af/5af1974e330a1ba6f4319400dde88129.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/bc0/bc06a29ceac58652b684deefe7d56099.jpg" + }, + { + "id": 170993, + "image": "https://media.rawg.io/media/screenshots/01f/01f62d7064838a5c3202acfc61503487.jpg" + }, + { + "id": 170994, + "image": "https://media.rawg.io/media/screenshots/7f5/7f517e07e36e4af5a7c0b86a7d42853f.jpg" + }, + { + "id": 170995, + "image": "https://media.rawg.io/media/screenshots/aca/aca089b963a42ec4cbf56b5e5334af8e.jpg" + }, + { + "id": 170996, + "image": "https://media.rawg.io/media/screenshots/3aa/3aa6f71eba1d64e671bd45826ca96560.jpg" + }, + { + "id": 170997, + "image": "https://media.rawg.io/media/screenshots/d8e/d8ed29c7c0b41e4013588847944ed446.jpg" + }, + { + "id": 170998, + "image": "https://media.rawg.io/media/screenshots/146/146e418797aca19296f90d259207414c.jpg" + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.stores.json b/tests/_data/games.stores.json new file mode 100644 index 0000000..cfe899a --- /dev/null +++ b/tests/_data/games.stores.json @@ -0,0 +1,37 @@ +{ + "count": 5, + "next": null, + "previous": null, + "results": [ + { + "id": 440408, + "game_id": 4427, + "store_id": 2, + "url": "https://www.microsoft.com/en-us/p/bioshock-2/bp8t903fzl2x?cid=msft_web_chart" + }, + { + "id": 79405, + "game_id": 4427, + "store_id": 4, + "url": "https://apps.apple.com/us/app/bioshock-2/id469377135?mt=12&uo=4" + }, + { + "id": 33604, + "game_id": 4427, + "store_id": 7, + "url": "https://marketplace.xbox.com/en-US/Product/BioShock-2/66acd000-77fe-1000-9115-d8025454082d" + }, + { + "id": 4755, + "game_id": 4427, + "store_id": 3, + "url": "https://store.playstation.com/en-us/product/UP1001-NPUB30392_00-BIOSHOCK2PSN0001" + }, + { + "id": 19732, + "game_id": 4427, + "store_id": 1, + "url": "http://store.steampowered.com/app/8850/" + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.suggested.json b/tests/_data/games.suggested.json new file mode 100644 index 0000000..16d4b7d --- /dev/null +++ b/tests/_data/games.suggested.json @@ -0,0 +1,1052 @@ +{ + "count": 291, + "next": "https://api.rawg.io/api/games/1/suggested?page=2", + "previous": null, + "results": [ + { + "id": 432527, + "slug": "peaky-blinders-mastermind", + "name": "Peaky Blinders: Mastermind", + "released": "2020-06-01", + "tba": false, + "background_image": "https://media.rawg.io/media/screenshots/421/42119c476afe602d7b48805368426a75.jpg", + "rating": 0, + "rating_top": 0, + "ratings": [], + "ratings_count": 0, + "reviews_text_count": 0, + "added": 24, + "added_by_status": { + "yet": 3, + "owned": 13, + "toplay": 8 + }, + "metacritic": null, + "playtime": 1, + "suggestions_count": 509, + "user_game": null, + "reviews_count": 0, + "community_rating": 0, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251793, + "image_background": "https://media.rawg.io/media/games/88c/88c5b4d7c80276c03ff62aebb1a99ad4.jpg" + }, + "released_at": "2020-08-20", + "requirements_en": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + }, + "requirements_ru": null + }, + { + "platform": { + "id": 7, + "name": "Nintendo Switch", + "slug": "nintendo-switch", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3341, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + "released_at": "2020-06-01", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3742, + "image_background": "https://media.rawg.io/media/games/490/49016e06ae2103881ff6373248843069.jpg" + }, + "released_at": "2020-08-20", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 5036, + "image_background": "https://media.rawg.io/media/games/618/618c2031a07bbff6b4f611f10b6bcdbc.jpg" + }, + "released_at": "2020-08-19", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 2, + "name": "PlayStation", + "slug": "playstation" + } + }, + { + "platform": { + "id": 3, + "name": "Xbox", + "slug": "xbox" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo", + "slug": "nintendo" + } + } + ], + "genres": [ + { + "id": 3, + "name": "Adventure", + "slug": "adventure", + "games_count": 65983, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 10, + "name": "Strategy", + "slug": "strategy", + "games_count": 31159, + "image_background": "https://media.rawg.io/media/games/054/0549f1a0a5e782d4e81cdf8d022073fa.jpg" + }, + { + "id": 51, + "name": "Indie", + "slug": "indie", + "games_count": 30468, + "image_background": "https://media.rawg.io/media/games/9fa/9fa63622543e5d4f6d99aa9d73b043de.jpg" + }, + { + "id": 7, + "name": "Puzzle", + "slug": "puzzle", + "games_count": 51292, + "image_background": "https://media.rawg.io/media/games/e07/e07737df8469bf32d132ba9eaffc3461.jpg" + } + ], + "stores": [ + { + "id": 472848, + "store": { + "id": 3, + "name": "PlayStation Store", + "slug": "playstation-store", + "domain": "store.playstation.com", + "games_count": 6681, + "image_background": "https://media.rawg.io/media/games/310/3106b0e012271c5ffb16497b070be739.jpg" + }, + "url_en": "https://store.playstation.com/en-us/product/UP4395-CUSA15236_00-PEAKYBLINDERS000", + "url_ru": "" + }, + { + "id": 464395, + "store": { + "id": 2, + "name": "Xbox Store", + "slug": "xbox-store", + "domain": "microsoft.com", + "games_count": 3356, + "image_background": "https://media.rawg.io/media/games/d69/d69810315bd7e226ea2d21f9156af629.jpg" + }, + "url_en": "https://www.microsoft.com/en-us/p/peaky-blinders-mastermind/9n3jd9j577gq?cid=msft_web_chart", + "url_ru": "" + }, + { + "id": 423650, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42622, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + "url_en": "https://store.steampowered.com/app/1013310/Peaky_Blinders_Mastermind/", + "url_ru": null + } + ], + "clip": { + "clip": "https://media.rawg.io/media/stories-640/85d/85dac068baa13310466a85b18593a05e.mp4", + "clips": { + "320": "https://media.rawg.io/media/stories-320/e93/e93c47f3bc65fc14c40fee60eba19bbc.mp4", + "640": "https://media.rawg.io/media/stories-640/85d/85dac068baa13310466a85b18593a05e.mp4", + "full": "https://media.rawg.io/media/stories/973/973c82b97a25db4743769386d8006bc8.mp4" + }, + "video": "ODz1IA5FLBM", + "preview": "https://media.rawg.io/media/stories-previews/9bd/9bdfa2ae4e82e1c6f87eaa479acb5037.jpg" + }, + "tags": [ + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 40849, + "name": "Steam Cloud", + "slug": "steam-cloud", + "language": "eng", + "games_count": 8804, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + { + "id": 144, + "name": "Crime", + "slug": "crime", + "language": "eng", + "games_count": 1517, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 142, + "name": "Detective", + "slug": "detective", + "language": "eng", + "games_count": 1067, + "image_background": "https://media.rawg.io/media/games/0af/0af85e8edddfa55368e47c539914a220.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 302, + "name": "Time Manipulation", + "slug": "time-manipulation", + "language": "eng", + "games_count": 60, + "image_background": "https://media.rawg.io/media/screenshots/62f/62ffa88bda2ddf991835f583fe7d4bef.jpeg" + }, + { + "id": 61, + "name": "Top-Down", + "slug": "top-down", + "language": "eng", + "games_count": 7721, + "image_background": "https://media.rawg.io/media/screenshots/a65/a65e9f01832997a4d913b3ea86319af4.jpg" + }, + { + "id": 34, + "name": "Violent", + "slug": "violent", + "language": "eng", + "games_count": 3793, + "image_background": "https://media.rawg.io/media/games/5bf/5bf88a28de96321c86561a65ee48e6c2.jpg" + }, + { + "id": 568, + "name": "Time Management", + "slug": "time-management", + "language": "eng", + "games_count": 46, + "image_background": "https://media.rawg.io/media/screenshots/27b/27bd326f0c5d4892247dfbbe0b2a2a4d.jpg" + }, + { + "id": 5140, + "name": "indie-game", + "slug": "indie-game", + "language": "eng", + "games_count": 94, + "image_background": "https://media.rawg.io/media/screenshots/93a/93ada8de22a8c3c00b5073484b70e7e6.jpg" + }, + { + "id": 8657, + "name": "noire", + "slug": "noire", + "language": "eng", + "games_count": 9, + "image_background": "https://media.rawg.io/media/screenshots/f32/f32792e3b6cb094e4a610ff6913611a5.jpg" + }, + { + "id": 14272, + "name": "strategy-action", + "slug": "strategy-action", + "language": "eng", + "games_count": 3, + "image_background": "https://media.rawg.io/media/screenshots/487/48799bae67db636f74ca4d7d57678cfc.jpg" + }, + { + "id": 18894, + "name": "strategy-puzzle", + "slug": "strategy-puzzle", + "language": "eng", + "games_count": 3, + "image_background": "https://media.rawg.io/media/screenshots/bbd/bbd25e44708049d84825bae721641a7f.jpg" + }, + { + "id": 25027, + "name": "tv-series", + "slug": "tv-series", + "language": "eng", + "games_count": 4, + "image_background": "https://media.rawg.io/media/screenshots/74d/74da48af158d3df6b8fd2dd485768c0e.jpg" + }, + { + "id": 43374, + "name": "Remote Play on TV", + "slug": "remote-play-on-tv", + "language": "eng", + "games_count": 61, + "image_background": "https://media.rawg.io/media/games/66d/66d058a6cee7e2a781c00ee111f6f5cb.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/screenshots/421/42119c476afe602d7b48805368426a75.jpg" + }, + { + "id": 2355753, + "image": "https://media.rawg.io/media/screenshots/f81/f817d6ec3f81cb4cf3bc4c8e7d7dc5f3.jpg" + }, + { + "id": 2355754, + "image": "https://media.rawg.io/media/screenshots/a4c/a4c1c1fb2947a8c8fb8a3c743817d4bc.jpg" + }, + { + "id": 2355755, + "image": "https://media.rawg.io/media/screenshots/50d/50da08cecfc6eecda7da31ff105b5557.jpg" + }, + { + "id": 2355756, + "image": "https://media.rawg.io/media/screenshots/458/458f7b50411dce42196e2db66c3e0691.jpg" + }, + { + "id": 2355757, + "image": "https://media.rawg.io/media/screenshots/e42/e4244aa1fa874085caf871a32eb7d663.jpg" + }, + { + "id": 2355758, + "image": "https://media.rawg.io/media/screenshots/351/3513c451b4f259c0dc7ac6621b3c030f.jpg" + } + ], + "short_description": "Peaky Blinders: Mastermind is an indie, adventure, strategy and puzzle game developed by FuturLab. It came out on 01-06-2020. It was published by Curve Digital. \nPeaky Blinders: Mastermind is available on PC, Nintendo Switch, Xbox One and PlayStation 4. You can purchase the game on PlayStation Store, Xbox Store and Steam. \n\n" + }, + { + "id": 62547, + "slug": "super-strawberry-man", + "name": "Super Strawberry Man", + "released": "2018-11-02", + "tba": false, + "background_image": "https://media.rawg.io/media/screenshots/0ac/0ac4499667d4cd5956619d727df41fbc.jpg", + "rating": 0, + "rating_top": 0, + "ratings": [], + "ratings_count": 0, + "reviews_text_count": 0, + "added": 2, + "added_by_status": { + "owned": 2 + }, + "metacritic": null, + "playtime": 0, + "suggestions_count": 295, + "user_game": null, + "reviews_count": 0, + "community_rating": 0, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 39347, + "image_background": "https://media.rawg.io/media/games/b7b/b7b8381707152afc7d91f5d95de70e39.jpg" + }, + "released_at": "2018-11-02", + "requirements_en": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + }, + "requirements_ru": null + }, + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251793, + "image_background": "https://media.rawg.io/media/games/88c/88c5b4d7c80276c03ff62aebb1a99ad4.jpg" + }, + "released_at": "2018-11-02", + "requirements_en": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + }, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 6, + "name": "Linux", + "slug": "linux" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94969, + "image_background": "https://media.rawg.io/media/games/ad2/ad2ffdf80ba993654f31da045bc02456.jpg" + }, + { + "id": 3, + "name": "Adventure", + "slug": "adventure", + "games_count": 65983, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 40, + "name": "Casual", + "slug": "casual", + "games_count": 26372, + "image_background": "https://media.rawg.io/media/games/f15/f15e1dbda32b588a981bbc6b222a4b4c.jpg" + }, + { + "id": 51, + "name": "Indie", + "slug": "indie", + "games_count": 30468, + "image_background": "https://media.rawg.io/media/games/9fa/9fa63622543e5d4f6d99aa9d73b043de.jpg" + }, + { + "id": 83, + "name": "Platformer", + "slug": "platformer", + "games_count": 43069, + "image_background": "https://media.rawg.io/media/games/f8c/f8c6a262ead4c16b47e1219310210eb3.jpg" + } + ], + "stores": [ + { + "id": 398306, + "store": { + "id": 9, + "name": "itch.io", + "slug": "itch", + "domain": "itch.io", + "games_count": 284693, + "image_background": "https://media.rawg.io/media/screenshots/95a/95a557d6dfa6430dd662a136d71e5915.jpg" + }, + "url_en": "https://amaxang-games.itch.io/super-strawberry-man", + "url_ru": null + }, + { + "id": 53470, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42622, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + "url_en": "https://store.steampowered.com/app/914900/", + "url_ru": null + } + ], + "clip": null, + "tags": [ + { + "id": 45, + "name": "2D", + "slug": "2d", + "language": "eng", + "games_count": 74309, + "image_background": "https://media.rawg.io/media/games/f8c/f8c6a262ead4c16b47e1219310210eb3.jpg" + }, + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 69, + "name": "Action-Adventure", + "slug": "action-adventure", + "language": "eng", + "games_count": 5596, + "image_background": "https://media.rawg.io/media/games/fd8/fd882c8267a44621a0de6f9cec77ae90.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 115, + "name": "Controller", + "slug": "controller", + "language": "eng", + "games_count": 4582, + "image_background": "https://media.rawg.io/media/games/8ee/8eed88e297441ef9202b5d1d35d7d86f.jpg" + }, + { + "id": 49, + "name": "Difficult", + "slug": "difficult", + "language": "eng", + "games_count": 6846, + "image_background": "https://media.rawg.io/media/games/48e/48e63bbddeddbe9ba81942772b156664.jpg" + }, + { + "id": 122, + "name": "Pixel Graphics", + "slug": "pixel-graphics", + "language": "eng", + "games_count": 34960, + "image_background": "https://media.rawg.io/media/games/5f4/5f4780690dbf04900cbac5f05b9305f3.jpg" + }, + { + "id": 74, + "name": "Retro", + "slug": "retro", + "language": "eng", + "games_count": 15536, + "image_background": "https://media.rawg.io/media/games/6c0/6c00ee85d1344f58c469e8e47fd8ae7c.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/screenshots/0ac/0ac4499667d4cd5956619d727df41fbc.jpg" + }, + { + "id": 847811, + "image": "https://media.rawg.io/media/screenshots/fd1/fd1b2b1b8e0bba1260db1d0a0462a4db.jpg" + }, + { + "id": 847812, + "image": "https://media.rawg.io/media/screenshots/41b/41b0982f5645c9e3a776c07e53077161.jpg" + }, + { + "id": 847813, + "image": "https://media.rawg.io/media/screenshots/237/237f1409f563849b7ed2182ef6915b2e.jpg" + }, + { + "id": 847814, + "image": "https://media.rawg.io/media/screenshots/740/7409f115415ff0adbdcce40229b0014e.jpg" + }, + { + "id": 847815, + "image": "https://media.rawg.io/media/screenshots/443/44350a8ccfa59e0b26532c6ebded8b1c.jpg" + }, + { + "id": 847816, + "image": "https://media.rawg.io/media/screenshots/18e/18e4ff9214645892b8c92e3149ffbc80.jpg" + } + ], + "short_description": "Super Strawberry Man is a casual, action, adventure and platformer game developed by Anamik Majumdar and AMAXANG GAMES. It came out on 02-11-2018. It was published by Anamik Majumdar. \nYou can play Super Strawberry Man on Linux and PC. You can purchase the game on itch.io and Steam. \n\n" + }, + { + "id": 375197, + "slug": "exit-the-gungeon", + "name": "Exit the Gungeon", + "released": "2020-03-16", + "tba": false, + "background_image": "https://media.rawg.io/media/games/28c/28c4b2b8d8c190e8ba4133bef8f96f83.jpg", + "rating": 3.81, + "rating_top": 4, + "ratings": [ + { + "id": 4, + "title": "recommended", + "count": 18, + "percent": 66.67 + }, + { + "id": 3, + "title": "meh", + "count": 5, + "percent": 18.52 + }, + { + "id": 5, + "title": "exceptional", + "count": 3, + "percent": 11.11 + }, + { + "id": 1, + "title": "skip", + "count": 1, + "percent": 3.7 + } + ], + "ratings_count": 26, + "reviews_text_count": 0, + "added": 120, + "added_by_status": { + "yet": 10, + "owned": 59, + "beaten": 9, + "toplay": 23, + "dropped": 16, + "playing": 3 + }, + "metacritic": null, + "playtime": 2, + "suggestions_count": 450, + "user_game": null, + "reviews_count": 27, + "saturated_color": "0f0f0f", + "dominant_color": "0f0f0f", + "platforms": [ + { + "platform": { + "id": 4, + "name": "PC", + "slug": "pc", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 251793, + "image_background": "https://media.rawg.io/media/games/88c/88c5b4d7c80276c03ff62aebb1a99ad4.jpg" + }, + "released_at": "2020-03-16", + "requirements_en": { + "minimum": "Minimum:
", + "recommended": "Recommended:
" + }, + "requirements_ru": null + }, + { + "platform": { + "id": 3, + "name": "iOS", + "slug": "ios", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 66842, + "image_background": "https://media.rawg.io/media/games/4cb/4cb855e8ef1578415a928e53c9f51867.png" + }, + "released_at": "2020-03-16", + "requirements_en": { + "minimum": "iPhone 5s, iPad Air, iPad Air Cellular, iPad Mini Retina, iPad Mini Retina Cellular, iPhone 6, iPhone 6 Plus, iPad Air 2, iPad Air 2 Cellular, iPad Mini 3, iPad Mini 3 Cellular, iPod Touch Sixth Gen, iPhone 6s, iPhone 6s Plus, iPad Mini 4, iPad Mini 4 Cellular, iPad Pro, iPad Pro Cellular, iPad Pro 9.7, iPad Pro 9.7 Cellular, iPhone SE, iPhone 7, iPhone 7 Plus, iPad 6 1 1, iPad 6 1 2, iPad 7 1, iPad 7 2, iPad 7 3, iPad 7 4, iPhone 8, iPhone 8 Plus, iPhone X, iPad 7 5, iPad 7 6, iPhone X S, iPhone X S Max, iPhone X R, iPad 8 1 2, iPad 8 3 4, iPad 8 5 6, iPad 8 7 8, iPad Mini 5, iPad Mini 5 Cellular, iPad Air 3, iPad Air 3 Cellular, iPod Touch Seventh Gen, iPhone 1 1, iPhone 1 1 Pro, iPad Seventh Gen, iPad Seventh Gen Cellular, iPhone 1 1 Pro Max" + }, + "requirements_ru": null + }, + { + "platform": { + "id": 7, + "name": "Nintendo Switch", + "slug": "nintendo-switch", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 3341, + "image_background": "https://media.rawg.io/media/games/7cf/7cfc9220b401b7a300e409e539c9afd5.jpg" + }, + "released_at": "2020-03-16", + "requirements_en": null, + "requirements_ru": null + }, + { + "platform": { + "id": 5, + "name": "macOS", + "slug": "macos", + "image": null, + "year_end": null, + "year_start": null, + "games_count": 57222, + "image_background": "https://media.rawg.io/media/games/d1a/d1a2e99ade53494c6330a0ed945fe823.jpg" + }, + "released_at": "2020-03-16", + "requirements_en": null, + "requirements_ru": null + } + ], + "parent_platforms": [ + { + "platform": { + "id": 1, + "name": "PC", + "slug": "pc" + } + }, + { + "platform": { + "id": 4, + "name": "iOS", + "slug": "ios" + } + }, + { + "platform": { + "id": 5, + "name": "Apple Macintosh", + "slug": "mac" + } + }, + { + "platform": { + "id": 7, + "name": "Nintendo", + "slug": "nintendo" + } + } + ], + "genres": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 94969, + "image_background": "https://media.rawg.io/media/games/ad2/ad2ffdf80ba993654f31da045bc02456.jpg" + }, + { + "id": 3, + "name": "Adventure", + "slug": "adventure", + "games_count": 65983, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 51, + "name": "Indie", + "slug": "indie", + "games_count": 30468, + "image_background": "https://media.rawg.io/media/games/9fa/9fa63622543e5d4f6d99aa9d73b043de.jpg" + }, + { + "id": 83, + "name": "Platformer", + "slug": "platformer", + "games_count": 43069, + "image_background": "https://media.rawg.io/media/games/f8c/f8c6a262ead4c16b47e1219310210eb3.jpg" + } + ], + "stores": [ + { + "id": 431262, + "store": { + "id": 5, + "name": "GOG", + "slug": "gog", + "domain": "gog.com", + "games_count": 2703, + "image_background": "https://media.rawg.io/media/games/7c4/7c448374df84b607f67ce9182a3a3ca7.jpg" + }, + "url_en": "http://www.gog.com/game/exit_the_gungeon", + "url_ru": "" + }, + { + "id": 418990, + "store": { + "id": 1, + "name": "Steam", + "slug": "steam", + "domain": "store.steampowered.com", + "games_count": 42622, + "image_background": "https://media.rawg.io/media/games/fc1/fc1307a2774506b5bd65d7e8424664a7.jpg" + }, + "url_en": "https://store.steampowered.com/app/1209490/", + "url_ru": "" + }, + { + "id": 410511, + "store": { + "id": 6, + "name": "Nintendo Store", + "slug": "nintendo", + "domain": "nintendo.com", + "games_count": 7777, + "image_background": "https://media.rawg.io/media/games/e04/e04963f3ac4c4fa83a1dc0b9231e50db.jpg" + }, + "url_en": "https://www.nintendo.com/games/detail/exit-the-gungeon-switch/", + "url_ru": null + }, + { + "id": 364743, + "store": { + "id": 4, + "name": "App Store", + "slug": "apple-appstore", + "domain": "apps.apple.com", + "games_count": 65298, + "image_background": "https://media.rawg.io/media/games/588/588c6bdff3d4baf66ec36b1c05b793bf.jpg" + }, + "url_en": "https://apps.apple.com/it/app/exit-the-gungeon/id1445379179", + "url_ru": null + } + ], + "clip": null, + "tags": [ + { + "id": 45, + "name": "2D", + "slug": "2d", + "language": "eng", + "games_count": 74309, + "image_background": "https://media.rawg.io/media/games/f8c/f8c6a262ead4c16b47e1219310210eb3.jpg" + }, + { + "id": 40836, + "name": "Full controller support", + "slug": "full-controller-support", + "language": "eng", + "games_count": 8823, + "image_background": "https://media.rawg.io/media/games/b49/b4912b5dbfc7ed8927b65f05b8507f6c.jpg" + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "language": "eng", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg" + }, + { + "id": 13, + "name": "Atmospheric", + "slug": "atmospheric", + "language": "eng", + "games_count": 9073, + "image_background": "https://media.rawg.io/media/games/91c/91c4f377c1e09755b60a0102c5252843.jpg" + }, + { + "id": 57, + "name": "Bullet Hell", + "slug": "bullet-hell", + "language": "eng", + "games_count": 3229, + "image_background": "https://media.rawg.io/media/screenshots/2b8/2b86c68a911ca1dd4828e22364e077ea.jpg" + }, + { + "id": 49, + "name": "Difficult", + "slug": "difficult", + "language": "eng", + "games_count": 6846, + "image_background": "https://media.rawg.io/media/games/48e/48e63bbddeddbe9ba81942772b156664.jpg" + }, + { + "id": 48, + "name": "Dungeon Crawler", + "slug": "dungeon-crawler", + "language": "eng", + "games_count": 2670, + "image_background": "https://media.rawg.io/media/games/c1e/c1e869edee943ac3f36608b4c019b374.jpg" + }, + { + "id": 4, + "name": "Funny", + "slug": "funny", + "language": "eng", + "games_count": 9656, + "image_background": "https://media.rawg.io/media/games/4a0/4a0a1316102366260e6f38fd2a9cfdce.jpg" + }, + { + "id": 42, + "name": "Great Soundtrack", + "slug": "great-soundtrack", + "language": "eng", + "games_count": 3002, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 98, + "name": "Loot", + "slug": "loot", + "language": "eng", + "games_count": 974, + "image_background": "https://media.rawg.io/media/games/d0f/d0f91fe1d92332147e5db74e207cfc7a.jpg" + }, + { + "id": 122, + "name": "Pixel Graphics", + "slug": "pixel-graphics", + "language": "eng", + "games_count": 34960, + "image_background": "https://media.rawg.io/media/games/5f4/5f4780690dbf04900cbac5f05b9305f3.jpg" + }, + { + "id": 74, + "name": "Retro", + "slug": "retro", + "language": "eng", + "games_count": 15536, + "image_background": "https://media.rawg.io/media/games/6c0/6c00ee85d1344f58c469e8e47fd8ae7c.jpg" + }, + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "language": "eng", + "games_count": 83033, + "image_background": "https://media.rawg.io/media/games/562/562553814dd54e001a541e4ee83a591c.jpg" + }, + { + "id": 640, + "name": "Roguelite", + "slug": "roguelite", + "language": "eng", + "games_count": 1505, + "image_background": "https://media.rawg.io/media/screenshots/929/92962e1c3902b9a89b91c09c8f1a17b2.jpg" + }, + { + "id": 639, + "name": "Roguelike", + "slug": "roguelike", + "language": "eng", + "games_count": 4497, + "image_background": "https://media.rawg.io/media/games/3be/3be0e624424d3453005019799a760af2.jpg" + }, + { + "id": 822, + "name": "escape", + "slug": "escape", + "language": "eng", + "games_count": 4624, + "image_background": "https://media.rawg.io/media/screenshots/808/80846bed4848a50e1ce8ae7ca43fc504.jpg" + }, + { + "id": 981, + "name": "battle", + "slug": "battle", + "language": "eng", + "games_count": 8013, + "image_background": "https://media.rawg.io/media/games/c06/c06edf54c45016c6e5edc2235a29c7d3.jpg" + }, + { + "id": 1190, + "name": "hell", + "slug": "hell", + "language": "eng", + "games_count": 1017, + "image_background": "https://media.rawg.io/media/games/a2d/a2d2720071a92e46db10a095d7c68236.jpg" + }, + { + "id": 2489, + "name": "dodge", + "slug": "dodge", + "language": "eng", + "games_count": 1934, + "image_background": "https://media.rawg.io/media/screenshots/86a/86a1ca92bee366c36e30aad87c0604ee.jpg" + }, + { + "id": 49959, + "name": "2D Platformer", + "slug": "2d-platformer-3", + "language": "eng", + "games_count": 146, + "image_background": "https://media.rawg.io/media/screenshots/315/315567d8ec1a897c7b761db4cdba5a43.jpg" + } + ], + "short_screenshots": [ + { + "id": -1, + "image": "https://media.rawg.io/media/games/28c/28c4b2b8d8c190e8ba4133bef8f96f83.jpg" + }, + { + "id": 2175775, + "image": "https://media.rawg.io/media/screenshots/ccd/ccd328e9103fcd6901f53f80db346e7b.jpg" + }, + { + "id": 2379401, + "image": "https://media.rawg.io/media/screenshots/279/279321662e9bd4fcab84eec39fdc56d5.jpg" + }, + { + "id": 2379402, + "image": "https://media.rawg.io/media/screenshots/a40/a40aab6121ee5457e159d19332ae2536.jpg" + }, + { + "id": 2379403, + "image": "https://media.rawg.io/media/screenshots/918/918a087422583422236456811d9c1687.jpg" + }, + { + "id": 2379404, + "image": "https://media.rawg.io/media/screenshots/ae3/ae364bea967f8a5c08aca19c94e80ea8.jpg" + }, + { + "id": 2379405, + "image": "https://media.rawg.io/media/screenshots/550/550d35776b24a1e4f366d25aed897c71.jpg" + } + ], + "short_description": "Exit the Gungeon is an indie, action, adventure and platformer game developed by Dodge Roll, Devolver and Singlecore. It came out on 16-03-2020. Devolver Digital published the game. The game is rated as \"Recommended\" on RAWG. \nYou can play Exit the Gungeon on PC, iOS, Nintendo Switch and macOS. The game is sold via GOG, Steam, Nintendo eShop and App Store. \n\n" + } + ], + "updated": "2019-08-02T16:25:03", + "seo_text": "If you want to find games like D/Generation HD, we've got you covered. This is a list of games similar to D/Generation HD. If you are looking for something like that, you'll likely enjoy some of these games." +} \ No newline at end of file diff --git a/tests/_data/games.twitch.json b/tests/_data/games.twitch.json new file mode 100644 index 0000000..8048dd8 --- /dev/null +++ b/tests/_data/games.twitch.json @@ -0,0 +1,117 @@ +{ + "count": 11, + "next": "https://api.rawg.io/api/games/1/twitch?page=2", + "previous": null, + "results": [ + { + "id": 1275629, + "external_id": 51138072, + "name": "D/Generation speedrun any% 09:26 WR", + "description": "Finally a decent speed run... Sub 9 is the next goal, of course.", + "created": "2016-02-27T17:59:52Z", + "published": "2016-02-27T17:59:52.266727Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/0f0fac4770_ciscoheat_19859187008_408578432//thumb/thumb51138072-%{width}x%{height}.jpg", + "view_count": 161, + "language": "eng" + }, + { + "id": 1275630, + "external_id": 201137487, + "name": "D/Generation 100% Run", + "description": "", + "created": "2017-11-14T05:49:53Z", + "published": "2017-11-14T06:31:30Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/quantum_hypercharge/201137487/558b8e91-a2b4-4e46-8e3a-cad5a7c18f5f/thumb/index-0000000000-%{width}x%{height}.jpg", + "view_count": 45, + "language": "eng" + }, + { + "id": 1275638, + "external_id": 283582171, + "name": "D/Generation (Any%) in 22:51 by tbcrtwitch - Shots Fired: Annihilation", + "description": "", + "created": "2018-07-12T01:46:24Z", + "published": "2018-07-12T01:46:24Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/97e1ad9b071e27b28a2f_shotsfiredmarathon_29420044496_907422944//thumb/thumb283582171-%{width}x%{height}.jpg", + "view_count": 9, + "language": "eng" + }, + { + "id": 1275632, + "external_id": 277251088, + "name": "Highlight: Practicing 39 min of my life that I will never get back in H I G H D E F I N I T I O N", + "description": "why?", + "created": "2018-06-25T01:48:14Z", + "published": "2018-06-25T01:48:14Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/fbbfd976d9a4615d6d47_tbcrtwitch_29223690480_895150818//thumb/thumb277251088-%{width}x%{height}.jpg", + "view_count": 6, + "language": "eng" + }, + { + "id": 1275633, + "external_id": 48553406, + "name": "D/Gen Single Segment Speedrun-21:17.71", + "description": "after 6 attempts today, i finally get a good run", + "created": "2014-07-02T03:50:21Z", + "published": "2014-07-02T03:50:20.564779Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/943d735e29/tbcrtwitch_10107553104_10107553104/thumb/thumb0-%{width}x%{height}.jpg", + "view_count": 3, + "language": "eng" + }, + { + "id": 1275634, + "external_id": 186740419, + "name": "39 min of your life you are never getting back", + "description": "D/Generation HD any% in 38:24.56\r\n\r\nI was completely out of it during this, so apoligies ahead of time.", + "created": "2017-11-01T06:17:44Z", + "published": "2017-11-01T06:17:44Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/1fd7a59264f48734f783_tbcrtwitch_26620897728_732476299//thumb/thumb186740419-%{width}x%{height}.jpg", + "view_count": 3, + "language": "eng" + }, + { + "id": 1275636, + "external_id": 88545585, + "name": "D/Gen Any% New PB 13:02 (AGDQ Submission)", + "description": "The timer in this video is accidentally stopped for 2 seconds near the end. The actual time was determined from the making of this highlight.\r\n\r\nHoly moly this is a interesting run. So despite using the usual time and date that the typical Any% gives, I was given this item layout. I can't complain, I mean this was 3 min 43 sec faster than my previous PB", + "created": "2016-09-10T05:04:37Z", + "published": "2016-09-10T05:04:37Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/f1e9005d42_tbcrtwitch_23127260752_514121657//thumb/thumb88545585-%{width}x%{height}.jpg", + "view_count": 2, + "language": "eng" + }, + { + "id": 1275637, + "external_id": 282948849, + "name": "17min 36 sec of your life you are never getting back", + "description": "", + "created": "2018-07-10T11:46:16Z", + "published": "2018-07-10T11:46:16Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/7ca76db0c3f490695e85_tbcrtwitch_29414002768_907045336//thumb/thumb282948849-%{width}x%{height}.jpg", + "view_count": 2, + "language": "eng" + }, + { + "id": 1275635, + "external_id": 278824717, + "name": "21 min and 56 sec you are never getting back [HD any% WR]", + "description": "screw this game.", + "created": "2018-06-29T03:45:03Z", + "published": "2018-06-29T03:45:03Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/acd45235666a637254dd_tbcrtwitch_29275999520_898420133//thumb/thumb278824717-%{width}x%{height}.jpg", + "view_count": 2, + "language": "eng" + }, + { + "id": 1275640, + "external_id": 149575446, + "name": "D/Generation - Gameplay [HD]", + "description": "D/Generation is an action adventure/puzzle game. It was released on the PC, Amiga and Atari ST by Mindscape in 1991. It was later ported to the Amiga CD32 in 1993, the new version largely based upon the Amiga version but allowing use of the 6-button CD32 gamepad.\n\nThe game takes place in a slightly cyberpunk futuristic setting in 2021. A French company called Genoq has developed a series of new genetically engineered bioweapons, which have run out of control and taken over Genoq's Singapore lab. The main character is a courier making an emergency delivery by jetpack of an important package to one of Genoq's top researchers, Jean-Paul Derrida (a name likely inspired by the philosopher Jean-Paul Sartre and Jacques Derrida), and who is happily oblivious to the carnage until the lab's doors lock behind him. His customer is ten floors away, all of them crawling with bioweapons. D/Generation's plot begins in Singapore on June 27, 2021 and is told in a \"late to the party\" fashion: the player starts off completely lost at sea, and a picture of past events is gradually built up by examining computer terminals and talking to surviving employees.\n\nThe game presents an isometric point of view of different interconnected, maze-like rooms that the player passes through floor by floor. Each room can require brains, brawn or both. All bioweapons present in a room must be killed and all air duct vents that they enter through sealed before proceeding further. The building's paranoid security system has predictably gone haywire, leaving rotating grenade launcher turrets, land mines, electrified floors and laser fences targeting humans. Less hostile puzzle elements are doors, the switches and computers that control them, keycards, infrared electric eyes and teleporters.\n\nThe courier is soon armed with a laser gun that holds unlimited ammunition and a great puzzle value: its shots bounce off walls, trip switches and travel in teleporters. Finally, surviving Genoq employees and some special items are scattered around the floors. Rescuing a survivor by clearing a room of bioweapons and getting him/her to its entry point in one piece earns an extra life. Bombs are the most prominent item; they can blast through doors and destroy some hazards, making them a kind of a \"get out of puzzle free\" coupon.\nThe number of lives is limited. Losing one restarts the room if any are left, the floor if not. Saving is available, loading returns to the start of the floor.\n\nThe game was ranked the 40th best game of all time by Amiga Power.", + "created": "2017-06-04T23:36:51Z", + "published": "2017-06-12T01:44:01Z", + "thumbnail": "https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/olivieo/149575446/1a29b6ce-b796-4150-8e04-791207f44023/thumb/index-0000000000-%{width}x%{height}.jpg", + "view_count": 0, + "language": "eng" + } + ] +} \ No newline at end of file diff --git a/tests/_data/games.youtube.json b/tests/_data/games.youtube.json new file mode 100644 index 0000000..55e1277 --- /dev/null +++ b/tests/_data/games.youtube.json @@ -0,0 +1,409 @@ +{ + "count": 50, + "next": "https://api.rawg.io/api/games/1/youtube?page=2", + "previous": null, + "results": [ + { + "id": 9687247, + "external_id": "-q_UguhDAu0", + "channel_id": "UCYI18PHXSnK8d3aJem4XueA", + "channel_title": "Wrestling Video Games", + "name": "D-Generation X Cutscenes | WWE Championship", + "description": "DX unites when Triple H and Shawn Michaels team up to take on Evolution, but then on to battle each other for the WWE title at WrestleMania. From WWE ...", + "created": "2018-02-26T22:21:59Z", + "view_count": 1144118, + "comments_count": 359, + "like_count": 6765, + "dislike_count": 426, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/-q_UguhDAu0/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/-q_UguhDAu0/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/-q_UguhDAu0/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/-q_UguhDAu0/sddefault.jpg", + "width": 640, + "height": 480 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/-q_UguhDAu0/maxresdefault.jpg" + } + } + }, + { + "id": 24024747, + "external_id": "_2dZSrGBAL8", + "channel_id": "UCTM1VN-Jz_JpfIFX0yK8u_Q", + "channel_title": "TeemingTubbyEmu", + "name": "WWE 12 Story Mode - Entire D-Generation X Story #1 (Custom Story)", + "description": "LEAVE A LIKE to SHOW YOUR SUPPORT! PREVIOUS/NEXT Video links may be missing! ❖LIVESTREAMS on Twitch! http://www.twitch.tv/tubbyemu ❖Get The ...", + "created": "2012-08-05T22:07:21Z", + "view_count": 255355, + "comments_count": 262, + "like_count": 1460, + "dislike_count": 131, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/_2dZSrGBAL8/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/_2dZSrGBAL8/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/_2dZSrGBAL8/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/_2dZSrGBAL8/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/_2dZSrGBAL8/hqdefault.jpg", + "width": 480, + "height": 360 + } + } + }, + { + "id": 24879513, + "external_id": "4Av2iK8uyJk", + "channel_id": "UCvnHkuLwiGw-u5c9azkOx2g", + "channel_title": "Vishal Techgamers", + "name": "WWE Mayhem D-Generation X VS Brothers of Destruction", + "description": "Hello Friends thanks for supporting so much to my channel and I ensure you that we will increase our Gaming family. Thank You Guys. God Bless ... .. . If You ...", + "created": "2018-11-04T09:13:28Z", + "view_count": 136797, + "comments_count": 68, + "like_count": 1463, + "dislike_count": 171, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/4Av2iK8uyJk/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/4Av2iK8uyJk/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/4Av2iK8uyJk/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/4Av2iK8uyJk/sddefault.jpg", + "width": 640, + "height": 480 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/4Av2iK8uyJk/hqdefault.jpg", + "width": 480, + "height": 360 + } + } + }, + { + "id": 20035202, + "external_id": "EpD0aPruO8k", + "channel_id": "UChYCUXvjwL4D8SWeeWh_IDA", + "channel_title": "Bestintheworld", + "name": "WWE 2K19 - DX Entrance, Signature, Finisher & Victory Scene! ( Updated Attire )", + "description": "The official entrance of D-generation X with entrance, signature & victory scene in WWE 2K19. #WWE2K19 #WWEGAMES #WWE2K Order WWE 2K19 Today ...", + "created": "2018-10-09T17:45:24Z", + "view_count": 89852, + "comments_count": 108, + "like_count": 1313, + "dislike_count": 40, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/EpD0aPruO8k/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/EpD0aPruO8k/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/EpD0aPruO8k/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/EpD0aPruO8k/sddefault.jpg", + "width": 640, + "height": 480 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/EpD0aPruO8k/maxresdefault.jpg" + } + } + }, + { + "id": 24879509, + "external_id": "59PI3IjFOs4", + "channel_id": "UCC1Ipa4NRoBviVO4MwF19tA", + "channel_title": "AntDaGamer*ADG", + "name": "WWE 2K19 | How To Play As DX / Degeneration-X [Step By Step In Depth Tutorial]", + "description": "DX #HowTo #WWE 2K19 : How To Play As DX aka Degeneration-X step by step in-depth tutorial. Support By Checking out https://www.antdagamer.com, ...", + "created": "2018-10-10T20:38:57Z", + "view_count": 38797, + "comments_count": 91, + "like_count": 430, + "dislike_count": 24, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/59PI3IjFOs4/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/59PI3IjFOs4/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/59PI3IjFOs4/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/59PI3IjFOs4/sddefault.jpg", + "width": 640, + "height": 480 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/59PI3IjFOs4/maxresdefault.jpg" + } + } + }, + { + "id": 9687236, + "external_id": "hOvlCFvtuZY", + "channel_id": "UCVi6ofFy7QyJJrZ9l0-fwbQ", + "channel_title": "World-of-Longplays", + "name": "Amiga Longplay D/Generation (CD32)", + "description": "http://www.recordedamigagames.org Played by: Eino Gameplay begins at 2:06. This CD32 version seems to pretty much identical with the AGA version. I played ...", + "created": "2010-07-12T03:37:45Z", + "view_count": 31411, + "comments_count": 43, + "like_count": 242, + "dislike_count": 1, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/hOvlCFvtuZY/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/hOvlCFvtuZY/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/hOvlCFvtuZY/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/hOvlCFvtuZY/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/hOvlCFvtuZY/hqdefault.jpg", + "width": 480, + "height": 360 + } + } + }, + { + "id": 23948342, + "external_id": "tQ3NPTrozGg", + "channel_id": "UCFru6jm7w81BAJYFlRtfxUw", + "channel_title": "Mr LT", + "name": "WWE 2K19 | THE SHIELD vs D-GENERATION X", + "description": "In this episode of wwe 2k19 we have the shield vs DX, roman reigns, deam ambrose and seth rollins will face shawn michaels, triple h and x-pac!", + "created": "2019-03-29T02:00:04Z", + "view_count": 29961, + "comments_count": 67, + "like_count": 441, + "dislike_count": 19, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/tQ3NPTrozGg/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/tQ3NPTrozGg/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/tQ3NPTrozGg/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/tQ3NPTrozGg/sddefault.jpg", + "width": 640, + "height": 480 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/tQ3NPTrozGg/maxresdefault.jpg" + } + } + }, + { + "id": 24879512, + "external_id": "t_4rXsI1aQ8", + "channel_id": "UCTM1VN-Jz_JpfIFX0yK8u_Q", + "channel_title": "TeemingTubbyEmu", + "name": "WWE 12 Story Mode - Entire D-Generation X Story #4 (Custom Story)", + "description": "LEAVE A LIKE to SHOW YOUR SUPPORT! PREVIOUS/NEXT Video links may be missing! ❖LIVESTREAMS on Twitch! http://www.twitch.tv/tubbyemu ❖Get The ...", + "created": "2012-08-15T17:00:13Z", + "view_count": 24783, + "comments_count": 58, + "like_count": 348, + "dislike_count": 9, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/t_4rXsI1aQ8/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/t_4rXsI1aQ8/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/t_4rXsI1aQ8/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/t_4rXsI1aQ8/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/t_4rXsI1aQ8/hqdefault.jpg", + "width": 480, + "height": 360 + } + } + }, + { + "id": 24879507, + "external_id": "Nt3tkjfdTWw", + "channel_id": "UCvnHkuLwiGw-u5c9azkOx2g", + "channel_title": "Vishal Techgamers", + "name": "WWE Mayhem gameplay of D-Generation X "Are you Ready"", + "description": "Like Share Comment Subscribe #VishalTGMayhem #WWEMayhen.", + "created": "2020-02-10T02:24:38Z", + "view_count": 22886, + "comments_count": 16, + "like_count": 376, + "dislike_count": 19, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/Nt3tkjfdTWw/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/Nt3tkjfdTWw/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/Nt3tkjfdTWw/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/Nt3tkjfdTWw/sddefault.jpg", + "width": 640, + "height": 480 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/Nt3tkjfdTWw/hqdefault.jpg", + "width": 480, + "height": 360 + } + } + }, + { + "id": 21782022, + "external_id": "-oA3R8j3CkM", + "channel_id": "UCW7RdWlb5YD6Rsw1JoYF1qg", + "channel_title": "IDO Gaming", + "name": "The Undertaker & John Cena vs D-Generation X- WWE Tag Team Hell In A Cell Match-WWE-2K18-Gameplay", + "description": "The Undertaker & John Cena vs D-Generation X- WWE Tag Team Hell In A Cell Match -- WWE-2K18-Gameplay WWE 2K18 is a professional wrestling video ...", + "created": "2018-05-09T06:23:48Z", + "view_count": 19804, + "comments_count": 3, + "like_count": 220, + "dislike_count": 5, + "favorite_count": 0, + "thumbnails": { + "high": { + "url": "https://i.ytimg.com/vi/-oA3R8j3CkM/hqdefault.jpg", + "width": 480, + "height": 360 + }, + "medium": { + "url": "https://i.ytimg.com/vi/-oA3R8j3CkM/mqdefault.jpg", + "width": 320, + "height": 180 + }, + "default": { + "url": "https://i.ytimg.com/vi/-oA3R8j3CkM/default.jpg", + "width": 120, + "height": 90 + }, + "sddefault": { + "url": "https://i.ytimg.com/vi/-oA3R8j3CkM/sddefault.jpg", + "width": 640, + "height": 480 + }, + "maxresdefault": { + "url": "https://i.ytimg.com/vi/-oA3R8j3CkM/hqdefault.jpg", + "width": 480, + "height": 360 + } + } + } + ] +} \ No newline at end of file diff --git a/tests/_data/genres.genre.json b/tests/_data/genres.genre.json new file mode 100644 index 0000000..81c4681 --- /dev/null +++ b/tests/_data/genres.genre.json @@ -0,0 +1,8 @@ +{ + "id": 1, + "name": "Racing", + "slug": "racing", + "games_count": 15664, + "image_background": "https://media.rawg.io/media/screenshots/376/376c0927f2ff4c5fd38a95d5ff501bba.jpg", + "description": "

Racing games is the video game genre with a high focus on driving competition. Such games are usually presented from the first-person or a third-person perspective. It is noted that gamepads are generally more suited to control the vehicle than keyboard/mouse pair. Although car avatars may render real-life examples, there are many instances where spaceships, formless mechanisms and other fantastical entities take the role of the avatar. Grand Prix released in 1969 is considered to be the first racing game ever made. Racings is a defining genre of a video game which is, in turn, can be divided into a lot of sub-genres: for instance, a primary focus may be made on destroying enemies' vehicles (FlatOut, Twisted Metal) or crushing as many environments as possible (Split/Second). Those mechanics can alternatively be mixed with open world structure or set in the defined assortment of separate racing events.

" +} \ No newline at end of file diff --git a/tests/_data/genres.genres.json b/tests/_data/genres.genres.json new file mode 100644 index 0000000..c48ae95 --- /dev/null +++ b/tests/_data/genres.genres.json @@ -0,0 +1,97 @@ +{ + "count": 19, + "next": "https://api.rawg.io/api/genres?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 4, + "name": "Action", + "slug": "action", + "games_count": 95210, + "image_background": "https://media.rawg.io/media/games/8d6/8d69eb6c32ed6acfd75f82d532144993.jpg", + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 3328, + "slug": "the-witcher-3-wild-hunt", + "name": "The Witcher 3: Wild Hunt", + "added": 10966 + }, + { + "id": 5286, + "slug": "tomb-raider", + "name": "Tomb Raider (2013)", + "added": 10141 + }, + { + "id": 5679, + "slug": "the-elder-scrolls-v-skyrim", + "name": "The Elder Scrolls V: Skyrim", + "added": 10011 + }, + { + "id": 12020, + "slug": "left-4-dead-2", + "name": "Left 4 Dead 2", + "added": 9642 + }, + { + "id": 802, + "slug": "borderlands-2", + "name": "Borderlands 2", + "added": 9614 + } + ] + }, + { + "id": 51, + "name": "Indie", + "slug": "indie", + "games_count": 30470, + "image_background": "https://media.rawg.io/media/games/713/713269608dc8f2f40f5a670a14b2de94.jpg", + "games": [ + { + "id": 1030, + "slug": "limbo", + "name": "Limbo", + "added": 8719 + }, + { + "id": 3272, + "slug": "rocket-league", + "name": "Rocket League", + "added": 7285 + }, + { + "id": 422, + "slug": "terraria", + "name": "Terraria", + "added": 6819 + }, + { + "id": 13668, + "slug": "amnesia-the-dark-descent", + "name": "Amnesia: The Dark Descent", + "added": 6441 + }, + { + "id": 3612, + "slug": "hotline-miami", + "name": "Hotline Miami", + "added": 6409 + }, + { + "id": 3790, + "slug": "outlast", + "name": "Outlast", + "added": 6292 + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/platforms.lists.parents.json b/tests/_data/platforms.lists.parents.json new file mode 100644 index 0000000..8bec0b0 --- /dev/null +++ b/tests/_data/platforms.lists.parents.json @@ -0,0 +1,101 @@ +{ + "count": 14, + "next": "https://api.rawg.io/api/platforms/lists/parents?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 1, + "name": "PC", + "slug": "pc", + "platforms": [ + { + "id": 4, + "name": "PC", + "slug": "pc", + "games_count": 252690, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg", + "image": null, + "year_start": null, + "year_end": null + } + ] + }, + { + "id": 2, + "name": "PlayStation", + "slug": "playstation", + "platforms": [ + { + "id": 187, + "name": "PlayStation 5", + "slug": "playstation5", + "games_count": 74, + "image_background": "https://media.rawg.io/media/games/a8b/a8bf6f31bfbdaf7d4b86c1953c62cee0.jpg", + "image": null, + "year_start": 2020, + "year_end": null + }, + { + "id": 18, + "name": "PlayStation 4", + "slug": "playstation4", + "games_count": 5044, + "image_background": "https://media.rawg.io/media/games/34b/34b1f1850a1c06fd971bc6ab3ac0ce0e.jpg", + "image": null, + "year_start": null, + "year_end": null + }, + { + "id": 16, + "name": "PlayStation 3", + "slug": "playstation3", + "games_count": 3605, + "image_background": "https://media.rawg.io/media/games/c6b/c6bfece1daf8d06bc0a60632ac78e5bf.jpg", + "image": null, + "year_start": null, + "year_end": null + }, + { + "id": 15, + "name": "PlayStation 2", + "slug": "playstation2", + "games_count": 1826, + "image_background": "https://media.rawg.io/media/screenshots/afc/afc146e4644b7a15282e4ad4af9b2444.jpg", + "image": null, + "year_start": null, + "year_end": null + }, + { + "id": 27, + "name": "PlayStation", + "slug": "playstation1", + "games_count": 1510, + "image_background": "https://media.rawg.io/media/games/bc1/bc141ec3f4ca8d1d14f0ab4e4f9e654d.jpg", + "image": null, + "year_start": null, + "year_end": null + }, + { + "id": 19, + "name": "PS Vita", + "slug": "ps-vita", + "games_count": 1921, + "image_background": "https://media.rawg.io/media/games/9fa/9fa63622543e5d4f6d99aa9d73b043de.jpg", + "image": null, + "year_start": null, + "year_end": null + }, + { + "id": 17, + "name": "PSP", + "slug": "psp", + "games_count": 1561, + "image_background": "https://media.rawg.io/media/screenshots/124/124dd314f9effb6cc153589db7975e9a.jpg", + "image": null, + "year_start": null, + "year_end": null + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/platforms.platform.json b/tests/_data/platforms.platform.json new file mode 100644 index 0000000..d17a173 --- /dev/null +++ b/tests/_data/platforms.platform.json @@ -0,0 +1,11 @@ +{ + "id": 1, + "name": "Xbox One", + "slug": "xbox-one", + "games_count": 3751, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg", + "description": "

Xbox One is a home video game console released by Microsoft in 2013. Unlike its main competitor — PlayStation 4, the accent in the development was made in multitasking and using a console as a home media player to watch TV, listen to music and play the games. There is three hardware option available to gamers: original console, One S version (with a smaller body, no external power supply, and native HDR/4k support) and One X (pro-gamer-oriented system with updated hardware and 4k rendering in real time). While PS4 is known for exclusive-orientation, Xbox One's games are mostly multi-platform titles. This supports Microsoft's initial idea to prevent selling used games between the players. However, given the competition from the Sony side, the corporation quickly gave up. Among the notable exclusive games, there are Sunset Overdrive, Halo 5: Guardians and Forza Motorsport 5.

", + "image": null, + "year_start": null, + "year_end": null +} \ No newline at end of file diff --git a/tests/_data/platforms.platforms.json b/tests/_data/platforms.platforms.json new file mode 100644 index 0000000..d66df88 --- /dev/null +++ b/tests/_data/platforms.platforms.json @@ -0,0 +1,103 @@ +{ + "count": 51, + "next": "https://api.rawg.io/api/platforms?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 4, + "name": "PC", + "slug": "pc", + "games_count": 252690, + "image_background": "https://media.rawg.io/media/games/84d/84da2ac3fdfc6507807a1808595afb12.jpg", + "image": null, + "year_start": null, + "year_end": null, + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "added": 11199 + }, + { + "id": 3328, + "slug": "the-witcher-3-wild-hunt", + "name": "The Witcher 3: Wild Hunt", + "added": 10966 + }, + { + "id": 5286, + "slug": "tomb-raider", + "name": "Tomb Raider (2013)", + "added": 10141 + }, + { + "id": 5679, + "slug": "the-elder-scrolls-v-skyrim", + "name": "The Elder Scrolls V: Skyrim", + "added": 10011 + }, + { + "id": 12020, + "slug": "left-4-dead-2", + "name": "Left 4 Dead 2", + "added": 9642 + } + ] + }, + { + "id": 187, + "name": "PlayStation 5", + "slug": "playstation5", + "games_count": 74, + "image_background": "https://media.rawg.io/media/games/a8b/a8bf6f31bfbdaf7d4b86c1953c62cee0.jpg", + "image": null, + "year_start": 2020, + "year_end": null, + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 32, + "slug": "destiny-2", + "name": "Destiny 2", + "added": 7260 + }, + { + "id": 766, + "slug": "warframe", + "name": "Warframe", + "added": 7034 + }, + { + "id": 51325, + "slug": "the-last-of-us-part-2", + "name": "The Last of Us Part II", + "added": 3367 + }, + { + "id": 58812, + "slug": "control", + "name": "Control", + "added": 2970 + }, + { + "id": 41494, + "slug": "cyberpunk-2077", + "name": "Cyberpunk 2077", + "added": 2956 + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/publishers.publisher.json b/tests/_data/publishers.publisher.json new file mode 100644 index 0000000..5a2ac73 --- /dev/null +++ b/tests/_data/publishers.publisher.json @@ -0,0 +1,8 @@ +{ + "id": 1, + "name": "West Coast Software Limited", + "slug": "west-coast-software-limited", + "games_count": 2, + "image_background": "https://media.rawg.io/media/screenshots/592/59280b54d91d4d555a864767a7ac8a4a.jpeg", + "description": "" +} \ No newline at end of file diff --git a/tests/_data/publishers.publishers.json b/tests/_data/publishers.publishers.json new file mode 100644 index 0000000..76d9005 --- /dev/null +++ b/tests/_data/publishers.publishers.json @@ -0,0 +1,97 @@ +{ + "count": 42554, + "next": "https://api.rawg.io/api/publishers?page=2&page_size=2", + "previous": null, + "results": [ + { + "id": 354, + "name": "Electronic Arts", + "slug": "electronic-arts", + "games_count": 1219, + "image_background": "https://media.rawg.io/media/games/d4c/d4cc887fb00426939d091557e2edf63a.jpg", + "games": [ + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "added": 11199 + }, + { + "id": 12020, + "slug": "left-4-dead-2", + "name": "Left 4 Dead 2", + "added": 9642 + }, + { + "id": 4252, + "slug": "mirrors-edge", + "name": "Mirror's Edge", + "added": 6473 + }, + { + "id": 4806, + "slug": "mass-effect-2", + "name": "Mass Effect 2", + "added": 5934 + }, + { + "id": 4570, + "slug": "dead-space", + "name": "Dead Space", + "added": 5759 + }, + { + "id": 4166, + "slug": "mass-effect", + "name": "Mass Effect", + "added": 5519 + } + ] + }, + { + "id": 20987, + "name": "Microsoft Studios", + "slug": "microsoft-studios", + "games_count": 462, + "image_background": "https://media.rawg.io/media/games/c89/c89ca70716080733d03724277df2c6c7.jpg", + "games": [ + { + "id": 1030, + "slug": "limbo", + "name": "Limbo", + "added": 8719 + }, + { + "id": 7689, + "slug": "rise-of-the-tomb-raider", + "name": "Rise of the Tomb Raider", + "added": 6841 + }, + { + "id": 19487, + "slug": "alan-wake", + "name": "Alan Wake", + "added": 6255 + }, + { + "id": 3144, + "slug": "super-meat-boy", + "name": "Super Meat Boy", + "added": 6242 + }, + { + "id": 4166, + "slug": "mass-effect", + "name": "Mass Effect", + "added": 5519 + }, + { + "id": 5525, + "slug": "brutal-legend", + "name": "Brutal Legend", + "added": 5436 + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_data/stores.store.json b/tests/_data/stores.store.json new file mode 100644 index 0000000..a26385e --- /dev/null +++ b/tests/_data/stores.store.json @@ -0,0 +1,9 @@ +{ + "id": 1, + "name": "Steam", + "domain": "store.steampowered.com", + "slug": "steam", + "games_count": 42624, + "image_background": "https://media.rawg.io/media/games/83f/83f6f70a7c1b86cd2637b029d8b42caa.jpg", + "description": "

Steam is an online video game store launched in 2003 by Valve. Games on Steam can be played on PCs, including Windows, Mac, and Linux systems. There are dozens of thousands of titles there with over 100 million active users all over the world. Games on Steam are ranged by genres and popularity; more games are recommended to players depending on their previous purchases. Some games on Steam require special hardware, such as VR-headsets or controllers. Time-limited offers, personal recommendations, and holiday bundles are featured on the main Steam page. Players can add games to their Steam wishlists to track them down and get a notification when they are out.
\nSteam also acts as a social network for PC players that can discuss and rate games and get achievements. In 2018 Valve released Steam TV - a service to stream international game tournaments.

" +} \ No newline at end of file diff --git a/tests/_data/stores.stores.json b/tests/_data/stores.stores.json new file mode 100644 index 0000000..2420b3b --- /dev/null +++ b/tests/_data/stores.stores.json @@ -0,0 +1,105 @@ +{ + "count": 10, + "next": null, + "previous": null, + "results": [ + { + "id": 1, + "name": "Steam", + "domain": "store.steampowered.com", + "slug": "steam", + "games_count": 42624, + "image_background": "https://media.rawg.io/media/games/83f/83f6f70a7c1b86cd2637b029d8b42caa.jpg", + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "added": 11199 + }, + { + "id": 3328, + "slug": "the-witcher-3-wild-hunt", + "name": "The Witcher 3: Wild Hunt", + "added": 10967 + }, + { + "id": 5286, + "slug": "tomb-raider", + "name": "Tomb Raider (2013)", + "added": 10140 + }, + { + "id": 5679, + "slug": "the-elder-scrolls-v-skyrim", + "name": "The Elder Scrolls V: Skyrim", + "added": 10011 + }, + { + "id": 12020, + "slug": "left-4-dead-2", + "name": "Left 4 Dead 2", + "added": 9642 + } + ], + "following": false + }, + { + "id": 3, + "name": "PlayStation Store", + "domain": "store.playstation.com", + "slug": "playstation-store", + "games_count": 6690, + "image_background": "https://media.rawg.io/media/games/f87/f87457e8347484033cb34cde6101d08d.jpg", + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "added": 11199 + }, + { + "id": 3328, + "slug": "the-witcher-3-wild-hunt", + "name": "The Witcher 3: Wild Hunt", + "added": 10967 + }, + { + "id": 5286, + "slug": "tomb-raider", + "name": "Tomb Raider (2013)", + "added": 10140 + }, + { + "id": 5679, + "slug": "the-elder-scrolls-v-skyrim", + "name": "The Elder Scrolls V: Skyrim", + "added": 10011 + }, + { + "id": 802, + "slug": "borderlands-2", + "name": "Borderlands 2", + "added": 9614 + } + ], + "following": false + } + ], + "description": "", + "seo_title": "Stores — video game discovery site", + "seo_description": "Stores — RAWG is a video game discovery site. The most comprehensive database that is powered by personal player experiences.", + "seo_h1": "Stores" +} \ No newline at end of file diff --git a/tests/_data/tags.tag.json b/tests/_data/tags.tag.json new file mode 100644 index 0000000..725962f --- /dev/null +++ b/tests/_data/tags.tag.json @@ -0,0 +1,8 @@ +{ + "id": 1, + "name": "Survival", + "slug": "survival", + "games_count": 3689, + "image_background": "https://media.rawg.io/media/games/48e/48e63bbddeddbe9ba81942772b156664.jpg", + "description": "" +} \ No newline at end of file diff --git a/tests/_data/tags.tags.json b/tests/_data/tags.tags.json new file mode 100644 index 0000000..f692b91 --- /dev/null +++ b/tests/_data/tags.tags.json @@ -0,0 +1,99 @@ +{ + "count": 6211, + "next": "https://api.rawg.io/api/tags?page=2", + "previous": null, + "results": [ + { + "id": 31, + "name": "Singleplayer", + "slug": "singleplayer", + "games_count": 83357, + "image_background": "https://media.rawg.io/media/games/d58/d588947d4286e7b5e0e12e1bea7d9844.jpg", + "language": "eng", + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "added": 11199 + }, + { + "id": 3328, + "slug": "the-witcher-3-wild-hunt", + "name": "The Witcher 3: Wild Hunt", + "added": 10967 + }, + { + "id": 5286, + "slug": "tomb-raider", + "name": "Tomb Raider (2013)", + "added": 10141 + }, + { + "id": 5679, + "slug": "the-elder-scrolls-v-skyrim", + "name": "The Elder Scrolls V: Skyrim", + "added": 10011 + }, + { + "id": 12020, + "slug": "left-4-dead-2", + "name": "Left 4 Dead 2", + "added": 9642 + } + ] + }, + { + "id": 40847, + "name": "Steam Achievements", + "slug": "steam-achievements", + "games_count": 18691, + "image_background": "https://media.rawg.io/media/games/157/15742f2f67eacff546738e1ab5c19d20.jpg", + "language": "eng", + "games": [ + { + "id": 3498, + "slug": "grand-theft-auto-v", + "name": "Grand Theft Auto V", + "added": 12781 + }, + { + "id": 4200, + "slug": "portal-2", + "name": "Portal 2", + "added": 11199 + }, + { + "id": 5679, + "slug": "the-elder-scrolls-v-skyrim", + "name": "The Elder Scrolls V: Skyrim", + "added": 10011 + }, + { + "id": 12020, + "slug": "left-4-dead-2", + "name": "Left 4 Dead 2", + "added": 9642 + }, + { + "id": 802, + "slug": "borderlands-2", + "name": "Borderlands 2", + "added": 9614 + }, + { + "id": 4062, + "slug": "bioshock-infinite", + "name": "BioShock Infinite", + "added": 9541 + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/_output/.gitignore b/tests/_output/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/tests/_output/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/_support/AcceptanceTester.php b/tests/_support/AcceptanceTester.php new file mode 100644 index 0000000..7359a12 --- /dev/null +++ b/tests/_support/AcceptanceTester.php @@ -0,0 +1,26 @@ +fakeClient = new Client([ + 'handler' => $handler + ]); + } + + public function testInit() + { + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $this->fakeClient); + + $this->assertInstanceOf(CreatorsResource::class, $client->creators()); + $this->assertInstanceOf(DevelopersResource::class, $client->developers()); + $this->assertInstanceOf(GamesResource::class, $client->games()); + $this->assertInstanceOf(GenresResource::class, $client->genres()); + $this->assertInstanceOf(PlatformsResource::class, $client->platforms()); + $this->assertInstanceOf(PublishersResource::class, $client->publishers()); + $this->assertInstanceOf(StoresResource::class, $client->stores()); + $this->assertInstanceOf(TagsResource::class, $client->tags()); + } +} diff --git a/tests/unit/ApiExceptionTest.php b/tests/unit/ApiExceptionTest.php new file mode 100644 index 0000000..469fac3 --- /dev/null +++ b/tests/unit/ApiExceptionTest.php @@ -0,0 +1,19 @@ +tester->expectThrowable(ApiException::class, function() { + throw new ApiException(); + }); + } +} diff --git a/tests/unit/ConfigTest.php b/tests/unit/ConfigTest.php new file mode 100644 index 0000000..caa3acf --- /dev/null +++ b/tests/unit/ConfigTest.php @@ -0,0 +1,29 @@ +assertEquals($lang, $cfg->getLanguage()); + $this->assertEquals($appName, $cfg->getAppName()); + $this->assertEquals('https://api.rawg.io/api', $cfg->getBaseUrl()); + } + + public function testDefaultLang() + { + $appName = 'MyApp'; + $cfg = new Config($appName); + $this->assertEquals('en', $cfg->getLanguage()); + } +} diff --git a/tests/unit/DateRangeTest.php b/tests/unit/DateRangeTest.php new file mode 100644 index 0000000..00f1b79 --- /dev/null +++ b/tests/unit/DateRangeTest.php @@ -0,0 +1,31 @@ +assertInstanceOf(DateRange::class, $range); + $this->assertEquals($dateFrom, $range->getFrom()); + $this->assertEquals($dateTo, $range->getTo()); + } + + public function testInit() + { + $dateFrom = new DateTime(); + $dateTo = new DateTime(); + $range = new DateRange($dateFrom, $dateTo); + $this->assertEquals($dateFrom, $range->getFrom()); + $this->assertEquals($dateTo, $range->getTo()); + } +} diff --git a/tests/unit/Filters/GamesFilterTest.php b/tests/unit/Filters/GamesFilterTest.php new file mode 100644 index 0000000..70bed7f --- /dev/null +++ b/tests/unit/Filters/GamesFilterTest.php @@ -0,0 +1,64 @@ + 1, + 'page_size' => 10, + 'ordering' => '-released', + 'search' => 'avatar', + 'parent_platforms' => '1,2,3', + 'platforms' => '4,5,6', + 'stores' => '7,8,9', + 'developers' => '123,456,dmitriy-sviridov', + 'publishers' => '432455,Alex,942', + 'genres' => 'indie,action,91', + 'tags' => 'singleplayer,multiplayer,5', + 'creators' => 'cris-velasco,mike-morasky', + 'dates' => '2010-01-01,2018-12-31.1960-01-01,1969-12-31', + 'platforms_count' => 1252, + 'exclude_collection' => 812, + 'exclude_additions' => true, + 'exclude_parents' => false, + 'exclude_game_series' => true, + ]; + + $filter = new GamesFilter(); + $this->assertInstanceOf(Filter::class, $filter); + $this->assertInstanceOf(GamesFilter::class, $filter->setPage($params['page'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setPageSize($params['page_size'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setOrdering($params['ordering'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setSearch($params['search'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setParentPlatforms(explode(',', $params['parent_platforms']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setPlatforms(explode(',', $params['platforms']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setStores(explode(',', $params['stores']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setDevelopers(explode(',', $params['developers']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setPublishers(explode(',', $params['publishers']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setGenres(explode(',', $params['genres']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setTags(explode(',', $params['tags']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setCreators(explode(',', $params['creators']))); + $this->assertInstanceOf(GamesFilter::class, $filter->setDates([ + DateRange::create(new DateTime('2010-01-01'), new DateTime('2018-12-31')), + DateRange::create(new DateTime('1960-01-01'), new DateTime('1969-12-31')), + ])); + $this->assertInstanceOf(GamesFilter::class, $filter->setPlatformsCount($params['platforms_count'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setExcludeCollection($params['exclude_collection'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setExcludeAdditions($params['exclude_additions'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setExcludeParents($params['exclude_parents'])); + $this->assertInstanceOf(GamesFilter::class, $filter->setExcludeGameSeries($params['exclude_game_series'])); + $this->assertEquals($params, $filter->toArray()); + } +} diff --git a/tests/unit/Filters/OrderingFilterTest.php b/tests/unit/Filters/OrderingFilterTest.php new file mode 100644 index 0000000..dc1395b --- /dev/null +++ b/tests/unit/Filters/OrderingFilterTest.php @@ -0,0 +1,27 @@ +assertInstanceOf(Filter::class, $filter); + $this->assertInstanceOf(OrderingFilter::class, $filter->setPage(1)); + $this->assertInstanceOf(OrderingFilter::class, $filter->setPageSize(10)); + $this->assertInstanceOf(OrderingFilter::class, $filter->setOrdering('-name')); + $this->assertEquals([ + 'page' => 1, + 'page_size' => 10, + 'ordering' => '-name' + ], $filter->toArray()); + } +} diff --git a/tests/unit/Filters/PaginationFilterTest.php b/tests/unit/Filters/PaginationFilterTest.php new file mode 100644 index 0000000..bb3521f --- /dev/null +++ b/tests/unit/Filters/PaginationFilterTest.php @@ -0,0 +1,25 @@ +assertInstanceOf(Filter::class, $filter); + $this->assertInstanceOf(PaginationFilter::class, $filter->setPage(1)); + $this->assertInstanceOf(PaginationFilter::class, $filter->setPageSize(10)); + $this->assertEquals([ + 'page' => 1, + 'page_size' => 10 + ], $filter->toArray()); + } +} diff --git a/tests/unit/Resources/CreatorsResourceTest.php b/tests/unit/Resources/CreatorsResourceTest.php new file mode 100644 index 0000000..7c49583 --- /dev/null +++ b/tests/unit/Resources/CreatorsResourceTest.php @@ -0,0 +1,75 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->creators()->getCreators(new PaginationFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetCreator() + { + $responseBody = file_get_contents('tests/_data/creators.creator.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->creators()->getCreator(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetRoles() + { + $responseBody = file_get_contents('tests/_data/creator-roles.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->creators()->getRoles(new PaginationFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } +} diff --git a/tests/unit/Resources/DevelopersResourceTest.php b/tests/unit/Resources/DevelopersResourceTest.php new file mode 100644 index 0000000..cb2bd8e --- /dev/null +++ b/tests/unit/Resources/DevelopersResourceTest.php @@ -0,0 +1,57 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->developers()->getDevelopers(new PaginationFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetDeveloper() + { + $responseBody = file_get_contents('tests/_data/developers.developer.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->developers()->getDeveloper(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } +} diff --git a/tests/unit/Resources/DummyResource.php b/tests/unit/Resources/DummyResource.php new file mode 100644 index 0000000..6e8fbea --- /dev/null +++ b/tests/unit/Resources/DummyResource.php @@ -0,0 +1,26 @@ +get("/fake", $filter->toArray()); + } +} \ No newline at end of file diff --git a/tests/unit/Resources/GamesResourceTest.php b/tests/unit/Resources/GamesResourceTest.php new file mode 100644 index 0000000..951f419 --- /dev/null +++ b/tests/unit/Resources/GamesResourceTest.php @@ -0,0 +1,276 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getGames(new GamesFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetAdditions() + { + $responseBody = file_get_contents('tests/_data/games.additions.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getAdditions(1, (new PaginationFilter())); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetDevelopmentTeam() + { + $responseBody = file_get_contents('tests/_data/games.development-team.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getDevelopmentTeam(1, (new OrderingFilter())); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetGameSeries() + { + $responseBody = file_get_contents('tests/_data/games.series.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getGameSeries(1, (new PaginationFilter())); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetParentGames() + { + $responseBody = file_get_contents('tests/_data/games.parent-games.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getParentGames(1, (new PaginationFilter())); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetScreenshots() + { + $responseBody = file_get_contents('tests/_data/games.screenshots.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getScreenshots(1, (new OrderingFilter())); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetStores() + { + $responseBody = file_get_contents('tests/_data/games.stores.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getStores(1, (new OrderingFilter())); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetGame() + { + $responseBody = file_get_contents('tests/_data/games.game.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getGame(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetArchievements() + { + $responseBody = file_get_contents('tests/_data/games.archievements.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getArchievements(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetMovies() + { + $responseBody = file_get_contents('tests/_data/games.movies.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getMovies(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetReddit() + { + $responseBody = file_get_contents('tests/_data/games.reddit.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getRedditPosts(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetSuggested() + { + $responseBody = file_get_contents('tests/_data/games.suggested.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getSuggested(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetTwitch() + { + $responseBody = file_get_contents('tests/_data/games.twitch.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getTwitchVideos(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetYoutube() + { + $responseBody = file_get_contents('tests/_data/games.youtube.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->games()->getYoutubeVideos(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + +} diff --git a/tests/unit/Resources/GenresResourceTest.php b/tests/unit/Resources/GenresResourceTest.php new file mode 100644 index 0000000..f2428ca --- /dev/null +++ b/tests/unit/Resources/GenresResourceTest.php @@ -0,0 +1,58 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->genres()->getGenres(new OrderingFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetGenre() + { + $responseBody = file_get_contents('tests/_data/genres.genre.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->genres()->getGenre(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } +} diff --git a/tests/unit/Resources/PlatformsResourceTest.php b/tests/unit/Resources/PlatformsResourceTest.php new file mode 100644 index 0000000..cf73205 --- /dev/null +++ b/tests/unit/Resources/PlatformsResourceTest.php @@ -0,0 +1,75 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->platforms()->getPlatforms(new OrderingFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetPlatform() + { + $responseBody = file_get_contents('tests/_data/platforms.platform.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->platforms()->getPlatform(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetListsParents() + { + $responseBody = file_get_contents('tests/_data/platforms.lists.parents.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->platforms()->getPlatformsParents(new OrderingFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } +} diff --git a/tests/unit/Resources/PublishersResourceTest.php b/tests/unit/Resources/PublishersResourceTest.php new file mode 100644 index 0000000..4a71d6a --- /dev/null +++ b/tests/unit/Resources/PublishersResourceTest.php @@ -0,0 +1,57 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->publishers()->getPublishers(new PaginationFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetPublisher() + { + $responseBody = file_get_contents('tests/_data/publishers.publisher.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->publishers()->getPublisher(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } +} diff --git a/tests/unit/Resources/ResourceTest.php b/tests/unit/Resources/ResourceTest.php new file mode 100644 index 0000000..cd4f98e --- /dev/null +++ b/tests/unit/Resources/ResourceTest.php @@ -0,0 +1,125 @@ +push($historyMiddleware); + + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config($appName, 'en'); + $dummyResource = new DummyResource($cfg, $client); + $dummyResource->getFakeData(new OrderingFilter()); + + /** + * @var Request $historyRequest + */ + $historyRequest = $history[0]['request']; + $uaHeader = $historyRequest->getHeader('User-Agent'); + $this->assertEquals(1, count($uaHeader)); + $this->assertEquals($appName, $uaHeader[0]); + } + + public function testLanguage() + { + $language = 'ru'; + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], '') + ]); + $handler = HandlerStack::create($mock); + + $history = []; + $historyMiddleware = Middleware::history($history); + $handler->push($historyMiddleware); + + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('FakeApp', $language); + $dummyResource = new DummyResource($cfg, $client); + $dummyResource->getFakeData(new OrderingFilter()); + + /** + * @var Request $historyRequest + */ + $historyRequest = $history[0]['request']; + $this->assertEquals('page=1&page_size=20&lang=ru', $historyRequest->getUri()->getQuery()); + } + + public function testException() + { + $appName = 'FakeApp'; + $mock = new MockHandler([ + new Response(Status::HTTP_FORBIDDEN, [], '') + ]); + $handler = HandlerStack::create($mock); + + $history = []; + $historyMiddleware = Middleware::history($history); + $handler->push($historyMiddleware); + + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config($appName, 'en'); + $dummyResource = new DummyResource($cfg, $client); + + $this->tester->expectThrowable(ApiException::class, function() use ($dummyResource) { + $dummyResource->getFakeData(new OrderingFilter()); + }); + } + + public function testQueryParams() + { + $appName = 'FakeApp'; + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], ''), + new Response(Status::HTTP_OK, [], '') + ]); + $handler = HandlerStack::create($mock); + + $history = []; + $historyMiddleware = Middleware::history($history); + $handler->push($historyMiddleware); + + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config($appName, 'en'); + $dummyResource = new DummyResource($cfg, $client); + $dummyResource->getFakeData(new OrderingFilter()); + $dummyResource->getFakeData((new OrderingFilter())->setOrdering('name')); + + $this->assertEquals('page=1&page_size=20&lang=en', $history[0]['request']->getUri()->getQuery()); + $this->assertEquals('page=1&page_size=20&ordering=name&lang=en', $history[1]['request']->getUri()->getQuery()); + } +} diff --git a/tests/unit/Resources/StoresResourceTest.php b/tests/unit/Resources/StoresResourceTest.php new file mode 100644 index 0000000..d476f6d --- /dev/null +++ b/tests/unit/Resources/StoresResourceTest.php @@ -0,0 +1,57 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + $response = $client->stores()->getStores(new OrderingFilter()); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } + + public function testGetStore() + { + $responseBody = file_get_contents('tests/_data/stores.store.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + $client = new Client([ + 'handler' => $handler + ]); + + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $response = $client->stores()->getStore(1); + $this->assertEquals(json_decode($responseBody, true), $response->getData()); + $this->assertEquals(Status::HTTP_OK, $response->getResponse()->getStatusCode()); + } +} diff --git a/tests/unit/Resources/TagsResourceTest.php b/tests/unit/Resources/TagsResourceTest.php new file mode 100644 index 0000000..0e471f3 --- /dev/null +++ b/tests/unit/Resources/TagsResourceTest.php @@ -0,0 +1,59 @@ + $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $tagsResponse = $client->tags()->getTags((new PaginationFilter())); + $this->assertEquals(json_decode($responseBody, true), $tagsResponse->getData()); + $this->assertEquals(Status::HTTP_OK, $tagsResponse->getResponse()->getStatusCode()); + } + + public function testGetTag() + { + $responseBody = file_get_contents('tests/_data/tags.tag.json'); + $mock = new MockHandler([ + new Response(Status::HTTP_OK, [], $responseBody) + ]); + $handler = HandlerStack::create($mock); + + $client = new Client([ + 'handler' => $handler + ]); + $cfg = new Config('MyApp', 'en'); + $client = new ApiClient($cfg, $client); + + $tagsResponse = $client->tags()->getTag(1); + $this->assertEquals(json_decode($responseBody, true), $tagsResponse->getData()); + $this->assertEquals(Status::HTTP_OK, $tagsResponse->getResponse()->getStatusCode()); + } +} diff --git a/tests/unit/_bootstrap.php b/tests/unit/_bootstrap.php new file mode 100644 index 0000000..10a1f72 --- /dev/null +++ b/tests/unit/_bootstrap.php @@ -0,0 +1,3 @@ +