Skip to content

Commit

Permalink
Merge branch '2.3' into 2.7
Browse files Browse the repository at this point in the history
* 2.3:
  fix container cache key generation
  [Translation] Add resources from fallback locale
  [DependencyInjection] enforce tags to have a name
  [YAML] Refine the return value of Yaml::parse()
  • Loading branch information
fabpot committed Jan 31, 2016
2 parents aadd4b6 + 27de563 commit 9d8232b
Show file tree
Hide file tree
Showing 13 changed files with 115 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,7 @@ protected function createContainer(array $data = array())

protected function createContainerFromFile($file, $data = array())
{
$cacheKey = md5($file.serialize($data));
$cacheKey = md5(get_class($this).$file.serialize($data));
if (isset(self::$containerCache[$cacheKey])) {
return self::$containerCache[$cacheKey];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,10 @@ private function parseDefinition(\DOMElement $service, $file)
$parameters[$name] = XmlUtils::phpize($node->nodeValue);
}

if ('' === $tag->getAttribute('name')) {
throw new InvalidArgumentException(sprintf('The tag name for service "%s" in %s must be a non-empty string.', (string) $service->getAttribute('id'), $file));
}

$definition->addTag($tag->getAttribute('name'), $parameters);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,10 @@ private function parseDefinition($id, $service, $file)
throw new InvalidArgumentException(sprintf('A "tags" entry is missing a "name" key for service "%s" in %s.', $id, $file));
}

if (!is_string($tag['name']) || '' === $tag['name']) {
throw new InvalidArgumentException(sprintf('The tag name for service "%s" in %s must be a non-empty string.', $id, $file));
}

$name = $tag['name'];
unset($tag['name']);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
</xsd:complexType>

<xsd:complexType name="tag">
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" use="required" />
<xsd:anyAttribute namespace="##any" processContents="lax" />
</xsd:complexType>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

<services>
<service id="foo" class="BarClass">
<tag name="" foo="bar" />
</service>
</services>
</container>
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

<services>
<service id="foo" class="BarClass">
<tag foo="bar" />
</service>
</services>
</container>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
foo_service:
class: FooClass
tags:
# tag name is an empty string
- { name: '', foo: bar }
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
foo_service:
class: FooClass
tags:
# tag name is not a string
- { name: [], foo: bar }
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
Expand Down Expand Up @@ -268,6 +269,27 @@ public function testParsesTags()
}
}

/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
*/
public function testParseTagsWithoutNameThrowsException()
{
$container = new ContainerBuilder();
$loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
$loader->load('tag_without_name.xml');
}

/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
* @expectedExceptionMessageRegExp /The tag name for service ".+" in .* must be a non-empty string/
*/
public function testParseTagWithEmptyNameThrowsException()
{
$container = new ContainerBuilder();
$loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
$loader->load('tag_with_empty_name.xml');
}

public function testConvertDomElementToArray()
{
$doc = new \DOMDocument('1.0');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,4 +277,24 @@ public function testLoadYamlOnlyWithKeys()
$this->assertEquals(array(true), $definition->getArguments());
$this->assertEquals(array('manager' => array(array('alias' => 'user'))), $definition->getTags());
}

/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
* @expectedExceptionMessageRegExp /The tag name for service ".+" in .+ must be a non-empty string/
*/
public function testTagWithEmptyNameThrowsException()
{
$loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));
$loader->load('tag_name_empty_string.yml');
}

/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
* @expectedExceptionMessageREgExp /The tag name for service "\.+" must be a non-empty string/
*/
public function testTagWithNonStringNameThrowsException()
{
$loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));
$loader->load('tag_name_no_string.yml');
}
}
24 changes: 24 additions & 0 deletions src/Symfony/Component/Translation/Tests/TranslatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,30 @@ public function testWhenAResourceHasNoRegisteredLoader()
$translator->trans('foo');
}

public function testFallbackCatalogueResources()
{
$translator = new Translator('en_GB', new MessageSelector());
$translator->addLoader('yml', new \Symfony\Component\Translation\Loader\YamlFileLoader());
$translator->addResource('yml', __DIR__.'/fixtures/empty.yml', 'en_GB');
$translator->addResource('yml', __DIR__.'/fixtures/resources.yml', 'en');

// force catalogue loading
$this->assertEquals('bar', $translator->trans('foo', array()));

$cataloguesProperty = new \ReflectionProperty($translator, 'catalogues');
$cataloguesProperty->setAccessible(true);
$catalogues = $cataloguesProperty->getValue($translator);

$resources = $catalogues['en']->getResources();
$this->assertCount(1, $resources);
$this->assertContains( __DIR__.'/fixtures/resources.yml', $resources);

$resources = $catalogues['en_GB']->getResources();
$this->assertCount(2, $resources);
$this->assertContains( __DIR__.'/fixtures/empty.yml', $resources);
$this->assertContains( __DIR__.'/fixtures/resources.yml', $resources);
}

/**
* @dataProvider getTransTests
*/
Expand Down
3 changes: 3 additions & 0 deletions src/Symfony/Component/Translation/Translator.php
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,9 @@ private function loadFallbackCatalogues($locale)
}

$fallbackCatalogue = new MessageCatalogue($fallback, $this->catalogues[$fallback]->all());
foreach ($this->catalogues[$fallback]->getResources() as $resource) {
$fallbackCatalogue->addResource($resource);
}
$current->addFallbackCatalogue($fallbackCatalogue);
$current = $fallbackCatalogue;
}
Expand Down
7 changes: 2 additions & 5 deletions src/Symfony/Component/Yaml/Yaml.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,7 @@
class Yaml
{
/**
* Parses YAML into a PHP array.
*
* The parse method, when supplied with a YAML stream (string or file),
* will do its best to convert YAML in a file into a PHP array.
* Parses YAML into a PHP value.
*
* Usage:
* <code>
Expand All @@ -43,7 +40,7 @@ class Yaml
* @param bool $objectSupport True if object support is enabled, false otherwise
* @param bool $objectForMap True if maps should return a stdClass instead of array()
*
* @return array The YAML converted to a PHP array
* @return mixed The YAML converted to a PHP value
*
* @throws ParseException If the YAML is not valid
*/
Expand Down

0 comments on commit 9d8232b

Please sign in to comment.