Version 5.1 - All the GraphQL #32

Closed
timw4mail wants to merge 1160 commits from develop into master
31 changed files with 119 additions and 122 deletions
Showing only changes of commit 55cabc5840 - Show all commits

View File

@ -26,7 +26,7 @@ $ROOT_DIR = realpath("{$APP_DIR}/../");
$tomlConfig = loadToml(__DIR__); $tomlConfig = loadToml(__DIR__);
$base_config = array_merge($tomlConfig, [ return array_merge($tomlConfig, [
'asset_dir' => "{$ROOT_DIR}/public", 'asset_dir' => "{$ROOT_DIR}/public",
// Template file path // Template file path

View File

@ -36,7 +36,7 @@ use Zend\Diactoros\{Response, ServerRequestFactory};
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Setup DI container // Setup DI container
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
return function(array $configArray = []) { return function (array $configArray = []) {
$container = new Container(); $container = new Container();
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
@ -49,7 +49,7 @@ return function(array $configArray = []) {
$kitsuRequestLogger->pushHandler(new RotatingFileHandler(__DIR__ . '/logs/kitsu_request.log', Logger::NOTICE)); $kitsuRequestLogger->pushHandler(new RotatingFileHandler(__DIR__ . '/logs/kitsu_request.log', Logger::NOTICE));
$malRequestLogger = new Logger('mal-request'); $malRequestLogger = new Logger('mal-request');
$malRequestLogger->pushHandler(new RotatingFileHandler(__DIR__ . '/logs/mal_request.log', Logger::NOTICE)); $malRequestLogger->pushHandler(new RotatingFileHandler(__DIR__ . '/logs/mal_request.log', Logger::NOTICE));
$container->setLogger($appLogger, 'default'); $container->setLogger($appLogger);
$container->setLogger($kitsuRequestLogger, 'kitsu-request'); $container->setLogger($kitsuRequestLogger, 'kitsu-request');
$container->setLogger($malRequestLogger, 'mal-request'); $container->setLogger($malRequestLogger, 'mal-request');

View File

@ -52,7 +52,7 @@
"clean": "vendor/bin/robo clean", "clean": "vendor/bin/robo clean",
"coverage": "phpdbg -qrr -- vendor/bin/phpunit -c build", "coverage": "phpdbg -qrr -- vendor/bin/phpunit -c build",
"docs": "vendor/bin/phpdox", "docs": "vendor/bin/phpdox",
"phpstan": "phpstan analyse src tests", "phpstan": "phpstan analyse -l 3 ./phpstan.neon src tests",
"watch:css": "cd public && npm run watch", "watch:css": "cd public && npm run watch",
"test": "vendor/bin/phpunit" "test": "vendor/bin/phpunit"
} }

View File

@ -40,8 +40,8 @@ $CONF_DIR = _dir($APP_DIR, 'config');
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Dependency Injection setup // Dependency Injection setup
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
require_once $APPCONF_DIR . '/base_config.php'; // $base_config $base_config = require $APPCONF_DIR . '/base_config.php';
$di = require $APP_DIR . '/bootstrap.php'; $di = require_once $APP_DIR . '/bootstrap.php';
$config = loadToml($CONF_DIR); $config = loadToml($CONF_DIR);
$config_array = array_merge($base_config, $config); $config_array = array_merge($base_config, $config);

7
phpstan.neon Normal file
View File

@ -0,0 +1,7 @@
parameters:
ignoreErrors:
- '#Access to an undefined property Aviat\\\Ion\\\Friend::\$[a-zA-Z0-9_]+#'
- '#Call to an undefined method Aviat\\\Ion\\\Friend:[a-zA-Z0-9_]+\(\)#'
- '#Call to an undefined method Aura\\\Html\\\HelperLocator:[a-zA-Z0-9_]+\(\)#'
excludes_analyze:
- %rootDir%/test_views/*

View File

@ -30,15 +30,7 @@ use Amp\{
TimeoutCancellationToken TimeoutCancellationToken
}; };
use Amp\Artax\{ use Amp\Artax\{
ConnectionInfo, ConnectionInfo, Client, DnsException, HttpException, HttpSocketPool, MetaInfo, ParseException, RequestBody, Response, Request, SocketException, TimeoutException, TlsInfo, TooManyRedirectsException
Client,
HttpException,
HttpSocketPool,
MetaInfo,
Response,
Request,
TimeoutException,
TlsInfo
}; };
use Amp\Artax\Cookie\{ use Amp\Artax\Cookie\{
Cookie, Cookie,

View File

@ -44,7 +44,7 @@ class JsonAPI {
* Inline all included data * Inline all included data
* *
* @param array $data - The raw JsonAPI response data * @param array $data - The raw JsonAPI response data
* @return data * @return array
*/ */
public static function organizeData(array $data): array public static function organizeData(array $data): array
{ {
@ -54,7 +54,7 @@ class JsonAPI {
]; ];
// Reorganize included data // Reorganize included data
$included = (array_key_exists('included', $data)) $included = array_key_exists('included', $data)
? static::organizeIncluded($data['included']) ? static::organizeIncluded($data['included'])
: []; : [];

View File

@ -116,7 +116,7 @@ class Model {
] ]
]); ]);
$data = Json::decode(wait($response->getBody())); $data = Json::decode(wait($response->getBody()));
//dump($response); //dump($response);
if (array_key_exists('access_token', $data)) if (array_key_exists('access_token', $data))
@ -763,7 +763,7 @@ class Model {
* Get the mal id for the manga represented by the kitsu id * Get the mal id for the manga represented by the kitsu id
* to enable updating MyAnimeList * to enable updating MyAnimeList
* *
* @param string $kitsuAnimeId The id of the anime on Kitsu * @param string $kitsuMangaId The id of the manga on Kitsu
* @return string|null Returns the mal id if it exists, otherwise null * @return string|null Returns the mal id if it exists, otherwise null
*/ */
public function getMalIdForManga(string $kitsuMangaId) public function getMalIdForManga(string $kitsuMangaId)

View File

@ -27,7 +27,7 @@ interface ListItemInterface {
* Create a list item * Create a list item
* *
* @param array $data - * @param array $data -
* @return bool * @return Request
*/ */
public function create(array $data): Request; public function create(array $data): Request;
@ -44,7 +44,7 @@ interface ListItemInterface {
* *
* @param string $id - The id of the list item to update * @param string $id - The id of the list item to update
* @param array $data - The data with which to update the list item * @param array $data - The data with which to update the list item
* @return Response * @return Request
*/ */
public function update(string $id, array $data): Request; public function update(string $id, array $data): Request;
@ -52,7 +52,7 @@ interface ListItemInterface {
* Delete a list item * Delete a list item
* *
* @param string $id - The id of the list item to delete * @param string $id - The id of the list item to delete
* @return bool * @return Request
*/ */
public function delete(string $id): Request; public function delete(string $id): Request;
} }

View File

@ -38,6 +38,11 @@ class Model {
*/ */
protected $animeListTransformer; protected $animeListTransformer;
/**
* @var MangaListTransformer
*/
protected $mangaListTransformer;
/** /**
* @var ListItem * @var ListItem
*/ */
@ -76,6 +81,8 @@ class Model {
*/ */
public function createListItem(array $data, string $type = 'anime'): Request public function createListItem(array $data, string $type = 'anime'): Request
{ {
$createData = [];
if ($type === 'anime') if ($type === 'anime')
{ {
$createData = [ $createData = [
@ -119,7 +126,7 @@ class Model {
] ]
]); ]);
return (array_key_exists($type, $list['myanimelist'])) return array_key_exists($type, $list['myanimelist'])
? $list['myanimelist'][$type] ? $list['myanimelist'][$type]
: []; : [];
} }
@ -146,6 +153,8 @@ class Model {
*/ */
public function updateListItem(array $data, string $type = 'anime'): Request public function updateListItem(array $data, string $type = 'anime'): Request
{ {
$updateData = [];
if ($type === 'anime') if ($type === 'anime')
{ {
$updateData = $this->animeListTransformer->untransform($data); $updateData = $this->animeListTransformer->untransform($data);

View File

@ -34,7 +34,7 @@ class ParallelAPIRequest {
/** /**
* Add a request * Add a request
* *
* @param string|Request $request * @param string|\Amp\Artax\Request $request
* @param string|number $key * @param string|number $key
* @return self * @return self
*/ */
@ -53,7 +53,7 @@ class ParallelAPIRequest {
/** /**
* Add multiple requests * Add multiple requests
* *
* @param string[]|Request[] $requests * @param string[]|\Amp\Artax\Request[] $requests
* @return self * @return self
*/ */
public function addRequests(array $requests): self public function addRequests(array $requests): self

View File

@ -16,7 +16,7 @@
namespace Aviat\AnimeClient\API; namespace Aviat\AnimeClient\API;
use DOMDocument, DOMNode, DOMNodelist; use DOMDocument, DOMNode, DOMNodeList;
/** /**
* XML <=> PHP Array codec * XML <=> PHP Array codec
@ -180,7 +180,7 @@ class XML {
// except for the xml declaration tag, Which looks // except for the xml declaration tag, Which looks
// something like: // something like:
/* <?xml version="1.0" encoding="UTF-8"?> */ /* <?xml version="1.0" encoding="UTF-8"?> */
return preg_replace('/([^\?])>\s+</', '$1><', $xml); return preg_replace('/([^\?])>\s+</', '$1><', $xml);
} }

View File

@ -18,15 +18,15 @@ namespace Aviat\AnimeClient;
use Yosymfony\Toml\Toml; use Yosymfony\Toml\Toml;
if ( ! defined('SRC_DIR')) if ( ! \defined('SRC_DIR'))
{ {
\define('SRC_DIR', \realpath(__DIR__)); \define('SRC_DIR', \realpath(__DIR__));
} }
const SESSION_SEGMENT = 'Aviat\AnimeClient\Auth'; const SESSION_SEGMENT = 'Aviat\AnimeClient\Auth';
const DEFAULT_CONTROLLER = 'Aviat\AnimeClient\Controller\Index'; const DEFAULT_CONTROLLER = Controller\Index::class;
const DEFAULT_CONTROLLER_NAMESPACE = 'Aviat\AnimeClient\Controller'; const DEFAULT_CONTROLLER_NAMESPACE = Controller::class;
const DEFAULT_LIST_CONTROLLER = 'Aviat\AnimeClient\Controller\Anime'; const DEFAULT_LIST_CONTROLLER = Controller\Anime::class;
const DEFAULT_CONTROLLER_METHOD = 'index'; const DEFAULT_CONTROLLER_METHOD = 'index';
const NOT_FOUND_METHOD = 'notFound'; const NOT_FOUND_METHOD = 'notFound';
const ERROR_MESSAGE_METHOD = 'errorPage'; const ERROR_MESSAGE_METHOD = 'errorPage';

View File

@ -19,11 +19,7 @@ namespace Aviat\AnimeClient\Command;
use function Aviat\AnimeClient\loadToml; use function Aviat\AnimeClient\loadToml;
use Aura\Session\SessionFactory; use Aura\Session\SessionFactory;
use Aviat\AnimeClient\{ use Aviat\AnimeClient\Util;
AnimeClient,
Model,
Util
};
use Aviat\AnimeClient\API\CacheTrait; use Aviat\AnimeClient\API\CacheTrait;
use Aviat\AnimeClient\API\{Kitsu, MAL}; use Aviat\AnimeClient\API\{Kitsu, MAL};
use Aviat\AnimeClient\API\Kitsu\KitsuRequestBuilder; use Aviat\AnimeClient\API\Kitsu\KitsuRequestBuilder;
@ -67,7 +63,7 @@ class BaseCommand extends Command {
$APP_DIR = realpath(__DIR__ . '/../../app'); $APP_DIR = realpath(__DIR__ . '/../../app');
$APPCONF_DIR = realpath("{$APP_DIR}/appConf/"); $APPCONF_DIR = realpath("{$APP_DIR}/appConf/");
$CONF_DIR = realpath("{$APP_DIR}/config/"); $CONF_DIR = realpath("{$APP_DIR}/config/");
require_once $APPCONF_DIR . '/base_config.php'; // $base_config $base_config = require_once $APPCONF_DIR . '/base_config.php';
$config = loadToml($CONF_DIR); $config = loadToml($CONF_DIR);
$config_array = array_merge($base_config, $config); $config_array = array_merge($base_config, $config);
@ -85,7 +81,7 @@ class BaseCommand extends Command {
$kitsu_request_logger->pushHandler(new RotatingFileHandler($APP_DIR . '/logs/kitsu_request-cli.log', Logger::NOTICE)); $kitsu_request_logger->pushHandler(new RotatingFileHandler($APP_DIR . '/logs/kitsu_request-cli.log', Logger::NOTICE));
$mal_request_logger = new Logger('mal-request'); $mal_request_logger = new Logger('mal-request');
$mal_request_logger->pushHandler(new RotatingFileHandler($APP_DIR . '/logs/mal_request-cli.log', Logger::NOTICE)); $mal_request_logger->pushHandler(new RotatingFileHandler($APP_DIR . '/logs/mal_request-cli.log', Logger::NOTICE));
$container->setLogger($app_logger, 'default'); $container->setLogger($app_logger);
$container->setLogger($kitsu_request_logger, 'kitsu-request'); $container->setLogger($kitsu_request_logger, 'kitsu-request');
$container->setLogger($mal_request_logger, 'mal-request'); $container->setLogger($mal_request_logger, 'mal-request');

View File

@ -51,7 +51,6 @@ class SyncKitsuWithMal extends BaseCommand {
* @param array $args * @param array $args
* @param array $options * @param array $options
* @return void * @return void
* @throws \ConsoleKit\ConsoleException
*/ */
public function execute(array $args, array $options = []) public function execute(array $args, array $options = [])
{ {
@ -80,6 +79,7 @@ class SyncKitsuWithMal extends BaseCommand {
); );
} }
$kitsuCount = 0;
try try
{ {
$kitsuCount = $this->kitsuModel->{"get{$uType}ListCount"}(); $kitsuCount = $this->kitsuModel->{"get{$uType}ListCount"}();

View File

@ -18,15 +18,20 @@ namespace Aviat\AnimeClient;
use function Aviat\Ion\_dir; use function Aviat\Ion\_dir;
use Aviat\Ion\Di\{ContainerAware, ContainerInterface}; use Aviat\Ion\Di\{
ContainerAware,
ContainerInterface
};
use Aviat\Ion\Di\Exception\{
ContainerException,
NotFoundException
};
use Aviat\Ion\Exception\DoubleRenderException; use Aviat\Ion\Exception\DoubleRenderException;
use Aviat\Ion\View\{HtmlView, HttpView, JsonView}; use Aviat\Ion\View\{HtmlView, HttpView, JsonView};
use InvalidArgumentException; use InvalidArgumentException;
/** /**
* Controller base, defines output methods * Controller base, defines output methods
*
* @property $response Response object
*/ */
class Controller { class Controller {
@ -46,22 +51,16 @@ class Controller {
/** /**
* Request object * Request object
* @var object $request * @var \Psr\Http\Message\ServerRequestInterface $request
*/ */
protected $request; protected $request;
/** /**
* Response object * Response object
* @var object $response * @var \Psr\Http\Message\ResponseInterface $response
*/ */
public $response; public $response;
/**
* The api model for the current controller
* @var object
*/
protected $model;
/** /**
* Url generation class * Url generation class
* @var UrlGenerator * @var UrlGenerator
@ -94,8 +93,8 @@ class Controller {
* Constructor * Constructor
* *
* @param ContainerInterface $container * @param ContainerInterface $container
* @throws \Aviat\Ion\Di\ContainerException * @throws ContainerException
* @throws \Aviat\Ion\Di\NotFoundException * @throws NotFoundException
*/ */
public function __construct(ContainerInterface $container) public function __construct(ContainerInterface $container)
{ {
@ -146,8 +145,8 @@ class Controller {
* Set the current url in the session as the target of a future redirect * Set the current url in the session as the target of a future redirect
* *
* @param string|null $url * @param string|null $url
* @throws \Aviat\Ion\Di\ContainerException * @throws ContainerException
* @throws \Aviat\Ion\Di\NotFoundException * @throws NotFoundException
* @return void * @return void
*/ */
public function setSessionRedirect(string $url = NULL) public function setSessionRedirect(string $url = NULL)
@ -174,7 +173,7 @@ class Controller {
if (null === $url) if (null === $url)
{ {
$url = $util->isViewPage() $url = $util->isViewPage()
? $this->request->url->get() ? $this->request->getUri()->__toString()
: $serverParams['HTTP_REFERER']; : $serverParams['HTTP_REFERER'];
} }

View File

@ -17,10 +17,8 @@
namespace Aviat\AnimeClient\Controller; namespace Aviat\AnimeClient\Controller;
use Aviat\AnimeClient\Controller as BaseController; use Aviat\AnimeClient\Controller as BaseController;
use Aviat\AnimeClient\API\Kitsu\{ use Aviat\AnimeClient\API\Kitsu\Transformer\AnimeListTransformer;
Enum\AnimeWatchingStatus as KitsuWatchingStatus, use Aviat\AnimeClient\API\Enum\AnimeWatchingStatus\Kitsu as KitsuWatchingStatus;
Transformer\AnimeListTransformer
};
use Aviat\AnimeClient\API\Mapping\AnimeWatchingStatus; use Aviat\AnimeClient\API\Mapping\AnimeWatchingStatus;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
use Aviat\Ion\Json; use Aviat\Ion\Json;
@ -35,22 +33,10 @@ class Anime extends BaseController {
/** /**
* The anime list model * The anime list model
* @var object $model * @var \Aviat\AnimeClient\Model\Anime $model
*/ */
protected $model; protected $model;
/**
* Data to be sent to all routes in this controller
* @var array $baseData
*/
protected $baseData;
/**
* Data cache
* @var \Psr\Cache\CachePoolInterface
*/
protected $cache;
/** /**
* Constructor * Constructor
* *
@ -158,7 +144,7 @@ class Anime extends BaseController {
*/ */
public function edit($id, $status = "all") public function edit($id, $status = "all")
{ {
$item = $this->model->getLibraryItem($id, $status); $item = $this->model->getLibraryItem($id);
$this->setSessionRedirect(); $this->setSessionRedirect();
$this->outputHTML('anime/edit', [ $this->outputHTML('anime/edit', [
@ -203,7 +189,7 @@ class Anime extends BaseController {
if ($fullResult['statusCode'] === 200) if ($fullResult['statusCode'] === 200)
{ {
$this->setFlashMessage("Successfully updated.", 'success'); $this->setFlashMessage('Successfully updated.', 'success');
$this->cache->clear(); $this->cache->clear();
} }
else else
@ -230,7 +216,7 @@ class Anime extends BaseController {
$data = $this->request->getParsedBody(); $data = $this->request->getParsedBody();
} }
$response = $this->model->updateLibraryItem($data, $data); $response = $this->model->updateLibraryItem($data);
$this->cache->clear(); $this->cache->clear();
$this->outputJSON($response['body'], $response['statusCode']); $this->outputJSON($response['body'], $response['statusCode']);
@ -272,12 +258,14 @@ class Anime extends BaseController {
if (empty($data)) if (empty($data))
{ {
return $this->notFound( $this->notFound(
$this->config->get('whose_list') . $this->config->get('whose_list') .
"'s Anime List &middot; Anime &middot; " . "'s Anime List &middot; Anime &middot; " .
'Anime not found', 'Anime not found',
'Anime Not Found' 'Anime Not Found'
); );
return;
} }
if (array_key_exists('characters', $data['included'])) if (array_key_exists('characters', $data['included']))

View File

@ -35,13 +35,15 @@ class Character extends BaseController {
if (( ! array_key_exists('data', $rawData)) || empty($rawData['data'])) if (( ! array_key_exists('data', $rawData)) || empty($rawData['data']))
{ {
return $this->notFound( $this->notFound(
$this->formatTitle( $this->formatTitle(
'Characters', 'Characters',
'Character not found' 'Character not found'
), ),
'Character Not Found' 'Character Not Found'
); );
return;
} }
$data = JsonAPI::organizeData($rawData); $data = JsonAPI::organizeData($rawData);
@ -110,22 +112,22 @@ class Character extends BaseController {
return $output; return $output;
} }
private function getCastCount(array $cast): int private function getCastCount(array $cast): int
{ {
$count = 0; $count = 0;
foreach($cast as $role) foreach($cast as $role)
{ {
if ( if (
array_key_exists('attributes', $role) && array_key_exists('attributes', $role) &&
array_key_exists('role', $role['attributes']) && array_key_exists('role', $role['attributes']) &&
( ! is_null($role['attributes']['role'])) ( ! is_null($role['attributes']['role']))
) { ) {
$count++; $count++;
} }
} }
return $count; return $count;
} }

View File

@ -265,12 +265,13 @@ class Manga extends Controller {
if (empty($data)) if (empty($data))
{ {
return $this->notFound( $this->notFound(
$this->config->get('whose_list') . $this->config->get('whose_list') .
"'s Manga List &middot; Manga &middot; " . "'s Manga List &middot; Manga &middot; " .
'Manga not found', 'Manga not found',
'Manga Not Found' 'Manga Not Found'
); );
return;
} }
foreach($data['included'] as $included) foreach($data['included'] as $included)

View File

@ -18,8 +18,8 @@ namespace Aviat\AnimeClient\Controller;
use Aviat\AnimeClient\Controller as BaseController; use Aviat\AnimeClient\Controller as BaseController;
use Aviat\AnimeClient\Model\{ use Aviat\AnimeClient\Model\{
manga as mangaModel, Manga as MangaModel,
mangaCollection as mangaCollectionModel MangaCollection as MangaCollectionModel
}; };
use Aviat\AnimeClient\UrlGenerator; use Aviat\AnimeClient\UrlGenerator;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
@ -31,13 +31,13 @@ class MangaCollection extends BaseController {
/** /**
* The manga collection model * The manga collection model
* @var mangaCollectionModel $mangaCollectionModel * @var MangaCollectionModel $mangaCollectionModel
*/ */
private $mangaCollectionModel; private $mangaCollectionModel;
/** /**
* The manga API model * The manga API model
* @var mangaModel $mangaModel * @var MangaModel $mangaModel
*/ */
private $mangaModel; private $mangaModel;

View File

@ -18,6 +18,8 @@ namespace Aviat\AnimeClient;
use function Aviat\Ion\_dir; use function Aviat\Ion\_dir;
use Aura\Router\Matcher;
use Aviat\AnimeClient\API\FailedResponseException; use Aviat\AnimeClient\API\FailedResponseException;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
use Aviat\Ion\Friend; use Aviat\Ion\Friend;
@ -38,7 +40,7 @@ class Dispatcher extends RoutingBase {
/** /**
* The route matcher * The route matcher
* @var object $matcher * @var Matcher $matcher
*/ */
protected $matcher; protected $matcher;
@ -72,14 +74,14 @@ class Dispatcher extends RoutingBase {
/** /**
* Get the current route object, if one matches * Get the current route object, if one matches
* *
* @return object * @return \Aura\Router\Route|false
*/ */
public function getRoute() public function getRoute()
{ {
$logger = $this->container->getLogger('default'); $logger = $this->container->getLogger('default');
$rawRoute = $this->request->getUri()->getPath(); $rawRoute = $this->request->getUri()->getPath();
$routePath = "/" . trim($rawRoute, '/'); $routePath = '/' . trim($rawRoute, '/');
$logger->info('Dispatcher - Routing data from get_route method'); $logger->info('Dispatcher - Routing data from get_route method');
$logger->info(print_r([ $logger->info(print_r([

View File

@ -16,8 +16,11 @@
namespace Aviat\AnimeClient; namespace Aviat\AnimeClient;
use Aviat\Ion\{ArrayWrapper, StringWrapper}; use Aviat\Ion\{
ArrayWrapper, StringWrapper
};
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
use Aviat\Ion\Exception\ConfigException;
/** /**
* Helper object to manage menu creation and selection * Helper object to manage menu creation and selection
@ -80,6 +83,7 @@ class MenuGenerator extends UrlGenerator {
* Generate the html structure of the menu selected * Generate the html structure of the menu selected
* *
* @param string $menu * @param string $menu
* @throws ConfigException
* @return string * @return string
*/ */
public function generate($menu) public function generate($menu)

View File

@ -28,7 +28,7 @@ class AnimeCollection extends Collection {
/** /**
* Anime API Model * Anime API Model
* @var object $animeModel * @var Anime $animeModel
*/ */
protected $animeModel; protected $animeModel;
@ -221,7 +221,7 @@ class AnimeCollection extends Collection {
private function updateGenre($animeId) private function updateGenre($animeId)
{ {
$genreInfo = $this->getGenreData(); $genreInfo = $this->getGenreData();
extract($genreInfo); extract($genreInfo, \EXTR_SKIP);
// Get api information // Get api information
$anime = $this->animeModel->getAnimeById($animeId); $anime = $this->animeModel->getAnimeById($animeId);

View File

@ -26,7 +26,7 @@ class DB extends AbstractModel {
/** /**
* The query builder object * The query builder object
* @var object $db * @var \Query\Query_Builder_Interface $db
*/ */
protected $db; protected $db;

View File

@ -28,7 +28,7 @@ class MangaCollection extends Collection {
/** /**
* Manga API Model * Manga API Model
* @var object $mangaModel * @var Manga $mangaModel
*/ */
protected $mangaModel; protected $mangaModel;
@ -221,12 +221,12 @@ class MangaCollection extends Collection {
private function updateGenre($mangaId) private function updateGenre($mangaId)
{ {
$genreInfo = $this->getGenreData(); $genreInfo = $this->getGenreData();
extract($genreInfo); extract($genreInfo, EXTR_SKIP);
// Get api information // Get api information
$manga = $this->mangaModel->getMangaById($mangaId); $manga = $this->mangaModel->getMangaById($mangaId);
foreach ($anime['genres'] as $genre) foreach ($manga['genres'] as $genre)
{ {
// Add genres that don't currently exist // Add genres that don't currently exist
if ( ! in_array($genre, $genres)) if ( ! in_array($genre, $genres))

View File

@ -116,7 +116,7 @@ class APIRequestBuilderTest extends TestCase {
'foo' => [ 'foo' => [
'bar' => 1, 'bar' => 1,
'baz' => [2, 3, 4], 'baz' => [2, 3, 4],
'bar' => [ 'bazbar' => [
'a' => 1, 'a' => 1,
'b' => 2 'b' => 2
] ]

View File

@ -20,21 +20,24 @@ use Aviat\AnimeClient\API\CacheTrait;
use Aviat\AnimeClient\Tests\AnimeClientTestCase; use Aviat\AnimeClient\Tests\AnimeClientTestCase;
class CacheTraitTest extends AnimeClientTestCase { class CacheTraitTest extends AnimeClientTestCase {
protected $testClass;
public function setUp() public function setUp()
{ {
parent::setUp(); parent::setUp();
$this->testClass = new class { $this->testClass = new class {
use CacheTrait; use CacheTrait;
}; };
} }
public function testSetGet() public function testSetGet()
{ {
$cachePool = $this->container->get('cache'); $cachePool = $this->container->get('cache');
$this->testClass->setCache($cachePool); $this->testClass->setCache($cachePool);
$this->assertEquals($cachePool, $this->testClass->getCache()); $this->assertEquals($cachePool, $this->testClass->getCache());
} }
public function testGetHashForMethodCall() public function testGetHashForMethodCall()
{ {
$hash = $this->testClass->getHashForMethodCall($this, __METHOD__, []); $hash = $this->testClass->getHashForMethodCall($this, __METHOD__, []);

View File

@ -16,32 +16,34 @@
namespace Aviat\AnimeClient\Tests\API; namespace Aviat\AnimeClient\Tests\API;
use Aviat\AnimeClient\API\{APIRequestBuilder, ParallelAPIRequest}; use Aviat\AnimeClient\API\ParallelAPIRequest;
use Aviat\Ion\Friend; use Aviat\Ion\Friend;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class ParallelAPIRequestTest extends TestCase { class ParallelAPIRequestTest extends TestCase {
public function testAddStringUrlRequest() public function testAddStringUrlRequest()
{ {
$requester = new ParallelAPIRequest(); $requester = new ParallelAPIRequest();
$requester->addRequest('https://httpbin.org');
$friend = new Friend($requester); $friend = new Friend($requester);
$friend->addRequest('https://httpbin.org');
$this->assertEquals($friend->requests, ['https://httpbin.org']); $this->assertEquals($friend->requests, ['https://httpbin.org']);
} }
public function testAddStringUrlRequests() public function testAddStringUrlRequests()
{ {
$requests = [ $requests = [
'foo' => 'http://example.com', 'foo' => 'http://example.com',
'bar' => 'https://example.com' 'bar' => 'https://example.com'
]; ];
$requester = new ParallelAPIRequest(); $requester = new ParallelAPIRequest();
$requester->addRequests($requests);
$friend = new Friend($requester); $friend = new Friend($requester);
$friend->addRequests($requests);
$this->assertEquals($friend->requests, $requests); $this->assertEquals($friend->requests, $requests);
} }
} }

View File

@ -180,14 +180,6 @@ class DispatcherTest extends AnimeClientTestCase {
'action' => ['login'], 'action' => ['login'],
'verb' => 'get' 'verb' => 'get'
], ],
'index' => [
'path' => '/',
'action' => ['redirect'],
'params' => [
'url' => '', // Determined by config
'code' => '301'
]
],
'index' => [ 'index' => [
'path' => '/', 'path' => '/',
'action' => ['redirect'], 'action' => ['redirect'],

View File

@ -33,7 +33,7 @@ class MenuGeneratorTest extends AnimeClientTestCase {
public function testSanity() public function testSanity()
{ {
$generator = new MenuGenerator($this->container); $generator = new MenuGenerator($this->container);
$this->assertInstanceOf('Aviat\AnimeClient\MenuGenerator', $generator); $this->assertInstanceOf(MenuGenerator::class, $generator);
} }
public function testParseConfig() public function testParseConfig()

View File

@ -14,8 +14,8 @@ if ($timezone === '' || $timezone === FALSE)
// Autoloading // Autoloading
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
require __DIR__ . '/AnimeClientTestCase.php'; require_once __DIR__ . '/AnimeClientTestCase.php';
require __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/../vendor/autoload.php';
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Ini Settings // Ini Settings
@ -35,7 +35,7 @@ $_SESSION = [];
$_COOKIE = []; $_COOKIE = [];
// Request base test case and mocks // Request base test case and mocks
require __DIR__ . '/TestSessionHandler.php'; require_once __DIR__ . '/TestSessionHandler.php';
require __DIR__ . '/mocks.php'; require_once __DIR__ . '/mocks.php';
// End of bootstrap.php // End of bootstrap.php