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

View File

@ -20,7 +20,7 @@ class Config {
/**
* Constructor
*
* @param array $config_files
* @param 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\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;

View File

@ -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' => '',

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
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';

View File

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

View File

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

View File

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

View File

@ -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 {
/**

View File

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

View File

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

View File

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

View File

@ -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();
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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,6 +92,8 @@ class ArrayType {
$func($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;
/**
* Base view response class
*/
abstract class View {
use Di\ContainerAware;

View File

@ -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 {
/**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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]);