Set up a proper formatter for more consistent code style

This commit is contained in:
Timothy Warren 2022-03-03 17:26:09 -05:00
parent 9b945ca0a5
commit 047ee4cb37
143 changed files with 1714 additions and 1211 deletions

4
.gitignore vendored
View File

@ -152,4 +152,6 @@ public/mal_mappings.json
tmp
tools/vendor/
tools/phinx/vendor/
tools/phinx/vendor/
/.php-cs-fixer.php
/.php-cs-fixer.cache

551
.php-cs-fixer.dist.php Normal file
View File

@ -0,0 +1,551 @@
<?php declare(strict_types=1);
use Nexus\CsConfig\Factory;
use PhpCsFixer\{Config, Finder};
$finder = Finder::create()
->in([
__DIR__,
__DIR__ . '/tools',
// __DIR__ . '/app'
])
->exclude([
'apidocs',
'build',
'coverage',
'frontEndSrc',
'phinx',
'public',
'tools',
'tmp',
'vendor'
]);
$srcFinder = Finder::create()->in(__DIR__ . '/src');
return (new Config())
->setRiskyAllowed(TRUE)
->setFinder($srcFinder)
->setIndent(' ')
->setRules([
'align_multiline_comment' => false,
'array_indentation' => true,
'array_push' => true,
'array_syntax' => ['syntax' => 'short'],
'assign_null_coalescing_to_coalesce_equal' => true,
'backtick_to_shell_exec' => true,
'binary_operator_spaces' => [
'default' => 'single_space',
'operators' => [
'=' => NULL,
'&' => NULL,
]
],
'blank_line_after_namespace' => true,
'blank_line_after_opening_tag' => false,
'blank_line_before_statement' => [
'statements' => [
'case',
'continue',
'declare',
'default',
'do',
'exit',
'for',
'foreach',
'goto',
'return',
'switch',
'throw',
'try',
'while',
'yield',
'yield_from',
],
],
'braces' => [
'allow_single_line_anonymous_class_with_empty_body' => true,
'allow_single_line_closure' => true,
'position_after_anonymous_constructs' => 'same',
'position_after_control_structures' => 'next',
'position_after_functions_and_oop_constructs' => 'next',
],
'cast_spaces' => ['space' => 'single'],
'class_attributes_separation' => [
'elements' => [
'const' => 'none',
'property' => 'none',
'method' => 'one',
'trait_import' => 'none',
],
],
'class_definition' => [
'multi_line_extends_each_single_line' => true,
'single_item_single_line' => true,
'single_line' => true,
'space_before_parenthesis' => true,
],
'class_reference_name_casing' => true,
'clean_namespace' => true,
'combine_consecutive_issets' => true,
'combine_consecutive_unsets' => true,
'combine_nested_dirname' => true,
'comment_to_phpdoc' => [
'ignored_tags' => [
'todo',
'codeCoverageIgnore',
'codeCoverageIgnoreStart',
'codeCoverageIgnoreEnd',
'phpstan-ignore-line',
'phpstan-ignore-next-line',
],
],
'compact_nullable_typehint' => true,
'concat_space' => ['spacing' => 'one'],
'constant_case' => ['case' => 'upper'],
'control_structure_continuation_position' => ['position' => 'next_line'],
'date_time_immutable' => false,
'declare_equal_normalize' => ['space' => 'none'],
'declare_parentheses' => true,
'declare_strict_types' => true,
'dir_constant' => true,
'doctrine_annotation_array_assignment' => false,
'doctrine_annotation_braces' => false,
'doctrine_annotation_indentation' => false,
'doctrine_annotation_spaces' => false,
'echo_tag_syntax' => [
'format' => 'short',
'long_function' => 'echo',
'shorten_simple_statements_only' => false,
],
'elseif' => true,
'empty_loop_body' => ['style' => 'braces'],
'empty_loop_condition' => ['style' => 'while'],
'encoding' => true,
'ereg_to_preg' => true,
'error_suppression' => [
'mute_deprecation_error' => true,
'noise_remaining_usages' => false,
'noise_remaining_usages_exclude' => [],
],
'escape_implicit_backslashes' => [
'double_quoted' => true,
'heredoc_syntax' => true,
'single_quoted' => false,
],
'explicit_indirect_variable' => true,
'explicit_string_variable' => true,
'final_class' => false,
'final_internal_class' => [
'annotation_exclude' => ['@no-final'],
'annotation_include' => ['@internal'],
'consider_absent_docblock_as_internal_class' => false,
],
'final_public_method_for_abstract_class' => false,
'fopen_flag_order' => true,
'fopen_flags' => ['b_mode' => true],
'full_opening_tag' => true,
'fully_qualified_strict_types' => true,
'function_declaration' => ['closure_function_spacing' => 'one'],
'function_to_constant' => [
'functions' => [
'get_called_class',
'get_class',
'get_class_this',
'php_sapi_name',
'phpversion',
'pi',
],
],
'function_typehint_space' => true,
'general_phpdoc_annotation_remove' => false,
'general_phpdoc_tag_rename' => false,
'get_class_to_class_keyword' => false,
'global_namespace_import' => [
'import_constants' => true,
'import_functions' => true,
'import_classes' => true,
],
'group_import' => true,
'header_comment' => false, // false by default
'heredoc_indentation' => ['indentation' => 'start_plus_one'],
'heredoc_to_nowdoc' => true,
'implode_call' => true,
'include' => true,
'increment_style' => ['style' => 'post'],
'indentation_type' => true,
'integer_literal_case' => true,
'is_null' => true,
'lambda_not_used_import' => true,
'line_ending' => true,
'linebreak_after_opening_tag' => false,
'list_syntax' => ['syntax' => 'short'],
'logical_operators' => true,
'lowercase_cast' => true,
'lowercase_keywords' => true,
'lowercase_static_reference' => true,
'magic_constant_casing' => true,
'magic_method_casing' => true,
'mb_str_functions' => false,
'method_argument_space' => [
'after_heredoc' => false,
'keep_multiple_spaces_after_comma' => false,
'on_multiline' => 'ensure_fully_multiline',
],
'method_chaining_indentation' => true,
'modernize_strpos' => false, // requires 8.0+
'modernize_types_casting' => true,
'multiline_comment_opening_closing' => true,
'multiline_whitespace_before_semicolons' => ['strategy' => 'no_multi_line'],
'native_constant_invocation' => false,
'native_function_casing' => true,
'native_function_invocation' => false,
'native_function_type_declaration_casing' => true,
'new_with_braces' => true,
'no_alias_functions' => ['sets' => ['@all']],
'no_alias_language_construct_call' => true,
'no_alternative_syntax' => ['fix_non_monolithic_code' => false],
'no_binary_string' => true,
'no_blank_lines_after_class_opening' => true,
'no_blank_lines_after_phpdoc' => true,
'no_blank_lines_before_namespace' => false, // conflicts with `single_blank_line_before_namespace`
'no_break_comment' => ['comment_text' => 'no break'],
'no_closing_tag' => true,
'no_empty_comment' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => ['tokens' => ['extra']],
'no_homoglyph_names' => true,
'no_leading_import_slash' => true,
'no_leading_namespace_whitespace' => true,
'no_mixed_echo_print' => ['use' => 'echo'],
'no_multiline_whitespace_around_double_arrow' => true,
'no_null_property_initialization' => true,
// 'no_php4_constructor' => true,
'no_short_bool_cast' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_space_around_double_colon' => true,
'no_spaces_after_function_name' => true,
'no_spaces_around_offset' => ['positions' => ['inside', 'outside']],
'no_spaces_inside_parenthesis' => true,
'no_superfluous_elseif' => true,
'no_superfluous_phpdoc_tags' => [
'allow_mixed' => true,
'allow_unused_params' => true,
'remove_inheritdoc' => false,
],
'no_trailing_comma_in_list_call' => true,
'no_trailing_comma_in_singleline_array' => true,
'no_trailing_whitespace' => true,
'no_trailing_whitespace_in_comment' => true,
'no_trailing_whitespace_in_string' => true,
'no_unneeded_control_parentheses' => [
'statements' => [
'break',
'clone',
'continue',
'echo_print',
'return',
'switch_case',
'yield',
],
],
'no_unneeded_curly_braces' => ['namespaces' => true],
'no_unneeded_final_method' => ['private_methods' => true],
'no_unneeded_import_alias' => true,
'no_unreachable_default_argument_value' => true,
'no_unset_cast' => true,
'no_unset_on_property' => false,
'no_unused_imports' => true,
'no_useless_else' => true,
'no_useless_return' => true,
'no_useless_sprintf' => true,
'no_whitespace_before_comma_in_array' => ['after_heredoc' => true],
'no_whitespace_in_blank_line' => true,
'non_printable_character' => ['use_escape_sequences_in_strings' => true],
'normalize_index_brace' => true,
'not_operator_with_space' => true,
'not_operator_with_successor_space' => true,
'nullable_type_declaration_for_default_null_value' => ['use_nullable_type_declaration' => true],
'object_operator_without_whitespace' => true,
// 'octal_notation' => false, // requires 8.1+
'operator_linebreak' => ['only_booleans' => true, 'position' => 'beginning'],
'ordered_class_elements' => [
'order' => [
'use_trait',
'constant',
'property',
'method',
],
'sort_algorithm' => 'none',
],
'ordered_imports' => [
'sort_algorithm' => 'alpha',
'imports_order' => ['class', 'function', 'const'],
],
'ordered_interfaces' => false,
'ordered_traits' => false,
'php_unit_construct' => [
'assertions' => [
'assertSame',
'assertEquals',
'assertNotEquals',
'assertNotSame',
],
],
'php_unit_dedicate_assert' => ['target' => 'newest'],
'php_unit_dedicate_assert_internal_type' => ['target' => 'newest'],
'php_unit_expectation' => ['target' => 'newest'],
'php_unit_fqcn_annotation' => true,
'php_unit_internal_class' => ['types' => ['normal', 'final']],
'php_unit_method_casing' => ['case' => 'camel_case'],
'php_unit_mock' => ['target' => 'newest'],
'php_unit_mock_short_will_return' => true,
'php_unit_namespaced' => ['target' => 'newest'],
'php_unit_no_expectation_annotation' => [
'target' => 'newest',
'use_class_const' => true,
],
'php_unit_set_up_tear_down_visibility' => true,
'php_unit_size_class' => false,
'php_unit_strict' => [
'assertions' => [
'assertAttributeEquals',
'assertAttributeNotEquals',
'assertEquals',
'assertNotEquals',
],
],
'php_unit_test_annotation' => ['style' => 'prefix'],
'php_unit_test_case_static_method_calls' => [
'call_type' => 'this',
'methods' => [],
],
'php_unit_test_class_requires_covers' => false,
'phpdoc_add_missing_param_annotation' => ['only_untyped' => true],
'phpdoc_align' => [
'align' => 'left'
],
// 'phpdoc_align' => [
// 'align' => 'vertical',
// 'tags' => [
// 'method',
// 'param',
// 'property',
// 'return',
// 'throws',
// 'type',
// 'var',
// ],
// ],
'phpdoc_annotation_without_dot' => false,
'phpdoc_indent' => true,
'phpdoc_inline_tag_normalizer' => [
'tags' => [
'example',
'id',
'internal',
'inheritdoc',
'inheritdocs',
'link',
'source',
'toc',
'tutorial',
],
],
'phpdoc_line_span' => [
'const' => 'multi',
'method' => 'multi',
'property' => 'multi',
],
'phpdoc_no_access' => true,
// 'phpdoc_no_alias_tag' => [
// 'replacements' => [
// 'property-read' => 'property',
// 'property-write' => 'property',
// 'type' => 'var',
// 'link' => 'see',
// ],
// ],
'phpdoc_no_empty_return' => false,
'phpdoc_no_package' => false,
'phpdoc_no_useless_inheritdoc' => true,
'phpdoc_order' => true,
'phpdoc_order_by_value' => [
'annotations' => [
'author',
'covers',
'coversNothing',
'dataProvider',
'depends',
'group',
'internal',
'method',
'property',
'property-read',
'property-write',
'requires',
'throws',
'uses',
],
],
'phpdoc_return_self_reference' => [
'replacements' => [
'this' => '$this',
'@this' => '$this',
'$self' => 'self',
'@self' => 'self',
'$static' => 'static',
'@static' => 'static',
],
],
'phpdoc_scalar' => [
'types' => [
'boolean',
'callback',
'double',
'integer',
'real',
'str',
],
],
'phpdoc_separation' => false,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_summary' => false,
'phpdoc_tag_casing' => ['tags' => ['inheritDoc']],
'phpdoc_tag_type' => ['tags' => ['inheritDoc' => 'inline']],
'phpdoc_to_comment' => false,
'phpdoc_to_param_type' => false,
'phpdoc_to_property_type' => false,
'phpdoc_to_return_type' => false,
'phpdoc_trim' => true,
'phpdoc_trim_consecutive_blank_line_separation' => true,
'phpdoc_types' => ['groups' => ['simple', 'alias', 'meta']],
'phpdoc_types_order' => [
'null_adjustment' => 'always_last',
'sort_algorithm' => 'alpha',
],
'phpdoc_var_annotation_correct_order' => true,
'phpdoc_var_without_name' => true,
'pow_to_exponentiation' => true,
'protected_to_private' => true,
'psr_autoloading' => ['dir' => null],
'random_api_migration' => [
'replacements' => [
'getrandmax' => 'mt_getrandmax',
'rand' => 'mt_rand',
'srand' => 'mt_srand',
],
],
'regular_callable_call' => true,
'return_assignment' => true,
'return_type_declaration' => ['space_before' => 'none'],
'self_accessor' => false,
'self_static_accessor' => true,
'semicolon_after_instruction' => false,
'set_type_to_cast' => true,
'short_scalar_cast' => true,
'simple_to_complex_string_variable' => true,
'simplified_if_return' => true,
'simplified_null_return' => false,
'single_blank_line_at_eof' => true,
'single_blank_line_before_namespace' => true,
'single_class_element_per_statement' => ['elements' => ['const', 'property']],
'single_import_per_statement' => false,
'single_line_after_imports' => true,
'single_line_comment_style' => ['comment_types' => ['asterisk', 'hash']],
'single_line_throw' => false,
'single_quote' => ['strings_containing_single_quote_chars' => false],
'single_space_after_construct' => [
'constructs' => [
'abstract',
'as',
'attribute',
'break',
'case',
'catch',
'class',
'clone',
'comment',
'const',
'const_import',
'continue',
'do',
'echo',
'else',
'elseif',
'extends',
'final',
'finally',
'for',
'foreach',
'function',
'function_import',
'global',
'goto',
'if',
'implements',
'include',
'include_once',
'instanceof',
'insteadof',
'interface',
'match',
'named_argument',
'new',
'open_tag_with_echo',
'php_doc',
'php_open',
'print',
'private',
'protected',
'public',
'require',
'require_once',
'return',
'static',
'throw',
'trait',
'try',
'use',
'use_lambda',
'use_trait',
'var',
'while',
'yield',
'yield_from',
],
],
'single_trait_insert_per_statement' => true,
'space_after_semicolon' => ['remove_in_empty_for_expressions' => true],
'standardize_increment' => true,
'standardize_not_equals' => true,
'static_lambda' => true,
'strict_comparison' => true,
'strict_param' => true,
'string_length_to_empty' => true,
'string_line_ending' => true,
'switch_case_semicolon_to_colon' => true,
'switch_case_space' => true,
'switch_continue_to_break' => true,
'ternary_operator_spaces' => true,
'ternary_to_elvis_operator' => true,
'ternary_to_null_coalescing' => true,
'trailing_comma_in_multiline' => [
'after_heredoc' => true,
'elements' => ['arrays'],
],
'trim_array_spaces' => true,
'types_spaces' => ['space' => 'none'],
'unary_operator_spaces' => false,
'use_arrow_functions' => true,
'visibility_required' => ['elements' => ['const', 'method', 'property']],
'void_return' => false, // changes method signature
'whitespace_after_comma_in_array' => true,
'yoda_style' => [
'equal' => false,
'identical' => null,
'less_and_greater' => false,
'always_move_variable' => false,
],
]);

31
justfile Normal file
View File

@ -0,0 +1,31 @@
# Lists the available actions
default:
@just --list
# Runs rector, showing what changes will be make
rector-dry-run:
tools/vendor/bin/rector process --config=tools/rector.php --dry-run src
# Runs rector, and updates the files
rector:
tools/vendor/bin/rector process --config=tools/rector.php src
# Check code formatting
check-fmt:
tools/vendor/bin/php-cs-fixer fix --dry-run --verbose
# Fix code formatting
fmt:
tools/vendor/bin/php-cs-fixer fix --verbose
# Run tests
test:
composer run-script test
# Run tests, update snapshots
test-update:
composer run-script test-update
# Run unit tests and generate test-coverage report
coverage:
composer run-script coverage

View File

@ -16,21 +16,25 @@
namespace Aviat\AnimeClient\API;
use const Aviat\AnimeClient\USER_AGENT;
use function Amp\Promise\wait;
use function Aviat\AnimeClient\getResponse;
use Amp\Http\Client\Body\FormBody;
use Amp\Http\Client\Request;
use Amp\Http\Client\Body\FormBody;
use Aviat\Ion\Json;
use Error;
use InvalidArgumentException;
use Psr\Log\LoggerAwareTrait;
use Throwable;
use TypeError;
use function Amp\Promise\wait;
use function Aviat\AnimeClient\getResponse;
use const Aviat\AnimeClient\USER_AGENT;
/**
* Wrapper around Http\Client to make it easier to build API requests
*/
abstract class APIRequestBuilder {
abstract class APIRequestBuilder
{
use LoggerAwareTrait;
/**
@ -101,6 +105,7 @@ abstract class APIRequestBuilder {
public function setBasicAuth(string $username, string $password): self
{
$this->setAuth('basic', base64_encode($username . ':' . $password));
return $this;
}
@ -110,6 +115,7 @@ abstract class APIRequestBuilder {
public function setBody(FormBody|string $body): self
{
$this->request->setBody($body);
return $this;
}
@ -132,15 +138,14 @@ abstract class APIRequestBuilder {
public function unsetHeader(string $name): self
{
$this->request->removeHeader($name);
return $this;
}
/**
* Set a request header
*
* @param string|null $value
*/
public function setHeader(string $name, string $value = NULL): self
public function setHeader(string $name, ?string $value = NULL): self
{
if (NULL === $value)
{
@ -158,8 +163,6 @@ abstract class APIRequestBuilder {
* Set multiple request headers
*
* name => value
*
* @param array $headers
*/
public function setHeaders(array $headers): self
{
@ -176,7 +179,7 @@ abstract class APIRequestBuilder {
*/
public function setJsonBody(mixed $body): self
{
$requestBody = ( is_string($body))
$requestBody = (is_string($body))
? $body
: Json::encode($body);
@ -189,13 +192,14 @@ abstract class APIRequestBuilder {
public function setQuery(array $params): self
{
$this->query = http_build_query($params);
return $this;
}
/**
* Return the promise for the current request
*
* @throws \Throwable
* @throws Throwable
*/
public function getFullRequest(): Request
{
@ -210,7 +214,7 @@ abstract class APIRequestBuilder {
$this->request->getBody()
->createBodyStream()
->read()
)
),
]);
}
@ -220,14 +224,15 @@ abstract class APIRequestBuilder {
/**
* Get the data from the response of the passed request
*
* @throws Error
* @throws Throwable
* @throws TypeError
* @return mixed
* @throws \Error
* @throws \Throwable
* @throws \TypeError
*/
public function getResponseData(Request $request)
{
$response = getResponse($request);
return wait($response->getBody()->buffer());
}
@ -295,4 +300,4 @@ abstract class APIRequestBuilder {
$this->request->setTcpConnectTimeout(300000);
$this->request->setTransferTimeout(300000);
}
}
}

View File

@ -22,8 +22,8 @@ use Aviat\AnimeClient\Types\FormItemData;
/**
* Common interface for anime and manga list item CRUD
*/
abstract class AbstractListItem {
abstract class AbstractListItem
{
/**
* Create a list item
*
@ -62,5 +62,5 @@ abstract class AbstractListItem {
*
* @param string $id - The id of the list item to delete
*/
abstract public function delete(string $id):?Request;
}
abstract public function delete(string $id): ?Request;
}

View File

@ -26,7 +26,8 @@ use Aviat\AnimeClient\Types\FormItemData;
/**
* CRUD operations for MAL list items
*/
final class ListItem extends AbstractListItem {
final class ListItem extends AbstractListItem
{
use RequestBuilderTrait;
/**
@ -35,6 +36,7 @@ final class ListItem extends AbstractListItem {
public function create(array $data): Request
{
$checkedData = Types\MediaListEntry::check($data);
return $this->requestBuilder->mutateRequest('CreateMediaListEntry', $checkedData ?? []);
}
@ -44,6 +46,7 @@ final class ListItem extends AbstractListItem {
public function createFull(array $data): Request
{
$checkedData = Types\MediaListEntry::check($data);
return $this->requestBuilder->mutateRequest('CreateFullMediaListEntry', $checkedData ?? []);
}
@ -82,23 +85,23 @@ final class ListItem extends AbstractListItem {
public function update(string $id, FormItemData $data): Request
{
$notes = $data->notes ?? '';
$progress = (int)$data->progress;
$private = (bool)$data->private;
$progress = (int) $data->progress;
$private = (bool) $data->private;
$rating = $data->ratingTwenty;
$status = ($data->reconsuming === TRUE)
? AnilistStatus::REPEATING
: AnimeWatchingStatus::KITSU_TO_ANILIST[$data->status];
$updateData = Types\MediaListEntry::check([
'id' => (int)$id,
'id' => (int) $id,
'status' => $status,
'score' => $rating * 5,
'progress' => $progress,
'repeat' => (int)$data['reconsumeCount'],
'repeat' => (int) $data['reconsumeCount'],
'private' => $private,
'notes' => $notes,
]);
return $this->requestBuilder->mutateRequest('UpdateMediaListEntry', $updateData ?? []);
}
}
}

View File

@ -18,4 +18,6 @@ namespace Aviat\AnimeClient\API\Anilist;
use InvalidArgumentException;
class MissingIdException extends InvalidArgumentException {}
class MissingIdException extends InvalidArgumentException
{
}

View File

@ -16,19 +16,17 @@
namespace Aviat\AnimeClient\API\Anilist;
use function Amp\Promise\wait;
use InvalidArgumentException;
use Amp\Http\Client\Request;
use Aviat\AnimeClient\Anilist;
use Aviat\AnimeClient\API\Mapping\{AnimeWatchingStatus, MangaReadingStatus};
use Aviat\AnimeClient\Types\FormItem;
use Aviat\Ion\Di\Exception\{ContainerException, NotFoundException};
use Aviat\Ion\Json;
use Aviat\Ion\Di\Exception\ContainerException;
use Aviat\Ion\Di\Exception\NotFoundException;
use InvalidArgumentException;
use Throwable;
use function Amp\Promise\wait;
/**
* Anilist API Model
@ -179,7 +177,7 @@ final class Model
$data = $this->listItem->get($id)['data'];
return ($data !== null)
return ($data !== NULL)
? $data['MediaList']
: [];
}
@ -270,7 +268,7 @@ final class Model
return NULL;
}
return (string)$info['data']['MediaList']['id'];
return (string) $info['data']['MediaList']['id'];
}
/**
@ -293,6 +291,6 @@ final class Model
return NULL;
}
return (string)$info['data']['Media']['id'];
return (string) $info['data']['Media']['id'];
}
}
}

View File

@ -16,24 +16,22 @@
namespace Aviat\AnimeClient\API\Anilist;
use Amp\Http\Client\Request;
use Amp\Http\Client\Response;
use Amp\Http\Client\{Request, Response};
use Aviat\AnimeClient\Anilist;
use Aviat\Ion\Di\ContainerAware;
use Aviat\Ion\Di\ContainerInterface;
use Aviat\Ion\Json;
use Aviat\Ion\JsonException;
use function Amp\Promise\wait;
use function Aviat\AnimeClient\getResponse;
use const Aviat\AnimeClient\USER_AGENT;
use Aviat\AnimeClient\API\APIRequestBuilder;
use Aviat\Ion\Di\{ContainerAware, ContainerInterface};
use Aviat\Ion\{Json, JsonException};
use LogicException;
use Throwable;
final class RequestBuilder extends APIRequestBuilder {
use function Amp\Promise\wait;
use function Aviat\AnimeClient\getResponse;
use function in_array;
use const Aviat\AnimeClient\USER_AGENT;
final class RequestBuilder extends APIRequestBuilder
{
use ContainerAware;
/**
@ -115,27 +113,28 @@ final class RequestBuilder extends APIRequestBuilder {
$query = file_get_contents($file);
$body = [
'query' => $query
'query' => $query,
];
if ( ! empty($variables))
{
$body['variables'] = [];
foreach($variables as $key => $val)
foreach ($variables as $key => $val)
{
$body['variables'][$key] = $val;
}
}
return $this->postRequest([
'body' => $body
'body' => $body,
]);
}
/**
* @throws Throwable
*/
public function mutateRequest (string $name, array $variables = []): Request
public function mutateRequest(string $name, array $variables = []): Request
{
$file = __DIR__ . "/Mutations/{$name}.graphql";
if ( ! file_exists($file))
@ -146,11 +145,13 @@ final class RequestBuilder extends APIRequestBuilder {
$query = file_get_contents($file);
$body = [
'query' => $query
'query' => $query,
];
if (!empty($variables)) {
if ( ! empty($variables))
{
$body['variables'] = [];
foreach ($variables as $key => $val)
{
$body['variables'][$key] = $val;
@ -166,7 +167,7 @@ final class RequestBuilder extends APIRequestBuilder {
* @throws Throwable
* @return mixed[]
*/
public function mutate (string $name, array $variables = []): array
public function mutate(string $name, array $variables = []): array
{
$request = $this->mutateRequest($name, $variables);
$response = $this->getResponseFromRequest($request);
@ -242,13 +243,13 @@ final class RequestBuilder extends APIRequestBuilder {
//'requestHeaders' => $request->getHeaders(),
]);
if ( ! \in_array($response->getStatus(), $validResponseCodes, TRUE))
if ( ! in_array($response->getStatus(), $validResponseCodes, TRUE))
{
$logger?->warning('Non 200 response for POST api call', (array)$response->getBody());
$logger?->warning('Non 200 response for POST api call', (array) $response->getBody());
}
$rawBody = wait($response->getBody()->buffer());
try
{
return Json::decode($rawBody);
@ -257,7 +258,8 @@ final class RequestBuilder extends APIRequestBuilder {
{
dump($e);
dump($rawBody);
die();
exit();
}
}
}
}

View File

@ -18,7 +18,8 @@ namespace Aviat\AnimeClient\API\Anilist;
use Aviat\Ion\Di\ContainerAware;
trait RequestBuilderTrait {
trait RequestBuilderTrait
{
use ContainerAware;
/**
@ -32,6 +33,7 @@ trait RequestBuilderTrait {
public function setRequestBuilder(RequestBuilder $requestBuilder): self
{
$this->requestBuilder = $requestBuilder;
return $this;
}
}
}

View File

@ -16,9 +16,7 @@
namespace Aviat\AnimeClient\API\Anilist\Transformer;
use Aviat\AnimeClient\API\Enum\AnimeWatchingStatus\Anilist as AnilistStatus;
use Aviat\AnimeClient\API\Enum\AnimeWatchingStatus\Kitsu as KitsuStatus;
use Aviat\AnimeClient\API\Mapping\AnimeWatchingStatus;
use Aviat\AnimeClient\API\{Enum, Mapping};
use Aviat\AnimeClient\Types\{AnimeListItem, FormItem};
use Aviat\Ion\Transformer\AbstractTransformer;
@ -26,8 +24,8 @@ use Aviat\Ion\Transformer\AbstractTransformer;
use DateTime;
use DateTimeInterface;
class AnimeListTransformer extends AbstractTransformer {
class AnimeListTransformer extends AbstractTransformer
{
public function transform(array|object $item): AnimeListItem
{
return AnimeListItem::from([]);
@ -35,12 +33,10 @@ class AnimeListTransformer extends AbstractTransformer {
/**
* Transform Anilist list item to Kitsu form update format
*
* @return FormItem
*/
public function untransform(array $item): FormItem
{
$reconsuming = $item['status'] === AnilistStatus::REPEATING;
$reconsuming = $item['status'] === Enum\AnimeWatchingStatus\Anilist::REPEATING;
return FormItem::from([
'id' => $item['id'],
@ -53,12 +49,12 @@ class AnimeListTransformer extends AbstractTransformer {
'reconsumeCount' => $item['repeat'],
'reconsuming' => $reconsuming,
'status' => $reconsuming
? KitsuStatus::WATCHING
: AnimeWatchingStatus::ANILIST_TO_KITSU[$item['status']],
? Enum\AnimeWatchingStatus\Kitsu::WATCHING
: Mapping\AnimeWatchingStatus::ANILIST_TO_KITSU[$item['status']],
'updatedAt' => (new DateTime())
->setTimestamp($item['updatedAt'])
->format(DateTimeInterface::W3C)
->format(DateTimeInterface::W3C),
],
]);
}
}
}

View File

@ -16,19 +16,15 @@
namespace Aviat\AnimeClient\API\Anilist\Transformer;
use Aviat\AnimeClient\API\Enum\MangaReadingStatus\Anilist as AnilistStatus;
use Aviat\AnimeClient\API\Enum\MangaReadingStatus\Kitsu as KitsuStatus;
use Aviat\AnimeClient\API\Mapping\MangaReadingStatus;
use Aviat\AnimeClient\Types\MangaListItem;
use Aviat\AnimeClient\Types\FormItem;
use Aviat\AnimeClient\API\{Enum, Mapping};
use Aviat\AnimeClient\Types\{FormItem, MangaListItem};
use Aviat\Ion\Transformer\AbstractTransformer;
use DateTime;
use DateTimeInterface;
class MangaListTransformer extends AbstractTransformer {
class MangaListTransformer extends AbstractTransformer
{
public function transform(array|object $item): MangaListItem
{
return MangaListItem::from([]);
@ -39,7 +35,7 @@ class MangaListTransformer extends AbstractTransformer {
*/
public function untransform(array $item): FormItem
{
$reconsuming = $item['status'] === AnilistStatus::REPEATING;
$reconsuming = $item['status'] === Enum\MangaReadingStatus\Anilist::REPEATING;
return FormItem::from([
'id' => $item['id'],
@ -52,12 +48,12 @@ class MangaListTransformer extends AbstractTransformer {
'reconsumeCount' => $item['repeat'],
'reconsuming' => $reconsuming,
'status' => $reconsuming
? KitsuStatus::READING
: MangaReadingStatus::ANILIST_TO_KITSU[$item['status']],
? Enum\MangaReadingStatus\Kitsu::READING
: Mapping\MangaReadingStatus::ANILIST_TO_KITSU[$item['status']],
'updatedAt' => (new DateTime())
->setTimestamp($item['updatedAt'])
->format(DateTimeInterface::W3C),
]
],
]);
}
}
}

View File

@ -18,19 +18,13 @@ namespace Aviat\AnimeClient\API\Anilist\Types;
use Aviat\AnimeClient\Types\AbstractType;
class MediaListEntry extends AbstractType {
class MediaListEntry extends AbstractType
{
public int|string $id;
public ?string $notes;
public ?bool $private;
public int $progress;
public ?int $repeat;
public string $status;
public ?int $score;
}
}

View File

@ -21,8 +21,8 @@ use Psr\SimpleCache\CacheInterface;
/**
* Helper methods for dealing with the Cache
*/
trait CacheTrait {
trait CacheTrait
{
protected CacheInterface $cache;
/**
@ -31,6 +31,7 @@ trait CacheTrait {
public function setCache(CacheInterface $cache): self
{
$this->cache = $cache;
return $this;
}
@ -64,4 +65,4 @@ trait CacheTrait {
return $value;
}
}
}

View File

@ -21,11 +21,12 @@ use Aviat\Ion\Enum;
/**
* Possible values for watching status for the current anime
*/
final class Anilist extends Enum {
final class Anilist extends Enum
{
public const WATCHING = 'CURRENT';
public const COMPLETED = 'COMPLETED';
public const ON_HOLD = 'PAUSED';
public const DROPPED = 'DROPPED';
public const PLAN_TO_WATCH = 'PLANNING';
public const REPEATING = 'REPEATING';
}
}

View File

@ -21,10 +21,11 @@ use Aviat\Ion\Enum;
/**
* Possible values for watching status for the current anime
*/
final class Kitsu extends Enum {
final class Kitsu extends Enum
{
public const WATCHING = 'current';
public const PLAN_TO_WATCH = 'planned';
public const ON_HOLD = 'on_hold';
public const DROPPED = 'dropped';
public const COMPLETED = 'completed';
}
}

View File

@ -21,7 +21,8 @@ use Aviat\Ion\Enum;
/**
* Possible values for current watching status of anime
*/
final class Route extends Enum {
final class Route extends Enum
{
public const ALL = 'all';
public const WATCHING = 'watching';
public const PLAN_TO_WATCH = 'plan_to_watch';

View File

@ -21,7 +21,8 @@ use Aviat\Ion\Enum;
/**
* Possible values for current watching status of anime
*/
final class Title extends Enum {
final class Title extends Enum
{
public const ALL = 'All';
public const WATCHING = 'Currently Watching';
public const PLAN_TO_WATCH = 'Plan to Watch';

View File

@ -21,11 +21,12 @@ use Aviat\Ion\Enum;
/**
* Possible values for watching status for the current anime
*/
final class Anilist extends Enum {
final class Anilist extends Enum
{
public const READING = 'CURRENT';
public const COMPLETED = 'COMPLETED';
public const ON_HOLD = 'PAUSED';
public const DROPPED = 'DROPPED';
public const PLAN_TO_READ = 'PLANNING';
public const REPEATING = 'REPEATING';
}
}

View File

@ -21,10 +21,11 @@ use Aviat\Ion\Enum;
/**
* Possible values for current reading status of manga
*/
final class Kitsu extends Enum {
final class Kitsu extends Enum
{
public const READING = 'current';
public const PLAN_TO_READ = 'planned';
public const DROPPED = 'dropped';
public const ON_HOLD = 'on_hold';
public const COMPLETED = 'completed';
}
}

View File

@ -21,7 +21,8 @@ use Aviat\Ion\Enum;
/**
* Possible values for current reading status of manga
*/
final class Route extends Enum {
final class Route extends Enum
{
public const ALL = 'all';
public const READING = 'reading';
public const PLAN_TO_READ = 'plan_to_read';

View File

@ -21,7 +21,8 @@ use Aviat\Ion\Enum;
/**
* Possible values for current reading status of manga
*/
final class Title extends Enum {
final class Title extends Enum
{
public const ALL = 'All';
public const READING = 'Currently Reading';
public const PLAN_TO_READ = 'Plan to Read';

View File

@ -21,6 +21,6 @@ use UnexpectedValueException;
/**
* Exception for an API Request that fails validation
*/
class FailedResponseException extends UnexpectedValueException {
}
class FailedResponseException extends UnexpectedValueException
{
}

View File

@ -18,17 +18,18 @@ namespace Aviat\AnimeClient\API\Kitsu;
use Aura\Session\Segment;
use const Aviat\AnimeClient\SESSION_SEGMENT;
use Aviat\AnimeClient\API\CacheTrait;
use Aviat\AnimeClient\Kitsu as K;
use Aviat\AnimeClient\API\CacheTrait;
use Aviat\Ion\Di\{ContainerAware, ContainerInterface};
use Aviat\Ion\Event;
use const Aviat\AnimeClient\SESSION_SEGMENT;
/**
* Kitsu API Authentication
*/
final class Auth {
final class Auth
{
use CacheTrait;
use ContainerAware;
@ -44,8 +45,6 @@ final class Auth {
/**
* Constructor
*
* @param ContainerInterface $container
*/
public function __construct(ContainerInterface $container)
{
@ -94,7 +93,7 @@ final class Auth {
*/
public function isAuthenticated(): bool
{
return ($this->getAuthToken() !== NULL);
return $this->getAuthToken() !== NULL;
}
/**
@ -136,7 +135,7 @@ final class Auth {
/**
* Save the new authentication information
*/
private function storeAuth(array|false $auth): bool
private function storeAuth(array|FALSE $auth): bool
{
if (FALSE !== $auth)
{
@ -157,6 +156,7 @@ final class Auth {
$this->segment->set('auth_token', $auth['access_token']);
$this->segment->set('auth_token_expires', $expire_time);
$this->segment->set('refresh_token', $auth['refresh_token']);
return TRUE;
}
}
@ -165,4 +165,4 @@ final class Auth {
}
}
// End of KitsuAuth.php
// End of KitsuAuth.php

View File

@ -21,7 +21,8 @@ use Aviat\Ion\Enum as BaseEnum;
/**
* Status of when anime is being/was/will be aired