Skip to content

Commit

Permalink
bug #22829 [Yaml] fix colon without space deprecation (xabbuh)
Browse files Browse the repository at this point in the history
This PR was merged into the 3.2 branch.

Discussion
----------

[Yaml] fix colon without space deprecation

| Q             | A
| ------------- | ---
| Branch?       | 3.2
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets |
| License       | MIT
| Doc PR        |

A colon after a mapping key that is not followed by a space is valid if the mapping key is quoted.

Commits
-------

57f6941e25 [Yaml] fix colon without space deprecation
  • Loading branch information
fabpot committed May 25, 2017
2 parents af35d97 + a506187 commit 4cdb9fe
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 5 deletions.
4 changes: 2 additions & 2 deletions CHANGELOG.md
Expand Up @@ -5,8 +5,8 @@ CHANGELOG
-----

* Mappings with a colon (`:`) that is not followed by a whitespace are deprecated
and will lead to a `ParseException` in Symfony 4.0 (e.g. `foo:bar` must be
`foo: bar`).
when the mapping key is not quoted and will lead to a `ParseException` in
Symfony 4.0 (e.g. `foo:bar` must be `foo: bar`).

* Added support for parsing PHP constants:

Expand Down
5 changes: 3 additions & 2 deletions Inline.php
Expand Up @@ -461,14 +461,15 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = ar
}

// key
$isKeyQuoted = in_array($mapping[$i], array('"', "'"), true);
$key = self::parseScalar($mapping, $flags, array(':', ' '), array('"', "'"), $i, false);

if (':' !== $key && false === $i = strpos($mapping, ':', $i)) {
break;
}

if (':' !== $key && (!isset($mapping[$i + 1]) || !in_array($mapping[$i + 1], array(' ', ',', '[', ']', '{', '}'), true))) {
@trigger_error('Using a colon that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}" is deprecated since version 3.2 and will throw a ParseException in 4.0.', E_USER_DEPRECATED);
if (':' !== $key && !$isKeyQuoted && (!isset($mapping[$i + 1]) || !in_array($mapping[$i + 1], array(' ', ',', '[', ']', '{', '}'), true))) {
@trigger_error('Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since version 3.2 and will throw a ParseException in 4.0.', E_USER_DEPRECATED);
}

// value
Expand Down
6 changes: 5 additions & 1 deletion Tests/InlineTest.php
Expand Up @@ -168,7 +168,7 @@ public function testParseInvalidMappingKeyShouldThrowException()

/**
* @group legacy
* @expectedDeprecation Using a colon that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}" is deprecated since version 3.2 and will throw a ParseException in 4.0.
* @expectedDeprecation Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since version 3.2 and will throw a ParseException in 4.0.
* throws \Symfony\Component\Yaml\Exception\ParseException in 4.0
*/
public function testParseMappingKeyWithColonNotFollowedBySpace()
Expand Down Expand Up @@ -391,6 +391,8 @@ public function getTestsForParse()
array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', array('foo' => 'bar', 'bar' => 'foo: bar')),
array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', array('foo\'' => 'bar', 'bar"' => 'foo: bar')),
array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', array('foo: ' => 'bar', 'bar: ' => 'foo: bar')),
array('{"foo:bar": "baz"}', array('foo:bar' => 'baz')),
array('{"foo":"bar"}', array('foo' => 'bar')),

// nested sequences and mappings
array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))),
Expand Down Expand Up @@ -460,6 +462,8 @@ public function getTestsForParseWithMapObjects()
array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', (object) array('foo' => 'bar', 'bar' => 'foo: bar')),
array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', (object) array('foo\'' => 'bar', 'bar"' => 'foo: bar')),
array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', (object) array('foo: ' => 'bar', 'bar: ' => 'foo: bar')),
array('{"foo:bar": "baz"}', (object) array('foo:bar' => 'baz')),
array('{"foo":"bar"}', (object) array('foo' => 'bar')),

// nested sequences and mappings
array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))),
Expand Down

0 comments on commit 4cdb9fe

Please sign in to comment.