From 3a31c93c943ab3ef2599212585ab1d21da19f3a0 Mon Sep 17 00:00:00 2001 From: Bez Hermoso Date: Tue, 17 Jun 2014 17:05:00 -0700 Subject: [PATCH] Unified data types [actualType and subType] Updated tests. JMS parsing fixes; updated {Validator,FormType}Parser, FOSRestHandler, and AbstractFormatter, and updated DataTypes enum. Modified dataType checking. Updated tests. Updated DataTypes enum. Quick fix and added doc comments. CS fixes. Refactored FormTypeParser to produce nested parameters. Updated tests accordingly. Logical and CS fixes. Sub-forms and more tests. Ignore data_class and always use form-type to avoid conflicts. Quick fix. --- DependencyInjection/Configuration.php | 2 +- Parser/FormTypeParser.php | 136 +++++--- Parser/JmsMetadataParser.php | 1 + Parser/ValidationParser.php | 31 +- Tests/Fixtures/Form/CompoundType.php | 32 ++ Tests/Fixtures/Form/ImprovedTestType.php | 6 - Tests/Fixtures/Form/SimpleType.php | 38 +++ Tests/Formatter/MarkdownFormatterTest.php | 9 + Tests/Formatter/SimpleFormatterTest.php | 95 +++++- Tests/Parser/FormTypeParserTest.php | 363 +++++++++++++++------- Tests/Parser/JmsMetadataParserTest.php | 16 + 11 files changed, 542 insertions(+), 187 deletions(-) create mode 100644 Tests/Fixtures/Form/CompoundType.php create mode 100644 Tests/Fixtures/Form/SimpleType.php diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index 6a97d70..bd5c8fc 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -54,7 +54,7 @@ class Configuration implements ConfigurationInterface ->addDefaultsIfNotSet() ->beforeNormalization() ->ifString() - ->then(function($v) { return array('default_format' => $v); }) + ->then(function ($v) { return array('default_format' => $v); }) ->end() ->children() ->arrayNode('formats') diff --git a/Parser/FormTypeParser.php b/Parser/FormTypeParser.php index a507fc2..a84ce26 100644 --- a/Parser/FormTypeParser.php +++ b/Parser/FormTypeParser.php @@ -16,6 +16,9 @@ use Symfony\Component\Form\Exception\UnexpectedTypeException; use Symfony\Component\Form\Exception\InvalidArgumentException; use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface; use Symfony\Component\Form\Extension\Core\View\ChoiceView; +use Symfony\Component\Form\Form; +use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\ResolvedFormTypeInterface; use Symfony\Component\OptionsResolver\Exception\MissingOptionsException; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\Form\Exception\FormException; @@ -87,39 +90,73 @@ class FormTypeParser implements ParserInterface $form = $this->formFactory->create($type); - return $this->parseForm($form, array_key_exists('name', $item) ? $item['name'] : $form->getName()); + $name = array_key_exists('name', $item) ? $item['name'] : $form->getName(); + + $options = null; + + if (empty($name)) { + return $this->parseForm($form); + } + + $subType = is_object($type) ? get_class($type) : $type; + + if (class_exists($subType)) { + $parts = explode('\\', $subType); + $dataType = sprintf('object (%s)', end($parts)); + } else { + $dataType = sprintf('object (%s)', $subType); + } + + return array( + $name => array( + 'required' => true, + 'readonly' => false, + 'description' => '', + 'default' => null, + 'dataType' => $dataType, + 'actualType' => DataTypes::MODEL, + 'subType' => $subType, + 'children' => $this->parseForm($form), + ), + ); } - private function parseForm($form, $prefix = null) + private function parseForm($form) { $parameters = array(); foreach ($form as $name => $child) { - $config = $child->getConfig(); - - - if ($prefix) { - $name = sprintf('%s[%s]', $prefix, $name); - } - - $bestType = ''; + $config = $child->getConfig(); + $bestType = ''; $actualType = null; - $subType = null; + $subType = null; + $children = null; - for ($type = $config->getType(); null !== $type; $type = $type->getParent()) { + for ($type = $config->getType(); + $type instanceof FormInterface || $type instanceof ResolvedFormTypeInterface; + $type = $type->getParent() + ) { if (isset($this->mapTypes[$type->getName()])) { - $bestType = $this->mapTypes[$type->getName()]; + $bestType = $this->mapTypes[$type->getName()]; $actualType = $bestType; } elseif ('collection' === $type->getName()) { if (is_string($config->getOption('type')) && isset($this->mapTypes[$config->getOption('type')])) { - $subType = $this->mapTypes[$config->getOption('type')]; + $subType = $this->mapTypes[$config->getOption('type')]; $actualType = DataTypes::COLLECTION; - $bestType = sprintf('array of %ss', $subType); + $bestType = sprintf('array of %ss', $subType); } else { // Embedded form collection - $subParameters = $this->parseForm($this->formFactory->create($config->getOption('type'), null, $config->getOption('options', array())), $name . '[]'); - $parameters = array_merge($parameters, $subParameters); + $type = $config->getOption('type'); + $subForm = $this->formFactory->create($type, null, $config->getOption('options', array())); + $children = $this->parseForm($subForm); + $actualType = DataTypes::COLLECTION; + $subType = is_object($type) ? get_class($type) : $type; - continue 2; + if (class_exists($subType)) { + $parts = explode('\\', $subType); + $bestType = sprintf('array of objects (%s)', end($parts)); + } else { + $bestType = sprintf('array of objects (%s)', $subType); + } } } } @@ -134,10 +171,27 @@ class FormTypeParser implements ParserInterface */ $addDefault = false; try { - $subForm = $this->formFactory->create($type); + $subForm = $this->formFactory->create($type); $subParameters = $this->parseForm($subForm, $name); + if (!empty($subParameters)) { - $parameters = array_merge($parameters, $subParameters); + $children = $subParameters; + $config = $subForm->getConfig(); + $subType = get_class($type); + $parts = explode('\\', $subType); + $bestType = sprintf('object (%s)', end($parts)); + + $parameters[$name] = array( + 'dataType' => $bestType, + 'actualType' => DataTypes::MODEL, + 'default' => null, + 'subType' => $subType, + 'required' => $config->getRequired(), + 'description' => $config->getAttribute('description'), + 'readonly' => $config->getDisabled(), + 'children' => $children, + ); + } else { $addDefault = true; } @@ -147,12 +201,12 @@ class FormTypeParser implements ParserInterface if ($addDefault) { $parameters[$name] = array( - 'dataType' => 'string', - 'actualType' => 'string', - 'default' => $config->getData(), - 'required' => $config->getRequired(), - 'description' => $config->getAttribute('description'), - 'readonly' => $config->getDisabled(), + 'dataType' => 'string', + 'actualType' => 'string', + 'default' => $config->getData(), + 'required' => $config->getRequired(), + 'description' => $config->getAttribute('description'), + 'readonly' => $config->getDisabled(), ); } @@ -162,17 +216,21 @@ class FormTypeParser implements ParserInterface } $parameters[$name] = array( - 'dataType' => $bestType, - 'actualType' => $actualType, - 'subType' => $subType, - 'default' => $config->getData(), - 'required' => $config->getRequired(), - 'description' => $config->getAttribute('description'), - 'readonly' => $config->getDisabled(), + 'dataType' => $bestType, + 'actualType' => $actualType, + 'subType' => $subType, + 'default' => $config->getData(), + 'required' => $config->getRequired(), + 'description' => $config->getAttribute('description'), + 'readonly' => $config->getDisabled(), ); - switch ($actualType) { - case DataTypes::DATETIME: + if (null !== $children) { + $parameters[$name]['children'] = $children; + } + + switch ($bestType) { + case 'datetime': if (($format = $config->getOption('date_format')) && is_string($format)) { $parameters[$name]['format'] = $format; } elseif ('single_text' == $config->getOption('widget') && $format = $config->getOption('format')) { @@ -180,13 +238,13 @@ class FormTypeParser implements ParserInterface } break; - case DataTypes::DATE: + case 'date': if (($format = $config->getOption('format')) && is_string($format)) { $parameters[$name]['format'] = $format; } break; - case DataTypes::ENUM: + case 'choice': if ($config->getOption('multiple')) { $parameters[$name]['dataType'] = sprintf('array of %ss', $parameters[$name]['dataType']); $parameters[$name]['actualType'] = DataTypes::COLLECTION; @@ -213,9 +271,10 @@ class FormTypeParser implements ParserInterface if (!class_exists($item)) { return false; } + $refl = new \ReflectionClass($item); - return $refl->implementsInterface('Symfony\Component\Form\FormTypeInterface'); + return $refl->implementsInterface('Symfony\Component\Form\FormTypeInterface') || $refl->implementsInterface('Symfony\Component\Form\ResolvedFormTypeInterface'); } private function getTypeInstance($type) @@ -230,6 +289,7 @@ class FormTypeParser implements ParserInterface return $this->formFactory->create($type); } + try { return $this->formFactory->create($item); } catch (UnexpectedTypeException $e) { diff --git a/Parser/JmsMetadataParser.php b/Parser/JmsMetadataParser.php index 5429769..97f87ad 100644 --- a/Parser/JmsMetadataParser.php +++ b/Parser/JmsMetadataParser.php @@ -133,6 +133,7 @@ class JmsMetadataParser implements ParserInterface 'actualType' => $dataType['actualType'], 'subType' => $dataType['class'], 'required' => false, + 'default' => null, //TODO: can't think of a good way to specify this one, JMS doesn't have a setting for this 'description' => $this->getDescription($item), 'readonly' => $item->readOnly, diff --git a/Parser/ValidationParser.php b/Parser/ValidationParser.php index 386b0f9..bd72c94 100644 --- a/Parser/ValidationParser.php +++ b/Parser/ValidationParser.php @@ -28,17 +28,17 @@ class ValidationParser implements ParserInterface, PostParserInterface protected $factory; protected $typeMap = array( - 'integer' => DataTypes::INTEGER, - 'int' => DataTypes::INTEGER, - 'scalar' => DataTypes::STRING, - 'numeric' => DataTypes::INTEGER, - 'boolean' => DataTypes::BOOLEAN, - 'string' => DataTypes::STRING, - 'float' => DataTypes::FLOAT, - 'double' => DataTypes::FLOAT, - 'long' => DataTypes::INTEGER, - 'object' => DataTypes::MODEL, - 'array' => DataTypes::COLLECTION, + 'integer' => DataTypes::INTEGER, + 'int' => DataTypes::INTEGER, + 'scalar' => DataTypes::STRING, + 'numeric' => DataTypes::INTEGER, + 'boolean' => DataTypes::BOOLEAN, + 'string' => DataTypes::STRING, + 'float' => DataTypes::FLOAT, + 'double' => DataTypes::FLOAT, + 'long' => DataTypes::INTEGER, + 'object' => DataTypes::MODEL, + 'array' => DataTypes::COLLECTION, 'DateTime' => DataTypes::DATETIME, ); @@ -159,7 +159,8 @@ class ValidationParser implements ParserInterface, PostParserInterface $class = substr(get_class($constraint), strlen('Symfony\\Component\\Validator\\Constraints\\')); $vparams['actualType'] = DataTypes::STRING; - $vparams['subType'] = null; + $vparams['subType'] = null; + $vparams['default'] = null; switch ($class) { case 'NotBlank': @@ -243,10 +244,10 @@ class ValidationParser implements ParserInterface, PostParserInterface } } - $vparams['dataType'] = sprintf("array of objects (%s)", end($exp)); + $vparams['dataType'] = sprintf("array of objects (%s)", end($exp)); $vparams['actualType'] = DataTypes::COLLECTION; - $vparams['subType'] = $nestedType; - $vparams['class'] = $nestedType; + $vparams['subType'] = $nestedType; + $vparams['class'] = $nestedType; if (!in_array($nestedType, $visited)) { $visited[] = $nestedType; diff --git a/Tests/Fixtures/Form/CompoundType.php b/Tests/Fixtures/Form/CompoundType.php new file mode 100644 index 0000000..63d6675 --- /dev/null +++ b/Tests/Fixtures/Form/CompoundType.php @@ -0,0 +1,32 @@ + + */ +class CompoundType extends AbstractType +{ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder + ->add('sub_form', new SimpleType()) + ->add('a', 'number') + ; + } + + /** + * Returns the name of this type. + * + * @return string The name of this type + */ + public function getName() + { + return ''; + } +} diff --git a/Tests/Fixtures/Form/ImprovedTestType.php b/Tests/Fixtures/Form/ImprovedTestType.php index 245b8dc..7963eb2 100644 --- a/Tests/Fixtures/Form/ImprovedTestType.php +++ b/Tests/Fixtures/Form/ImprovedTestType.php @@ -1,10 +1,4 @@ + */ +class SimpleType extends AbstractType +{ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->add('a', 'text', array( + 'description' => 'Something that describes A.', + )) + ->add('b', 'number') + ->add('c', 'choice', array( + 'choices' => array('x' => 'X', 'y' => 'Y', 'z' => 'Z'), + )) + ->add('d', 'datetime') + ->add('e', 'date') + ->add('g', 'textarea') + ; + } + + /** + * Returns the name of this type. + * + * @return string The name of this type + */ + public function getName() + { + return 'simple'; + } +} diff --git a/Tests/Formatter/MarkdownFormatterTest.php b/Tests/Formatter/MarkdownFormatterTest.php index bc82c6b..cd31041 100644 --- a/Tests/Formatter/MarkdownFormatterTest.php +++ b/Tests/Formatter/MarkdownFormatterTest.php @@ -162,6 +162,11 @@ _create another test_ #### Parameters #### +dependency_type: + + * type: object (dependency_type) + * required: true + dependency_type[a]: * type: string @@ -289,6 +294,10 @@ _Testing return_ #### Response #### +dependency_type: + + * type: object (dependency_type) + dependency_type[a]: * type: string diff --git a/Tests/Formatter/SimpleFormatterTest.php b/Tests/Formatter/SimpleFormatterTest.php index b84463f..4d6ec97 100644 --- a/Tests/Formatter/SimpleFormatterTest.php +++ b/Tests/Formatter/SimpleFormatterTest.php @@ -227,15 +227,25 @@ class SimpleFormatterTest extends WebTestCase 'description' => 'create another test', 'parameters' => array( - 'dependency_type[a]' => - array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'subType' => null, + 'dependency_type' => array( + 'dataType' => 'object (dependency_type)', + 'actualType' => DataTypes::MODEL, + 'subType' => 'dependency_type', 'default' => null, 'required' => true, - 'description' => 'A nice description', 'readonly' => false, + 'description' => '', + 'children' => array( + 'a' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => 'A nice description', + 'readonly' => false, + ), + ), ), ), 'https' => false, @@ -293,6 +303,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -304,6 +315,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => true, @@ -315,6 +327,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'double', 'actualType' => DataTypes::FLOAT, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -326,6 +339,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'array', 'actualType' => DataTypes::COLLECTION, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -337,6 +351,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'object (JmsNested)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -349,6 +364,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => true, @@ -360,6 +376,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -371,6 +388,7 @@ class SimpleFormatterTest extends WebTestCase 'dataType' => 'array of integers', 'actualType' => DataTypes::COLLECTION, 'subType' => DataTypes::INTEGER, + 'default' => null, 'required' => false, 'description' => 'Epic description. @@ -384,6 +402,7 @@ With multiple lines.', 'dataType' => 'object (JmsNested)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -395,6 +414,7 @@ With multiple lines.', 'dataType' => 'object (JmsTest)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsTest', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -407,6 +427,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -418,6 +439,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => true, @@ -429,6 +451,7 @@ With multiple lines.', 'dataType' => 'double', 'actualType' => DataTypes::FLOAT, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -440,6 +463,7 @@ With multiple lines.', 'dataType' => 'array', 'actualType' => DataTypes::COLLECTION, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -451,6 +475,7 @@ With multiple lines.', 'dataType' => 'object (JmsNested)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -462,6 +487,7 @@ With multiple lines.', 'dataType' => 'array of objects (JmsNested)', 'actualType' => DataTypes::COLLECTION, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -475,6 +501,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -486,6 +513,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -497,6 +525,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -510,6 +539,7 @@ With multiple lines.', 'dataType' => 'array of objects (JmsNested)', 'actualType' => DataTypes::COLLECTION, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -529,15 +559,25 @@ With multiple lines.', 'description' => 'Testing return', 'response' => array( - 'dependency_type[a]' => - array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'subType' => null, + 'dependency_type' => array( + 'dataType' => 'object (dependency_type)', + 'actualType' => DataTypes::MODEL, + 'subType' => 'dependency_type', 'default' => null, 'required' => true, - 'description' => 'A nice description', 'readonly' => false, + 'description' => '', + 'children' => array( + 'a' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => 'A nice description', + 'readonly' => false, + ), + ), ), ), 'https' => false, @@ -601,6 +641,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -612,6 +653,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => true, @@ -623,6 +665,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'double', 'actualType' => DataTypes::FLOAT, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -634,6 +677,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'array', 'actualType' => DataTypes::COLLECTION, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -645,6 +689,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'object (JmsNested)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -657,6 +702,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => true, @@ -668,6 +714,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -679,6 +726,7 @@ And, it supports multilines until the first \'@\' char.', 'dataType' => 'array of integers', 'actualType' => DataTypes::COLLECTION, 'subType' => DataTypes::INTEGER, + 'default' => null, 'required' => false, 'description' => 'Epic description. @@ -692,6 +740,7 @@ With multiple lines.', 'dataType' => 'object (JmsNested)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -703,6 +752,7 @@ With multiple lines.', 'dataType' => 'object (JmsTest)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsTest', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -715,6 +765,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -726,6 +777,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => true, @@ -737,6 +789,7 @@ With multiple lines.', 'dataType' => 'double', 'actualType' => DataTypes::FLOAT, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -748,6 +801,7 @@ With multiple lines.', 'dataType' => 'array', 'actualType' => DataTypes::COLLECTION, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -759,6 +813,7 @@ With multiple lines.', 'dataType' => 'object (JmsNested)', 'actualType' => DataTypes::MODEL, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -770,6 +825,7 @@ With multiple lines.', 'dataType' => 'array of objects (JmsNested)', 'actualType' => DataTypes::COLLECTION, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -783,6 +839,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -794,6 +851,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -805,6 +863,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -818,6 +877,7 @@ With multiple lines.', 'dataType' => 'array of objects (JmsNested)', 'actualType' => DataTypes::COLLECTION, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\JmsNested', + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -969,6 +1029,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => null, 'readonly' => null ), @@ -976,6 +1037,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -986,6 +1048,7 @@ With multiple lines.', 'dataType' => 'array of objects (Test)', 'actualType' => DataTypes::COLLECTION, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', + 'default' => null, 'readonly' => null, 'required' => null, 'children' => array( @@ -993,6 +1056,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'format' => '{length: min: foo}, {not blank}', 'required' => true, 'readonly' => null @@ -1001,6 +1065,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => null, 'readonly' => null ) @@ -1050,6 +1115,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'default' => "DefaultTest", 'required' => true, 'description' => '', @@ -1069,6 +1135,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => null, 'readonly' => null ), @@ -1076,6 +1143,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => '', 'readonly' => false, @@ -1086,6 +1154,7 @@ With multiple lines.', 'dataType' => 'array of objects (Test)', 'actualType' => DataTypes::COLLECTION, 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Model\Test', + 'default' => null, 'readonly' => null, 'required' => null, 'children' => array( @@ -1093,6 +1162,7 @@ With multiple lines.', 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'format' => '{length: min: foo}, {not blank}', 'required' => true, 'readonly' => null @@ -1101,6 +1171,7 @@ With multiple lines.', 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => null, 'readonly' => null ) diff --git a/Tests/Parser/FormTypeParserTest.php b/Tests/Parser/FormTypeParserTest.php index aee673b..08369f1 100644 --- a/Tests/Parser/FormTypeParserTest.php +++ b/Tests/Parser/FormTypeParserTest.php @@ -58,10 +58,10 @@ class FormTypeParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'boolean', 'actualType' => DataTypes::BOOLEAN, 'subType' => null, + 'default' => null, 'required' => true, 'description' => '', 'readonly' => false, - 'default' => null ), 'd' => array( 'dataType' => 'string', @@ -77,52 +77,74 @@ class FormTypeParserTest extends \PHPUnit_Framework_TestCase array( array('class' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Form\CollectionType'), array( - 'collection_type[a]' => array( - 'dataType' => 'array of strings', - 'actualType' => DataTypes::COLLECTION, - 'subType' => DataTypes::STRING, - 'required' => true, - 'description' => '', - 'default' => null, - 'readonly' => false - ), - 'collection_type[b][][a]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'default' => null, - 'subType' => null, - 'required' => true, - 'description' => 'A nice description', - 'readonly' => false - ), - 'collection_type[b][][b]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'subType' => null, + 'collection_type' => array( + 'dataType' => 'object (CollectionType)', + 'actualType' => DataTypes::MODEL, + 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Form\CollectionType', 'default' => null, 'required' => true, 'description' => '', - 'readonly' => false + 'readonly' => false, + 'children' => array( + 'a' => array( + 'dataType' => 'array of strings', + 'actualType' => DataTypes::COLLECTION, + 'subType' => DataTypes::STRING, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'b' => array( + 'dataType' => 'array of objects (TestType)', + 'actualType' => DataTypes::COLLECTION, + 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Form\TestType', + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + 'children' => array( + 'a' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'default' => null, + 'subType' => null, + 'required' => true, + 'description' => 'A nice description', + 'readonly' => false, + ), + 'b' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'default' => null, + 'subType' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'c' => array( + 'dataType' => 'boolean', + 'actualType' => DataTypes::BOOLEAN, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'd' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + 'default' => "DefaultTest" + ), + ), + ), + ), ), - 'collection_type[b][][c]' => array( - 'dataType' => 'boolean', - 'actualType' => DataTypes::BOOLEAN, - 'default' => null, - 'subType' => null, - 'required' => true, - 'description' => '', - 'readonly' => false - ), - 'collection_type[b][][d]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'default' => "DefaultTest", - 'subType' => null, - 'required' => true, - 'description' => '', - 'readonly' => false - ) - ) + ), ), array( array( @@ -133,49 +155,60 @@ class FormTypeParserTest extends \PHPUnit_Framework_TestCase 'a' => array( 'dataType' => 'array of strings', 'actualType' => DataTypes::COLLECTION, - 'default' => null, 'subType' => DataTypes::STRING, - 'required' => true, - 'description' => '', - 'readonly' => false - ), - 'b[][a]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, 'default' => null, - 'subType' => null, 'required' => true, - 'description' => 'A nice description', - 'readonly' => false + 'description' => '', + 'readonly' => false, ), - 'b[][b]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, + 'b' => array( + 'dataType' => 'array of objects (TestType)', + 'actualType' => DataTypes::COLLECTION, + 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Form\TestType', + 'required' => true, + 'description' => '', 'default' => null, - 'subType' => null, - 'required' => true, - 'description' => '', - 'readonly' => false + 'readonly' => false, + 'children' => array( + 'a' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => 'A nice description', + 'readonly' => false, + ), + 'b' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'c' => array( + 'dataType' => 'boolean', + 'actualType' => DataTypes::BOOLEAN, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'd' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + 'default' => "DefaultTest" + ), + ), ), - 'b[][c]' => array( - 'dataType' => 'boolean', - 'actualType' => DataTypes::BOOLEAN, - 'default' => null, - 'subType' => null, - 'required' => true, - 'description' => '', - 'readonly' => false - ), - 'b[][d]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'subType' => null, - 'default' => "DefaultTest", - 'required' => true, - 'description' => '', - 'readonly' => false - ) - ) + ), ), array( array( @@ -190,45 +223,56 @@ class FormTypeParserTest extends \PHPUnit_Framework_TestCase 'default' => null, 'required' => true, 'description' => '', - 'readonly' => false + 'readonly' => false, ), - 'b[][a]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'subType' => null, - 'default' => null, - 'required' => true, - 'description' => 'A nice description', - 'readonly' => false - ), - 'b[][b]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'subType' => null, + 'b' => array( + 'dataType' => 'array of objects (TestType)', + 'actualType' => DataTypes::COLLECTION, + 'subType' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Form\TestType', 'default' => null, 'required' => true, 'description' => '', - 'readonly' => false + 'readonly' => false, + 'children' => array( + 'a' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => 'A nice description', + 'readonly' => false, + ), + 'b' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'c' => array( + 'dataType' => 'boolean', + 'actualType' => DataTypes::BOOLEAN, + 'subType' => null, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'd' => array( + 'dataType' => 'string', + 'actualType' => DataTypes::STRING, + 'subType' => null, + 'default' => "DefaultTest", + 'required' => true, + 'description' => '', + 'readonly' => false + ), + ), ), - 'b[][c]' => array( - 'dataType' => 'boolean', - 'actualType' => DataTypes::BOOLEAN, - 'subType' => null, - 'default' => null, - 'required' => true, - 'description' => '', - 'readonly' => false - ), - 'b[][d]' => array( - 'dataType' => 'string', - 'actualType' => DataTypes::STRING, - 'subType' => null, - 'default' => "DefaultTest", - 'required' => true, - 'description' => '', - 'readonly' => false - ) - ) + ), ), array( array('class' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Form\ImprovedTestType'), @@ -339,8 +383,97 @@ class FormTypeParserTest extends \PHPUnit_Framework_TestCase 'readonly' => false, 'format' => json_encode(array('foo' => 'bar', 'baz' => 'Buzz')), ), - ) + ), ), + array( + array('class' => 'Nelmio\ApiDocBundle\Tests\Fixtures\Form\CompoundType'), + array ( + 'sub_form' => + array ( + 'dataType' => 'object (SimpleType)', + 'actualType' => 'model', + 'subType' => 'Nelmio\\ApiDocBundle\\Tests\\Fixtures\\Form\\SimpleType', + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + 'children' => + array ( + 'a' => + array ( + 'dataType' => 'string', + 'actualType' => 'string', + 'subType' => NULL, + 'default' => null, + 'required' => true, + 'description' => 'Something that describes A.', + 'readonly' => false, + ), + 'b' => + array ( + 'dataType' => 'float', + 'actualType' => 'float', + 'subType' => NULL, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'c' => + array ( + 'dataType' => 'choice', + 'actualType' => 'choice', + 'subType' => NULL, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + 'format' => '{"x":"X","y":"Y","z":"Z"}', + ), + 'd' => + array ( + 'dataType' => 'datetime', + 'actualType' => 'datetime', + 'subType' => NULL, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'e' => + array ( + 'dataType' => 'date', + 'actualType' => 'date', + 'subType' => NULL, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + 'g' => + array ( + 'dataType' => 'string', + 'actualType' => 'string', + 'subType' => NULL, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + ), + ), + 'a' => + array ( + 'dataType' => 'float', + 'actualType' => 'float', + 'subType' => NULL, + 'default' => null, + 'required' => true, + 'description' => '', + 'readonly' => false, + ), + ), + ) ); } } diff --git a/Tests/Parser/JmsMetadataParserTest.php b/Tests/Parser/JmsMetadataParserTest.php index d4640d5..c974760 100644 --- a/Tests/Parser/JmsMetadataParserTest.php +++ b/Tests/Parser/JmsMetadataParserTest.php @@ -85,6 +85,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'DateTime', 'actualType' => DataTypes::DATETIME, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -95,6 +96,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -105,6 +107,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'array of integers', 'actualType' => DataTypes::COLLECTION, 'subType' => DataTypes::INTEGER, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -164,6 +167,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -174,6 +178,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -184,6 +189,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -208,6 +214,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -218,6 +225,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -242,6 +250,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -252,6 +261,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -276,6 +286,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -286,6 +297,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -296,6 +308,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -355,6 +368,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -365,6 +379,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false, @@ -375,6 +390,7 @@ class JmsMetadataParserTest extends \PHPUnit_Framework_TestCase 'dataType' => 'string', 'actualType' => DataTypes::STRING, 'subType' => null, + 'default' => null, 'required' => false, 'description' => null, 'readonly' => false,