Skip to content

Commit

Permalink
Merge branch '2.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
goetas committed May 10, 2017
2 parents 85ee039 + 7523f53 commit d3810b6
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 38 deletions.
10 changes: 5 additions & 5 deletions DependencyInjection/Configuration.php
Expand Up @@ -43,7 +43,6 @@ public function getConfigTreeBuilder()
$root = $tb
->root('jms_serializer', 'array')
->children()
->booleanNode('enable_short_alias')->defaultTrue()->end()
;

$this->addHandlersSection($root);
Expand All @@ -66,15 +65,15 @@ private function addHandlersSection(NodeBuilder $builder)
->arrayNode('datetime')
->addDefaultsIfNotSet()
->children()
->scalarNode('default_format')->defaultValue(\DateTime::ISO8601)->end()
->scalarNode('default_format')->defaultValue(\DateTime::RFC3339)->end()
->scalarNode('default_timezone')->defaultValue(date_default_timezone_get())->end()
->scalarNode('cdata')->defaultTrue()->end()
->end()
->end()
->arrayNode('array_collection')
->addDefaultsIfNotSet()
->children()
->booleanNode('initialize_excluded')->defaultTrue()->end()
->booleanNode('initialize_excluded')->defaultFalse()->end()
->end()
->end()
->end()
Expand All @@ -91,8 +90,8 @@ private function addSubscribersSection(NodeBuilder $builder)
->arrayNode('doctrine_proxy')
->addDefaultsIfNotSet()
->children()
->booleanNode('initialize_excluded')->defaultTrue()->end()
->booleanNode('initialize_virtual_types')->defaultTrue()->end()
->booleanNode('initialize_excluded')->defaultFalse()->end()
->booleanNode('initialize_virtual_types')->defaultFalse()->end()
->end()
->end()
->end()
Expand Down Expand Up @@ -188,6 +187,7 @@ private function addMetadataSection(NodeBuilder $builder)
->defaultTrue()
->end()
->arrayNode('directories')
->useAttributeAsKey('name')
->prototype('array')
->children()
->scalarNode('path')->isRequired()->end()
Expand Down
18 changes: 12 additions & 6 deletions DependencyInjection/JMSSerializerExtension.php
Expand Up @@ -114,7 +114,10 @@ public function loadInternal(array $config, ContainerBuilder $container)
foreach ($bundles as $name => $class) {
$ref = new \ReflectionClass($class);

$directories[$ref->getNamespaceName()] = dirname($ref->getFileName()) . '/Resources/config/serializer';
$dir = dirname($ref->getFileName()) . '/Resources/config/serializer';
if (file_exists($dir)) {
$directories[$ref->getNamespaceName()] = $dir;
}
}
}
foreach ($config['metadata']['directories'] as $directory) {
Expand All @@ -132,7 +135,12 @@ public function loadInternal(array $config, ContainerBuilder $container)
$directory['path'] = dirname($ref->getFileName()) . substr($directory['path'], strlen('@' . $bundleName));
}

$directories[rtrim($directory['namespace_prefix'], '\\')] = rtrim($directory['path'], '\\/');
$dir = rtrim($directory['path'], '\\/');
if (!file_exists($dir)) {
throw new RuntimeException(sprintf('The metadata directory "%s" does not exist for the namespace "%s"', $dir, $directory['namespace_prefix']));
}

$directories[rtrim($directory['namespace_prefix'], '\\')] = $dir;
}
$container
->getDefinition('jms_serializer.metadata.file_locator')
Expand All @@ -142,11 +150,9 @@ public function loadInternal(array $config, ContainerBuilder $container)
$container->setParameter('jms_serializer.xml_serialization_visitor.format_output', $config['visitors']['xml']['format_output']);
$container->setParameter('jms_serializer.json_serialization_visitor.options', $config['visitors']['json']['options']);

if (!$config['enable_short_alias']) {
$container->removeAlias('serializer');
}

if (!$container->getParameter('kernel.debug')) {

if ( ! $container->getParameter('kernel.debug')) {
$container->removeDefinition('jms_serializer.stopwatch_subscriber');
}

Expand Down
6 changes: 3 additions & 3 deletions Resources/config/services.xml
Expand Up @@ -72,8 +72,8 @@
<argument type="service" id="service_container" />
</service>
<service id="jms_serializer.doctrine_proxy_subscriber" class="%jms_serializer.doctrine_proxy_subscriber.class%">
<argument type="constant">false</argument>
<argument type="constant">true</argument>
<argument type="constant">false</argument>
<tag name="jms_serializer.event_subscriber" />
</service>
<service id="jms_serializer.stopwatch_subscriber" class="%jms_serializer.stopwatch_subscriber.class%">
Expand All @@ -89,7 +89,7 @@
<tag name="jms_serializer.subscribing_handler" />
</service>
<service id="jms_serializer.array_collection_handler" class="%jms_serializer.array_collection_handler.class%">
<argument type="constant">true</argument>
<argument type="constant">false</argument>
<tag name="jms_serializer.subscribing_handler" />
</service>
<service id="jms_serializer.php_collection_handler" class="%jms_serializer.php_collection_handler.class%">
Expand Down Expand Up @@ -208,7 +208,7 @@
<service id="jms_serializer" alias="jms_serializer.serializer" /><!-- Preferred Alias -->
<service id="JMS\Serializer\SerializerInterface" alias="jms_serializer.serializer" />
<service id="JMS\Serializer\ArrayTransformerInterface" alias="jms_serializer.serializer" />
<service id="serializer" alias="jms_serializer.serializer" /><!-- Here for BC, may be disabled in the config -->


<!-- expression language components -->
<service id="jms_serializer.expression_evaluator" class="%jms_serializer.expression_evaluator.class%">
Expand Down
9 changes: 4 additions & 5 deletions Resources/doc/configuration.rst
Expand Up @@ -98,18 +98,17 @@ values:
# config.yml
jms_serializer:
enable_short_alias: true # controls if "serializer" service is aliased to jms_serializer.serializer service
handlers:
datetime:
default_format: "c" # ISO8601
default_format: "Y-m-d\\TH:i:sP" # ATOM
default_timezone: "UTC" # defaults to whatever timezone set in php.ini or via date_default_timezone_set
array_collection:
initialize_excluded: true # suggested false for better performance
initialize_excluded: false
subscribers:
doctrine_proxy:
initialize_virtual_types: true # suggested false for better performance
initialize_excluded: true # suggested false for better performance
initialize_virtual_types: false
initialize_excluded: false
object_constructors:
doctrine:
Expand Down
45 changes: 43 additions & 2 deletions Tests/DependencyInjection/ConfigurationTest.php
Expand Up @@ -48,11 +48,11 @@ public function testConfig()
[
'metadata' => [
'directories' => [
[
'foo' => [
'namespace_prefix' => 'JMSSerializerBundleNs1',
'path' => '@JMSSerializerBundle',
],
[
'bar' => [
'namespace_prefix' => 'JMSSerializerBundleNs2',
'path' => '@JMSSerializerBundle/Resources/config',
],
Expand Down Expand Up @@ -84,6 +84,39 @@ public function testWrongObjectConstructorFallbackStrategyTriggersException()
]);
}

public function testConfigComposed()
{
$ref = new JMSSerializerBundle();
$container = $this->getContainer([
[
'metadata' => [
'directories' => [
'foo' => [
'namespace_prefix' => 'JMSSerializerBundleNs1',
'path' => '@JMSSerializerBundle',
],
]
]
],
[
'metadata' => [
'directories' => [
[
'name' => 'foo',
'namespace_prefix' => 'JMSSerializerBundleNs2',
'path' => '@JMSSerializerBundle/Resources/config',
],
]
]
],
]);

$directories = $container->getDefinition('jms_serializer.metadata.file_locator')->getArgument(0);

$this->assertArrayNotHasKey('JMSSerializerBundleNs1', $directories);
$this->assertEquals($ref->getPath().'/Resources/config', $directories['JMSSerializerBundleNs2']);
}

public function testContextDefaults()
{
$processor = new Processor();
Expand Down Expand Up @@ -220,4 +253,12 @@ public function testContextNullValues()
$this->assertArrayNotHasKey('serialize_null', $defaultContext);
}
}

public function testDefaultDateFormat()
{
$processor = new Processor();
$config = $processor->processConfiguration(new Configuration(true), []);

$this->assertEquals(\DateTime::ATOM, $config['handlers']['datetime']['default_format']);
}
}
64 changes: 50 additions & 14 deletions Tests/DependencyInjection/JMSSerializerExtensionTest.php
Expand Up @@ -221,16 +221,16 @@ public function testLoad()

$simpleObject = new SimpleObject('foo', 'bar');
$versionedObject = new VersionedObject('foo', 'bar');
$serializer = $container->get('serializer');
$serializer = $container->get('jms_serializer');

$this->assertTrue($container->has('JMS\Serializer\SerializerInterface'), 'Alias should be defined to allow autowiring');
$this->assertTrue($container->has('JMS\Serializer\ArrayTransformerInterface'), 'Alias should be defined to allow autowiring');

$this->assertTrue($container->getDefinition('jms_serializer.array_collection_handler')->getArgument(0));
$this->assertFalse($container->getDefinition('jms_serializer.array_collection_handler')->getArgument(0));

// the logic is inverted because arg 0 on doctrine_proxy_subscriber is $skipVirtualTypeInit = false
$this->assertFalse($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(0));
$this->assertTrue($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(1));
$this->assertTrue($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(0));
$this->assertFalse($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(1));

$this->assertEquals("null", $container->getDefinition('jms_serializer.doctrine_object_constructor')->getArgument(2));

Expand All @@ -249,8 +249,8 @@ public function testLoadWithOptions()
$container = $this->getContainerForConfig(array(array(
'subscribers' => [
'doctrine_proxy' => [
'initialize_virtual_types' => false,
'initialize_excluded' => false,
'initialize_virtual_types' => true,
'initialize_excluded' => true,
],
],
'object_constructors' => [
Expand All @@ -260,20 +260,56 @@ public function testLoadWithOptions()
],
'handlers' => [
'array_collection' => [
'initialize_excluded' => false,
'initialize_excluded' => true,
],
],
)));

$this->assertFalse($container->getDefinition('jms_serializer.array_collection_handler')->getArgument(0));
$this->assertTrue($container->getDefinition('jms_serializer.array_collection_handler')->getArgument(0));

// the logic is inverted because arg 0 on doctrine_proxy_subscriber is $skipVirtualTypeInit = false
$this->assertTrue($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(0));
$this->assertFalse($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(1));
$this->assertFalse($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(0));
$this->assertTrue($container->getDefinition('jms_serializer.doctrine_proxy_subscriber')->getArgument(1));

$this->assertEquals("exception", $container->getDefinition('jms_serializer.doctrine_object_constructor')->getArgument(2));
}

public function testLoadExistentMetadataDir()
{
$container = $this->getContainerForConfig(array(array(
'metadata' => [
'directories' => [
'foo' => [
'namespace_prefix' => 'foo_ns',
'path' => __DIR__,
]
]
]
)));

$fileLocatorDef = $container->getDefinition('jms_serializer.metadata.file_locator');
$directories = $fileLocatorDef->getArgument(0);
$this->assertEquals(['foo_ns' => __DIR__], $directories);
}

/**
* @expectedException \JMS\Serializer\Exception\RuntimeException
* @expectedExceptionMessage The metadata directory "foo_dir" does not exist for the namespace "foo_ns"
*/
public function testLoadNotExistentMetadataDir()
{
$this->getContainerForConfig(array(array(
'metadata' => [
'directories' => [
'foo' => [
'namespace_prefix' => 'foo_ns',
'path' => 'foo_dir',
]
]
]
)));
}

/**
* @dataProvider getJsonVisitorConfigs
*/
Expand Down Expand Up @@ -324,7 +360,7 @@ public function testExpressionLanguage()
$this->markTestSkipped("The Symfony Expression Language is not available");
}
$container = $this->getContainerForConfig(array(array()));
$serializer = $container->get('serializer');
$serializer = $container->get('jms_serializer');
// test that all components have been wired correctly
$object = new ObjectUsingExpressionLanguage('foo', true);
$this->assertEquals('{"name":"foo"}', $serializer->serialize($object, 'json'));
Expand All @@ -338,7 +374,7 @@ public function testExpressionLanguageVirtualProperties()
$this->markTestSkipped("The Symfony Expression Language is not available");
}
$container = $this->getContainerForConfig(array(array()));
$serializer = $container->get('serializer');
$serializer = $container->get('jms_serializer');
// test that all components have been wired correctly
$object = new ObjectUsingExpressionProperties('foo');
$this->assertEquals('{"v_prop_name":"foo"}', $serializer->serialize($object, 'json'));
Expand All @@ -353,7 +389,7 @@ public function testExpressionLanguageDisabledVirtualProperties()
$this->markTestSkipped("The Symfony Expression Language is not available");
}
$container = $this->getContainerForConfig(array(array('expression_evaluator' => array('id' => null))));
$serializer = $container->get('serializer');
$serializer = $container->get('jms_serializer');
// test that all components have been wired correctly
$object = new ObjectUsingExpressionProperties('foo');
$serializer->serialize($object, 'json');
Expand All @@ -366,7 +402,7 @@ public function testExpressionLanguageDisabledVirtualProperties()
public function testExpressionLanguageNotLoaded()
{
$container = $this->getContainerForConfig(array(array('expression_evaluator' => array('id' => null))));
$serializer = $container->get('serializer');
$serializer = $container->get('jms_serializer');
// test that all components have been wired correctly
$object = new ObjectUsingExpressionLanguage('foo', true);
$serializer->serialize($object, 'json');
Expand Down
9 changes: 9 additions & 0 deletions UPGRADING.md
@@ -1,6 +1,15 @@
This document details the changes that you need to make to your code
when upgrading from one version to another.

Upgrading From 1.x to 2.0
==========================

- Removed `serializer` alias, to access the serializer use the alias `jms_serializer` [#558](https://github.com/schmittjoh/JMSSerializerBundle/issues/558)
- Changed the default datetime format from `ISO8601` (`Y-m-d\TH:i:sO`) to `RFC3339` (`Y-m-d\TH:i:sP`) [#494](https://github.com/schmittjoh/JMSSerializerBundle/issues/494)
- Defining not-existing metadata directories will trigger an exception [#517](https://github.com/schmittjoh/JMSSerializerBundle/issues/517)
- The "key" (or `name` attribute) for the metadata directories definition is mandatory now [#531](https://github.com/schmittjoh/JMSSerializerBundle/pull/531)
- The options `subscribers.doctrine_proxy.initialize_virtual_types`, `subscribers.doctrine_proxy.initialize_excluded` and `handlers.array_collection.initialize_excluded` now as default are `false`

Upgrading From 0.11 to 1.0
==========================
Nothing yet.
Expand Down
5 changes: 2 additions & 3 deletions composer.json
Expand Up @@ -37,12 +37,11 @@
"jms/di-extra-bundle": "Required to get lazy loading (de)serialization visitors, ~1.3"
},
"autoload": {
"psr-0": { "JMS\\SerializerBundle": "" }
"psr-4": { "JMS\\SerializerBundle\\": "" }
},
"target-dir": "JMS/SerializerBundle",
"extra": {
"branch-alias": {
"dev-master": "1.5-dev"
"dev-master": "2.x-dev"
}
}
}

0 comments on commit d3810b6

Please sign in to comment.