Merge remote-tracking branch 'stewe/jms_serlializer_1_0_upgrade'

This commit is contained in:
Jordi Boggiano 2013-02-15 13:16:59 +01:00
commit efb4bb29dd
10 changed files with 112 additions and 30 deletions

View File

@ -13,8 +13,8 @@ namespace Nelmio\ApiDocBundle\Parser;
use Metadata\MetadataFactoryInterface; use Metadata\MetadataFactoryInterface;
use Nelmio\ApiDocBundle\Util\DocCommentExtractor; use Nelmio\ApiDocBundle\Util\DocCommentExtractor;
use JMS\SerializerBundle\Metadata\PropertyMetadata; use JMS\Serializer\Metadata\PropertyMetadata;
use JMS\SerializerBundle\Metadata\VirtualPropertyMetadata; use JMS\Serializer\Metadata\VirtualPropertyMetadata;
/** /**
* Uses the JMS metadata factory to extract input/output model information * Uses the JMS metadata factory to extract input/output model information
@ -73,11 +73,10 @@ class JmsMetadataParser implements ParserInterface
//iterate over property metadata //iterate over property metadata
foreach ($meta->propertyMetadata as $item) { foreach ($meta->propertyMetadata as $item) {
if (!is_null($item->type)) { if (!is_null($item->type)) {
$name = isset($item->serializedName) ? $item->serializedName : $item->name; $name = isset($item->serializedName) ? $item->serializedName : $item->name;
$dataType = $this->processDataType(is_string($item->type) ? $item->type : $item->type['name']); $dataType = $this->processDataType($item);
$params[$name] = array( $params[$name] = array(
'dataType' => $dataType['normalized'], 'dataType' => $dataType['normalized'],
@ -107,21 +106,13 @@ class JmsMetadataParser implements ParserInterface
* Figure out a normalized data type (for documentation), and get a * Figure out a normalized data type (for documentation), and get a
* nested class name, if available. * nested class name, if available.
* *
* @param string $type * @param PropertyMetadata $type
* @return array * @return array
*/ */
protected function processDataType($type) protected function processDataType(PropertyMetadata $item)
{ {
//could be basic type
if ($this->isPrimitive($type)) {
return array(
'normalized' => $type,
'class' => null
);
}
//check for a type inside something that could be treated as an array //check for a type inside something that could be treated as an array
if ($nestedType = $this->getNestedTypeInArray($type)) { if ($nestedType = $this->getNestedTypeInArray($item)) {
if ($this->isPrimitive($nestedType)) { if ($this->isPrimitive($nestedType)) {
return array( return array(
'normalized' => sprintf("array of %ss", $nestedType), 'normalized' => sprintf("array of %ss", $nestedType),
@ -137,6 +128,16 @@ class JmsMetadataParser implements ParserInterface
); );
} }
$type = $item->type['name'];
//could be basic type
if ($this->isPrimitive($type)) {
return array(
'normalized' => $type,
'class' => null
);
}
//if we got this far, it's a general class name //if we got this far, it's a general class name
$exp = explode("\\", $type); $exp = explode("\\", $type);
@ -155,15 +156,17 @@ class JmsMetadataParser implements ParserInterface
* Check the various ways JMS describes values in arrays, and * Check the various ways JMS describes values in arrays, and
* get the value type in the array * get the value type in the array
* *
* @param string $type * @param PropertyMetadata $item
* @return string|null * @return string|null
*/ */
protected function getNestedTypeInArray($type) protected function getNestedTypeInArray(PropertyMetadata $item)
{ {
//could be some type of array with <V>, or <K,V> if (is_array($item->type)
$regEx = "/\<([A-Za-z0-9\\\]*)(\,?\s?(.*))?\>/"; && in_array($item->type['name'], array('array')) // We have to support ArrayCollection as well
if (preg_match($regEx, $type, $matches)) { && isset($item->type['params'])
return (!empty($matches[3])) ? $matches[3] : $matches[1]; && 1 === count($item->type['params'])
&& isset($item->type['params'][0]['name'])) {
return $item->type['params'][0]['name'];
} }
return null; return null;

View File

@ -12,6 +12,7 @@
namespace Nelmio\ApiDocBundle\Tests\Extractor; namespace Nelmio\ApiDocBundle\Tests\Extractor;
use Nelmio\ApiDocBundle\Tests\WebTestCase; use Nelmio\ApiDocBundle\Tests\WebTestCase;
use Symfony\Component\Form\Test\DeprecationErrorHandler;
class ApiDocExtractorTest extends WebTestCase class ApiDocExtractorTest extends WebTestCase
{ {
@ -19,7 +20,9 @@ class ApiDocExtractorTest extends WebTestCase
{ {
$container = $this->getContainer(); $container = $this->getContainer();
$extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor');
set_error_handler(array('Symfony\Component\Form\Test\DeprecationErrorHandler', 'handle'));
$data = $extractor->all(); $data = $extractor->all();
restore_error_handler();
$this->assertTrue(is_array($data)); $this->assertTrue(is_array($data));
$this->assertCount(14, $data); $this->assertCount(14, $data);

View File

@ -1,7 +1,7 @@
<?php <?php
namespace Nelmio\ApiDocBundle\Tests\Fixtures\Model; namespace Nelmio\ApiDocBundle\Tests\Fixtures\Model;
use JMS\SerializerBundle\Annotation as JMS; use JMS\Serializer\Annotation as JMS;
class JmsNested class JmsNested
{ {

View File

@ -2,7 +2,7 @@
namespace Nelmio\ApiDocBundle\Tests\Fixtures\Model; namespace Nelmio\ApiDocBundle\Tests\Fixtures\Model;
use JMS\SerializerBundle\Annotation as JMS; use JMS\Serializer\Annotation as JMS;
class JmsTest class JmsTest
{ {

View File

@ -16,7 +16,7 @@ use Symfony\Component\Validator\Constraints as Assert;
class Test class Test
{ {
/** /**
* @Assert\MinLength("foo"); * @Assert\Length(min="foo");
* @Assert\NotBlank * @Assert\NotBlank
*/ */
public $a; public $a;

View File

@ -30,13 +30,9 @@ services:
#JMS Serializer config for testing JmsMetadataParser #JMS Serializer config for testing JmsMetadataParser
jms_serializer: jms_serializer:
handlers: handlers:
object_based: false
datetime: datetime:
format: "Y-m-dTH:i:s" # ISO8601 default_format: "Y-m-dTH:i:s" # ISO8601
default_timezone: "UTC" # defaults to whatever timezone set in php.ini or via date_default_timezone_set default_timezone: "UTC" # defaults to whatever timezone set in php.ini or via date_default_timezone_set
array_collection: true
form_error: true
constraint_violation: true
property_naming: property_naming:
separator: _ separator: _

View File

@ -20,7 +20,9 @@ class MarkdownFormatterTest extends WebTestCase
$container = $this->getContainer(); $container = $this->getContainer();
$extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor');
set_error_handler(array('Symfony\Component\Form\Test\DeprecationErrorHandler', 'handle'));
$data = $extractor->all(); $data = $extractor->all();
restore_error_handler();
$result = $container->get('nelmio_api_doc.formatter.markdown_formatter')->format($data); $result = $container->get('nelmio_api_doc.formatter.markdown_formatter')->format($data);
$expected = <<<MARKDOWN $expected = <<<MARKDOWN

View File

@ -20,7 +20,9 @@ class SimpleFormatterTest extends WebTestCase
$container = $this->getContainer(); $container = $this->getContainer();
$extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor'); $extractor = $container->get('nelmio_api_doc.extractor.api_doc_extractor');
set_error_handler(array('Symfony\Component\Form\Test\DeprecationErrorHandler', 'handle'));
$data = $extractor->all(); $data = $extractor->all();
restore_error_handler();
$result = $container->get('nelmio_api_doc.formatter.simple_formatter')->format($data); $result = $container->get('nelmio_api_doc.formatter.simple_formatter')->format($data);
$expected = array( $expected = array(

View File

@ -0,0 +1,76 @@
<?php
namespace NelmioApiDocBundle\Tests\Parser;
use Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested;
use Nelmio\ApiDocBundle\Parser\JmsMetadataParser;
use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\Metadata\PropertyMetadata;
class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase
{
public function testParserWithNestedType()
{
$metadataFactory = $this->getMock('Metadata\MetadataFactoryInterface');
$docCommentExtractor = $this->getMockBuilder('Nelmio\ApiDocBundle\Util\DocCommentExtractor')
->disableOriginalConstructor()
->getMock();
$propertyMetadataFoo = new PropertyMetadata('Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', 'foo');
$propertyMetadataFoo->type = array(
'name' => 'DateTime'
);
$propertyMetadataBar = new PropertyMetadata('Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', 'bar');
$propertyMetadataBar->type = array(
'name' => 'string'
);
$propertyMetadataBaz = new PropertyMetadata('Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', 'baz');
$propertyMetadataBaz->type = array(
'name' => 'array',
'params' => array(
array(
'name' => 'integer',
'params' => array()
)
)
);
$metadata = new ClassMetadata('Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested');
$metadata->addPropertyMetadata($propertyMetadataFoo);
$metadata->addPropertyMetadata($propertyMetadataBar);
$metadata->addPropertyMetadata($propertyMetadataBaz);
$input = new JmsNested();
$metadataFactory->expects($this->once())
->method('getMetadataForClass')
->with($input)
->will($this->returnValue($metadata));
$jmsMetadataParser = new JmsMetadataParser($metadataFactory, $docCommentExtractor);
$output = $jmsMetadataParser->parse($input);
$this->assertEquals(array(
'foo' => array(
'dataType' => 'DateTime',
'required' => false,
'description' => 'No description.',
'readonly' => false
),
'bar' => array(
'dataType' => 'string',
'required' => false,
'description' => 'No description.',
'readonly' => false
),
'baz' => array(
'dataType' => 'array of integers',
'required' => false,
'description' => 'No description.',
'readonly' => false
)
), $output);
}
}

View File

@ -26,7 +26,7 @@
"symfony/validator": ">=2.1,<2.3-dev", "symfony/validator": ">=2.1,<2.3-dev",
"symfony/yaml": ">=2.1,<2.3-dev", "symfony/yaml": ">=2.1,<2.3-dev",
"friendsofsymfony/rest-bundle": "dev-master", "friendsofsymfony/rest-bundle": "dev-master",
"jms/serializer-bundle": "0.9.*" "jms/serializer-bundle": "1.0.*"
}, },
"minimum-stability": "dev", "minimum-stability": "dev",
"autoload": { "autoload": {