Merge pull request #70 from evillemez/apidoc_return

Implemented @ApiDoc `return` property
This commit is contained in:
William Durand 2012-08-27 23:41:42 -07:00
commit cbdddfebb5
9 changed files with 124 additions and 7 deletions

View File

@ -28,6 +28,11 @@ class ApiDoc
*/ */
private $input = null; private $input = null;
/**
* @var string
*/
private $return = null;
/** /**
* @var string * @var string
*/ */
@ -63,6 +68,11 @@ class ApiDoc
*/ */
private $parameters = array(); private $parameters = array();
/**
* @var array
*/
private $response = array();
/** /**
* @var Route * @var Route
*/ */
@ -89,6 +99,10 @@ class ApiDoc
$this->description = $data['description']; $this->description = $data['description'];
} }
if (isset($data['return'])) {
$this->return = $data['return'];
}
$this->isResource = isset($data['resource']) && $data['resource']; $this->isResource = isset($data['resource']) && $data['resource'];
} }
@ -126,6 +140,14 @@ class ApiDoc
return $this->input; return $this->input;
} }
/**
* @return string|null
*/
public function getReturn()
{
return $this->return;
}
/** /**
* @return string * @return string
*/ */
@ -182,6 +204,24 @@ class ApiDoc
$this->parameters = $parameters; $this->parameters = $parameters;
} }
/**
* Sets the responsed data as processed by the parsers - same format as parameters
*
* @param array $response
*/
public function setResponse(array $response)
{
$this->response = $response;
}
/**
* @return array
*/
public function getResponse()
{
return $this->response;
}
/** /**
* @param Route $route * @param Route $route
*/ */
@ -228,6 +268,10 @@ class ApiDoc
$data['requirements'] = $requirements; $data['requirements'] = $requirements;
} }
if ($response = $this->response) {
$data['response'] = $response;
}
return $data; return $data;
} }
} }

View File

@ -223,7 +223,7 @@ class ApiDocExtractor
// doc // doc
$annotation->setDocumentation($this->getDocCommentText($method)); $annotation->setDocumentation($this->getDocCommentText($method));
// input // input (populates 'parameters' for the formatters)
if (null !== $input = $annotation->getInput()) { if (null !== $input = $annotation->getInput()) {
$parameters = array(); $parameters = array();
@ -244,6 +244,20 @@ class ApiDocExtractor
$annotation->setParameters($parameters); $annotation->setParameters($parameters);
} }
// return (populates 'response' for the formatters)
if (null !== $return = $annotation->getReturn()) {
$response = array();
foreach ($this->parsers as $parser) {
if ($parser->supports($return)) {
$response = $parser->parse($return);
break;
}
}
$annotation->setResponse($response);
}
// requirements // requirements
$requirements = array(); $requirements = array();
foreach ($route->getRequirements() as $name => $value) { foreach ($route->getRequirements() as $name => $value) {

View File

@ -85,6 +85,22 @@ class MarkdownFormatter extends AbstractFormatter
} }
} }
if (isset($data['response'])) {
$markdown .= "#### Response ####\n\n";
foreach ($data['response'] as $name => $parameter) {
$markdown .= sprintf("%s:\n\n", $name);
$markdown .= sprintf(" * type: %s\n", $parameter['dataType']);
$markdown .= sprintf(" * required: %s\n", $parameter['required'] ? 'true' : 'false');
if (isset($parameter['description']) && !empty($parameter['description'])) {
$markdown .= sprintf(" * description: %s\n", $parameter['description']);
}
$markdown .= "\n";
}
}
return $markdown; return $markdown;
} }

View File

@ -81,7 +81,6 @@ class JmsMetadataParser implements ParserInterface
//TODO: regex comment to get description - or move doc comment parsing functionality from `ApiDocExtractor` to a new location //TODO: regex comment to get description - or move doc comment parsing functionality from `ApiDocExtractor` to a new location
//in order to reuse it here //in order to reuse it here
return $description; return $description;
} }

View File

@ -22,7 +22,7 @@ class ApiDocExtractorTest extends WebTestCase
$data = $extractor->all(); $data = $extractor->all();
$this->assertTrue(is_array($data)); $this->assertTrue(is_array($data));
$this->assertCount(11, $data); $this->assertCount(12, $data);
foreach ($data as $d) { foreach ($data as $d) {
$this->assertTrue(is_array($d)); $this->assertTrue(is_array($d));

View File

@ -100,4 +100,15 @@ class TestController
public function jmsInputTestAction() public function jmsInputTestAction()
{ {
} }
/**
* @ApiDoc(
* description="Testing return",
* return="dependency_type"
* )
*/
public function jmsReturnTestAction()
{
}
} }

View File

@ -46,6 +46,12 @@ test_route_9:
requirements: requirements:
_method: POST _method: POST
test_route_10:
pattern: /jms-return-test
defaults: { _controller: NelmioApiDocTestBundle:Test:jmsReturnTest }
requirements:
_method: GET
test_service_route_1: test_service_route_1:
pattern: /tests.{_format} pattern: /tests.{_format}
defaults: { _controller: nemlio.test.controller:indexAction, _format: json } defaults: { _controller: nemlio.test.controller:indexAction, _format: json }

View File

@ -186,6 +186,19 @@ arr:
* description: No description. * description: No description.
### `GET` /jms-return-test ###
_Testing return_
#### Response ####
a:
* type: string
* required: true
* description: A nice description
### `ANY` /my-commented/{id}/{page} ### ### `ANY` /my-commented/{id}/{page} ###
_This method is useful to test if the getDocComment works._ _This method is useful to test if the getDocComment works._

View File

@ -215,6 +215,20 @@ class SimpleFormatterTest extends WebTestCase
'description' => 'Testing JMS' 'description' => 'Testing JMS'
), ),
4 => 4 =>
array(
'method' => 'GET',
'uri' => '/jms-return-test',
'description' => 'Testing return',
'response' => array(
'a' => array(
'dataType' => 'string',
'required' => true,
'description' => 'A nice description',
'readonly' => false
)
)
),
5 =>
array( array(
'method' => 'ANY', 'method' => 'ANY',
'uri' => '/my-commented/{id}/{page}', 'uri' => '/my-commented/{id}/{page}',
@ -226,7 +240,7 @@ class SimpleFormatterTest extends WebTestCase
'description' => 'This method is useful to test if the getDocComment works.', 'description' => 'This method is useful to test if the getDocComment works.',
'documentation' => "This method is useful to test if the getDocComment works.\nAnd, it supports multilines until the first '@' char." 'documentation' => "This method is useful to test if the getDocComment works.\nAnd, it supports multilines until the first '@' char."
), ),
5 => 6 =>
array( array(
'method' => 'ANY', 'method' => 'ANY',
'uri' => '/yet-another/{id}', 'uri' => '/yet-another/{id}',
@ -235,7 +249,7 @@ class SimpleFormatterTest extends WebTestCase
'id' => array('type' => '', 'description' => '', 'requirement' => '\d+') 'id' => array('type' => '', 'description' => '', 'requirement' => '\d+')
), ),
), ),
6 => 7 =>
array( array(
'method' => 'GET', 'method' => 'GET',
'uri' => '/z-action-with-query-param', 'uri' => '/z-action-with-query-param',