Version 5.1 - All the GraphQL #32
@ -5,8 +5,6 @@
|
||||
use Whoops\Handler\PrettyPageHandler;
|
||||
use Whoops\Handler\JsonResponseHandler;
|
||||
|
||||
use Aviat\AnimeClient\Config;
|
||||
|
||||
// Work around the silly timezone error
|
||||
$timezone = ini_get('date.timezone');
|
||||
if ($timezone === '' || $timezone === FALSE)
|
||||
@ -49,7 +47,6 @@ spl_autoload_register(function($class) {
|
||||
}
|
||||
});
|
||||
|
||||
// Dependency setup
|
||||
require _dir(ROOT_DIR, '/vendor/autoload.php');
|
||||
require _dir(SRC_DIR, '/functions.php');
|
||||
|
||||
@ -67,7 +64,8 @@ $jsonHandler = new JsonResponseHandler();
|
||||
$jsonHandler->onlyForAjaxRequests(TRUE);
|
||||
$whoops->pushHandler($jsonHandler);
|
||||
|
||||
//$whoops->register();
|
||||
// Register as the error handler
|
||||
$whoops->register();
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Dependency Injection setup
|
||||
|
@ -20,7 +20,7 @@ class Config {
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param array $config_files
|
||||
* @param array $config_array
|
||||
*/
|
||||
public function __construct(array $config_array = [])
|
||||
{
|
||||
|
@ -7,7 +7,7 @@ namespace Aviat\AnimeClient\Controller;
|
||||
|
||||
use Aviat\Ion\Di\ContainerInterface;
|
||||
use Aviat\AnimeClient\Controller as BaseController;
|
||||
use Aviat\AnimeClient\Enum\Hummingbird\AnimeWatchingStatus;
|
||||
use Aviat\AnimeClient\Hummingbird\Enum\AnimeWatchingStatus;
|
||||
use Aviat\AnimeClient\Model\Anime as AnimeModel;
|
||||
use Aviat\AnimeClient\Model\AnimeCollection as AnimeCollectionModel;
|
||||
|
||||
|
@ -45,7 +45,7 @@ class Collection extends BaseController {
|
||||
parent::__construct($container);
|
||||
|
||||
$this->urlGenerator = $container->get('url-generator');
|
||||
$this->anime_anime_collection_model = new AnimeCollectionModel($container);
|
||||
$this->anime_collection_model = new AnimeCollectionModel($container);
|
||||
$this->base_data = array_merge($this->base_data, [
|
||||
'menu_name' => 'collection',
|
||||
'message' => '',
|
||||
|
@ -1,14 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Enum\Hummingbird;
|
||||
|
||||
use Aviat\Ion\Enum;
|
||||
|
||||
class AnimeAgeRating extends Enum {
|
||||
const G = 'G';
|
||||
const PG = 'PG';
|
||||
const PG13 = 'PG13';
|
||||
const R = 'R17+';
|
||||
const X = 'R18+';
|
||||
}
|
||||
// End of AnimeAgeRating.php
|
@ -1,12 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Enum\Hummingbird;
|
||||
|
||||
use Aviat\Ion\Enum;
|
||||
|
||||
class AnimeAiringStatus extends Enum {
|
||||
const NOT_YET_AIRED = 'Not Yet Aired';
|
||||
const AIRING = 'Currently Airing';
|
||||
const FINISHED_AIRING = 'Finished Airing';
|
||||
}
|
||||
// End of AnimeAiringStatus.php
|
15
src/Aviat/AnimeClient/Hummingbird/Enum/AnimeAiringStatus.php
Normal file
15
src/Aviat/AnimeClient/Hummingbird/Enum/AnimeAiringStatus.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Hummingbird\Enum;
|
||||
|
||||
use Aviat\Ion\Enum as BaseEnum;
|
||||
|
||||
/**
|
||||
* Status of when anime is being/was/will be aired
|
||||
*/
|
||||
class AnimeAiringStatus extends BaseEnum {
|
||||
const NOT_YET_AIRED = 'Not Yet Aired';
|
||||
const AIRING = 'Currently Airing';
|
||||
const FINISHED_AIRING = 'Finished Airing';
|
||||
}
|
||||
// End of AnimeAiringStatus.php
|
@ -1,10 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Enum\Hummingbird;
|
||||
namespace Aviat\AnimeClient\Hummingbird\Enum;
|
||||
|
||||
use Aviat\Ion\Enum;
|
||||
use Aviat\Ion\Enum as BaseEnum;
|
||||
|
||||
class AnimeShowType extends Enum {
|
||||
/**
|
||||
* Type of Anime
|
||||
*/
|
||||
class AnimeShowType extends BaseEnum {
|
||||
const TV = 'TV';
|
||||
const MOVIE = 'Movie';
|
||||
const OVA = 'OVA';
|
@ -1,10 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Enum\Hummingbird;
|
||||
namespace Aviat\AnimeClient\Hummingbird\Enum;
|
||||
|
||||
use Aviat\Ion\Enum;
|
||||
use Aviat\Ion\Enum as BaseEnum;
|
||||
|
||||
class AnimeWatchingStatus extends Enum {
|
||||
/**
|
||||
* Possible values for watching status for the current anime
|
||||
*/
|
||||
class AnimeWatchingStatus extends BaseEnum {
|
||||
const WATCHING = 'currently-watching';
|
||||
const PLAN_TO_WATCH = 'plan-to-watch';
|
||||
const COMPLETED = 'completed';
|
@ -1,10 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Enum\Hummingbird;
|
||||
namespace Aviat\AnimeClient\Hummingbird\Enum;
|
||||
|
||||
use Aviat\Ion\Enum;
|
||||
use Aviat\Ion\Enum as BaseEnum;
|
||||
|
||||
class MangaReadingStatus extends Enum {
|
||||
/**
|
||||
* Possible values for current reading status of manga
|
||||
*/
|
||||
class MangaReadingStatus extends BaseEnum {
|
||||
const READING = 'Currently Reading';
|
||||
const PLAN_TO_READ = 'Plan to Read';
|
||||
const DROPPED = 'Dropped';
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Transformer\Hummingbird;
|
||||
namespace Aviat\AnimeClient\Hummingbird\Transformer;
|
||||
|
||||
use Aviat\Ion\Transformer\AbstractTransformer;
|
||||
|
@ -1,9 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Transformer\Hummingbird;
|
||||
namespace Aviat\AnimeClient\Hummingbird\Transformer;
|
||||
|
||||
use Aviat\Ion\Transformer\AbstractTransformer;
|
||||
|
||||
/**
|
||||
* Data transformation class for zippered Hummingbird manga
|
||||
*/
|
||||
class MangaListTransformer extends AbstractTransformer {
|
||||
|
||||
/**
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Aviat\AnimeClient\Transformer\Hummingbird;
|
||||
namespace Aviat\AnimeClient\Hummingbird\Transformer;
|
||||
|
||||
/**
|
||||
* Merges the two separate manga lists together
|
@ -6,8 +6,8 @@
|
||||
namespace Aviat\AnimeClient\Model;
|
||||
|
||||
use Aviat\AnimeClient\Model\API;
|
||||
use Aviat\AnimeClient\Enum\Hummingbird\AnimeWatchingStatus;
|
||||
use Aviat\AnimeClient\Transformer\Hummingbird\AnimeListTransformer;
|
||||
use Aviat\AnimeClient\Hummingbird\Enum\AnimeWatchingStatus;
|
||||
use Aviat\AnimeClient\Hummingbird\Transformer\AnimeListTransformer;
|
||||
|
||||
/**
|
||||
* Model for handling requests dealing with the anime list
|
||||
|
@ -277,6 +277,7 @@ class AnimeCollection extends DB {
|
||||
/**
|
||||
* Update genre information for selected anime
|
||||
*
|
||||
* @param int $anime_id The current anime
|
||||
* @return void
|
||||
*/
|
||||
private function update_genre($anime_id)
|
||||
|
@ -5,8 +5,8 @@
|
||||
namespace Aviat\AnimeClient\Model;
|
||||
|
||||
use Aviat\AnimeClient\Model\API;
|
||||
use Aviat\AnimeClient\Transformer\Hummingbird;
|
||||
use Aviat\AnimeClient\Enum\Hummingbird\MangaReadingStatus;
|
||||
use Aviat\AnimeClient\Hummingbird\Transformer;
|
||||
use Aviat\AnimeClient\Hummingbird\Enum\MangaReadingStatus;
|
||||
|
||||
/**
|
||||
* Model for handling requests dealing with the manga list
|
||||
@ -132,7 +132,7 @@ class Manga extends API {
|
||||
file_put_contents($cache_file, json_encode($api_data));
|
||||
|
||||
$zippered_data = $this->zipper_lists($api_data);
|
||||
$transformer = new Hummingbird\MangaListTransformer();
|
||||
$transformer = new Transformer\MangaListTransformer();
|
||||
$transformed_data = $transformer->transform_collection($zippered_data);
|
||||
file_put_contents($transformed_cache_file, json_encode($transformed_data));
|
||||
return $transformed_data;
|
||||
@ -172,7 +172,7 @@ class Manga extends API {
|
||||
*/
|
||||
private function zipper_lists($raw_data)
|
||||
{
|
||||
$zipper = new Hummingbird\MangaListsZipper($raw_data);
|
||||
$zipper = new Transformer\MangaListsZipper($raw_data);
|
||||
return $zipper->transform();
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,9 @@
|
||||
|
||||
namespace Aviat\Ion\Di;
|
||||
|
||||
/**
|
||||
* Interface for the Dependency Injection Container
|
||||
*/
|
||||
interface ContainerInterface extends \Interop\Container\ContainerInterface {
|
||||
|
||||
/**
|
||||
|
@ -4,6 +4,12 @@ namespace Aviat\Ion;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Class emulating an enumeration type
|
||||
*
|
||||
* @method bool isValid(mixed $key)
|
||||
* @method array getConstList()
|
||||
*/
|
||||
abstract class Enum {
|
||||
|
||||
use StaticInstance;
|
||||
|
@ -4,6 +4,9 @@ namespace Aviat\Ion;
|
||||
|
||||
use Aviat\Ion\Type\StringType;
|
||||
|
||||
/**
|
||||
* Trait to add convenience method for creating StringType objects
|
||||
*/
|
||||
trait StringWrapper {
|
||||
|
||||
/**
|
||||
|
@ -2,6 +2,9 @@
|
||||
|
||||
namespace Aviat\Ion\Transformer;
|
||||
|
||||
/**
|
||||
* Base class for data trasformation
|
||||
*/
|
||||
abstract class AbstractTransformer implements TransformerInterface {
|
||||
|
||||
use \Aviat\Ion\StringWrapper;
|
||||
|
@ -2,6 +2,9 @@
|
||||
|
||||
namespace Aviat\Ion\Transformer;
|
||||
|
||||
/**
|
||||
* Interface for data transformation classes
|
||||
*/
|
||||
interface TransformerInterface {
|
||||
|
||||
/**
|
||||
|
@ -4,6 +4,10 @@ namespace Aviat\Ion\Type;
|
||||
|
||||
/**
|
||||
* Wrapper class for native array methods for convenience
|
||||
*
|
||||
* @method array chunk(int $size, bool $preserve_keys = FALSE)
|
||||
* @method array pluck(mixed $column_key, mixed $index_key = NULL)
|
||||
* @method array filter(callable $callback = NULL, int $flag = 0)
|
||||
*/
|
||||
class ArrayType {
|
||||
|
||||
@ -22,7 +26,6 @@ class ArrayType {
|
||||
protected $native_methods = [
|
||||
'chunk' => 'array_chunk',
|
||||
'pluck' => 'array_column',
|
||||
'assoc_diff' => 'array_diff_assoc',
|
||||
'key_diff' => 'array_diff_key',
|
||||
'diff' => 'array_diff',
|
||||
'filter' => 'array_filter',
|
||||
@ -31,16 +34,12 @@ class ArrayType {
|
||||
'keys' => 'array_keys',
|
||||
'merge' => 'array_merge',
|
||||
'pad' => 'array_pad',
|
||||
'pop' => 'array_pop',
|
||||
'product' => 'array_product',
|
||||
'push' => 'array_push',
|
||||
'random' => 'array_rand',
|
||||
'reduce' => 'array_reduce',
|
||||
'reverse' => 'array_reverse',
|
||||
'shift' => 'array_shift',
|
||||
'sum' => 'array_sum',
|
||||
'unique' => 'array_unique',
|
||||
'unshift' => 'array_unshift',
|
||||
'values' => 'array_values',
|
||||
];
|
||||
|
||||
@ -51,6 +50,10 @@ class ArrayType {
|
||||
*/
|
||||
protected $native_in_place_methods = [
|
||||
'shuffle' => 'shuffle',
|
||||
'shift' => 'array_shift',
|
||||
'unshift' => 'array_unshift',
|
||||
'push' => 'array_push',
|
||||
'pop' => 'array_pop',
|
||||
];
|
||||
|
||||
/**
|
||||
@ -69,6 +72,7 @@ class ArrayType {
|
||||
* @param string $method
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function __call($method, $args)
|
||||
{
|
||||
@ -88,8 +92,10 @@ class ArrayType {
|
||||
$func($this->arr);
|
||||
return $this->arr;
|
||||
}
|
||||
|
||||
throw new \InvalidArgumentException("Method '{$method}' does not exist");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Does the passed key exist in the current array?
|
||||
*
|
||||
|
@ -4,6 +4,9 @@ namespace Aviat\Ion;
|
||||
|
||||
use Aviat\Ion\Di\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Base view response class
|
||||
*/
|
||||
abstract class View {
|
||||
|
||||
use Di\ContainerAware;
|
||||
|
@ -5,6 +5,9 @@ namespace Aviat\Ion\View;
|
||||
use Aviat\Ion\View\HttpView;
|
||||
use Aviat\Ion\Di\ContainerInterface;
|
||||
|
||||
/**
|
||||
* View class for outputting HTML
|
||||
*/
|
||||
class HtmlView extends HttpView {
|
||||
|
||||
/**
|
||||
|
@ -6,11 +6,14 @@ use Aura\Web\ResponseSender;
|
||||
|
||||
use Aviat\Ion\View as BaseView;
|
||||
|
||||
/**
|
||||
* Base view class for Http output
|
||||
*/
|
||||
class HttpView extends BaseView {
|
||||
|
||||
|
||||
/**
|
||||
* Do a redirect
|
||||
*
|
||||
*
|
||||
* @param string $url
|
||||
* @param int $code
|
||||
* @return void
|
||||
@ -19,7 +22,7 @@ class HttpView extends BaseView {
|
||||
{
|
||||
$this->response->redirect->to($url, $code);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send the appropriate response
|
||||
*
|
||||
@ -32,5 +35,5 @@ class HttpView extends BaseView {
|
||||
$sender = new ResponseSender($this->response);
|
||||
$sender->__invoke();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -4,6 +4,9 @@ namespace Aviat\Ion\View;
|
||||
|
||||
use Aviat\Ion\View\HttpView;
|
||||
|
||||
/**
|
||||
* View class to serialize Json
|
||||
*/
|
||||
class JsonView extends HttpView {
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Aviat\Ion\Friend;
|
||||
use Aviat\AnimeClient\Transformer\Hummingbird\AnimeListTransformer;
|
||||
use Aviat\AnimeClient\Hummingbird\Transformer\AnimeListTransformer;
|
||||
|
||||
class AnimeListTransformerTest extends AnimeClient_TestCase {
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Aviat\AnimeClient\Transformer\Hummingbird\MangaListTransformer;
|
||||
use Aviat\AnimeClient\Hummingbird\Transformer\MangaListTransformer;
|
||||
|
||||
class MangaListTransformerTest extends AnimeClient_TestCase {
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Aviat\AnimeClient\Transformer\Hummingbird\MangaListsZipper;
|
||||
use Aviat\AnimeClient\Hummingbird\Transformer\MangaListsZipper;
|
||||
|
||||
class MangaListsZipperTest extends AnimeClient_TestCase {
|
||||
|
@ -9,6 +9,68 @@ class ArrayTypeTest extends AnimeClient_TestCase {
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
public function dataCall()
|
||||
{
|
||||
$method_map = [
|
||||
'chunk' => 'array_chunk',
|
||||
'pluck' => 'array_column',
|
||||
'assoc_diff' => 'array_diff_assoc',
|
||||
'key_diff' => 'array_diff_key',
|
||||
'diff' => 'array_diff',
|
||||
'filter' => 'array_filter',
|
||||
'flip' => 'array_flip',
|
||||
'intersect' => 'array_intersect',
|
||||
'keys' => 'array_keys',
|
||||
'merge' => 'array_merge',
|
||||
'pad' => 'array_pad',
|
||||
'product' => 'array_product',
|
||||
'random' => 'array_rand',
|
||||
'reduce' => 'array_reduce',
|
||||
'reverse' => 'array_reverse',
|
||||
];
|
||||
|
||||
return [
|
||||
'array_sum' => [
|
||||
'method' => 'sum',
|
||||
'array' => [1, 2, 3, 4, 5, 6],
|
||||
'args' => [],
|
||||
'expected' => 21
|
||||
],
|
||||
'array_unique' => [
|
||||
'method' => 'unique',
|
||||
'array' => [1, 1, 3, 2, 2, 2, 3, 3, 5],
|
||||
'args' => [SORT_REGULAR],
|
||||
'expected' => [0=>1, 2=>3, 3=>2, 8=>5]
|
||||
],
|
||||
'array_values' => [
|
||||
'method' => 'values',
|
||||
'array' => ['foo' => 'bar', 'baz' => 'foobar'],
|
||||
'args' => [],
|
||||
'expected' => ['bar', 'foobar']
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the array methods defined for the __Call method
|
||||
*
|
||||
* @dataProvider dataCall
|
||||
*/
|
||||
public function testCall($method, $array, $args, $expected)
|
||||
{
|
||||
$obj = $this->arr($array);
|
||||
$actual = $obj->__call($method, $args);
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
public function testBadCall()
|
||||
{
|
||||
$obj = $this->arr([]);
|
||||
|
||||
$this->setExpectedException('InvalidArgumentException', "Method 'foo' does not exist");
|
||||
$obj->foo();
|
||||
}
|
||||
|
||||
public function testMerge()
|
||||
{
|
||||
$obj = $this->arr([1, 3, 5, 7]);
|
||||
@ -30,6 +92,16 @@ class ArrayTypeTest extends AnimeClient_TestCase {
|
||||
$this->assertTrue(is_array($actual));
|
||||
}
|
||||
|
||||
public function testHasKey()
|
||||
{
|
||||
$obj = $this->arr([
|
||||
'a' => 'b',
|
||||
'z' => 'y'
|
||||
]);
|
||||
$this->assertTrue($obj->has_key('a'));
|
||||
$this->assertFalse($obj->has_key('b'));
|
||||
}
|
||||
|
||||
public function testHas()
|
||||
{
|
||||
$obj = $this->arr([1, 2, 6, 8, 11]);
|
||||
|
Loading…
Reference in New Issue
Block a user