Skip to content

Commit

Permalink
Merge pull request #116 from koriym/options-schema
Browse files Browse the repository at this point in the history
OPTIONS method returns schema
  • Loading branch information
koriym authored Jul 29, 2017
2 parents a057a74 + efe3640 commit ad6346e
Show file tree
Hide file tree
Showing 13 changed files with 245 additions and 134 deletions.
2 changes: 2 additions & 0 deletions src/Module/ResourceModule.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
namespace BEAR\Resource\Module;

use BEAR\Resource\Annotation\AppName;
use BEAR\Resource\OptionsMethods;
use Ray\Di\AbstractModule;

class ResourceModule extends AbstractModule
Expand All @@ -33,5 +34,6 @@ protected function configure()
$this->bind()->annotatedWith(AppName::class)->toInstance($this->appName);
$this->install(new ResourceClientModule);
$this->install(new EmbedResourceModule);
$this->bind(OptionsMethods::class);
}
}
34 changes: 32 additions & 2 deletions src/OptionsMethods.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
*/
namespace BEAR\Resource;

use BEAR\Resource\Annotation\JsonSchema;
use BEAR\Resource\Annotation\ResourceParam;
use Doctrine\Common\Annotations\Reader;
use phpDocumentor\Reflection\DocBlockFactory;
use Ray\Di\Di\Assisted;
use Ray\Di\Di\Named;
use Ray\WebContextParam\Annotation\AbstractWebContextParam;
use Ray\WebContextParam\Annotation\CookieParam;
use Ray\WebContextParam\Annotation\EnvParam;
Expand All @@ -33,9 +35,18 @@ final class OptionsMethods
];
private $reader;

public function __construct(Reader $reader)
/**
* @var string
*/
private $schemaDir;

/**
* @Named("schemaDir=json_schema_dir")
*/
public function __construct(Reader $reader, $schemaDir = '')
{
$this->reader = $reader;
$this->schemaDir = $schemaDir;
}

/**
Expand Down Expand Up @@ -63,8 +74,13 @@ public function __invoke(ResourceObject $ro, $requestMethod)
$paramMetas['required'] = $required;
}
$paramMetas = $this->ignoreAnnotatedPrameter($method, $paramMetas);
$schema = $this->getJsonSchema($method);
$request = $paramMetas ? ['request' => $paramMetas] : [];
if ($schema) {
return $doc + $request + ['schema' => $schema];
}

return $doc + $paramMetas;
return $doc + $request;
}

private function getInMap(\ReflectionMethod $method)
Expand Down Expand Up @@ -246,4 +262,18 @@ private function ignorreAssisted(array $paramMetas, Assisted $annotation)

return $paramMetas;
}

private function getJsonSchema(\ReflectionMethod $method)
{
$schema = $this->reader->getMethodAnnotation($method, JsonSchema::class);
if (! $schema instanceof JsonSchema) {
return false;
}
$schemaFile = $this->schemaDir . '/' . $schema->schema;
if (! file_exists($schemaFile)) {
return false;
}

return (array) json_decode(file_get_contents($schemaFile));
}
}
15 changes: 2 additions & 13 deletions src/OptionsRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
*/
namespace BEAR\Resource;

use Doctrine\Common\Annotations\Reader;

/**
* RFC2616 OPTIONS method renderer
*
Expand All @@ -18,23 +16,14 @@
*/
final class OptionsRenderer implements RenderInterface
{
/**
* @var Reader
*/
private $reader;

/**
* @var OptionsMethods
*/
private $optionsMethod;

/**
* @param Reader $reader
*/
public function __construct(Reader $reader)
public function __construct(OptionsMethods $optionsMethods)
{
$this->reader = $reader;
$this->optionsMethod = new OptionsMethods($reader);
$this->optionsMethod = $optionsMethods;
}

/**
Expand Down
229 changes: 144 additions & 85 deletions tests-php7/OptionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Cache\ArrayCache;
use FakeVendor\Sandbox\Resource\App\DocPhp7;
use FakeVendor\Sandbox\Resource\App\DocUser;
use Ray\Di\Injector;

class OptionsTest extends \PHPUnit_Framework_TestCase
Expand All @@ -30,7 +31,7 @@ class OptionsTest extends \PHPUnit_Framework_TestCase

protected function setUp()
{
$this->invoker = new Invoker(new NamedParameter(new ArrayCache, new AnnotationReader, new Injector), new OptionsRenderer(new AnnotationReader));
$this->invoker = new Invoker(new NamedParameter(new ArrayCache, new AnnotationReader, new Injector), new OptionsRenderer(new OptionsMethods(new AnnotationReader, $_ENV['schema_dir'])));
}

public function testOptionsMethod()
Expand All @@ -52,44 +53,48 @@ public function testOptionsMethodBody(ResourceObject $ro)
$actual = $ro->view;
$expected = '{
"GET": {
"parameters": {
"id": {
"type": "integer",
"description": "Id"
"request": {
"parameters": {
"id": {
"type": "integer",
"description": "Id"
},
"name": {
"type": "string",
"description": "Name"
},
"sw": {
"type": "bool",
"description": "Swithc"
},
"arr": {
"type": "array"
},
"defaultNull": {
"type": "string",
"description": "DefaultNull"
}
},
"name": {
"type": "string",
"description": "Name"
},
"sw": {
"type": "bool",
"description": "Swithc"
},
"arr": {
"type": "array"
},
"defaultNull": {
"type": "string",
"description": "DefaultNull"
}
},
"required": [
"id",
"name",
"sw",
"arr"
]
"required": [
"id",
"name",
"sw",
"arr"
]
}
},
"POST": {
"parameters": {
"id": {
"in": "server",
"type": "integer"
}
},
"required": [
"id"
]
"request": {
"parameters": {
"id": {
"in": "server",
"type": "integer"
}
},
"required": [
"id"
]
}
}
}
';
Expand All @@ -104,63 +109,117 @@ public function testAssistedResource()
$actual = $ro->view;
$expected = '{
"GET": {
"parameters": {
"id": [],
"name": {
"default": "koriym"
}
},
"required": [
"id"
]
"request": {
"parameters": {
"id": [],
"name": {
"default": "koriym"
}
},
"required": [
"id"
]
}
},
"POST": {
"parameters": {
"cookie": {
"in": "cookie"
"request": {
"parameters": {
"cookie": {
"in": "cookie"
},
"env": {
"in": "env"
},
"form": {
"in": "formData"
},
"query": {
"in": "query"
},
"server": {
"in": "server"
}
},
"env": {
"in": "env"
},
"form": {
"in": "formData"
},
"query": {
"in": "query"
},
"server": {
"in": "server"
}
},
"required": [
"cookie",
"env",
"form",
"query",
"server"
]
"required": [
"cookie",
"env",
"form",
"query",
"server"
]
}
},
"PUT": {
"parameters": {
"cookie": {
"in": "cookie"
}
},
"required": [
"cookie"
]
"request": {
"parameters": {
"cookie": {
"in": "cookie"
}
},
"required": [
"cookie"
]
}
},
"DELETE": {
"parameters": {
"a": [],
"cookie": {
"in": "cookie",
"default": "default"
}
"request": {
"parameters": {
"a": [],
"cookie": {
"in": "cookie",
"default": "default"
}
},
"required": [
"a"
]
}
}
}
';
$this->assertSame($expected, $actual);
}

public function testOptionsMethodWithJsonSchema()
{
$request = new Request($this->invoker, new DocUser, Request::OPTIONS);
$ro = $this->invoker->invoke($request);
$actual = $ro->headers['Allow'];
$expected = 'GET';
$this->assertSame($actual, $expected);
$actual = $ro->view;
$expected = '{
"GET": {
"summary": "User",
"description": "Returns a variety of information about the user specified by the required $id parameter",
"request": {
"parameters": {
"id": {
"type": "string",
"description": "User ID"
}
},
"required": [
"id"
]
},
"required": [
"a"
]
"schema": {
"type": "object",
"properties": {
"name": {
"$ref": "name.json#/definitions/name"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 20
}
},
"required": [
"name",
"age"
]
}
}
}
';
Expand Down
2 changes: 1 addition & 1 deletion tests/AnchorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class AnchorTest extends TestCase
protected function setUp()
{
parent::setUp();
$invoker = new Invoker(new NamedParameter(new ArrayCache, new AnnotationReader, new Injector), new OptionsRenderer(new AnnotationReader()));
$invoker = new Invoker(new NamedParameter(new ArrayCache, new AnnotationReader, new Injector), new OptionsRenderer(new OptionsMethods(new AnnotationReader)));
$author = new Author;
$author->onGet(1);
$this->request = new Request($invoker, $author, Request::GET, ['id' => 1]);
Expand Down
Loading

0 comments on commit ad6346e

Please sign in to comment.