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,