Version 5.1 - All the GraphQL #32

Closed
timw4mail wants to merge 1160 commits from develop into master
30 changed files with 172 additions and 64 deletions
Showing only changes of commit f49e4fe3d8 - Show all commits

View File

@ -5,8 +5,6 @@
use Whoops\Handler\PrettyPageHandler; use Whoops\Handler\PrettyPageHandler;
use Whoops\Handler\JsonResponseHandler; use Whoops\Handler\JsonResponseHandler;
use Aviat\AnimeClient\Config;
// Work around the silly timezone error // Work around the silly timezone error
$timezone = ini_get('date.timezone'); $timezone = ini_get('date.timezone');
if ($timezone === '' || $timezone === FALSE) if ($timezone === '' || $timezone === FALSE)
@ -49,7 +47,6 @@ spl_autoload_register(function($class) {
} }
}); });
// Dependency setup
require _dir(ROOT_DIR, '/vendor/autoload.php'); require _dir(ROOT_DIR, '/vendor/autoload.php');
require _dir(SRC_DIR, '/functions.php'); require _dir(SRC_DIR, '/functions.php');
@ -67,7 +64,8 @@ $jsonHandler = new JsonResponseHandler();
$jsonHandler->onlyForAjaxRequests(TRUE); $jsonHandler->onlyForAjaxRequests(TRUE);
$whoops->pushHandler($jsonHandler); $whoops->pushHandler($jsonHandler);
//$whoops->register(); // Register as the error handler
$whoops->register();
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Dependency Injection setup // Dependency Injection setup

View File

@ -20,7 +20,7 @@ class Config {
/** /**
* Constructor * Constructor
* *
* @param array $config_files * @param array $config_array
*/ */
public function __construct(array $config_array = []) public function __construct(array $config_array = [])
{ {

View File

@ -7,7 +7,7 @@ namespace Aviat\AnimeClient\Controller;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
use Aviat\AnimeClient\Controller as BaseController; 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\Anime as AnimeModel;
use Aviat\AnimeClient\Model\AnimeCollection as AnimeCollectionModel; use Aviat\AnimeClient\Model\AnimeCollection as AnimeCollectionModel;

View File

@ -45,7 +45,7 @@ class Collection extends BaseController {
parent::__construct($container); parent::__construct($container);
$this->urlGenerator = $container->get('url-generator'); $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, [ $this->base_data = array_merge($this->base_data, [
'menu_name' => 'collection', 'menu_name' => 'collection',
'message' => '', 'message' => '',

View File

@ -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

View File

@ -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

View 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

View File

@ -1,10 +1,13 @@
<?php <?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 TV = 'TV';
const MOVIE = 'Movie'; const MOVIE = 'Movie';
const OVA = 'OVA'; const OVA = 'OVA';

View File

@ -1,10 +1,13 @@
<?php <?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 WATCHING = 'currently-watching';
const PLAN_TO_WATCH = 'plan-to-watch'; const PLAN_TO_WATCH = 'plan-to-watch';
const COMPLETED = 'completed'; const COMPLETED = 'completed';

View File

@ -1,10 +1,13 @@
<?php <?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 READING = 'Currently Reading';
const PLAN_TO_READ = 'Plan to Read'; const PLAN_TO_READ = 'Plan to Read';
const DROPPED = 'Dropped'; const DROPPED = 'Dropped';

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Aviat\AnimeClient\Transformer\Hummingbird; namespace Aviat\AnimeClient\Hummingbird\Transformer;
use Aviat\Ion\Transformer\AbstractTransformer; use Aviat\Ion\Transformer\AbstractTransformer;

View File

@ -1,9 +1,12 @@
<?php <?php
namespace Aviat\AnimeClient\Transformer\Hummingbird; namespace Aviat\AnimeClient\Hummingbird\Transformer;
use Aviat\Ion\Transformer\AbstractTransformer; use Aviat\Ion\Transformer\AbstractTransformer;
/**
* Data transformation class for zippered Hummingbird manga
*/
class MangaListTransformer extends AbstractTransformer { class MangaListTransformer extends AbstractTransformer {
/** /**

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Aviat\AnimeClient\Transformer\Hummingbird; namespace Aviat\AnimeClient\Hummingbird\Transformer;
/** /**
* Merges the two separate manga lists together * Merges the two separate manga lists together

View File

@ -6,8 +6,8 @@
namespace Aviat\AnimeClient\Model; namespace Aviat\AnimeClient\Model;
use Aviat\AnimeClient\Model\API; use Aviat\AnimeClient\Model\API;
use Aviat\AnimeClient\Enum\Hummingbird\AnimeWatchingStatus; use Aviat\AnimeClient\Hummingbird\Enum\AnimeWatchingStatus;
use Aviat\AnimeClient\Transformer\Hummingbird\AnimeListTransformer; use Aviat\AnimeClient\Hummingbird\Transformer\AnimeListTransformer;
/** /**
* Model for handling requests dealing with the anime list * Model for handling requests dealing with the anime list

View File

@ -277,6 +277,7 @@ class AnimeCollection extends DB {
/** /**
* Update genre information for selected anime * Update genre information for selected anime
* *
* @param int $anime_id The current anime
* @return void * @return void
*/ */
private function update_genre($anime_id) private function update_genre($anime_id)

View File

@ -5,8 +5,8 @@
namespace Aviat\AnimeClient\Model; namespace Aviat\AnimeClient\Model;
use Aviat\AnimeClient\Model\API; use Aviat\AnimeClient\Model\API;
use Aviat\AnimeClient\Transformer\Hummingbird; use Aviat\AnimeClient\Hummingbird\Transformer;
use Aviat\AnimeClient\Enum\Hummingbird\MangaReadingStatus; use Aviat\AnimeClient\Hummingbird\Enum\MangaReadingStatus;
/** /**
* Model for handling requests dealing with the manga list * 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)); file_put_contents($cache_file, json_encode($api_data));
$zippered_data = $this->zipper_lists($api_data); $zippered_data = $this->zipper_lists($api_data);
$transformer = new Hummingbird\MangaListTransformer(); $transformer = new Transformer\MangaListTransformer();
$transformed_data = $transformer->transform_collection($zippered_data); $transformed_data = $transformer->transform_collection($zippered_data);
file_put_contents($transformed_cache_file, json_encode($transformed_data)); file_put_contents($transformed_cache_file, json_encode($transformed_data));
return $transformed_data; return $transformed_data;
@ -172,7 +172,7 @@ class Manga extends API {
*/ */
private function zipper_lists($raw_data) private function zipper_lists($raw_data)
{ {
$zipper = new Hummingbird\MangaListsZipper($raw_data); $zipper = new Transformer\MangaListsZipper($raw_data);
return $zipper->transform(); return $zipper->transform();
} }

View File

@ -2,6 +2,9 @@
namespace Aviat\Ion\Di; namespace Aviat\Ion\Di;
/**
* Interface for the Dependency Injection Container
*/
interface ContainerInterface extends \Interop\Container\ContainerInterface { interface ContainerInterface extends \Interop\Container\ContainerInterface {
/** /**

View File

@ -4,6 +4,12 @@ namespace Aviat\Ion;
use ReflectionClass; use ReflectionClass;
/**
* Class emulating an enumeration type
*
* @method bool isValid(mixed $key)
* @method array getConstList()
*/
abstract class Enum { abstract class Enum {
use StaticInstance; use StaticInstance;

View File

@ -4,6 +4,9 @@ namespace Aviat\Ion;
use Aviat\Ion\Type\StringType; use Aviat\Ion\Type\StringType;
/**
* Trait to add convenience method for creating StringType objects
*/
trait StringWrapper { trait StringWrapper {
/** /**

View File

@ -2,6 +2,9 @@
namespace Aviat\Ion\Transformer; namespace Aviat\Ion\Transformer;
/**
* Base class for data trasformation
*/
abstract class AbstractTransformer implements TransformerInterface { abstract class AbstractTransformer implements TransformerInterface {
use \Aviat\Ion\StringWrapper; use \Aviat\Ion\StringWrapper;

View File

@ -2,6 +2,9 @@
namespace Aviat\Ion\Transformer; namespace Aviat\Ion\Transformer;
/**
* Interface for data transformation classes
*/
interface TransformerInterface { interface TransformerInterface {
/** /**

View File

@ -4,6 +4,10 @@ namespace Aviat\Ion\Type;
/** /**
* Wrapper class for native array methods for convenience * 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 { class ArrayType {
@ -22,7 +26,6 @@ class ArrayType {
protected $native_methods = [ protected $native_methods = [
'chunk' => 'array_chunk', 'chunk' => 'array_chunk',
'pluck' => 'array_column', 'pluck' => 'array_column',
'assoc_diff' => 'array_diff_assoc',
'key_diff' => 'array_diff_key', 'key_diff' => 'array_diff_key',
'diff' => 'array_diff', 'diff' => 'array_diff',
'filter' => 'array_filter', 'filter' => 'array_filter',
@ -31,16 +34,12 @@ class ArrayType {
'keys' => 'array_keys', 'keys' => 'array_keys',
'merge' => 'array_merge', 'merge' => 'array_merge',
'pad' => 'array_pad', 'pad' => 'array_pad',
'pop' => 'array_pop',
'product' => 'array_product', 'product' => 'array_product',
'push' => 'array_push',
'random' => 'array_rand', 'random' => 'array_rand',
'reduce' => 'array_reduce', 'reduce' => 'array_reduce',
'reverse' => 'array_reverse', 'reverse' => 'array_reverse',
'shift' => 'array_shift',
'sum' => 'array_sum', 'sum' => 'array_sum',
'unique' => 'array_unique', 'unique' => 'array_unique',
'unshift' => 'array_unshift',
'values' => 'array_values', 'values' => 'array_values',
]; ];
@ -51,6 +50,10 @@ class ArrayType {
*/ */
protected $native_in_place_methods = [ protected $native_in_place_methods = [
'shuffle' => 'shuffle', 'shuffle' => 'shuffle',
'shift' => 'array_shift',
'unshift' => 'array_unshift',
'push' => 'array_push',
'pop' => 'array_pop',
]; ];
/** /**
@ -69,6 +72,7 @@ class ArrayType {
* @param string $method * @param string $method
* @param array $args * @param array $args
* @return mixed * @return mixed
* @throws \InvalidArgumentException
*/ */
public function __call($method, $args) public function __call($method, $args)
{ {
@ -88,6 +92,8 @@ class ArrayType {
$func($this->arr); $func($this->arr);
return $this->arr; return $this->arr;
} }
throw new \InvalidArgumentException("Method '{$method}' does not exist");
} }
/** /**

View File

@ -4,6 +4,9 @@ namespace Aviat\Ion;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
/**
* Base view response class
*/
abstract class View { abstract class View {
use Di\ContainerAware; use Di\ContainerAware;

View File

@ -5,6 +5,9 @@ namespace Aviat\Ion\View;
use Aviat\Ion\View\HttpView; use Aviat\Ion\View\HttpView;
use Aviat\Ion\Di\ContainerInterface; use Aviat\Ion\Di\ContainerInterface;
/**
* View class for outputting HTML
*/
class HtmlView extends HttpView { class HtmlView extends HttpView {
/** /**

View File

@ -6,6 +6,9 @@ use Aura\Web\ResponseSender;
use Aviat\Ion\View as BaseView; use Aviat\Ion\View as BaseView;
/**
* Base view class for Http output
*/
class HttpView extends BaseView { class HttpView extends BaseView {
/** /**

View File

@ -4,6 +4,9 @@ namespace Aviat\Ion\View;
use Aviat\Ion\View\HttpView; use Aviat\Ion\View\HttpView;
/**
* View class to serialize Json
*/
class JsonView extends HttpView { class JsonView extends HttpView {
/** /**

View File

@ -1,7 +1,7 @@
<?php <?php
use Aviat\Ion\Friend; use Aviat\Ion\Friend;
use Aviat\AnimeClient\Transformer\Hummingbird\AnimeListTransformer; use Aviat\AnimeClient\Hummingbird\Transformer\AnimeListTransformer;
class AnimeListTransformerTest extends AnimeClient_TestCase { class AnimeListTransformerTest extends AnimeClient_TestCase {

View File

@ -1,6 +1,6 @@
<?php <?php
use Aviat\AnimeClient\Transformer\Hummingbird\MangaListTransformer; use Aviat\AnimeClient\Hummingbird\Transformer\MangaListTransformer;
class MangaListTransformerTest extends AnimeClient_TestCase { class MangaListTransformerTest extends AnimeClient_TestCase {

View File

@ -1,6 +1,6 @@
<?php <?php
use Aviat\AnimeClient\Transformer\Hummingbird\MangaListsZipper; use Aviat\AnimeClient\Hummingbird\Transformer\MangaListsZipper;
class MangaListsZipperTest extends AnimeClient_TestCase { class MangaListsZipperTest extends AnimeClient_TestCase {

View File

@ -9,6 +9,68 @@ class ArrayTypeTest extends AnimeClient_TestCase {
parent::setUp(); 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() public function testMerge()
{ {
$obj = $this->arr([1, 3, 5, 7]); $obj = $this->arr([1, 3, 5, 7]);
@ -30,6 +92,16 @@ class ArrayTypeTest extends AnimeClient_TestCase {
$this->assertTrue(is_array($actual)); $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() public function testHas()
{ {
$obj = $this->arr([1, 2, 6, 8, 11]); $obj = $this->arr([1, 2, 6, 8, 11]);