Merge pull request #329 from mcg-web/code_quality

Code quality
This commit is contained in:
Vladimir Razuvaev 2018-08-28 14:41:55 +07:00 committed by GitHub
commit f1fc5d66c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 52 additions and 27 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ composer.phar
composer.lock composer.lock
vendor/ vendor/
bin/ bin/
phpstan.phar

View File

@ -9,7 +9,13 @@ php:
- 7.2 - 7.2
- nightly - nightly
matrix: jobs:
include:
- stage: Code Quality
php: 7.2
env: STATIC_ANALYSIS
install: travis_retry composer install --prefer-dist
script: composer static-analysis
allow_failures: allow_failures:
- php: nightly - php: nightly
@ -22,10 +28,7 @@ before_install:
- phpenv config-rm xdebug.ini || true - phpenv config-rm xdebug.ini || true
- composer selfupdate - composer selfupdate
install: install: composer install --dev --prefer-dist
- composer install --dev --prefer-dist
- composer require react/promise:2.*
- composer require psr/http-message:1.*
script: if [ "$TRAVIS_PHP_VERSION" == "5.6" ]; then bin/phpunit --coverage-clover build/logs/clover.xml --group default,ReactPromise; else bin/phpunit --group default,ReactPromise; fi script: if [ "$TRAVIS_PHP_VERSION" == "5.6" ]; then bin/phpunit --coverage-clover build/logs/clover.xml --group default,ReactPromise; else bin/phpunit --group default,ReactPromise; fi

View File

@ -14,13 +14,11 @@
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^4.8", "phpunit/phpunit": "^4.8",
"psr/http-message": "^1.0" "psr/http-message": "^1.0",
"react/promise": "2.*"
}, },
"config": { "config": {
"bin-dir": "bin", "bin-dir": "bin",
"platform": {
"php": "5.6.0"
},
"preferred-install": "dist", "preferred-install": "dist",
"sort-packages": true "sort-packages": true
}, },
@ -36,6 +34,15 @@
"GraphQL\\Examples\\Blog\\": "examples/01-blog/Blog/" "GraphQL\\Examples\\Blog\\": "examples/01-blog/Blog/"
} }
}, },
"scripts": {
"static-analysis": [
"rm phpstan.phar || true",
"@composer req --ansi --no-interaction --dev phpstan/phpstan-shim",
"cp -f vendor/phpstan/phpstan-shim/phpstan.phar .",
"@composer rem --ansi --dev phpstan/phpstan-shim",
"@php phpstan.phar analyse --ansi -l 1 -c phpstan.neon src"
]
},
"suggest": { "suggest": {
"react/promise": "To leverage async resolving on React PHP platform", "react/promise": "To leverage async resolving on React PHP platform",
"psr/http-message": "To use standard GraphQL server" "psr/http-message": "To use standard GraphQL server"

0
phpstan.neon Normal file
View File

View File

@ -2,6 +2,7 @@
namespace GraphQL\Executor; namespace GraphQL\Executor;
use GraphQL\Error\Error; use GraphQL\Error\Error;
use GraphQL\Executor\Promise\PromiseAdapter;
use GraphQL\Language\AST\FragmentDefinitionNode; use GraphQL\Language\AST\FragmentDefinitionNode;
use GraphQL\Language\AST\OperationDefinitionNode; use GraphQL\Language\AST\OperationDefinitionNode;
use GraphQL\Type\Schema; use GraphQL\Type\Schema;
@ -56,6 +57,11 @@ class ExecutionContext
*/ */
public $errors; public $errors;
/**
* @var PromiseAdapter
*/
public $promises;
public function __construct( public function __construct(
$schema, $schema,
$fragments, $fragments,

View File

@ -560,7 +560,7 @@ class Executor
switch ($selection->kind) { switch ($selection->kind) {
case NodeKind::FIELD: case NodeKind::FIELD:
if (!$this->shouldIncludeNode($selection)) { if (!$this->shouldIncludeNode($selection)) {
continue; continue 2;
} }
$name = self::getFieldEntryKey($selection); $name = self::getFieldEntryKey($selection);
if (!isset($fields[$name])) { if (!isset($fields[$name])) {
@ -572,7 +572,7 @@ class Executor
if (!$this->shouldIncludeNode($selection) || if (!$this->shouldIncludeNode($selection) ||
!$this->doesFragmentConditionMatch($selection, $runtimeType) !$this->doesFragmentConditionMatch($selection, $runtimeType)
) { ) {
continue; continue 2;
} }
$this->collectFields( $this->collectFields(
$runtimeType, $runtimeType,
@ -584,14 +584,14 @@ class Executor
case NodeKind::FRAGMENT_SPREAD: case NodeKind::FRAGMENT_SPREAD:
$fragName = $selection->name->value; $fragName = $selection->name->value;
if (!empty($visitedFragmentNames[$fragName]) || !$this->shouldIncludeNode($selection)) { if (!empty($visitedFragmentNames[$fragName]) || !$this->shouldIncludeNode($selection)) {
continue; continue 2;
} }
$visitedFragmentNames[$fragName] = true; $visitedFragmentNames[$fragName] = true;
/** @var FragmentDefinitionNode|null $fragment */ /** @var FragmentDefinitionNode|null $fragment */
$fragment = isset($exeContext->fragments[$fragName]) ? $exeContext->fragments[$fragName] : null; $fragment = isset($exeContext->fragments[$fragName]) ? $exeContext->fragments[$fragName] : null;
if (!$fragment || !$this->doesFragmentConditionMatch($fragment, $runtimeType)) { if (!$fragment || !$this->doesFragmentConditionMatch($fragment, $runtimeType)) {
continue; continue 2;
} }
$this->collectFields( $this->collectFields(
$runtimeType, $runtimeType,

View File

@ -6,15 +6,6 @@ use GraphQL\Language\AST\NodeKind;
use GraphQL\Language\AST\NodeList; use GraphQL\Language\AST\NodeList;
use GraphQL\Utils\TypeInfo; use GraphQL\Utils\TypeInfo;
class VisitorOperation
{
public $doBreak;
public $doContinue;
public $removeNode;
}
/** /**
* Utility for efficient AST traversal and modification. * Utility for efficient AST traversal and modification.
* *
@ -258,6 +249,7 @@ class Visitor
if ($visitFn) { if ($visitFn) {
$result = call_user_func($visitFn, $node, $key, $parent, $path, $ancestors); $result = call_user_func($visitFn, $node, $key, $parent, $path, $ancestors);
$editValue = null;
if ($result !== null) { if ($result !== null) {
if ($result instanceof VisitorOperation) { if ($result instanceof VisitorOperation) {

View File

@ -0,0 +1,11 @@
<?php
namespace GraphQL\Language;
class VisitorOperation
{
public $doBreak;
public $doContinue;
public $removeNode;
}

View File

@ -5,7 +5,7 @@ use GraphQL\Error\FormattedError;
use GraphQL\Error\InvariantViolation; use GraphQL\Error\InvariantViolation;
use GraphQL\Executor\ExecutionResult; use GraphQL\Executor\ExecutionResult;
use GraphQL\Executor\Promise\Promise; use GraphQL\Executor\Promise\Promise;
use GraphQL\Utils; use GraphQL\Utils\Utils;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\StreamInterface; use Psr\Http\Message\StreamInterface;

View File

@ -62,6 +62,11 @@ class FieldDefinition
*/ */
public $config; public $config;
/**
* @var null|callable
*/
public $complexityFn;
/** /**
* @var OutputType * @var OutputType
*/ */
@ -108,7 +113,7 @@ class FieldDefinition
} }
/** /**
* @param array|Config $field * @param array $field
* @param string $typeName * @param string $typeName
* @return FieldDefinition * @return FieldDefinition
*/ */

View File

@ -24,7 +24,7 @@ class InputObjectField
public $description; public $description;
/** /**
* @var callback|InputType * @var callable|InputType
*/ */
public $type; public $type;

View File

@ -49,10 +49,10 @@ class VariablesDefaultValueAllowed extends AbstractValidationRule
return Visitor::skipNode(); return Visitor::skipNode();
}, },
NodeKind::SELECTION_SET => function(SelectionSetNode $node) use ($context) { NodeKind::SELECTION_SET => function(SelectionSetNode $node) {
return Visitor::skipNode(); return Visitor::skipNode();
}, },
NodeKind::FRAGMENT_DEFINITION => function(FragmentDefinitionNode $node) use ($context) { NodeKind::FRAGMENT_DEFINITION => function(FragmentDefinitionNode $node) {
return Visitor::skipNode(); return Visitor::skipNode();
}, },
]; ];