feature #32669 [Yaml] Add flag to dump NULL as ~ (OskarStark)

This PR was merged into the 4.4 branch.

Discussion
----------

[Yaml] Add flag to dump NULL as ~

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #...   <!-- #-prefixed issue number(s), if any -->
| License       | MIT
| Doc PR        | https://github.com/symfony/symfony-docs/pull/12071

This PR adds the ability to dump `null` as `~` by a new Flag `Yaml::DUMP_NULL_AS_TILDE`:
```diff
- foo: null
+ foo: ~
```

Todos:
- [x] Fix/add tests

Commits
-------

749c11d94c [Yaml] Add flag to dump NULL as ~
This commit is contained in:
Fabien Potencier 2019-08-04 04:32:09 +02:00
commit 7479543f9a
4 changed files with 25 additions and 3 deletions

View File

@ -1,6 +1,11 @@
CHANGELOG
=========
4.4.0
-----
* Added support to dump `null` as `~` by using the `Yaml::DUMP_NULL_AS_TILDE` flag.
4.3.0
-----

View File

@ -33,6 +33,7 @@ class Inline
private static $objectSupport = false;
private static $objectForMap = false;
private static $constantSupport = false;
private static $nullAsTilde = false;
/**
* @param int $flags
@ -45,6 +46,7 @@ class Inline
self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);
self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);
self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);
self::$nullAsTilde = (bool) (Yaml::DUMP_NULL_AS_TILDE & $flags);
self::$parsedFilename = $parsedFilename;
if (null !== $parsedLineNumber) {
@ -129,7 +131,7 @@ class Inline
throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
}
return 'null';
return self::dumpNull($flags);
case $value instanceof \DateTimeInterface:
return $value->format('c');
case \is_object($value):
@ -155,11 +157,11 @@ class Inline
throw new DumpException('Object support when dumping a YAML file has been disabled.');
}
return 'null';
return self::dumpNull($flags);
case \is_array($value):
return self::dumpArray($value, $flags);
case null === $value:
return 'null';
return self::dumpNull($flags);
case true === $value:
return 'true';
case false === $value:
@ -256,6 +258,15 @@ class Inline
return sprintf('{ %s }', implode(', ', $output));
}
private static function dumpNull(int $flags): string
{
if (Yaml::DUMP_NULL_AS_TILDE & $flags) {
return '~';
}
return 'null';
}
/**
* Parses a YAML scalar.
*

View File

@ -504,6 +504,11 @@ YAML;
$this->expectExceptionMessage('The indentation must be greater than zero');
new Dumper(-4);
}
public function testDumpNullAsTilde()
{
$this->assertSame('{ foo: ~ }', $this->dumper->dump(['foo' => null], 0, 0, Yaml::DUMP_NULL_AS_TILDE));
}
}
class A

View File

@ -33,6 +33,7 @@ class Yaml
const PARSE_CONSTANT = 256;
const PARSE_CUSTOM_TAGS = 512;
const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024;
const DUMP_NULL_AS_TILDE = 2048;
/**
* Parses a YAML file into a PHP value.