diff --git a/classes/local/execution/engine.php b/classes/local/execution/engine.php index 1494178e..a89bf73d 100644 --- a/classes/local/execution/engine.php +++ b/classes/local/execution/engine.php @@ -757,7 +757,7 @@ private function setup_logging() { $now = microtime(true); [, $decimal] = explode('.', $now); $decimal = substr($decimal, 0, 3); // Only use the first 3 digits after the decimal point. - $rundateformat = date("Ymd_His$decimal", $now); + $rundateformat = date("Ymd_His$decimal", (int) $now); // Each channel represents a specific way of writing log information. $log = new Logger($channel); diff --git a/composer.json b/composer.json index b4418485..d51a264f 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ }, "require": { "php": ">=7.4", - "symfony/yaml": "^3.4", + "symfony/yaml": "^4.0", "symfony/expression-language": "^3.4", "phpseclib/phpseclib": "~3.0", "symfony/monolog-bundle": "^3.6" diff --git a/composer.lock b/composer.lock index 8cf31d45..412f6685 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "27004af2480967797bba3972c1dd7743", + "content-hash": "79d5abc7ca7b1fedf320f36f9d9c65ff", "packages": [ { "name": "monolog/monolog", @@ -2457,27 +2457,27 @@ }, { "name": "symfony/yaml", - "version": "v3.4.47", + "version": "v4.4.45", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "88289caa3c166321883f67fe5130188ebbb47094" + "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", - "reference": "88289caa3c166321883f67fe5130188ebbb47094", + "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", + "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" }, "require-dev": { - "symfony/console": "~3.4|~4.0" + "symfony/console": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -2505,10 +2505,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v3.4.47" + "source": "https://github.com/symfony/yaml/tree/v4.4.45" }, "funding": [ { @@ -2524,7 +2524,7 @@ "type": "tidelift" } ], - "time": "2020-10-24T10:57:07+00:00" + "time": "2022-08-02T15:47:23+00:00" } ], "packages-dev": [], @@ -2540,5 +2540,5 @@ "platform-overrides": { "php": "7.4" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.1.0" } diff --git a/thirdpartylibs.xml b/thirdpartylibs.xml index c20b71a1..534d2901 100644 --- a/thirdpartylibs.xml +++ b/thirdpartylibs.xml @@ -101,7 +101,7 @@ vendor/symfony/yaml yaml - v3.4.47 + v4.4.45 MIT @@ -218,4 +218,4 @@ MIT - \ No newline at end of file + diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index be7f5fbf..35fb5295 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -2546,33 +2546,33 @@ }, { "name": "symfony/yaml", - "version": "v3.4.47", - "version_normalized": "3.4.47.0", + "version": "v4.4.45", + "version_normalized": "4.4.45.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "88289caa3c166321883f67fe5130188ebbb47094" + "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", - "reference": "88289caa3c166321883f67fe5130188ebbb47094", + "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", + "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" }, "require-dev": { - "symfony/console": "~3.4|~4.0" + "symfony/console": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" }, - "time": "2020-10-24T10:57:07+00:00", + "time": "2022-08-02T15:47:23+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2597,10 +2597,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v3.4.47" + "source": "https://github.com/symfony/yaml/tree/v4.4.45" }, "funding": [ { @@ -2619,6 +2619,6 @@ "install-path": "../symfony/yaml" } ], - "dev": true, + "dev": false, "dev-package-names": [] } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index a89d7d47..ea637d49 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,19 +1,19 @@ array( 'name' => '__root__', - 'pretty_version' => '1.0.0+no-version-set', - 'version' => '1.0.0.0', - 'reference' => NULL, + 'pretty_version' => 'dev-851-update-dependencies-extra-changes', + 'version' => 'dev-851-update-dependencies-extra-changes', + 'reference' => '2ed9efbaf8ec8d6f01db7dc7944dc35359045d9e', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'dev' => true, + 'dev' => false, ), 'versions' => array( '__root__' => array( - 'pretty_version' => '1.0.0+no-version-set', - 'version' => '1.0.0.0', - 'reference' => NULL, + 'pretty_version' => 'dev-851-update-dependencies-extra-changes', + 'version' => 'dev-851-update-dependencies-extra-changes', + 'reference' => '2ed9efbaf8ec8d6f01db7dc7944dc35359045d9e', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -357,9 +357,9 @@ 'dev_requirement' => false, ), 'symfony/yaml' => array( - 'pretty_version' => 'v3.4.47', - 'version' => '3.4.47.0', - 'reference' => '88289caa3c166321883f67fe5130188ebbb47094', + 'pretty_version' => 'v4.4.45', + 'version' => '4.4.45.0', + 'reference' => 'aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), diff --git a/vendor/symfony/yaml/.gitignore b/vendor/symfony/yaml/.gitignore deleted file mode 100644 index c49a5d8d..00000000 --- a/vendor/symfony/yaml/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/yaml/CHANGELOG.md b/vendor/symfony/yaml/CHANGELOG.md index fd41c9dd..ff78af2f 100644 --- a/vendor/symfony/yaml/CHANGELOG.md +++ b/vendor/symfony/yaml/CHANGELOG.md @@ -1,6 +1,53 @@ CHANGELOG ========= +4.4.0 +----- + + * Added support for parsing the inline notation spanning multiple lines. + * Added support to dump `null` as `~` by using the `Yaml::DUMP_NULL_AS_TILDE` flag. + * deprecated accepting STDIN implicitly when using the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit. + +4.3.0 +----- + + * Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0. + +4.2.0 +----- + + * added support for multiple files or directories in `LintCommand` + +4.0.0 +----- + + * The behavior of the non-specific tag `!` is changed and now forces + non-evaluating your values. + * complex mappings will throw a `ParseException` + * support for the comma as a group separator for floats has been dropped, use + the underscore instead + * support for the `!!php/object` tag has been dropped, use the `!php/object` + tag instead + * duplicate mapping keys throw a `ParseException` + * non-string mapping keys throw a `ParseException`, use the `Yaml::PARSE_KEYS_AS_STRINGS` + flag to cast them to strings + * `%` at the beginning of an unquoted string throw a `ParseException` + * mappings with a colon (`:`) that is not followed by a whitespace throw a + `ParseException` + * the `Dumper::setIndentation()` method has been removed + * being able to pass boolean options to the `Yaml::parse()`, `Yaml::dump()`, + `Parser::parse()`, and `Dumper::dump()` methods to configure the behavior of + the parser and dumper is no longer supported, pass bitmask flags instead + * the constructor arguments of the `Parser` class have been removed + * the `Inline` class is internal and no longer part of the BC promise + * removed support for the `!str` tag, use the `!!str` tag instead + * added support for tagged scalars. + + ```yml + Yaml::parse('!foo bar', Yaml::PARSE_CUSTOM_TAGS); + // returns TaggedValue('foo', 'bar'); + ``` + 3.4.0 ----- diff --git a/vendor/symfony/yaml/Command/LintCommand.php b/vendor/symfony/yaml/Command/LintCommand.php index fb8e3e65..98eb8e15 100644 --- a/vendor/symfony/yaml/Command/LintCommand.php +++ b/vendor/symfony/yaml/Command/LintCommand.php @@ -14,6 +14,7 @@ use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -38,7 +39,7 @@ class LintCommand extends Command private $directoryIteratorProvider; private $isReadableProvider; - public function __construct($name = null, $directoryIteratorProvider = null, $isReadableProvider = null) + public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null) { parent::__construct($name); @@ -52,8 +53,8 @@ public function __construct($name = null, $directoryIteratorProvider = null, $is protected function configure() { $this - ->setDescription('Lints a file and outputs encountered errors') - ->addArgument('filename', null, 'A file or a directory or STDIN') + ->setDescription('Lint a file and outputs encountered errors') + ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN') ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt') ->addOption('parse-tags', null, InputOption::VALUE_NONE, 'Parse custom tags') ->setHelp(<<cat filename | php %command.full_name% + cat filename | php %command.full_name% - You can also validate the syntax of a file: @@ -81,32 +82,41 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { $io = new SymfonyStyle($input, $output); - $filename = $input->getArgument('filename'); + $filenames = (array) $input->getArgument('filename'); $this->format = $input->getOption('format'); $this->displayCorrectFiles = $output->isVerbose(); $flags = $input->getOption('parse-tags') ? Yaml::PARSE_CUSTOM_TAGS : 0; - if (!$filename) { - if (!$stdin = $this->getStdin()) { - throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); - } - - return $this->display($io, [$this->validate($stdin, $flags)]); + if (['-'] === $filenames) { + return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]); } - if (!$this->isReadable($filename)) { - throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename)); + // @deprecated to be removed in 5.0 + if (!$filenames) { + if (0 === ftell(\STDIN)) { + @trigger_error('Piping content from STDIN to the "lint:yaml" command without passing the dash symbol "-" as argument is deprecated since Symfony 4.4.', \E_USER_DEPRECATED); + + return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]); + } + + throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); } $filesInfo = []; - foreach ($this->getFiles($filename) as $file) { - $filesInfo[] = $this->validate(file_get_contents($file), $flags, $file); + foreach ($filenames as $filename) { + if (!$this->isReadable($filename)) { + throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename)); + } + + foreach ($this->getFiles($filename) as $file) { + $filesInfo[] = $this->validate(file_get_contents($file), $flags, $file); + } } return $this->display($io, $filesInfo); } - private function validate($content, $flags, $file = null) + private function validate(string $content, int $flags, string $file = null) { $prevErrorHandler = set_error_handler(function ($level, $message, $file, $line) use (&$prevErrorHandler) { if (\E_USER_DEPRECATED === $level) { @@ -127,7 +137,7 @@ private function validate($content, $flags, $file = null) return ['file' => $file, 'valid' => true]; } - private function display(SymfonyStyle $io, array $files) + private function display(SymfonyStyle $io, array $files): int { switch ($this->format) { case 'txt': @@ -139,10 +149,11 @@ private function display(SymfonyStyle $io, array $files) } } - private function displayTxt(SymfonyStyle $io, array $filesInfo) + private function displayTxt(SymfonyStyle $io, array $filesInfo): int { $countFiles = \count($filesInfo); $erroredFiles = 0; + $suggestTagOption = false; foreach ($filesInfo as $info) { if ($info['valid'] && $this->displayCorrectFiles) { @@ -151,19 +162,23 @@ private function displayTxt(SymfonyStyle $io, array $filesInfo) ++$erroredFiles; $io->text(' ERROR '.($info['file'] ? sprintf(' in %s', $info['file']) : '')); $io->text(sprintf(' >> %s', $info['message'])); + + if (false !== strpos($info['message'], 'PARSE_CUSTOM_TAGS')) { + $suggestTagOption = true; + } } } if (0 === $erroredFiles) { $io->success(sprintf('All %d YAML files contain valid syntax.', $countFiles)); } else { - $io->warning(sprintf('%d YAML files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles)); + $io->warning(sprintf('%d YAML files have valid syntax and %d contain errors.%s', $countFiles - $erroredFiles, $erroredFiles, $suggestTagOption ? ' Use the --parse-tags option if you want parse custom tags.' : '')); } return min($erroredFiles, 1); } - private function displayJson(SymfonyStyle $io, array $filesInfo) + private function displayJson(SymfonyStyle $io, array $filesInfo): int { $errors = 0; @@ -172,6 +187,10 @@ private function displayJson(SymfonyStyle $io, array $filesInfo) if (!$v['valid']) { ++$errors; } + + if (isset($v['message']) && false !== strpos($v['message'], 'PARSE_CUSTOM_TAGS')) { + $v['message'] .= ' Use the --parse-tags option if you want parse custom tags.'; + } }); $io->writeln(json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)); @@ -179,7 +198,7 @@ private function displayJson(SymfonyStyle $io, array $filesInfo) return min($errors, 1); } - private function getFiles($fileOrDirectory) + private function getFiles(string $fileOrDirectory): iterable { if (is_file($fileOrDirectory)) { yield new \SplFileInfo($fileOrDirectory); @@ -196,24 +215,7 @@ private function getFiles($fileOrDirectory) } } - /** - * @return string|null - */ - private function getStdin() - { - if (0 !== ftell(\STDIN)) { - return null; - } - - $inputs = ''; - while (!feof(\STDIN)) { - $inputs .= fread(\STDIN, 1024); - } - - return $inputs; - } - - private function getParser() + private function getParser(): Parser { if (!$this->parser) { $this->parser = new Parser(); @@ -222,7 +224,7 @@ private function getParser() return $this->parser; } - private function getDirectoryIterator($directory) + private function getDirectoryIterator(string $directory): iterable { $default = function ($directory) { return new \RecursiveIteratorIterator( @@ -232,20 +234,20 @@ private function getDirectoryIterator($directory) }; if (null !== $this->directoryIteratorProvider) { - return \call_user_func($this->directoryIteratorProvider, $directory, $default); + return ($this->directoryIteratorProvider)($directory, $default); } return $default($directory); } - private function isReadable($fileOrDirectory) + private function isReadable(string $fileOrDirectory): bool { $default = function ($fileOrDirectory) { return is_readable($fileOrDirectory); }; if (null !== $this->isReadableProvider) { - return \call_user_func($this->isReadableProvider, $fileOrDirectory, $default); + return ($this->isReadableProvider)($fileOrDirectory, $default); } return $default($fileOrDirectory); diff --git a/vendor/symfony/yaml/Dumper.php b/vendor/symfony/yaml/Dumper.php index 336e39c9..52db38c3 100644 --- a/vendor/symfony/yaml/Dumper.php +++ b/vendor/symfony/yaml/Dumper.php @@ -18,7 +18,7 @@ * * @author Fabien Potencier * - * @final since version 3.4 + * @final */ class Dumper { @@ -29,10 +29,7 @@ class Dumper */ protected $indentation; - /** - * @param int $indentation - */ - public function __construct($indentation = 4) + public function __construct(int $indentation = 4) { if ($indentation < 1) { throw new \InvalidArgumentException('The indentation must be greater than zero.'); @@ -41,20 +38,6 @@ public function __construct($indentation = 4) $this->indentation = $indentation; } - /** - * Sets the indentation. - * - * @param int $num The amount of spaces to use for indentation of nested nodes - * - * @deprecated since version 3.1, to be removed in 4.0. Pass the indentation to the constructor instead. - */ - public function setIndentation($num) - { - @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 3.1 and will be removed in 4.0. Pass the indentation to the constructor instead.', \E_USER_DEPRECATED); - - $this->indentation = (int) $num; - } - /** * Dumps a PHP value to YAML. * @@ -65,26 +48,8 @@ public function setIndentation($num) * * @return string The YAML representation of the PHP value */ - public function dump($input, $inline = 0, $indent = 0, $flags = 0) + public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0): string { - if (\is_bool($flags)) { - @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', \E_USER_DEPRECATED); - - if ($flags) { - $flags = Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE; - } else { - $flags = 0; - } - } - - if (\func_num_args() >= 5) { - @trigger_error('Passing a boolean flag to toggle object support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::DUMP_OBJECT flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(4)) { - $flags |= Yaml::DUMP_OBJECT; - } - } - $output = ''; $prefix = $indent ? str_repeat(' ', $indent) : ''; $dumpObjectAsInlineMap = true; @@ -99,14 +64,31 @@ public function dump($input, $inline = 0, $indent = 0, $flags = 0) $dumpAsMap = Inline::isHash($input); foreach ($input as $key => $value) { - if ($inline >= 1 && Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && false !== strpos($value, "\n") && false === strpos($value, "\r")) { + if ('' !== $output && "\n" !== $output[-1]) { + $output .= "\n"; + } + + if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && false !== strpos($value, "\n") && false === strpos($value, "\r")) { // If the first line starts with a space character, the spec requires a blockIndicationIndicator // http://www.yaml.org/spec/1.2/spec.html#id2793979 $blockIndentationIndicator = (' ' === substr($value, 0, 1)) ? (string) $this->indentation : ''; - $output .= sprintf("%s%s%s |%s\n", $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator); + + if (isset($value[-2]) && "\n" === $value[-2] && "\n" === $value[-1]) { + $blockChompingIndicator = '+'; + } elseif ("\n" === $value[-1]) { + $blockChompingIndicator = ''; + } else { + $blockChompingIndicator = '-'; + } + + $output .= sprintf('%s%s%s |%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator, $blockChompingIndicator); foreach (explode("\n", $value) as $row) { - $output .= sprintf("%s%s%s\n", $prefix, str_repeat(' ', $this->indentation), $row); + if ('' === $row) { + $output .= "\n"; + } else { + $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row); + } } continue; @@ -115,20 +97,20 @@ public function dump($input, $inline = 0, $indent = 0, $flags = 0) if ($value instanceof TaggedValue) { $output .= sprintf('%s%s !%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', $value->getTag()); - if ($inline >= 1 && Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && false !== strpos($value->getValue(), "\n") && false === strpos($value->getValue(), "\r\n")) { + if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && false !== strpos($value->getValue(), "\n") && false === strpos($value->getValue(), "\r\n")) { // If the first line starts with a space character, the spec requires a blockIndicationIndicator // http://www.yaml.org/spec/1.2/spec.html#id2793979 $blockIndentationIndicator = (' ' === substr($value->getValue(), 0, 1)) ? (string) $this->indentation : ''; - $output .= sprintf(" |%s\n", $blockIndentationIndicator); + $output .= sprintf(' |%s', $blockIndentationIndicator); foreach (explode("\n", $value->getValue()) as $row) { - $output .= sprintf("%s%s%s\n", $prefix, str_repeat(' ', $this->indentation), $row); + $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row); } continue; } - if ($inline - 1 <= 0 || null === $value->getValue() || is_scalar($value->getValue())) { + if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) { $output .= ' '.$this->dump($value->getValue(), $inline - 1, 0, $flags)."\n"; } else { $output .= "\n"; diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php index 9413d7a2..9b809df8 100644 --- a/vendor/symfony/yaml/Escaper.php +++ b/vendor/symfony/yaml/Escaper.php @@ -22,13 +22,13 @@ class Escaper { // Characters that would cause a dumped string to require double quoting. - const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\x7f|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9"; + public const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\x7f|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9"; // Mapping arrays for escaping a double quoted string. The backslash is // first to ensure proper escaping because str_replace operates iteratively // on the input arrays. This ordering of the characters avoids the use of strtr, // which performs more slowly. - private static $escapees = ['\\', '\\\\', '\\"', '"', + private const ESCAPEES = ['\\', '\\\\', '\\"', '"', "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", @@ -36,7 +36,7 @@ class Escaper "\x7f", "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9", ]; - private static $escaped = ['\\\\', '\\"', '\\\\', '\\"', + private const ESCAPED = ['\\\\', '\\"', '\\\\', '\\"', '\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a', '\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f', '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17', @@ -52,7 +52,7 @@ class Escaper * * @return bool True if the value would require double quotes */ - public static function requiresDoubleQuoting($value) + public static function requiresDoubleQuoting(string $value): bool { return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value); } @@ -64,9 +64,9 @@ public static function requiresDoubleQuoting($value) * * @return string The quoted, escaped string */ - public static function escapeWithDoubleQuotes($value) + public static function escapeWithDoubleQuotes(string $value): string { - return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value)); + return sprintf('"%s"', str_replace(self::ESCAPEES, self::ESCAPED, $value)); } /** @@ -76,7 +76,7 @@ public static function escapeWithDoubleQuotes($value) * * @return bool True if the value would require single quotes */ - public static function requiresSingleQuoting($value) + public static function requiresSingleQuoting(string $value): bool { // Determines if a PHP value is entirely composed of a value that would // require single quoting in YAML. @@ -86,7 +86,7 @@ public static function requiresSingleQuoting($value) // Determines if the PHP value contains any single characters that would // cause it to require single quoting in YAML. - return 0 < preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value); + return 0 < preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` \p{Zs}]/xu', $value); } /** @@ -96,7 +96,7 @@ public static function requiresSingleQuoting($value) * * @return string The quoted, escaped string */ - public static function escapeWithSingleQuotes($value) + public static function escapeWithSingleQuotes(string $value): string { return sprintf("'%s'", str_replace('\'', '\'\'', $value)); } diff --git a/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/symfony/yaml/Exception/ExceptionInterface.php index ad850eea..90913168 100644 --- a/vendor/symfony/yaml/Exception/ExceptionInterface.php +++ b/vendor/symfony/yaml/Exception/ExceptionInterface.php @@ -16,6 +16,6 @@ * * @author Fabien Potencier */ -interface ExceptionInterface +interface ExceptionInterface extends \Throwable { } diff --git a/vendor/symfony/yaml/Exception/ParseException.php b/vendor/symfony/yaml/Exception/ParseException.php index 4207d9ab..82c05a71 100644 --- a/vendor/symfony/yaml/Exception/ParseException.php +++ b/vendor/symfony/yaml/Exception/ParseException.php @@ -24,13 +24,12 @@ class ParseException extends RuntimeException private $rawMessage; /** - * @param string $message The error message - * @param int $parsedLine The line where the error occurred - * @param string|null $snippet The snippet of code near the problem - * @param string|null $parsedFile The file name where the error occurred - * @param \Exception|null $previous The previous exception + * @param string $message The error message + * @param int $parsedLine The line where the error occurred + * @param string|null $snippet The snippet of code near the problem + * @param string|null $parsedFile The file name where the error occurred */ - public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null) + public function __construct(string $message, int $parsedLine = -1, string $snippet = null, string $parsedFile = null, \Throwable $previous = null) { $this->parsedFile = $parsedFile; $this->parsedLine = $parsedLine; diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php index 64ac48a9..1d4bbda6 100644 --- a/vendor/symfony/yaml/Inline.php +++ b/vendor/symfony/yaml/Inline.php @@ -24,7 +24,7 @@ */ class Inline { - const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')'; + public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')'; public static $parsedLineNumber = -1; public static $parsedFilename; @@ -34,12 +34,7 @@ class Inline private static $objectForMap = false; private static $constantSupport = false; - /** - * @param int $flags - * @param int|null $parsedLineNumber - * @param string|null $parsedFilename - */ - public static function initialize($flags, $parsedLineNumber = null, $parsedFilename = null) + public static function initialize(int $flags, int $parsedLineNumber = null, string $parsedFilename = null) { self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags); self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags); @@ -63,40 +58,8 @@ public static function initialize($flags, $parsedLineNumber = null, $parsedFilen * * @throws ParseException */ - public static function parse($value, $flags = 0, $references = []) + public static function parse(string $value = null, int $flags = 0, array &$references = []) { - if (\is_bool($flags)) { - @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', \E_USER_DEPRECATED); - - if ($flags) { - $flags = Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE; - } else { - $flags = 0; - } - } - - if (\func_num_args() >= 3 && !\is_array($references)) { - @trigger_error('Passing a boolean flag to toggle object support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT flag instead.', \E_USER_DEPRECATED); - - if ($references) { - $flags |= Yaml::PARSE_OBJECT; - } - - if (\func_num_args() >= 4) { - @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(3)) { - $flags |= Yaml::PARSE_OBJECT_FOR_MAP; - } - } - - if (\func_num_args() >= 5) { - $references = func_get_arg(4); - } else { - $references = []; - } - } - self::initialize($flags); $value = trim($value); @@ -105,7 +68,7 @@ public static function parse($value, $flags = 0, $references = []) return ''; } - if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) { + if (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) { $mbEncoding = mb_internal_encoding(); mb_internal_encoding('ASCII'); } @@ -131,7 +94,7 @@ public static function parse($value, $flags = 0, $references = []) throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename); } - if (null !== $tag) { + if (null !== $tag && '' !== $tag) { return new TaggedValue($tag, $result); } @@ -153,35 +116,19 @@ public static function parse($value, $flags = 0, $references = []) * * @throws DumpException When trying to dump PHP resource */ - public static function dump($value, $flags = 0) + public static function dump($value, int $flags = 0): string { - if (\is_bool($flags)) { - @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', \E_USER_DEPRECATED); - - if ($flags) { - $flags = Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE; - } else { - $flags = 0; - } - } - - if (\func_num_args() >= 3) { - @trigger_error('Passing a boolean flag to toggle object support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::DUMP_OBJECT flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(2)) { - $flags |= Yaml::DUMP_OBJECT; - } - } - switch (true) { case \is_resource($value): if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { 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 $value instanceof \UnitEnum: + return sprintf('!php/const %s::%s', \get_class($value), $value->name); case \is_object($value): if ($value instanceof TaggedValue) { return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags); @@ -192,25 +139,31 @@ public static function dump($value, $flags = 0) } if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) { - return self::dumpArray($value, $flags & ~Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE); + $output = []; + + foreach ($value as $key => $val) { + $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags)); + } + + return sprintf('{ %s }', implode(', ', $output)); } if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { 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: return 'false'; - case ctype_digit($value): - return \is_string($value) ? "'$value'" : (int) $value; - case is_numeric($value) && false === strpos($value, "\f") && false === strpos($value, "\n") && false === strpos($value, "\r") && false === strpos($value, "\t") && false === strpos($value, "\v"): + case \is_int($value): + return $value; + case is_numeric($value) && false === strpbrk($value, "\f\n\r\t\v"): $locale = setlocale(\LC_NUMERIC, 0); if (false !== $locale) { setlocale(\LC_NUMERIC, 'C'); @@ -250,13 +203,11 @@ public static function dump($value, $flags = 0) /** * Check if given array is hash or just normal indexed array. * - * @internal - * * @param array|\ArrayObject|\stdClass $value The PHP array or array-like object to check * * @return bool true if value is hash array, false otherwise */ - public static function isHash($value) + public static function isHash($value): bool { if ($value instanceof \stdClass || $value instanceof \ArrayObject) { return true; @@ -281,7 +232,7 @@ public static function isHash($value) * * @return string The YAML string representing the PHP array */ - private static function dumpArray($value, $flags) + private static function dumpArray(array $value, int $flags): string { // array if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) { @@ -302,30 +253,31 @@ private static function dumpArray($value, $flags) 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. * - * @param string $scalar - * @param int $flags - * @param string[] $delimiters - * @param int &$i - * @param bool $evaluate - * @param array $references - * - * @return string + * @return mixed * * @throws ParseException When malformed inline YAML string is parsed - * - * @internal */ - public static function parseScalar($scalar, $flags = 0, $delimiters = null, &$i = 0, $evaluate = true, $references = [], $legacyOmittedKeySupport = false) + public static function parseScalar(string $scalar, int $flags = 0, array $delimiters = null, int &$i = 0, bool $evaluate = true, array &$references = [], bool &$isQuoted = null) { if (\in_array($scalar[$i], ['"', "'"])) { // quoted scalar + $isQuoted = true; $output = self::parseQuotedScalar($scalar, $i); if (null !== $delimiters) { - $tmp = ltrim(substr($scalar, $i), ' '); + $tmp = ltrim(substr($scalar, $i), " \n"); if ('' === $tmp) { throw new ParseException(sprintf('Unexpected end of line, expected one of "%s".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); } @@ -335,6 +287,8 @@ public static function parseScalar($scalar, $flags = 0, $delimiters = null, &$i } } else { // "normal" string + $isQuoted = false; + if (!$delimiters) { $output = substr($scalar, $i); $i += \strlen($output); @@ -343,24 +297,21 @@ public static function parseScalar($scalar, $flags = 0, $delimiters = null, &$i if (Parser::preg_match('/[ \t]+#/', $output, $match, \PREG_OFFSET_CAPTURE)) { $output = substr($output, 0, $match[0][1]); } - } elseif (Parser::preg_match('/^(.'.($legacyOmittedKeySupport ? '+' : '*').'?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) { + } elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) { $output = $match[1]; $i += \strlen($output); + $output = trim($output); } else { throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename); } // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >) - if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0])) { + if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) { throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename); } - if ($output && '%' === $output[0]) { - @trigger_error(self::getDeprecationMessage(sprintf('Not quoting the scalar "%s" starting with the "%%" indicator character is deprecated since Symfony 3.1 and will throw a ParseException in 4.0.', $output)), \E_USER_DEPRECATED); - } - if ($evaluate) { - $output = self::evaluateScalar($output, $flags, $references); + $output = self::evaluateScalar($output, $flags, $references, $isQuoted); } } @@ -370,14 +321,9 @@ public static function parseScalar($scalar, $flags = 0, $delimiters = null, &$i /** * Parses a YAML quoted scalar. * - * @param string $scalar - * @param int &$i - * - * @return string - * * @throws ParseException When malformed inline YAML string is parsed */ - private static function parseQuotedScalar($scalar, &$i) + private static function parseQuotedScalar(string $scalar, int &$i = 0): string { if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) { throw new ParseException(sprintf('Malformed inline YAML string: "%s".', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); @@ -400,16 +346,9 @@ private static function parseQuotedScalar($scalar, &$i) /** * Parses a YAML sequence. * - * @param string $sequence - * @param int $flags - * @param int &$i - * @param array $references - * - * @return array - * * @throws ParseException When malformed inline YAML string is parsed */ - private static function parseSequence($sequence, $flags, &$i = 0, $references = []) + private static function parseSequence(string $sequence, int $flags, int &$i = 0, array &$references = []): array { $output = []; $len = \strlen($sequence); @@ -437,8 +376,7 @@ private static function parseSequence($sequence, $flags, &$i = 0, $references = $value = self::parseMapping($sequence, $flags, $i, $references); break; default: - $isQuoted = \in_array($sequence[$i], ['"', "'"]); - $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references); + $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted); // the value can be an array if a reference has been resolved to an array var if (\is_string($value) && !$isQuoted && false !== strpos($value, ': ')) { @@ -451,10 +389,15 @@ private static function parseSequence($sequence, $flags, &$i = 0, $references = } } + if (!$isQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) { + $references[$matches['ref']] = $matches['value']; + $value = $matches['value']; + } + --$i; } - if (null !== $tag) { + if (null !== $tag && '' !== $tag) { $value = new TaggedValue($tag, $value); } @@ -469,16 +412,11 @@ private static function parseSequence($sequence, $flags, &$i = 0, $references = /** * Parses a YAML mapping. * - * @param string $mapping - * @param int $flags - * @param int &$i - * @param array $references - * * @return array|\stdClass * * @throws ParseException When malformed inline YAML string is parsed */ - private static function parseMapping($mapping, $flags, &$i = 0, $references = []) + private static function parseMapping(string $mapping, int $flags, int &$i = 0, array &$references = []) { $output = []; $len = \strlen($mapping); @@ -490,6 +428,7 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = [] switch ($mapping[$i]) { case ' ': case ',': + case "\n": ++$i; continue 2; case '}': @@ -501,37 +440,33 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = [] } // key + $offsetBeforeKeyParsing = $i; $isKeyQuoted = \in_array($mapping[$i], ['"', "'"], true); - $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false, [], true); + $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false); - if ('!php/const' === $key) { - $key .= self::parseScalar($mapping, $flags, [':', ' '], $i, false, [], true); - if ('!php/const:' === $key && ':' !== $mapping[$i]) { - $key = ''; - --$i; - } else { - $key = self::evaluateScalar($key, $flags); - } + if ($offsetBeforeKeyParsing === $i) { + throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping); } - if (':' !== $key && false === $i = strpos($mapping, ':', $i)) { - break; + if ('!php/const' === $key) { + $key .= ' '.self::parseScalar($mapping, $flags, [':'], $i, false); + $key = self::evaluateScalar($key, $flags); } - if (':' === $key) { - @trigger_error(self::getDeprecationMessage('Omitting the key of a mapping is deprecated and will throw a ParseException in 4.0.'), \E_USER_DEPRECATED); + if (false === $i = strpos($mapping, ':', $i)) { + break; } if (!$isKeyQuoted) { $evaluatedKey = self::evaluateScalar($key, $flags, $references); if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) { - @trigger_error(self::getDeprecationMessage('Implicit casting of incompatible mapping keys to strings is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.'), \E_USER_DEPRECATED); + throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping); } } - if (':' !== $key && !$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}'], true))) { - @trigger_error(self::getDeprecationMessage('Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since Symfony 3.2 and will throw a ParseException in 4.0.'), \E_USER_DEPRECATED); + if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', "\n"], true))) { + throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping); } if ('<<' === $key) { @@ -539,7 +474,7 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = [] } while ($i < $len) { - if (':' === $mapping[$i] || ' ' === $mapping[$i]) { + if (':' === $mapping[$i] || ' ' === $mapping[$i] || "\n" === $mapping[$i]) { ++$i; continue; @@ -565,7 +500,7 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = [] $output[$key] = $value; } } elseif (isset($output[$key])) { - @trigger_error(self::getDeprecationMessage(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since Symfony 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key)), \E_USER_DEPRECATED); + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); } break; case '{': @@ -584,11 +519,11 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = [] $output[$key] = $value; } } elseif (isset($output[$key])) { - @trigger_error(self::getDeprecationMessage(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since Symfony 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key)), \E_USER_DEPRECATED); + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); } break; default: - $value = self::parseScalar($mapping, $flags, [',', '}'], $i, null === $tag, $references); + $value = self::parseScalar($mapping, $flags, [',', '}', "\n"], $i, null === $tag, $references, $isValueQuoted); // Spec: Keys MUST be unique; first one wins. // Parser cannot abort this mapping earlier, since lines // are processed sequentially. @@ -596,13 +531,18 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = [] if ('<<' === $key) { $output += $value; } elseif ($allowOverwrite || !isset($output[$key])) { + if (!$isValueQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) { + $references[$matches['ref']] = $matches['value']; + $value = $matches['value']; + } + if (null !== $tag) { $output[$key] = new TaggedValue($tag, $value); } else { $output[$key] = $value; } } elseif (isset($output[$key])) { - @trigger_error(self::getDeprecationMessage(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since Symfony 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key)), \E_USER_DEPRECATED); + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); } --$i; } @@ -618,16 +558,13 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = [] /** * Evaluates scalars and replaces magic values. * - * @param string $scalar - * @param int $flags - * @param array $references - * * @return mixed The evaluated YAML string * * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved */ - private static function evaluateScalar($scalar, $flags, $references = []) + private static function evaluateScalar(string $scalar, int $flags, array &$references = [], bool &$isQuotedString = null) { + $isQuotedString = false; $scalar = trim($scalar); $scalarLower = strtolower($scalar); @@ -661,40 +598,17 @@ private static function evaluateScalar($scalar, $flags, $references = []) return false; case '!' === $scalar[0]: switch (true) { - case 0 === strpos($scalar, '!str'): - @trigger_error(self::getDeprecationMessage('Support for the !str tag is deprecated since Symfony 3.4. Use the !!str tag instead.'), \E_USER_DEPRECATED); - - return (string) substr($scalar, 5); case 0 === strpos($scalar, '!!str '): - return (string) substr($scalar, 6); - case 0 === strpos($scalar, '! '): - @trigger_error(self::getDeprecationMessage('Using the non-specific tag "!" is deprecated since Symfony 3.4 as its behavior will change in 4.0. It will force non-evaluating your values in 4.0. Use plain integers or !!float instead.'), \E_USER_DEPRECATED); - - return (int) self::parseScalar(substr($scalar, 2), $flags); - case 0 === strpos($scalar, '!php/object:'): - if (self::$objectSupport) { - @trigger_error(self::getDeprecationMessage('The !php/object: tag to indicate dumped PHP objects is deprecated since Symfony 3.4 and will be removed in 4.0. Use the !php/object (without the colon) tag instead.'), \E_USER_DEPRECATED); + $s = (string) substr($scalar, 6); - return unserialize(substr($scalar, 12)); + if (\in_array($s[0] ?? '', ['"', "'"], true)) { + $isQuotedString = true; + $s = self::parseQuotedScalar($s); } - if (self::$exceptionOnInvalidType) { - throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); - } - - return null; - case 0 === strpos($scalar, '!!php/object:'): - if (self::$objectSupport) { - @trigger_error(self::getDeprecationMessage('The !!php/object: tag to indicate dumped PHP objects is deprecated since Symfony 3.1 and will be removed in 4.0. Use the !php/object (without the colon) tag instead.'), \E_USER_DEPRECATED); - - return unserialize(substr($scalar, 13)); - } - - if (self::$exceptionOnInvalidType) { - throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); - } - - return null; + return $s; + case 0 === strpos($scalar, '! '): + return substr($scalar, 2); case 0 === strpos($scalar, '!php/object'): if (self::$objectSupport) { if (!isset($scalar[12])) { @@ -708,21 +622,6 @@ private static function evaluateScalar($scalar, $flags, $references = []) throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); } - return null; - case 0 === strpos($scalar, '!php/const:'): - if (self::$constantSupport) { - @trigger_error(self::getDeprecationMessage('The !php/const: tag to indicate dumped PHP constants is deprecated since Symfony 3.4 and will be removed in 4.0. Use the !php/const (without the colon) tag instead.'), \E_USER_DEPRECATED); - - if (\defined($const = substr($scalar, 11))) { - return \constant($const); - } - - throw new ParseException(sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); - } - if (self::$exceptionOnInvalidType) { - throw new ParseException(sprintf('The string "%s" could not be parsed as a constant. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); - } - return null; case 0 === strpos($scalar, '!php/const'): if (self::$constantSupport) { @@ -747,14 +646,14 @@ private static function evaluateScalar($scalar, $flags, $references = []) case 0 === strpos($scalar, '!!binary '): return self::evaluateBinaryScalar(substr($scalar, 9)); default: - @trigger_error(self::getDeprecationMessage(sprintf('Using the unquoted scalar value "%s" is deprecated since Symfony 3.3 and will be considered as a tagged value in 4.0. You must quote it.', $scalar)), \E_USER_DEPRECATED); + throw new ParseException(sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename); } // Optimize for returning strings. // no break case '+' === $scalar[0] || '-' === $scalar[0] || '.' === $scalar[0] || is_numeric($scalar[0]): if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) { - $scalar = str_replace('_', '', (string) $scalar); + $scalar = str_replace('_', '', $scalar); } switch (true) { @@ -784,78 +683,72 @@ private static function evaluateScalar($scalar, $flags, $references = []) return -log(0); case '-.inf' === $scalarLower: return log(0); - case Parser::preg_match('/^(-|\+)?[0-9][0-9,]*(\.[0-9_]+)?$/', $scalar): case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar): - if (false !== strpos($scalar, ',')) { - @trigger_error(self::getDeprecationMessage('Using the comma as a group separator for floats is deprecated since Symfony 3.2 and will be removed in 4.0.'), \E_USER_DEPRECATED); - } - - return (float) str_replace([',', '_'], '', $scalar); + return (float) str_replace('_', '', $scalar); case Parser::preg_match(self::getTimestampRegex(), $scalar): + // When no timezone is provided in the parsed date, YAML spec says we must assume UTC. + $time = new \DateTime($scalar, new \DateTimeZone('UTC')); + if (Yaml::PARSE_DATETIME & $flags) { - // When no timezone is provided in the parsed date, YAML spec says we must assume UTC. - return new \DateTime($scalar, new \DateTimeZone('UTC')); + return $time; } - $timeZone = date_default_timezone_get(); - date_default_timezone_set('UTC'); - $time = strtotime($scalar); - date_default_timezone_set($timeZone); + try { + if (false !== $scalar = $time->getTimestamp()) { + return $scalar; + } + } catch (\ValueError $e) { + // no-op + } - return $time; + return $time->format('U'); } } return (string) $scalar; } - /** - * @param string $value - * @param int &$i - * @param int $flags - * - * @return string|null - */ - private static function parseTag($value, &$i, $flags) + private static function parseTag(string $value, int &$i, int $flags): ?string { if ('!' !== $value[$i]) { return null; } - $tagLength = strcspn($value, " \t\n", $i + 1); + $tagLength = strcspn($value, " \t\n[]{},", $i + 1); $tag = substr($value, $i + 1, $tagLength); $nextOffset = $i + $tagLength + 1; $nextOffset += strspn($value, ' ', $nextOffset); - // Is followed by a scalar - if ((!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && 'tagged' !== $tag) { - // Manage non-whitelisted scalars in {@link self::evaluateScalar()} + if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], true))) { + throw new ParseException('Using the unquoted scalar value "!" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + // Is followed by a scalar and is a built-in tag + if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || 'str' === $tag || 'php/const' === $tag || 'php/object' === $tag)) { + // Manage in {@link self::evaluateScalar()} return null; } + $i = $nextOffset; + // Built-in tags - if ($tag && '!' === $tag[0]) { + if ('' !== $tag && '!' === $tag[0]) { throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); } - if (Yaml::PARSE_CUSTOM_TAGS & $flags) { - $i = $nextOffset; + if ('' !== $tag && !isset($value[$i])) { + throw new ParseException(sprintf('Missing value for tag "%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) { return $tag; } - throw new ParseException(sprintf('Tags support is not enabled. Enable the `Yaml::PARSE_CUSTOM_TAGS` flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + throw new ParseException(sprintf('Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); } - /** - * @param string $scalar - * - * @return string - * - * @internal - */ - public static function evaluateBinaryScalar($scalar) + public static function evaluateBinaryScalar(string $scalar): string { $parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar)); @@ -870,7 +763,7 @@ public static function evaluateBinaryScalar($scalar) return base64_decode($parsedBinaryData, true); } - private static function isBinaryString($value) + private static function isBinaryString(string $value) { return !preg_match('//u', $value) || preg_match('/[^\x00\x07-\x0d\x1B\x20-\xff]/', $value); } @@ -882,7 +775,7 @@ private static function isBinaryString($value) * * @see http://www.yaml.org/spec/1.2/spec.html#id2761573 */ - private static function getTimestampRegex() + private static function getTimestampRegex(): string { return << * - * @final since version 3.4 + * @final */ class Parser { - const TAG_PATTERN = '(?P![\w!.\/:-]+)'; - const BLOCK_SCALAR_HEADER_PATTERN = '(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?'; + public const TAG_PATTERN = '(?P![\w!.\/:-]+)'; + public const BLOCK_SCALAR_HEADER_PATTERN = '(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?'; + public const REFERENCE_PATTERN = '#^&(?P[^ ]++) *+(?P.*)#u'; private $filename; private $offset = 0; @@ -37,21 +38,6 @@ class Parser private $locallySkippedLineNumbers = []; private $refsBeingParsed = []; - public function __construct() - { - if (\func_num_args() > 0) { - @trigger_error(sprintf('The constructor arguments $offset, $totalNumberOfLines, $skippedLineNumbers of %s are deprecated and will be removed in 4.0', self::class), \E_USER_DEPRECATED); - - $this->offset = func_get_arg(0); - if (\func_num_args() > 1) { - $this->totalNumberOfLines = func_get_arg(1); - } - if (\func_num_args() > 2) { - $this->skippedLineNumbers = func_get_arg(2); - } - } - } - /** * Parses a YAML file into a PHP value. * @@ -62,7 +48,7 @@ public function __construct() * * @throws ParseException If the file could not be read or the YAML is not valid */ - public function parseFile($filename, $flags = 0) + public function parseFile(string $filename, int $flags = 0) { if (!is_file($filename)) { throw new ParseException(sprintf('File "%s" does not exist.', $filename)); @@ -91,38 +77,8 @@ public function parseFile($filename, $flags = 0) * * @throws ParseException If the YAML is not valid */ - public function parse($value, $flags = 0) + public function parse(string $value, int $flags = 0) { - if (\is_bool($flags)) { - @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', \E_USER_DEPRECATED); - - if ($flags) { - $flags = Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE; - } else { - $flags = 0; - } - } - - if (\func_num_args() >= 3) { - @trigger_error('Passing a boolean flag to toggle object support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(2)) { - $flags |= Yaml::PARSE_OBJECT; - } - } - - if (\func_num_args() >= 4) { - @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(3)) { - $flags |= Yaml::PARSE_OBJECT_FOR_MAP; - } - } - - if (Yaml::PARSE_KEYS_AS_STRINGS & $flags) { - @trigger_error('Using the Yaml::PARSE_KEYS_AS_STRINGS flag is deprecated since Symfony 3.4 as it will be removed in 4.0. Quote your keys when they are evaluable instead.', \E_USER_DEPRECATED); - } - if (false === preg_match('//u', $value)) { throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename); } @@ -130,39 +86,32 @@ public function parse($value, $flags = 0) $this->refs = []; $mbEncoding = null; - $e = null; - $data = null; - if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) { + if (2 /* MB_OVERLOAD_STRING */ & (int) \ini_get('mbstring.func_overload')) { $mbEncoding = mb_internal_encoding(); mb_internal_encoding('UTF-8'); } try { $data = $this->doParse($value, $flags); - } catch (\Exception $e) { - } catch (\Throwable $e) { - } - - if (null !== $mbEncoding) { - mb_internal_encoding($mbEncoding); - } - - $this->lines = []; - $this->currentLine = ''; - $this->refs = []; - $this->skippedLineNumbers = []; - $this->locallySkippedLineNumbers = []; - $this->totalNumberOfLines = null; - - if (null !== $e) { - throw $e; + } finally { + if (null !== $mbEncoding) { + mb_internal_encoding($mbEncoding); + } + $this->refsBeingParsed = []; + $this->offset = 0; + $this->lines = []; + $this->currentLine = ''; + $this->refs = []; + $this->skippedLineNumbers = []; + $this->locallySkippedLineNumbers = []; + $this->totalNumberOfLines = null; } return $data; } - private function doParse($value, $flags) + private function doParse(string $value, int $flags) { $this->currentLineNb = -1; $this->currentLine = ''; @@ -206,25 +155,34 @@ private function doParse($value, $flags) Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename); $isRef = $mergeNode = false; - if (self::preg_match('#^\-((?P\s+)(?P.+))?$#u', rtrim($this->currentLine), $values)) { + if ('-' === $this->currentLine[0] && self::preg_match('#^\-((?P\s+)(?P.+))?$#u', rtrim($this->currentLine), $values)) { if ($context && 'mapping' == $context) { throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); } $context = 'sequence'; - if (isset($values['value']) && self::preg_match('#^&(?P[^ ]+) *(?P.*)#u', $values['value'], $matches)) { + if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) { $isRef = $matches['ref']; $this->refsBeingParsed[] = $isRef; $values['value'] = $matches['value']; } if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) { - @trigger_error($this->getDeprecationMessage('Starting an unquoted string with a question mark followed by a space is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.'), \E_USER_DEPRECATED); + throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine); } // array - if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { - $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags); + if (isset($values['value']) && 0 === strpos(ltrim($values['value'], ' '), '-')) { + // Inline first child + $currentLineNumber = $this->getRealCurrentLineNb(); + + $sequenceIndentation = \strlen($values['leadspaces']) + 1; + $sequenceYaml = substr($this->currentLine, $sequenceIndentation); + $sequenceYaml .= "\n".$this->getNextEmbedBlock($sequenceIndentation, true); + + $data[] = $this->parseBlock($currentLineNumber, rtrim($sequenceYaml), $flags); + } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { + $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags); } elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) { $data[] = new TaggedValue( $subTag, @@ -254,7 +212,7 @@ private function doParse($value, $flags) array_pop($this->refsBeingParsed); } } elseif ( - self::preg_match('#^(?P(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(\s++(?P.+))?$#u', rtrim($this->currentLine), $values) + self::preg_match('#^(?P(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(( |\t)++(?P.+))?$#u', rtrim($this->currentLine), $values) && (false === strpos($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"])) ) { if ($context && 'sequence' == $context) { @@ -263,15 +221,7 @@ private function doParse($value, $flags) $context = 'mapping'; try { - $i = 0; - $evaluateKey = !(Yaml::PARSE_KEYS_AS_STRINGS & $flags); - - // constants in key will be evaluated anyway - if (isset($values['key'][0]) && '!' === $values['key'][0] && Yaml::PARSE_CONSTANT & $flags) { - $evaluateKey = true; - } - - $key = Inline::parseScalar($values['key'], 0, null, $i, $evaluateKey); + $key = Inline::parseScalar($values['key']); } catch (ParseException $e) { $e->setParsedLine($this->getRealCurrentLineNb() + 1); $e->setSnippet($this->currentLine); @@ -280,8 +230,7 @@ private function doParse($value, $flags) } if (!\is_string($key) && !\is_int($key)) { - $keyType = is_numeric($key) ? 'numeric key' : 'non-string key'; - @trigger_error($this->getDeprecationMessage(sprintf('Implicit casting of %s to string is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.', $keyType)), \E_USER_DEPRECATED); + throw new ParseException((is_numeric($key) ? 'Numeric' : 'Non-string').' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine); } // Convert float keys to strings, to avoid being converted to integers by PHP @@ -289,14 +238,14 @@ private function doParse($value, $flags) $key = (string) $key; } - if ('<<' === $key && (!isset($values['value']) || !self::preg_match('#^&(?P[^ ]+)#u', $values['value'], $refMatches))) { + if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P[^ ]+)#u', $values['value'], $refMatches))) { $mergeNode = true; $allowOverwrite = true; if (isset($values['value'][0]) && '*' === $values['value'][0]) { $refName = substr(rtrim($values['value']), 1); if (!\array_key_exists($refName, $this->refs)) { if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) { - throw new ParseException(sprintf('Circular reference [%s, %s] detected for reference "%s".', implode(', ', \array_slice($this->refsBeingParsed, $pos)), $refName, $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename); + throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename); } throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); @@ -350,7 +299,7 @@ private function doParse($value, $flags) $data += $parsed; // array union } } - } elseif ('<<' !== $key && isset($values['value']) && self::preg_match('#^&(?P[^ ]++) *+(?P.*)#u', $values['value'], $matches)) { + } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) { $isRef = $matches['ref']; $this->refsBeingParsed[] = $isRef; $values['value'] = $matches['value']; @@ -372,9 +321,11 @@ private function doParse($value, $flags) $data[$key] = null; } } else { - @trigger_error($this->getDeprecationMessage(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since Symfony 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key)), \E_USER_DEPRECATED); + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine); } } else { + // remember the parsed line number here in case we need it to provide some contexts in error messages below + $realCurrentLineNbKey = $this->getRealCurrentLineNb(); $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags); if ('<<' === $key) { $this->refs[$refMatches['ref']] = $value; @@ -393,7 +344,7 @@ private function doParse($value, $flags) $data[$key] = $value; } } else { - @trigger_error($this->getDeprecationMessage(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since Symfony 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key)), \E_USER_DEPRECATED); + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine); } } } else { @@ -403,13 +354,68 @@ private function doParse($value, $flags) if ($allowOverwrite || !isset($data[$key])) { $data[$key] = $value; } else { - @trigger_error($this->getDeprecationMessage(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since Symfony 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key)), \E_USER_DEPRECATED); + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine); } } if ($isRef) { $this->refs[$isRef] = $data[$key]; array_pop($this->refsBeingParsed); } + } elseif ('"' === $this->currentLine[0] || "'" === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + try { + return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + } elseif ('{' === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + try { + $parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs); + + while ($this->moveToNextLine()) { + if (!$this->isCurrentLineEmpty()) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + + return $parsedMapping; + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + } elseif ('[' === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + try { + $parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs); + + while ($this->moveToNextLine()) { + if (!$this->isCurrentLineEmpty()) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + + return $parsedSequence; + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } } else { // multiple documents are not supported if ('---' === $this->currentLine) { @@ -417,7 +423,7 @@ private function doParse($value, $flags) } if ($deprecatedUsage = (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1])) { - @trigger_error($this->getDeprecationMessage('Starting an unquoted string with a question mark followed by a space is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.'), \E_USER_DEPRECATED); + throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine); } // 1-liner optionally followed by newline(s) @@ -448,6 +454,11 @@ private function doParse($value, $flags) if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) { throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); } + + if (false !== strpos($line, ': ')) { + @trigger_error('Support for mapping keys in multi-line blocks is deprecated since Symfony 4.3 and will throw a ParseException in 5.0.', \E_USER_DEPRECATED); + } + if ('' === trim($line)) { $value .= "\n"; } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) { @@ -500,7 +511,7 @@ private function doParse($value, $flags) return empty($data) ? null : $data; } - private function parseBlock($offset, $yaml, $flags) + private function parseBlock(int $offset, string $yaml, int $flags) { $skippedLineNumbers = $this->skippedLineNumbers; @@ -529,7 +540,7 @@ private function parseBlock($offset, $yaml, $flags) * * @return int The current line number */ - public function getRealCurrentLineNb() + public function getRealCurrentLineNb(): int { $realCurrentLineNumber = $this->currentLineNb + $this->offset; @@ -549,7 +560,7 @@ public function getRealCurrentLineNb() * * @return int The current line indentation */ - private function getCurrentLineIndentation() + private function getCurrentLineIndentation(): int { return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' ')); } @@ -557,14 +568,14 @@ private function getCurrentLineIndentation() /** * Returns the next embed block of YAML. * - * @param int $indentation The indent level at which the block is to be read, or null for default - * @param bool $inSequence True if the enclosing data structure is a sequence + * @param int|null $indentation The indent level at which the block is to be read, or null for default + * @param bool $inSequence True if the enclosing data structure is a sequence * * @return string A YAML string * * @throws ParseException When indentation problem are detected */ - private function getNextEmbedBlock($indentation = null, $inSequence = false) + private function getNextEmbedBlock(int $indentation = null, bool $inSequence = false): string { $oldLineIndentation = $this->getCurrentLineIndentation(); @@ -605,8 +616,9 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false) } $data = []; + if ($this->getCurrentLineIndentation() >= $newIndent) { - $data[] = substr($this->currentLine, $newIndent); + $data[] = substr($this->currentLine, $newIndent ?? 0); } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) { $data[] = $this->currentLine; } else { @@ -660,12 +672,15 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false) return implode("\n", $data); } + private function hasMoreLines(): bool + { + return (\count($this->lines) - 1) > $this->currentLineNb; + } + /** * Moves the parser to the next line. - * - * @return bool */ - private function moveToNextLine() + private function moveToNextLine(): bool { if ($this->currentLineNb >= \count($this->lines) - 1) { return false; @@ -678,10 +693,8 @@ private function moveToNextLine() /** * Moves the parser to the previous line. - * - * @return bool */ - private function moveToPreviousLine() + private function moveToPreviousLine(): bool { if ($this->currentLineNb < 1) { return false; @@ -703,7 +716,7 @@ private function moveToPreviousLine() * * @throws ParseException When reference does not exist */ - private function parseValue($value, $flags, $context) + private function parseValue(string $value, int $flags, string $context) { if (0 === strpos($value, '*')) { if (false !== $pos = strpos($value, '#')) { @@ -714,7 +727,7 @@ private function parseValue($value, $flags, $context) if (!\array_key_exists($value, $this->refs)) { if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) { - throw new ParseException(sprintf('Circular reference [%s, %s] detected for reference "%s".', implode(', ', \array_slice($this->refsBeingParsed, $pos)), $value, $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); + throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); } throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); @@ -723,73 +736,81 @@ private function parseValue($value, $flags, $context) return $this->refs[$value]; } - if (self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) { - $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : ''; + if (\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) { + $modifiers = $matches['modifiers'] ?? ''; $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), abs((int) $modifiers)); - if ('' !== $matches['tag']) { + if ('' !== $matches['tag'] && '!' !== $matches['tag']) { if ('!!binary' === $matches['tag']) { return Inline::evaluateBinaryScalar($data); - } elseif ('tagged' === $matches['tag']) { - return new TaggedValue(substr($matches['tag'], 1), $data); - } elseif ('!' !== $matches['tag']) { - @trigger_error($this->getDeprecationMessage(sprintf('Using the custom tag "%s" for the value "%s" is deprecated since Symfony 3.3. It will be replaced by an instance of %s in 4.0.', $matches['tag'], $data, TaggedValue::class)), \E_USER_DEPRECATED); } + + return new TaggedValue(substr($matches['tag'], 1), $data); } return $data; } try { - $quotation = '' !== $value && ('"' === $value[0] || "'" === $value[0]) ? $value[0] : null; + if ('' !== $value && '{' === $value[0]) { + $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value)); + + return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs); + } elseif ('' !== $value && '[' === $value[0]) { + $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value)); - // do not take following lines into account when the current line is a quoted single line value - if (null !== $quotation && self::preg_match('/^'.$quotation.'.*'.$quotation.'(\s*#.*)?$/', $value)) { - return Inline::parse($value, $flags, $this->refs); + return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs); } - $lines = []; + switch ($value[0] ?? '') { + case '"': + case "'": + $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value)); + $parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs); - while ($this->moveToNextLine()) { - // unquoted strings end before the first unindented line - if (null === $quotation && 0 === $this->getCurrentLineIndentation()) { - $this->moveToPreviousLine(); + if (isset($this->currentLine[$cursor]) && preg_replace('/\s*(#.*)?$/A', '', substr($this->currentLine, $cursor))) { + throw new ParseException(sprintf('Unexpected characters near "%s".', substr($this->currentLine, $cursor))); + } - break; - } + return $parsedValue; + default: + $lines = []; - $lines[] = trim($this->currentLine); + while ($this->moveToNextLine()) { + // unquoted strings end before the first unindented line + if (0 === $this->getCurrentLineIndentation()) { + $this->moveToPreviousLine(); - // quoted string values end with a line that is terminated with the quotation character - $escapedLine = str_replace(['\\\\', '\\"'], '', $this->currentLine); - if ('' !== $escapedLine && substr($escapedLine, -1) === $quotation) { - break; - } - } + break; + } - for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) { - if ('' === $lines[$i]) { - $value .= "\n"; - $previousLineBlank = true; - } elseif ($previousLineBlank) { - $value .= $lines[$i]; - $previousLineBlank = false; - } else { - $value .= ' '.$lines[$i]; - $previousLineBlank = false; - } - } + $lines[] = trim($this->currentLine); + } + + for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) { + if ('' === $lines[$i]) { + $value .= "\n"; + $previousLineBlank = true; + } elseif ($previousLineBlank) { + $value .= $lines[$i]; + $previousLineBlank = false; + } else { + $value .= ' '.$lines[$i]; + $previousLineBlank = false; + } + } - Inline::$parsedLineNumber = $this->getRealCurrentLineNb(); + Inline::$parsedLineNumber = $this->getRealCurrentLineNb(); - $parsedValue = Inline::parse($value, $flags, $this->refs); + $parsedValue = Inline::parse($value, $flags, $this->refs); - if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) { - throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename); - } + if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) { + throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } - return $parsedValue; + return $parsedValue; + } } catch (ParseException $e) { $e->setParsedLine($this->getRealCurrentLineNb() + 1); $e->setSnippet($this->currentLine); @@ -804,10 +825,8 @@ private function parseValue($value, $flags, $context) * @param string $style The style indicator that was used to begin this block scalar (| or >) * @param string $chomping The chomping indicator that was used to begin this block scalar (+ or -) * @param int $indentation The indentation indicator that was used to begin this block scalar - * - * @return string The text value */ - private function parseBlockScalar($style, $chomping = '', $indentation = 0) + private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string { $notEOF = $this->moveToNextLine(); if (!$notEOF) { @@ -828,8 +847,10 @@ private function parseBlockScalar($style, $chomping = '', $indentation = 0) // determine indentation if not specified if (0 === $indentation) { - if (self::preg_match('/^ +/', $this->currentLine, $matches)) { - $indentation = \strlen($matches[0]); + $currentLineLength = \strlen($this->currentLine); + + for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) { + ++$indentation; } } @@ -914,7 +935,7 @@ private function parseBlockScalar($style, $chomping = '', $indentation = 0) * * @return bool Returns true if the next line is indented, false otherwise */ - private function isNextLineIndented() + private function isNextLineIndented(): bool { $currentIndentation = $this->getCurrentLineIndentation(); $movements = 0; @@ -945,7 +966,7 @@ private function isNextLineIndented() * * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise */ - private function isCurrentLineEmpty() + private function isCurrentLineEmpty(): bool { return $this->isCurrentLineBlank() || $this->isCurrentLineComment(); } @@ -955,7 +976,7 @@ private function isCurrentLineEmpty() * * @return bool Returns true if the current line is blank, false otherwise */ - private function isCurrentLineBlank() + private function isCurrentLineBlank(): bool { return '' == trim($this->currentLine, ' '); } @@ -965,15 +986,15 @@ private function isCurrentLineBlank() * * @return bool Returns true if the current line is a comment line, false otherwise */ - private function isCurrentLineComment() + private function isCurrentLineComment(): bool { - //checking explicitly the first char of the trim is faster than loops or strpos + // checking explicitly the first char of the trim is faster than loops or strpos $ltrimmedLine = ltrim($this->currentLine, ' '); return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0]; } - private function isCurrentLineLastLineInDocument() + private function isCurrentLineLastLineInDocument(): bool { return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1); } @@ -985,7 +1006,7 @@ private function isCurrentLineLastLineInDocument() * * @return string A cleaned up YAML string */ - private function cleanup($value) + private function cleanup(string $value): string { $value = str_replace(["\r\n", "\r"], "\n", $value); @@ -1021,7 +1042,7 @@ private function cleanup($value) * * @return bool Returns true if the next line starts unindented collection, false otherwise */ - private function isNextLineUnIndentedCollection() + private function isNextLineUnIndentedCollection(): bool { $currentIndentation = $this->getCurrentLineIndentation(); $movements = 0; @@ -1052,13 +1073,13 @@ private function isNextLineUnIndentedCollection() * * @return bool Returns true if the string is un-indented collection item, false otherwise */ - private function isStringUnIndentedCollectionItem() + private function isStringUnIndentedCollectionItem(): bool { return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- '); } /** - * A local wrapper for `preg_match` which will throw a ParseException if there + * A local wrapper for "preg_match" which will throw a ParseException if there * is an internal error in the PCRE engine. * * This avoids us needing to check for "false" every time PCRE is used @@ -1070,7 +1091,7 @@ private function isStringUnIndentedCollectionItem() * * @internal */ - public static function preg_match($pattern, $subject, &$matches = null, $flags = 0, $offset = 0) + public static function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int { if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) { switch (preg_last_error()) { @@ -1102,10 +1123,10 @@ public static function preg_match($pattern, $subject, &$matches = null, $flags = /** * Trim the tag on top of the value. * - * Prevent values such as `!foo {quz: bar}` to be considered as + * Prevent values such as "!foo {quz: bar}" to be considered as * a mapping block. */ - private function trimTag($value) + private function trimTag(string $value): string { if ('!' === $value[0]) { return ltrim(substr($value, 1, strcspn($value, " \r\n", 1)), ' '); @@ -1114,10 +1135,7 @@ private function trimTag($value) return $value; } - /** - * @return string|null - */ - private function getLineTag($value, $flags, $nextLineCheck = true) + private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string { if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) { return null; @@ -1138,19 +1156,162 @@ private function getLineTag($value, $flags, $nextLineCheck = true) return $tag; } - throw new ParseException(sprintf('Tags support is not enabled. You must use the flag `Yaml::PARSE_CUSTOM_TAGS` to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename); + throw new ParseException(sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } + + private function lexInlineQuotedString(int &$cursor = 0): string + { + $quotation = $this->currentLine[$cursor]; + $value = $quotation; + ++$cursor; + + $previousLineWasNewline = true; + $previousLineWasTerminatedWithBackslash = false; + $lineNumber = 0; + + do { + if (++$lineNumber > 1) { + $cursor += strspn($this->currentLine, ' ', $cursor); + } + + if ($this->isCurrentLineBlank()) { + $value .= "\n"; + } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) { + $value .= ' '; + } + + for (; \strlen($this->currentLine) > $cursor; ++$cursor) { + switch ($this->currentLine[$cursor]) { + case '\\': + if ("'" === $quotation) { + $value .= '\\'; + } elseif (isset($this->currentLine[++$cursor])) { + $value .= '\\'.$this->currentLine[$cursor]; + } + + break; + case $quotation: + ++$cursor; + + if ("'" === $quotation && isset($this->currentLine[$cursor]) && "'" === $this->currentLine[$cursor]) { + $value .= "''"; + break; + } + + return $value.$quotation; + default: + $value .= $this->currentLine[$cursor]; + } + } + + if ($this->isCurrentLineBlank()) { + $previousLineWasNewline = true; + $previousLineWasTerminatedWithBackslash = false; + } elseif ('\\' === $this->currentLine[-1]) { + $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = true; + } else { + $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = false; + } + + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + + throw new ParseException('Malformed inline YAML string.'); } - private function getDeprecationMessage($message) + private function lexUnquotedString(int &$cursor): string { - $message = rtrim($message, '.'); + $offset = $cursor; + $cursor += strcspn($this->currentLine, '[]{},: ', $cursor); - if (null !== $this->filename) { - $message .= ' in '.$this->filename; + if ($cursor === $offset) { + throw new ParseException('Malformed unquoted YAML string.'); } - $message .= ' on line '.($this->getRealCurrentLineNb() + 1); + return substr($this->currentLine, $offset, $cursor - $offset); + } + + private function lexInlineMapping(int &$cursor = 0): string + { + return $this->lexInlineStructure($cursor, '}'); + } + + private function lexInlineSequence(int &$cursor = 0): string + { + return $this->lexInlineStructure($cursor, ']'); + } + + private function lexInlineStructure(int &$cursor, string $closingTag): string + { + $value = $this->currentLine[$cursor]; + ++$cursor; + + do { + $this->consumeWhitespaces($cursor); + + while (isset($this->currentLine[$cursor])) { + switch ($this->currentLine[$cursor]) { + case '"': + case "'": + $value .= $this->lexInlineQuotedString($cursor); + break; + case ':': + case ',': + $value .= $this->currentLine[$cursor]; + ++$cursor; + break; + case '{': + $value .= $this->lexInlineMapping($cursor); + break; + case '[': + $value .= $this->lexInlineSequence($cursor); + break; + case $closingTag: + $value .= $this->currentLine[$cursor]; + ++$cursor; + + return $value; + case '#': + break 2; + default: + $value .= $this->lexUnquotedString($cursor); + } + + if ($this->consumeWhitespaces($cursor)) { + $value .= ' '; + } + } + + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + + throw new ParseException('Malformed inline YAML string.'); + } + + private function consumeWhitespaces(int &$cursor): bool + { + $whitespacesConsumed = 0; + + do { + $whitespaceOnlyTokenLength = strspn($this->currentLine, ' ', $cursor); + $whitespacesConsumed += $whitespaceOnlyTokenLength; + $cursor += $whitespaceOnlyTokenLength; + + if (isset($this->currentLine[$cursor])) { + return 0 < $whitespacesConsumed; + } + + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); - return $message.'.'; + return 0 < $whitespacesConsumed; } } diff --git a/vendor/symfony/yaml/README.md b/vendor/symfony/yaml/README.md index b914e783..ac25024b 100644 --- a/vendor/symfony/yaml/README.md +++ b/vendor/symfony/yaml/README.md @@ -6,8 +6,8 @@ The Yaml component loads and dumps YAML files. Resources --------- - * [Documentation](https://symfony.com/doc/current/components/yaml.html) - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) + * [Documentation](https://symfony.com/doc/current/components/yaml.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/symfony/yaml/Tag/TaggedValue.php index 000c1d99..4ea34061 100644 --- a/vendor/symfony/yaml/Tag/TaggedValue.php +++ b/vendor/symfony/yaml/Tag/TaggedValue.php @@ -20,27 +20,17 @@ final class TaggedValue private $tag; private $value; - /** - * @param string $tag - * @param mixed $value - */ - public function __construct($tag, $value) + public function __construct(string $tag, $value) { $this->tag = $tag; $this->value = $value; } - /** - * @return string - */ - public function getTag() + public function getTag(): string { return $this->tag; } - /** - * @return mixed - */ public function getValue() { return $this->value; diff --git a/vendor/symfony/yaml/Tests/Command/LintCommandTest.php b/vendor/symfony/yaml/Tests/Command/LintCommandTest.php deleted file mode 100644 index 98c63b62..00000000 --- a/vendor/symfony/yaml/Tests/Command/LintCommandTest.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests\Command; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Tester\CommandTester; -use Symfony\Component\Yaml\Command\LintCommand; - -/** - * Tests the YamlLintCommand. - * - * @author Robin Chalas - */ -class LintCommandTest extends TestCase -{ - private $files; - - public function testLintCorrectFile() - { - $tester = $this->createCommandTester(); - $filename = $this->createFile('foo: bar'); - - $ret = $tester->execute(['filename' => $filename], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]); - - $this->assertEquals(0, $ret, 'Returns 0 in case of success'); - $this->assertMatchesRegularExpression('/^\/\/ OK in /', trim($tester->getDisplay())); - } - - public function testLintIncorrectFile() - { - $incorrectContent = ' -foo: -bar'; - $tester = $this->createCommandTester(); - $filename = $this->createFile($incorrectContent); - - $ret = $tester->execute(['filename' => $filename], ['decorated' => false]); - - $this->assertEquals(1, $ret, 'Returns 1 in case of error'); - $this->assertStringContainsString('Unable to parse at line 3 (near "bar").', trim($tester->getDisplay())); - } - - public function testConstantAsKey() - { - $yaml = <<createCommandTester()->execute(['filename' => $this->createFile($yaml)], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]); - $this->assertSame(0, $ret, 'lint:yaml exits with code 0 in case of success'); - } - - public function testCustomTags() - { - $yaml = <<createCommandTester()->execute(['filename' => $this->createFile($yaml), '--parse-tags' => true], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]); - $this->assertSame(0, $ret, 'lint:yaml exits with code 0 in case of success'); - } - - public function testCustomTagsError() - { - $yaml = <<createCommandTester()->execute(['filename' => $this->createFile($yaml)], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]); - $this->assertSame(1, $ret, 'lint:yaml exits with code 1 in case of error'); - } - - public function testLintFileNotReadable() - { - $this->expectException('RuntimeException'); - $tester = $this->createCommandTester(); - $filename = $this->createFile(''); - unlink($filename); - - $tester->execute(['filename' => $filename], ['decorated' => false]); - } - - /** - * @return string Path to the new file - */ - private function createFile($content) - { - $filename = tempnam(sys_get_temp_dir().'/framework-yml-lint-test', 'sf-'); - file_put_contents($filename, $content); - - $this->files[] = $filename; - - return $filename; - } - - /** - * @return CommandTester - */ - protected function createCommandTester() - { - $application = new Application(); - $application->add(new LintCommand()); - $command = $application->find('lint:yaml'); - - return new CommandTester($command); - } - - protected function setUp() - { - $this->files = []; - @mkdir(sys_get_temp_dir().'/framework-yml-lint-test'); - } - - protected function tearDown() - { - foreach ($this->files as $file) { - if (file_exists($file)) { - @unlink($file); - } - } - - @rmdir(sys_get_temp_dir().'/framework-yml-lint-test'); - } -} - -class Foo -{ - const TEST = 'foo'; -} diff --git a/vendor/symfony/yaml/Tests/DumperTest.php b/vendor/symfony/yaml/Tests/DumperTest.php deleted file mode 100644 index e4dc49f3..00000000 --- a/vendor/symfony/yaml/Tests/DumperTest.php +++ /dev/null @@ -1,655 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Yaml\Dumper; -use Symfony\Component\Yaml\Parser; -use Symfony\Component\Yaml\Tag\TaggedValue; -use Symfony\Component\Yaml\Yaml; - -class DumperTest extends TestCase -{ - protected $parser; - protected $dumper; - protected $path; - - protected $array = [ - '' => 'bar', - 'foo' => '#bar', - 'foo\'bar' => [], - 'bar' => [1, 'foo'], - 'foobar' => [ - 'foo' => 'bar', - 'bar' => [1, 'foo'], - 'foobar' => [ - 'foo' => 'bar', - 'bar' => [1, 'foo'], - ], - ], - ]; - - protected function setUp() - { - $this->parser = new Parser(); - $this->dumper = new Dumper(); - $this->path = __DIR__.'/Fixtures'; - } - - protected function tearDown() - { - $this->parser = null; - $this->dumper = null; - $this->path = null; - $this->array = null; - } - - public function testIndentationInConstructor() - { - $dumper = new Dumper(7); - $expected = <<<'EOF' -'': bar -foo: '#bar' -'foo''bar': { } -bar: - - 1 - - foo -foobar: - foo: bar - bar: - - 1 - - foo - foobar: - foo: bar - bar: - - 1 - - foo - -EOF; - $this->assertEquals($expected, $dumper->dump($this->array, 4, 0)); - } - - /** - * @group legacy - */ - public function testSetIndentation() - { - $this->dumper->setIndentation(7); - - $expected = <<<'EOF' -'': bar -foo: '#bar' -'foo''bar': { } -bar: - - 1 - - foo -foobar: - foo: bar - bar: - - 1 - - foo - foobar: - foo: bar - bar: - - 1 - - foo - -EOF; - $this->assertEquals($expected, $this->dumper->dump($this->array, 4, 0)); - } - - public function testSpecifications() - { - $files = $this->parser->parse(file_get_contents($this->path.'/index.yml')); - foreach ($files as $file) { - $yamls = file_get_contents($this->path.'/'.$file.'.yml'); - - // split YAMLs documents - foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) { - if (!$yaml) { - continue; - } - - $test = $this->parser->parse($yaml); - if (isset($test['dump_skip']) && $test['dump_skip']) { - continue; - } elseif (isset($test['todo']) && $test['todo']) { - // TODO - } else { - eval('$expected = '.trim($test['php']).';'); - $this->assertSame($expected, $this->parser->parse($this->dumper->dump($expected, 10)), $test['test']); - } - } - } - } - - public function testInlineLevel() - { - $expected = <<<'EOF' -{ '': bar, foo: '#bar', 'foo''bar': { }, bar: [1, foo], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } } -EOF; - $this->assertEquals($expected, $this->dumper->dump($this->array, -10), '->dump() takes an inline level argument'); - $this->assertEquals($expected, $this->dumper->dump($this->array, 0), '->dump() takes an inline level argument'); - - $expected = <<<'EOF' -'': bar -foo: '#bar' -'foo''bar': { } -bar: [1, foo] -foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } - -EOF; - $this->assertEquals($expected, $this->dumper->dump($this->array, 1), '->dump() takes an inline level argument'); - - $expected = <<<'EOF' -'': bar -foo: '#bar' -'foo''bar': { } -bar: - - 1 - - foo -foobar: - foo: bar - bar: [1, foo] - foobar: { foo: bar, bar: [1, foo] } - -EOF; - $this->assertEquals($expected, $this->dumper->dump($this->array, 2), '->dump() takes an inline level argument'); - - $expected = <<<'EOF' -'': bar -foo: '#bar' -'foo''bar': { } -bar: - - 1 - - foo -foobar: - foo: bar - bar: - - 1 - - foo - foobar: - foo: bar - bar: [1, foo] - -EOF; - $this->assertEquals($expected, $this->dumper->dump($this->array, 3), '->dump() takes an inline level argument'); - - $expected = <<<'EOF' -'': bar -foo: '#bar' -'foo''bar': { } -bar: - - 1 - - foo -foobar: - foo: bar - bar: - - 1 - - foo - foobar: - foo: bar - bar: - - 1 - - foo - -EOF; - $this->assertEquals($expected, $this->dumper->dump($this->array, 4), '->dump() takes an inline level argument'); - $this->assertEquals($expected, $this->dumper->dump($this->array, 10), '->dump() takes an inline level argument'); - } - - public function testObjectSupportEnabled() - { - $dump = $this->dumper->dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_OBJECT); - - $this->assertEquals('{ foo: !php/object \'O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}\', bar: 1 }', $dump, '->dump() is able to dump objects'); - } - - /** - * @group legacy - */ - public function testObjectSupportEnabledPassingTrue() - { - $dump = $this->dumper->dump(['foo' => new A(), 'bar' => 1], 0, 0, false, true); - - $this->assertEquals('{ foo: !php/object \'O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}\', bar: 1 }', $dump, '->dump() is able to dump objects'); - } - - public function testObjectSupportDisabledButNoExceptions() - { - $dump = $this->dumper->dump(['foo' => new A(), 'bar' => 1]); - - $this->assertEquals('{ foo: null, bar: 1 }', $dump, '->dump() does not dump objects when disabled'); - } - - public function testObjectSupportDisabledWithExceptions() - { - $this->expectException('Symfony\Component\Yaml\Exception\DumpException'); - $this->dumper->dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE); - } - - /** - * @group legacy - */ - public function testObjectSupportDisabledWithExceptionsPassingTrue() - { - $this->expectException('Symfony\Component\Yaml\Exception\DumpException'); - $this->dumper->dump(['foo' => new A(), 'bar' => 1], 0, 0, true); - } - - public function testEmptyArray() - { - $dump = $this->dumper->dump([]); - $this->assertEquals('{ }', $dump); - - $dump = $this->dumper->dump([], 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE); - $this->assertEquals('[]', $dump); - - $dump = $this->dumper->dump([], 9, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE); - $this->assertEquals('[]', $dump); - - $dump = $this->dumper->dump(new \ArrayObject(), 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE | Yaml::DUMP_OBJECT_AS_MAP); - $this->assertEquals('{ }', $dump); - - $dump = $this->dumper->dump(new \stdClass(), 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE | Yaml::DUMP_OBJECT_AS_MAP); - $this->assertEquals('{ }', $dump); - } - - /** - * @dataProvider getEscapeSequences - */ - public function testEscapedEscapeSequencesInQuotedScalar($input, $expected) - { - $this->assertEquals($expected, $this->dumper->dump($input)); - } - - public function getEscapeSequences() - { - return [ - 'empty string' => ['', "''"], - 'null' => ["\x0", '"\\0"'], - 'bell' => ["\x7", '"\\a"'], - 'backspace' => ["\x8", '"\\b"'], - 'horizontal-tab' => ["\t", '"\\t"'], - 'line-feed' => ["\n", '"\\n"'], - 'vertical-tab' => ["\v", '"\\v"'], - 'form-feed' => ["\xC", '"\\f"'], - 'carriage-return' => ["\r", '"\\r"'], - 'escape' => ["\x1B", '"\\e"'], - 'space' => [' ', "' '"], - 'double-quote' => ['"', "'\"'"], - 'slash' => ['/', '/'], - 'backslash' => ['\\', '\\'], - 'del' => ["\x7f", '"\x7f"'], - 'next-line' => ["\xC2\x85", '"\\N"'], - 'non-breaking-space' => ["\xc2\xa0", '"\\_"'], - 'line-separator' => ["\xE2\x80\xA8", '"\\L"'], - 'paragraph-separator' => ["\xE2\x80\xA9", '"\\P"'], - 'colon' => [':', "':'"], - ]; - } - - public function testBinaryDataIsDumpedBase64Encoded() - { - $binaryData = file_get_contents(__DIR__.'/Fixtures/arrow.gif'); - $expected = '{ data: !!binary '.base64_encode($binaryData).' }'; - - $this->assertSame($expected, $this->dumper->dump(['data' => $binaryData])); - } - - public function testNonUtf8DataIsDumpedBase64Encoded() - { - // "für" (ISO-8859-1 encoded) - $this->assertSame('!!binary ZsM/cg==', $this->dumper->dump("f\xc3\x3fr")); - } - - /** - * @dataProvider objectAsMapProvider - */ - public function testDumpObjectAsMap($object, $expected) - { - $yaml = $this->dumper->dump($object, 0, 0, Yaml::DUMP_OBJECT_AS_MAP); - - $this->assertEquals($expected, Yaml::parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP)); - } - - public function objectAsMapProvider() - { - $tests = []; - - $bar = new \stdClass(); - $bar->class = 'classBar'; - $bar->args = ['bar']; - $zar = new \stdClass(); - $foo = new \stdClass(); - $foo->bar = $bar; - $foo->zar = $zar; - $object = new \stdClass(); - $object->foo = $foo; - $tests['stdClass'] = [$object, $object]; - - $arrayObject = new \ArrayObject(); - $arrayObject['foo'] = 'bar'; - $arrayObject['baz'] = 'foobar'; - $parsedArrayObject = new \stdClass(); - $parsedArrayObject->foo = 'bar'; - $parsedArrayObject->baz = 'foobar'; - $tests['ArrayObject'] = [$arrayObject, $parsedArrayObject]; - - $a = new A(); - $tests['arbitrary-object'] = [$a, null]; - - return $tests; - } - - public function testDumpingArrayObjectInstancesRespectsInlineLevel() - { - $deep = new \ArrayObject(['deep1' => 'd', 'deep2' => 'e']); - $inner = new \ArrayObject(['inner1' => 'b', 'inner2' => 'c', 'inner3' => $deep]); - $outer = new \ArrayObject(['outer1' => 'a', 'outer2' => $inner]); - - $yaml = $this->dumper->dump($outer, 2, 0, Yaml::DUMP_OBJECT_AS_MAP); - - $expected = <<assertSame($expected, $yaml); - } - - public function testDumpingArrayObjectInstancesWithNumericKeysInlined() - { - $deep = new \ArrayObject(['d', 'e']); - $inner = new \ArrayObject(['b', 'c', $deep]); - $outer = new \ArrayObject(['a', $inner]); - - $yaml = $this->dumper->dump($outer, 0, 0, Yaml::DUMP_OBJECT_AS_MAP); - $expected = <<assertSame($expected, $yaml); - } - - public function testDumpingArrayObjectInstancesWithNumericKeysRespectsInlineLevel() - { - $deep = new \ArrayObject(['d', 'e']); - $inner = new \ArrayObject(['b', 'c', $deep]); - $outer = new \ArrayObject(['a', $inner]); - $yaml = $this->dumper->dump($outer, 2, 0, Yaml::DUMP_OBJECT_AS_MAP); - $expected = <<assertEquals($expected, $yaml); - } - - public function testDumpEmptyArrayObjectInstanceAsMap() - { - $this->assertSame('{ }', $this->dumper->dump(new \ArrayObject(), 2, 0, Yaml::DUMP_OBJECT_AS_MAP)); - } - - public function testDumpEmptyStdClassInstanceAsMap() - { - $this->assertSame('{ }', $this->dumper->dump(new \stdClass(), 2, 0, Yaml::DUMP_OBJECT_AS_MAP)); - } - - public function testDumpingStdClassInstancesRespectsInlineLevel() - { - $deep = new \stdClass(); - $deep->deep1 = 'd'; - $deep->deep2 = 'e'; - - $inner = new \stdClass(); - $inner->inner1 = 'b'; - $inner->inner2 = 'c'; - $inner->inner3 = $deep; - - $outer = new \stdClass(); - $outer->outer1 = 'a'; - $outer->outer2 = $inner; - - $yaml = $this->dumper->dump($outer, 2, 0, Yaml::DUMP_OBJECT_AS_MAP); - - $expected = <<assertSame($expected, $yaml); - } - - public function testDumpingTaggedValueSequenceRespectsInlineLevel() - { - $data = [ - new TaggedValue('user', [ - 'username' => 'jane', - ]), - new TaggedValue('user', [ - 'username' => 'john', - ]), - ]; - - $yaml = $this->dumper->dump($data, 2); - - $expected = <<assertSame($expected, $yaml); - } - - public function testDumpingTaggedValueSequenceWithInlinedTagValues() - { - $data = [ - new TaggedValue('user', [ - 'username' => 'jane', - ]), - new TaggedValue('user', [ - 'username' => 'john', - ]), - ]; - - $yaml = $this->dumper->dump($data, 1); - - $expected = <<assertSame($expected, $yaml); - } - - public function testDumpingTaggedValueMapRespectsInlineLevel() - { - $data = [ - 'user1' => new TaggedValue('user', [ - 'username' => 'jane', - ]), - 'user2' => new TaggedValue('user', [ - 'username' => 'john', - ]), - ]; - - $yaml = $this->dumper->dump($data, 2); - - $expected = <<assertSame($expected, $yaml); - } - - public function testDumpingTaggedValueMapWithInlinedTagValues() - { - $data = [ - 'user1' => new TaggedValue('user', [ - 'username' => 'jane', - ]), - 'user2' => new TaggedValue('user', [ - 'username' => 'john', - ]), - ]; - - $yaml = $this->dumper->dump($data, 1); - - $expected = <<assertSame($expected, $yaml); - } - - public function testDumpingNotInlinedScalarTaggedValue() - { - $data = [ - 'user1' => new TaggedValue('user', 'jane'), - 'user2' => new TaggedValue('user', 'john'), - ]; - $expected = <<assertSame($expected, $this->dumper->dump($data, 2)); - } - - public function testDumpingNotInlinedNullTaggedValue() - { - $data = [ - 'foo' => new TaggedValue('bar', null), - ]; - $expected = <<assertSame($expected, $this->dumper->dump($data, 2)); - } - - public function testDumpingMultiLineStringAsScalarBlockTaggedValue() - { - $data = [ - 'foo' => new TaggedValue('bar', "foo\nline with trailing spaces:\n \nbar\ninteger like line:\n123456789\nempty line:\n\nbaz"), - ]; - $expected = <<assertSame($expected, $this->dumper->dump($data, 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK)); - } - - public function testDumpingInlinedMultiLineIfRnBreakLineInTaggedValue() - { - $data = [ - 'data' => [ - 'foo' => new TaggedValue('bar', "foo\r\nline with trailing spaces:\n \nbar\ninteger like line:\n123456789\nempty line:\n\nbaz"), - ], - ]; - - $this->assertSame(file_get_contents(__DIR__.'/Fixtures/multiple_lines_as_literal_block_for_tagged_values.yml'), $this->dumper->dump($data, 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK)); - } - - public function testDumpMultiLineStringAsScalarBlock() - { - $data = [ - 'data' => [ - 'single_line' => 'foo bar baz', - 'multi_line' => "foo\nline with trailing spaces:\n \nbar\ninteger like line:\n123456789\nempty line:\n\nbaz", - 'multi_line_with_carriage_return' => "foo\nbar\r\nbaz", - 'nested_inlined_multi_line_string' => [ - 'inlined_multi_line' => "foo\nbar\r\nempty line:\n\nbaz", - ], - ], - ]; - - $this->assertSame(file_get_contents(__DIR__.'/Fixtures/multiple_lines_as_literal_block.yml'), $this->dumper->dump($data, 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK)); - } - - public function testDumpMultiLineStringAsScalarBlockWhenFirstLineHasLeadingSpace() - { - $data = [ - 'data' => [ - 'multi_line' => " the first line has leading spaces\nThe second line does not.", - ], - ]; - - $this->assertSame(file_get_contents(__DIR__.'/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml'), $this->dumper->dump($data, 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK)); - } - - public function testCarriageReturnFollowedByNewlineIsMaintainedWhenDumpingAsMultiLineLiteralBlock() - { - $this->assertSame("- \"a\\r\\nb\\nc\"\n", $this->dumper->dump(["a\r\nb\nc"], 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK)); - } - - public function testCarriageReturnNotFollowedByNewlineIsPreservedWhenDumpingAsMultiLineLiteralBlock() - { - $expected = <<<'YAML' -parent: - foo: "bar\n\rbaz: qux" - -YAML; - - $this->assertSame($expected, $this->dumper->dump([ - 'parent' => [ - 'foo' => "bar\n\rbaz: qux", - ], - ], 4, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK)); - } - - public function testZeroIndentationThrowsException() - { - $this->expectException('InvalidArgumentException'); - $this->expectExceptionMessage('The indentation must be greater than zero'); - new Dumper(0); - } - - public function testNegativeIndentationThrowsException() - { - $this->expectException('InvalidArgumentException'); - $this->expectExceptionMessage('The indentation must be greater than zero'); - new Dumper(-4); - } -} - -class A -{ - public $a = 'foo'; -} diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml deleted file mode 100644 index 81b4129a..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- %YAML:1.0 -test: Simple Alias Example -brief: > - If you need to refer to the same item of data twice, - you can give that item an alias. The alias is a plain - string, starting with an ampersand. The item may then - be referred to by the alias throughout your document - by using an asterisk before the name of the alias. - This is called an anchor. -yaml: | - - &showell Steve - - Clark - - Brian - - Oren - - *showell -php: | - ['Steve', 'Clark', 'Brian', 'Oren', 'Steve'] - ---- -test: Alias of a Mapping -brief: > - An alias can be used on any item of data, including - sequences, mappings, and other complex data types. -yaml: | - - &hello - Meat: pork - Starch: potato - - banana - - *hello -php: | - [['Meat'=>'pork', 'Starch'=>'potato'], 'banana', ['Meat'=>'pork', 'Starch'=>'potato']] diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml deleted file mode 100644 index 1a08d8ea..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml +++ /dev/null @@ -1,202 +0,0 @@ ---- %YAML:1.0 -test: Simple Sequence -brief: | - You can specify a list in YAML by placing each - member of the list on a new line with an opening - dash. These lists are called sequences. -yaml: | - - apple - - banana - - carrot -php: | - ['apple', 'banana', 'carrot'] ---- -test: Sequence With Item Being Null In The Middle -brief: | - You can specify a list in YAML by placing each - member of the list on a new line with an opening - dash. These lists are called sequences. -yaml: | - - apple - - - - carrot -php: | - ['apple', null, 'carrot'] ---- -test: Sequence With Last Item Being Null -brief: | - You can specify a list in YAML by placing each - member of the list on a new line with an opening - dash. These lists are called sequences. -yaml: | - - apple - - banana - - -php: | - ['apple', 'banana', null] ---- -test: Nested Sequences -brief: | - You can include a sequence within another - sequence by giving the sequence an empty - dash, followed by an indented list. -yaml: | - - - - foo - - bar - - baz -php: | - [['foo', 'bar', 'baz']] ---- -test: Mixed Sequences -brief: | - Sequences can contain any YAML data, - including strings and other sequences. -yaml: | - - apple - - - - foo - - bar - - x123 - - banana - - carrot -php: | - ['apple', ['foo', 'bar', 'x123'], 'banana', 'carrot'] ---- -test: Deeply Nested Sequences -brief: | - Sequences can be nested even deeper, with each - level of indentation representing a level of - depth. -yaml: | - - - - - - uno - - dos -php: | - [[['uno', 'dos']]] ---- -test: Simple Mapping -brief: | - You can add a keyed list (also known as a dictionary or - hash) to your document by placing each member of the - list on a new line, with a colon separating the key - from its value. In YAML, this type of list is called - a mapping. -yaml: | - foo: whatever - bar: stuff -php: | - ['foo' => 'whatever', 'bar' => 'stuff'] ---- -test: Sequence in a Mapping -brief: | - A value in a mapping can be a sequence. -yaml: | - foo: whatever - bar: - - uno - - dos -php: | - ['foo' => 'whatever', 'bar' => ['uno', 'dos']] ---- -test: Nested Mappings -brief: | - A value in a mapping can be another mapping. -yaml: | - foo: whatever - bar: - fruit: apple - name: steve - sport: baseball -php: | - [ - 'foo' => 'whatever', - 'bar' => [ - 'fruit' => 'apple', - 'name' => 'steve', - 'sport' => 'baseball' - ] - ] ---- -test: Mixed Mapping -brief: | - A mapping can contain any assortment - of mappings and sequences as values. -yaml: | - foo: whatever - bar: - - - fruit: apple - name: steve - sport: baseball - - more - - - python: rocks - perl: papers - ruby: scissorses -php: | - [ - 'foo' => 'whatever', - 'bar' => [ - [ - 'fruit' => 'apple', - 'name' => 'steve', - 'sport' => 'baseball' - ], - 'more', - [ - 'python' => 'rocks', - 'perl' => 'papers', - 'ruby' => 'scissorses' - ] - ] - ] ---- -test: Mapping-in-Sequence Shortcut -todo: true -brief: | - If you are adding a mapping to a sequence, you - can place the mapping on the same line as the - dash as a shortcut. -yaml: | - - work on YAML.py: - - work on Store -php: | - [['work on YAML.py' => ['work on Store']]] ---- -test: Sequence-in-Mapping Shortcut -todo: true -brief: | - The dash in a sequence counts as indentation, so - you can add a sequence inside of a mapping without - needing spaces as indentation. -yaml: | - allow: - - 'localhost' - - '%.sourceforge.net' - - '%.freepan.org' -php: | - ['allow' => ['localhost', '%.sourceforge.net', '%.freepan.org']] ---- -todo: true -test: Merge key -brief: | - A merge key ('<<') can be used in a mapping to insert other mappings. If - the value associated with the merge key is a mapping, each of its key/value - pairs is inserted into the current mapping. -yaml: | - mapping: - name: Joe - job: Accountant - <<: - age: 38 -php: | - [ - 'mapping' => - [ - 'name' => 'Joe', - 'job' => 'Accountant', - 'age' => 38 - ] - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml deleted file mode 100644 index 1f3a2e54..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -test: One Element Mapping -brief: | - A mapping with one key/value pair -yaml: | - foo: bar -php: | - ['foo' => 'bar'] ---- -test: Multi Element Mapping -brief: | - More than one key/value pair -yaml: | - red: baron - white: walls - blue: berries -php: | - [ - 'red' => 'baron', - 'white' => 'walls', - 'blue' => 'berries', - ] ---- -test: Values aligned -brief: | - Often times human editors of documents will align the values even - though YAML emitters generally don't. -yaml: | - red: baron - white: walls - blue: berries -php: | - [ - 'red' => 'baron', - 'white' => 'walls', - 'blue' => 'berries', - ] ---- -test: Colons aligned -brief: | - Spaces can come before the ': ' key/value separator. -yaml: | - red : baron - white : walls - blue : berries -php: | - [ - 'red' => 'baron', - 'white' => 'walls', - 'blue' => 'berries', - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml deleted file mode 100644 index 67cb47ad..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml +++ /dev/null @@ -1,85 +0,0 @@ ---- %YAML:1.0 -test: Trailing Document Separator -todo: true -brief: > - You can separate YAML documents - with a string of three dashes. -yaml: | - - foo: 1 - bar: 2 - --- - more: stuff -python: | - [ - [ { 'foo': 1, 'bar': 2 } ], - { 'more': 'stuff' } - ] -ruby: | - [ { 'foo' => 1, 'bar' => 2 } ] - ---- -test: Leading Document Separator -todo: true -brief: > - You can explicitly give an opening - document separator to your YAML stream. -yaml: | - --- - - foo: 1 - bar: 2 - --- - more: stuff -python: | - [ - [ {'foo': 1, 'bar': 2}], - {'more': 'stuff'} - ] -ruby: | - [ { 'foo' => 1, 'bar' => 2 } ] - ---- -test: YAML Header -todo: true -brief: > - The opening separator can contain directives - to the YAML parser, such as the version - number. -yaml: | - --- %YAML:1.0 - foo: 1 - bar: 2 -php: | - ['foo' => 1, 'bar' => 2] -documents: 1 - ---- -test: Red Herring Document Separator -brief: > - Separators included in blocks or strings - are treated as blocks or strings, as the - document separator should have no indentation - preceding it. -yaml: | - foo: | - --- -php: | - ['foo' => "---\n"] - ---- -test: Multiple Document Separators in Block -brief: > - This technique allows you to embed other YAML - documents within literal blocks. -yaml: | - foo: | - --- - foo: bar - --- - yo: baz - bar: | - fooness -php: | - [ - 'foo' => "---\nfoo: bar\n---\nyo: baz\n", - 'bar' => "fooness\n" - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml deleted file mode 100644 index e8697f93..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -test: Missing value for hash item -todo: true -brief: | - Third item in this hash doesn't have a value -yaml: | - okay: value - also okay: ~ - causes error because no value specified - last key: value okay here too -python-error: causes error because no value specified - ---- -test: Not indenting enough -brief: | - There was a bug in PyYaml where it was off by one - in the indentation check. It was allowing the YAML - below. -# This is actually valid YAML now. Someone should tell showell. -yaml: | - foo: - firstline: 1 - secondline: 2 -php: | - ['foo' => null, 'firstline' => 1, 'secondline' => 2] diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml deleted file mode 100644 index cc562cd9..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml +++ /dev/null @@ -1,60 +0,0 @@ ---- -test: Simple Inline Array -brief: > - Sequences can be contained on a - single line, using the inline syntax. - Separate each entry with commas and - enclose in square brackets. -yaml: | - seq: [ a, b, c ] -php: | - ['seq' => ['a', 'b', 'c']] ---- -test: Simple Inline Hash -brief: > - Mapping can also be contained on - a single line, using the inline - syntax. Each key-value pair is - separated by a colon, with a comma - between each entry in the mapping. - Enclose with curly braces. -yaml: | - hash: { name: Steve, foo: bar } -php: | - ['hash' => ['name' => 'Steve', 'foo' => 'bar']] ---- -test: Multi-line Inline Collections -todo: true -brief: > - Both inline sequences and inline mappings - can span multiple lines, provided that you - indent the additional lines. -yaml: | - languages: [ Ruby, - Perl, - Python ] - websites: { YAML: yaml.org, - Ruby: ruby-lang.org, - Python: python.org, - Perl: use.perl.org } -php: | - [ - 'languages' => ['Ruby', 'Perl', 'Python'], - 'websites' => [ - 'YAML' => 'yaml.org', - 'Ruby' => 'ruby-lang.org', - 'Python' => 'python.org', - 'Perl' => 'use.perl.org' - ] - ] ---- -test: Commas in Values (not in the spec!) -todo: true -brief: > - List items in collections are delimited by commas, but - there must be a space after each comma. This allows you - to add numbers without quoting. -yaml: | - attendances: [ 45,123, 70,000, 17,222 ] -php: | - ['attendances' => [45123, 70000, 17222]] diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml deleted file mode 100644 index 2895202a..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml +++ /dev/null @@ -1,176 +0,0 @@ ---- %YAML:1.0 -test: Single ending newline -brief: > - A pipe character, followed by an indented - block of text is treated as a literal - block, in which newlines are preserved - throughout the block, including the final - newline. -yaml: | - --- - this: | - Foo - Bar -php: | - ['this' => "Foo\nBar\n"] ---- -test: The '+' indicator -brief: > - The '+' indicator says to keep newlines at the end of text - blocks. -yaml: | - normal: | - extra new lines not kept - - preserving: |+ - extra new lines are kept - - - dummy: value -php: | - [ - 'normal' => "extra new lines not kept\n", - 'preserving' => "extra new lines are kept\n\n\n", - 'dummy' => 'value' - ] ---- -test: Three trailing newlines in literals -brief: > - To give you more control over how space - is preserved in text blocks, YAML has - the keep '+' and chomp '-' indicators. - The keep indicator will preserve all - ending newlines, while the chomp indicator - will strip all ending newlines. -yaml: | - clipped: | - This has one newline. - - - - same as "clipped" above: "This has one newline.\n" - - stripped: |- - This has no newline. - - - - same as "stripped" above: "This has no newline." - - kept: |+ - This has four newlines. - - - - same as "kept" above: "This has four newlines.\n\n\n\n" -php: | - [ - 'clipped' => "This has one newline.\n", - 'same as "clipped" above' => "This has one newline.\n", - 'stripped' => 'This has no newline.', - 'same as "stripped" above' => 'This has no newline.', - 'kept' => "This has four newlines.\n\n\n\n", - 'same as "kept" above' => "This has four newlines.\n\n\n\n" - ] ---- -test: Extra trailing newlines with spaces -todo: true -brief: > - Normally, only a single newline is kept - from the end of a literal block, unless the - keep '+' character is used in combination - with the pipe. The following example - will preserve all ending whitespace - since the last line of both literal blocks - contains spaces which extend past the indentation - level. -yaml: | - --- - this: | - Foo - - - kept: |+ - Foo - - -php: | - ['this' => "Foo\n\n \n", - 'kept' => "Foo\n\n \n"] - ---- -test: Folded Block in a Sequence -brief: > - A greater-then character, followed by an indented - block of text is treated as a folded block, in - which lines of text separated by a single newline - are concatenated as a single line. -yaml: | - --- - - apple - - banana - - > - can't you see - the beauty of yaml? - hmm - - dog -php: | - [ - 'apple', - 'banana', - "can't you see the beauty of yaml? hmm\n", - 'dog' - ] ---- -test: Folded Block as a Mapping Value -brief: > - Both literal and folded blocks can be - used in collections, as values in a - sequence or a mapping. -yaml: | - --- - quote: > - Mark McGwire's - year was crippled - by a knee injury. - source: espn -php: | - [ - 'quote' => "Mark McGwire's year was crippled by a knee injury.\n", - 'source' => 'espn' - ] ---- -test: Three trailing newlines in folded blocks -brief: > - The keep and chomp indicators can also - be applied to folded blocks. -yaml: | - clipped: > - This has one newline. - - - - same as "clipped" above: "This has one newline.\n" - - stripped: >- - This has no newline. - - - - same as "stripped" above: "This has no newline." - - kept: >+ - This has four newlines. - - - - same as "kept" above: "This has four newlines.\n\n\n\n" -php: | - [ - 'clipped' => "This has one newline.\n", - 'same as "clipped" above' => "This has one newline.\n", - 'stripped' => 'This has no newline.', - 'same as "stripped" above' => 'This has no newline.', - 'kept' => "This has four newlines.\n\n\n\n", - 'same as "kept" above' => "This has four newlines.\n\n\n\n" - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml deleted file mode 100644 index ea8e36ed..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- %YAML:1.0 -test: Empty Sequence -brief: > - You can represent the empty sequence - with an empty inline sequence. -yaml: | - empty: [] -php: | - ['empty' => []] ---- -test: Empty Mapping -brief: > - You can represent the empty mapping - with an empty inline mapping. -yaml: | - empty: {} -php: | - ['empty' => []] ---- -test: Empty Sequence as Entire Document -yaml: | - [] -php: | - [] ---- -test: Empty Mapping as Entire Document -yaml: | - {} -php: | - [] ---- -test: Null as Document -yaml: | - ~ -php: | - null ---- -test: Empty String -brief: > - You can represent an empty string - with a pair of quotes. -yaml: | - '' -php: | - '' diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml deleted file mode 100644 index dd2d776f..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml +++ /dev/null @@ -1,1701 +0,0 @@ ---- %YAML:1.0 -test: Sequence of scalars -spec: 2.1 -yaml: | - - Mark McGwire - - Sammy Sosa - - Ken Griffey -php: | - ['Mark McGwire', 'Sammy Sosa', 'Ken Griffey'] ---- -test: Mapping of scalars to scalars -spec: 2.2 -yaml: | - hr: 65 - avg: 0.278 - rbi: 147 -php: | - ['hr' => 65, 'avg' => 0.278, 'rbi' => 147] ---- -test: Mapping of scalars to sequences -spec: 2.3 -yaml: | - american: - - Boston Red Sox - - Detroit Tigers - - New York Yankees - national: - - New York Mets - - Chicago Cubs - - Atlanta Braves -php: | - ['american' => - ['Boston Red Sox', 'Detroit Tigers', - 'New York Yankees'], - 'national' => - ['New York Mets', 'Chicago Cubs', - 'Atlanta Braves'] - ] ---- -test: Sequence of mappings -spec: 2.4 -yaml: | - - - name: Mark McGwire - hr: 65 - avg: 0.278 - - - name: Sammy Sosa - hr: 63 - avg: 0.288 -php: | - [ - ['name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278], - ['name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288] - ] ---- -test: Legacy A5 -todo: true -spec: legacy_A5 -yaml: | - ? - - New York Yankees - - Atlanta Braves - : - - 2001-07-02 - - 2001-08-12 - - 2001-08-14 - ? - - Detroit Tigers - - Chicago Cubs - : - - 2001-07-23 -perl-busted: > - YAML.pm will be able to emulate this behavior soon. In this regard - it may be somewhat more correct than Python's native behavior which - can only use tuples as mapping keys. PyYAML will also need to figure - out some clever way to roundtrip structured keys. -python: | - [ - { - ('New York Yankees', 'Atlanta Braves'): - [yaml.timestamp('2001-07-02'), - yaml.timestamp('2001-08-12'), - yaml.timestamp('2001-08-14')], - ('Detroit Tigers', 'Chicago Cubs'): - [yaml.timestamp('2001-07-23')] - } - ] -ruby: | - { - [ 'New York Yankees', 'Atlanta Braves' ] => - [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ], - [ 'Detroit Tigers', 'Chicago Cubs' ] => - [ Date.new( 2001, 7, 23 ) ] - } -syck: | - struct test_node seq1[] = { - { T_STR, 0, "New York Yankees" }, - { T_STR, 0, "Atlanta Braves" }, - end_node - }; - struct test_node seq2[] = { - { T_STR, 0, "2001-07-02" }, - { T_STR, 0, "2001-08-12" }, - { T_STR, 0, "2001-08-14" }, - end_node - }; - struct test_node seq3[] = { - { T_STR, 0, "Detroit Tigers" }, - { T_STR, 0, "Chicago Cubs" }, - end_node - }; - struct test_node seq4[] = { - { T_STR, 0, "2001-07-23" }, - end_node - }; - struct test_node map[] = { - { T_SEQ, 0, 0, seq1 }, - { T_SEQ, 0, 0, seq2 }, - { T_SEQ, 0, 0, seq3 }, - { T_SEQ, 0, 0, seq4 }, - end_node - }; - struct test_node stream[] = { - { T_MAP, 0, 0, map }, - end_node - }; - ---- -test: Sequence of sequences -spec: 2.5 -yaml: | - - [ name , hr , avg ] - - [ Mark McGwire , 65 , 0.278 ] - - [ Sammy Sosa , 63 , 0.288 ] -php: | - [ - [ 'name', 'hr', 'avg' ], - [ 'Mark McGwire', 65, 0.278 ], - [ 'Sammy Sosa', 63, 0.288 ] - ] ---- -test: Mapping of mappings -todo: true -spec: 2.6 -yaml: | - Mark McGwire: {hr: 65, avg: 0.278} - Sammy Sosa: { - hr: 63, - avg: 0.288 - } -php: | - [ - 'Mark McGwire' => - [ 'hr' => 65, 'avg' => 0.278 ], - 'Sammy Sosa' => - [ 'hr' => 63, 'avg' => 0.288 ] - ] ---- -test: Two documents in a stream each with a leading comment -todo: true -spec: 2.7 -yaml: | - # Ranking of 1998 home runs - --- - - Mark McGwire - - Sammy Sosa - - Ken Griffey - - # Team ranking - --- - - Chicago Cubs - - St Louis Cardinals -ruby: | - y = YAML::Stream.new - y.add( [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] ) - y.add( [ 'Chicago Cubs', 'St Louis Cardinals' ] ) -documents: 2 - ---- -test: Play by play feed from a game -todo: true -spec: 2.8 -yaml: | - --- - time: 20:03:20 - player: Sammy Sosa - action: strike (miss) - ... - --- - time: 20:03:47 - player: Sammy Sosa - action: grand slam - ... -perl: | - [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] -documents: 2 - ---- -test: Single document with two comments -spec: 2.9 -yaml: | - hr: # 1998 hr ranking - - Mark McGwire - - Sammy Sosa - rbi: - # 1998 rbi ranking - - Sammy Sosa - - Ken Griffey -php: | - [ - 'hr' => [ 'Mark McGwire', 'Sammy Sosa' ], - 'rbi' => [ 'Sammy Sosa', 'Ken Griffey' ] - ] ---- -test: Node for Sammy Sosa appears twice in this document -spec: 2.10 -yaml: | - --- - hr: - - Mark McGwire - # Following node labeled SS - - &SS Sammy Sosa - rbi: - - *SS # Subsequent occurrence - - Ken Griffey -php: | - [ - 'hr' => - ['Mark McGwire', 'Sammy Sosa'], - 'rbi' => - ['Sammy Sosa', 'Ken Griffey'] - ] ---- -test: Mapping between sequences -todo: true -spec: 2.11 -yaml: | - ? # PLAY SCHEDULE - - Detroit Tigers - - Chicago Cubs - : - - 2001-07-23 - - ? [ New York Yankees, - Atlanta Braves ] - : [ 2001-07-02, 2001-08-12, - 2001-08-14 ] -ruby: | - { - [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ], - [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ] - } -syck: | - struct test_node seq1[] = { - { T_STR, 0, "New York Yankees" }, - { T_STR, 0, "Atlanta Braves" }, - end_node - }; - struct test_node seq2[] = { - { T_STR, 0, "2001-07-02" }, - { T_STR, 0, "2001-08-12" }, - { T_STR, 0, "2001-08-14" }, - end_node - }; - struct test_node seq3[] = { - { T_STR, 0, "Detroit Tigers" }, - { T_STR, 0, "Chicago Cubs" }, - end_node - }; - struct test_node seq4[] = { - { T_STR, 0, "2001-07-23" }, - end_node - }; - struct test_node map[] = { - { T_SEQ, 0, 0, seq3 }, - { T_SEQ, 0, 0, seq4 }, - { T_SEQ, 0, 0, seq1 }, - { T_SEQ, 0, 0, seq2 }, - end_node - }; - struct test_node stream[] = { - { T_MAP, 0, 0, map }, - end_node - }; - ---- -test: Sequence key shortcut -spec: 2.12 -yaml: | - --- - # products purchased - - item : Super Hoop - quantity: 1 - - item : Basketball - quantity: 4 - - item : Big Shoes - quantity: 1 -php: | - [ - [ - 'item' => 'Super Hoop', - 'quantity' => 1, - ], - [ - 'item' => 'Basketball', - 'quantity' => 4, - ], - [ - 'item' => 'Big Shoes', - 'quantity' => 1, - ] - ] -perl: | - [ - { item => 'Super Hoop', quantity => 1 }, - { item => 'Basketball', quantity => 4 }, - { item => 'Big Shoes', quantity => 1 } - ] - -ruby: | - [ - { 'item' => 'Super Hoop', 'quantity' => 1 }, - { 'item' => 'Basketball', 'quantity' => 4 }, - { 'item' => 'Big Shoes', 'quantity' => 1 } - ] -python: | - [ - { 'item': 'Super Hoop', 'quantity': 1 }, - { 'item': 'Basketball', 'quantity': 4 }, - { 'item': 'Big Shoes', 'quantity': 1 } - ] -syck: | - struct test_node map1[] = { - { T_STR, 0, "item" }, - { T_STR, 0, "Super Hoop" }, - { T_STR, 0, "quantity" }, - { T_STR, 0, "1" }, - end_node - }; - struct test_node map2[] = { - { T_STR, 0, "item" }, - { T_STR, 0, "Basketball" }, - { T_STR, 0, "quantity" }, - { T_STR, 0, "4" }, - end_node - }; - struct test_node map3[] = { - { T_STR, 0, "item" }, - { T_STR, 0, "Big Shoes" }, - { T_STR, 0, "quantity" }, - { T_STR, 0, "1" }, - end_node - }; - struct test_node seq[] = { - { T_MAP, 0, 0, map1 }, - { T_MAP, 0, 0, map2 }, - { T_MAP, 0, 0, map3 }, - end_node - }; - struct test_node stream[] = { - { T_SEQ, 0, 0, seq }, - end_node - }; - - ---- -test: Literal perserves newlines -todo: true -spec: 2.13 -yaml: | - # ASCII Art - --- | - \//||\/|| - // || ||_ -perl: | - "\\//||\\/||\n// || ||_\n" -ruby: | - "\\//||\\/||\n// || ||_\n" -python: | - [ - flushLeft( - """ - \//||\/|| - // || ||_ - """ - ) - ] -syck: | - struct test_node stream[] = { - { T_STR, 0, "\\//||\\/||\n// || ||_\n" }, - end_node - }; - ---- -test: Folded treats newlines as a space -todo: true -spec: 2.14 -yaml: | - --- - Mark McGwire's - year was crippled - by a knee injury. -perl: | - "Mark McGwire's year was crippled by a knee injury." -ruby: | - "Mark McGwire's year was crippled by a knee injury." -python: | - [ "Mark McGwire's year was crippled by a knee injury." ] -syck: | - struct test_node stream[] = { - { T_STR, 0, "Mark McGwire's year was crippled by a knee injury." }, - end_node - }; - ---- -test: Newlines preserved for indented and blank lines -todo: true -spec: 2.15 -yaml: | - --- > - Sammy Sosa completed another - fine season with great stats. - - 63 Home Runs - 0.288 Batting Average - - What a year! -perl: | - "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" -ruby: | - "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" -python: | - [ - flushLeft( - """ - Sammy Sosa completed another fine season with great stats. - - 63 Home Runs - 0.288 Batting Average - - What a year! - """ - ) - ] -syck: | - struct test_node stream[] = { - { T_STR, 0, "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" }, - end_node - }; - - ---- -test: Indentation determines scope -spec: 2.16 -yaml: | - name: Mark McGwire - accomplishment: > - Mark set a major league - home run record in 1998. - stats: | - 65 Home Runs - 0.278 Batting Average -php: | - [ - 'name' => 'Mark McGwire', - 'accomplishment' => "Mark set a major league home run record in 1998.\n", - 'stats' => "65 Home Runs\n0.278 Batting Average\n" - ] ---- -test: Quoted scalars -todo: true -spec: 2.17 -yaml: | - unicode: "Sosa did fine.\u263A" - control: "\b1998\t1999\t2000\n" - hexesc: "\x0D\x0A is \r\n" - - single: '"Howdy!" he cried.' - quoted: ' # not a ''comment''.' - tie-fighter: '|\-*-/|' -ruby: | - { - "tie-fighter" => "|\\-*-/|", - "control"=>"\0101998\t1999\t2000\n", - "unicode"=>"Sosa did fine." + ["263A".hex ].pack('U*'), - "quoted"=>" # not a 'comment'.", - "single"=>"\"Howdy!\" he cried.", - "hexesc"=>"\r\n is \r\n" - } ---- -test: Multiline flow scalars -todo: true -spec: 2.18 -yaml: | - plain: - This unquoted scalar - spans many lines. - - quoted: "So does this - quoted scalar.\n" -ruby: | - { - 'plain' => 'This unquoted scalar spans many lines.', - 'quoted' => "So does this quoted scalar.\n" - } ---- -test: Integers -spec: 2.19 -yaml: | - canonical: 12345 - octal: 014 - hexadecimal: 0xC -php: | - [ - 'canonical' => 12345, - 'octal' => 014, - 'hexadecimal' => 0xC - ] ---- -test: Decimal Integer -deprecated: true -spec: 2.19 -yaml: | - decimal: +12,345 -php: | - [ - 'decimal' => 12345.0, - ] ---- -# FIX: spec shows parens around -inf and NaN -test: Floating point -spec: 2.20 -yaml: | - canonical: 1.23015e+3 - exponential: 12.3015e+02 - negative infinity: -.inf - not a number: .NaN - float as whole number: !!float 1 -php: | - [ - 'canonical' => 1230.15, - 'exponential' => 1230.15, - 'negative infinity' => log(0), - 'not a number' => -log(0), - 'float as whole number' => (float) 1 - ] ---- -test: Fixed Floating point -deprecated: true -spec: 2.20 -yaml: | - fixed: 1,230.15 -php: | - [ - 'fixed' => 1230.15, - ] ---- -test: Timestamps -todo: true -spec: 2.22 -yaml: | - canonical: 2001-12-15T02:59:43.1Z - iso8601: 2001-12-14t21:59:43.10-05:00 - spaced: 2001-12-14 21:59:43.10 -05:00 - date: 2002-12-14 # Time is noon UTC -php: | - [ - 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ), - 'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'date' => Date.new( 2002, 12, 14 ) - ] ---- -test: legacy Timestamps test -todo: true -spec: legacy D4 -yaml: | - canonical: 2001-12-15T02:59:43.00Z - iso8601: 2001-02-28t21:59:43.00-05:00 - spaced: 2001-12-14 21:59:43.00 -05:00 - date: 2002-12-14 -php: | - [ - 'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ), - 'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ), - 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ), - 'date' => Date.new( 2002, 12, 14 ) - ] ---- -test: Various explicit families -todo: true -spec: 2.23 -yaml: | - not-date: !!str 2002-04-28 - picture: !binary | - R0lGODlhDAAMAIQAAP//9/X - 17unp5WZmZgAAAOfn515eXv - Pz7Y6OjuDg4J+fn5OTk6enp - 56enmleECcgggoBADs= - - application specific tag: !!something | - The semantics of the tag - above may be different for - different documents. - -ruby-setup: | - YAML.add_private_type( "something" ) do |type, val| - "SOMETHING: #{val}" - end -ruby: | - { - 'not-date' => '2002-04-28', - 'picture' => "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236i^\020' \202\n\001\000;", - 'application specific tag' => "SOMETHING: The semantics of the tag\nabove may be different for\ndifferent documents.\n" - } ---- -test: Application specific family -todo: true -spec: 2.24 -yaml: | - # Establish a tag prefix - --- !clarkevans.com,2002/graph/^shape - # Use the prefix: shorthand for - # !clarkevans.com,2002/graph/circle - - !^circle - center: &ORIGIN {x: 73, 'y': 129} - radius: 7 - - !^line # !clarkevans.com,2002/graph/line - start: *ORIGIN - finish: { x: 89, 'y': 102 } - - !^label - start: *ORIGIN - color: 0xFFEEBB - value: Pretty vector drawing. -ruby-setup: | - YAML.add_domain_type( "clarkevans.com,2002", 'graph/shape' ) { |type, val| - if Array === val - val << "Shape Container" - val - else - raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect - end - } - one_shape_proc = Proc.new { |type, val| - scheme, domain, type = type.split( /:/, 3 ) - if val.is_a? ::Hash - val['TYPE'] = "Shape: #{type}" - val - else - raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect - end - } - YAML.add_domain_type( "clarkevans.com,2002", 'graph/circle', &one_shape_proc ) - YAML.add_domain_type( "clarkevans.com,2002", 'graph/line', &one_shape_proc ) - YAML.add_domain_type( "clarkevans.com,2002", 'graph/label', &one_shape_proc ) -ruby: | - [ - { - "radius" => 7, - "center"=> - { - "x" => 73, - "y" => 129 - }, - "TYPE" => "Shape: graph/circle" - }, { - "finish" => - { - "x" => 89, - "y" => 102 - }, - "TYPE" => "Shape: graph/line", - "start" => - { - "x" => 73, - "y" => 129 - } - }, { - "TYPE" => "Shape: graph/label", - "value" => "Pretty vector drawing.", - "start" => - { - "x" => 73, - "y" => 129 - }, - "color" => 16772795 - }, - "Shape Container" - ] -# --- -# test: Unordered set -# spec: 2.25 -# yaml: | -# # sets are represented as a -# # mapping where each key is -# # associated with the empty string -# --- !set -# ? Mark McGwire -# ? Sammy Sosa -# ? Ken Griff ---- -test: Ordered mappings -todo: true -spec: 2.26 -yaml: | - # ordered maps are represented as - # a sequence of mappings, with - # each mapping having one key - --- !omap - - Mark McGwire: 65 - - Sammy Sosa: 63 - - Ken Griffy: 58 -ruby: | - YAML::Omap[ - 'Mark McGwire', 65, - 'Sammy Sosa', 63, - 'Ken Griffy', 58 - ] ---- -test: Invoice -dump_skip: true -spec: 2.27 -yaml: | - --- !clarkevans.com,2002/^invoice - invoice: 34843 - date : 2001-01-23 - bill-to: &id001 - given : Chris - family : Dumars - address: - lines: | - 458 Walkman Dr. - Suite #292 - city : Royal Oak - state : MI - postal : 48046 - ship-to: *id001 - product: - - - sku : BL394D - quantity : 4 - description : Basketball - price : 450.00 - - - sku : BL4438H - quantity : 1 - description : Super Hoop - price : 2392.00 - tax : 251.42 - total: 4443.52 - comments: > - Late afternoon is best. - Backup contact is Nancy - Billsmer @ 338-4338. -php: | - [ - 'invoice' => 34843, 'date' => gmmktime(0, 0, 0, 1, 23, 2001), - 'bill-to' => - [ 'given' => 'Chris', 'family' => 'Dumars', 'address' => [ 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ] ] - , 'ship-to' => - [ 'given' => 'Chris', 'family' => 'Dumars', 'address' => [ 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ] ] - , 'product' => - [ - [ 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ], - [ 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 ] - ], - 'tax' => 251.42, 'total' => 4443.52, - 'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n" - ] ---- -test: Log file -todo: true -spec: 2.28 -yaml: | - --- - Time: 2001-11-23 15:01:42 -05:00 - User: ed - Warning: > - This is an error message - for the log file - --- - Time: 2001-11-23 15:02:31 -05:00 - User: ed - Warning: > - A slightly different error - message. - --- - Date: 2001-11-23 15:03:17 -05:00 - User: ed - Fatal: > - Unknown variable "bar" - Stack: - - file: TopClass.py - line: 23 - code: | - x = MoreObject("345\n") - - file: MoreClass.py - line: 58 - code: |- - foo = bar -ruby: | - y = YAML::Stream.new - y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 01, 42, 00, "-05:00" ), - 'User' => 'ed', 'Warning' => "This is an error message for the log file\n" } ) - y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 02, 31, 00, "-05:00" ), - 'User' => 'ed', 'Warning' => "A slightly different error message.\n" } ) - y.add( { 'Date' => YAML::mktime( 2001, 11, 23, 15, 03, 17, 00, "-05:00" ), - 'User' => 'ed', 'Fatal' => "Unknown variable \"bar\"\n", - 'Stack' => [ - { 'file' => 'TopClass.py', 'line' => 23, 'code' => "x = MoreObject(\"345\\n\")\n" }, - { 'file' => 'MoreClass.py', 'line' => 58, 'code' => "foo = bar" } ] } ) -documents: 3 - ---- -test: Throwaway comments -yaml: | - ### These are four throwaway comment ### - - ### lines (the second line is empty). ### - this: | # Comments may trail lines. - contains three lines of text. - The third one starts with a - # character. This isn't a comment. - - # These are three throwaway comment - # lines (the first line is empty). -php: | - [ - 'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n" - ] ---- -test: Document with a single value -todo: true -yaml: | - --- > - This YAML stream contains a single text value. - The next stream is a log file - a sequence of - log entries. Adding an entry to the log is a - simple matter of appending it at the end. -ruby: | - "This YAML stream contains a single text value. The next stream is a log file - a sequence of log entries. Adding an entry to the log is a simple matter of appending it at the end.\n" ---- -test: Document stream -todo: true -yaml: | - --- - at: 2001-08-12 09:25:00.00 Z - type: GET - HTTP: '1.0' - url: '/index.html' - --- - at: 2001-08-12 09:25:10.00 Z - type: GET - HTTP: '1.0' - url: '/toc.html' -ruby: | - y = YAML::Stream.new - y.add( { - 'at' => Time::utc( 2001, 8, 12, 9, 25, 00 ), - 'type' => 'GET', - 'HTTP' => '1.0', - 'url' => '/index.html' - } ) - y.add( { - 'at' => Time::utc( 2001, 8, 12, 9, 25, 10 ), - 'type' => 'GET', - 'HTTP' => '1.0', - 'url' => '/toc.html' - } ) -documents: 2 - ---- -test: Top level mapping -yaml: | - # This stream is an example of a top-level mapping. - invoice : 34843 - date : 2001-01-23 - total : 4443.52 -php: | - [ - 'invoice' => 34843, - 'date' => gmmktime(0, 0, 0, 1, 23, 2001), - 'total' => 4443.52 - ] ---- -test: Single-line documents -todo: true -yaml: | - # The following is a sequence of three documents. - # The first contains an empty mapping, the second - # an empty sequence, and the last an empty string. - --- {} - --- [ ] - --- '' -ruby: | - y = YAML::Stream.new - y.add( {} ) - y.add( [] ) - y.add( '' ) -documents: 3 - ---- -test: Document with pause -todo: true -yaml: | - # A communication channel based on a YAML stream. - --- - sent at: 2002-06-06 11:46:25.10 Z - payload: Whatever - # Receiver can process this as soon as the following is sent: - ... - # Even if the next message is sent long after: - --- - sent at: 2002-06-06 12:05:53.47 Z - payload: Whatever - ... -ruby: | - y = YAML::Stream.new - y.add( - { 'sent at' => YAML::mktime( 2002, 6, 6, 11, 46, 25, 0.10 ), - 'payload' => 'Whatever' } - ) - y.add( - { "payload" => "Whatever", "sent at" => YAML::mktime( 2002, 6, 6, 12, 5, 53, 0.47 ) } - ) -documents: 2 - ---- -test: Explicit typing -deprecated: Using the non-specific tag "!" is deprecated since Symfony 3.4 as its behavior will change in 4.0. -yaml: | - integer: 12 - also int: ! "12" - string: !!str 12 -php: | - [ 'integer' => 12, 'also int' => 12, 'string' => '12' ] ---- -test: Private types -todo: true -yaml: | - # Both examples below make use of the 'x-private:ball' - # type family URI, but with different semantics. - --- - pool: !!ball - number: 8 - color: black - --- - bearing: !!ball - material: steel -ruby: | - y = YAML::Stream.new - y.add( { 'pool' => - YAML::PrivateType.new( 'ball', - { 'number' => 8, 'color' => 'black' } ) } - ) - y.add( { 'bearing' => - YAML::PrivateType.new( 'ball', - { 'material' => 'steel' } ) } - ) -documents: 2 - ---- -test: Type family under yaml.org -yaml: | - # The URI is 'tag:yaml.org,2002:str' - - !!str a Unicode string -php: | - [ 'a Unicode string' ] ---- -test: Type family under perl.yaml.org -todo: true -yaml: | - # The URI is 'tag:perl.yaml.org,2002:Text::Tabs' - - !perl/Text::Tabs {} -ruby: | - [ YAML::DomainType.new( 'perl.yaml.org,2002', 'Text::Tabs', {} ) ] ---- -test: Type family under clarkevans.com -todo: true -yaml: | - # The URI is 'tag:clarkevans.com,2003-02:timesheet' - - !clarkevans.com,2003-02/timesheet {} -ruby: | - [ YAML::DomainType.new( 'clarkevans.com,2003-02', 'timesheet', {} ) ] ---- -test: URI Escaping -todo: true -yaml: | - same: - - !domain.tld,2002/type\x30 value - - !domain.tld,2002/type0 value - different: # As far as the YAML parser is concerned - - !domain.tld,2002/type%30 value - - !domain.tld,2002/type0 value -ruby-setup: | - YAML.add_domain_type( "domain.tld,2002", "type0" ) { |type, val| - "ONE: #{val}" - } - YAML.add_domain_type( "domain.tld,2002", "type%30" ) { |type, val| - "TWO: #{val}" - } -ruby: | - { 'same' => [ 'ONE: value', 'ONE: value' ], 'different' => [ 'TWO: value', 'ONE: value' ] } ---- -test: URI Prefixing -todo: true -yaml: | - # 'tag:domain.tld,2002:invoice' is some type family. - invoice: !domain.tld,2002/^invoice - # 'seq' is shorthand for 'tag:yaml.org,2002:seq'. - # This does not effect '^customer' below - # because it is does not specify a prefix. - customers: !seq - # '^customer' is shorthand for the full - # notation 'tag:domain.tld,2002:customer'. - - !^customer - given : Chris - family : Dumars -ruby-setup: | - YAML.add_domain_type( "domain.tld,2002", /(invoice|customer)/ ) { |type, val| - if val.is_a? ::Hash - scheme, domain, type = type.split( /:/, 3 ) - val['type'] = "domain #{type}" - val - else - raise YAML::Error, "Not a Hash in domain.tld/invoice: " + val.inspect - end - } -ruby: | - { "invoice"=> { "customers"=> [ { "given"=>"Chris", "type"=>"domain customer", "family"=>"Dumars" } ], "type"=>"domain invoice" } } - ---- -test: Overriding anchors -yaml: | - anchor : &A001 This scalar has an anchor. - override : &A001 > - The alias node below is a - repeated use of this value. - alias : *A001 -php: | - [ 'anchor' => 'This scalar has an anchor.', - 'override' => "The alias node below is a repeated use of this value.\n", - 'alias' => "The alias node below is a repeated use of this value.\n"] ---- -test: Flow and block formatting -todo: true -yaml: | - empty: [] - flow: [ one, two, three # May span lines, - , four, # indentation is - five ] # mostly ignored. - block: - - First item in top sequence - - - - Subordinate sequence entry - - > - A folded sequence entry - - Sixth item in top sequence -ruby: | - { 'empty' => [], 'flow' => [ 'one', 'two', 'three', 'four', 'five' ], - 'block' => [ 'First item in top sequence', [ 'Subordinate sequence entry' ], - "A folded sequence entry\n", 'Sixth item in top sequence' ] } ---- -test: Complete mapping test -todo: true -yaml: | - empty: {} - flow: { one: 1, two: 2 } - spanning: { one: 1, - two: 2 } - block: - first : First entry - second: - key: Subordinate mapping - third: - - Subordinate sequence - - { } - - Previous mapping is empty. - - A key: value pair in a sequence. - A second: key:value pair. - - The previous entry is equal to the following one. - - - A key: value pair in a sequence. - A second: key:value pair. - !float 12 : This key is a float. - ? > - ? - : This key had to be protected. - "\a" : This key had to be escaped. - ? > - This is a - multi-line - folded key - : Whose value is - also multi-line. - ? this also works as a key - : with a value at the next line. - ? - - This key - - is a sequence - : - - With a sequence value. - ? - This: key - is a: mapping - : - with a: mapping value. -ruby: | - { 'empty' => {}, 'flow' => { 'one' => 1, 'two' => 2 }, - 'spanning' => { 'one' => 1, 'two' => 2 }, - 'block' => { 'first' => 'First entry', 'second' => - { 'key' => 'Subordinate mapping' }, 'third' => - [ 'Subordinate sequence', {}, 'Previous mapping is empty.', - { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' }, - 'The previous entry is equal to the following one.', - { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' } ], - 12.0 => 'This key is a float.', "?\n" => 'This key had to be protected.', - "\a" => 'This key had to be escaped.', - "This is a multi-line folded key\n" => "Whose value is also multi-line.", - 'this also works as a key' => 'with a value at the next line.', - [ 'This key', 'is a sequence' ] => [ 'With a sequence value.' ] } } - # Couldn't recreate map exactly, so we'll do a detailed check to be sure it's entact - obj_y['block'].keys.each { |k| - if Hash === k - v = obj_y['block'][k] - if k['This'] == 'key' and k['is a'] == 'mapping' and v['with a'] == 'mapping value.' - obj_r['block'][k] = v - end - end - } ---- -test: Literal explicit indentation -yaml: | - # Explicit indentation must - # be given in all the three - # following cases. - leading spaces: |2 - This value starts with four spaces. - - leading line break: |2 - - This value starts with a line break. - - leading comment indicator: |2 - # first line starts with a - # character. - - # Explicit indentation may - # also be given when it is - # not required. - redundant: |2 - This value is indented 2 spaces. -php: | - [ - 'leading spaces' => " This value starts with four spaces.\n", - 'leading line break' => "\nThis value starts with a line break.\n", - 'leading comment indicator' => "# first line starts with a\n# character.\n", - 'redundant' => "This value is indented 2 spaces.\n" - ] ---- -test: Chomping and keep modifiers -yaml: | - clipped: | - This has one newline. - - same as "clipped" above: "This has one newline.\n" - - stripped: |- - This has no newline. - - same as "stripped" above: "This has no newline." - - kept: |+ - This has two newlines. - - same as "kept" above: "This has two newlines.\n\n" -php: | - [ - 'clipped' => "This has one newline.\n", - 'same as "clipped" above' => "This has one newline.\n", - 'stripped' => 'This has no newline.', - 'same as "stripped" above' => 'This has no newline.', - 'kept' => "This has two newlines.\n\n", - 'same as "kept" above' => "This has two newlines.\n\n" - ] ---- -test: Literal combinations -todo: true -yaml: | - empty: | - - literal: | - The \ ' " characters may be - freely used. Leading white - space is significant. - - Line breaks are significant. - Thus this value contains one - empty line and ends with a - single line break, but does - not start with one. - - is equal to: "The \\ ' \" characters may \ - be\nfreely used. Leading white\n space \ - is significant.\n\nLine breaks are \ - significant.\nThus this value contains \ - one\nempty line and ends with a\nsingle \ - line break, but does\nnot start with one.\n" - - # Comments may follow a block - # scalar value. They must be - # less indented. - - # Modifiers may be combined in any order. - indented and chomped: |2- - This has no newline. - - also written as: |-2 - This has no newline. - - both are equal to: " This has no newline." -php: | - [ - 'empty' => '', - 'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " + - "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" + - "empty line and ends with a\nsingle line break, but does\nnot start with one.\n", - 'is equal to' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " + - "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" + - "empty line and ends with a\nsingle line break, but does\nnot start with one.\n", - 'indented and chomped' => ' This has no newline.', - 'also written as' => ' This has no newline.', - 'both are equal to' => ' This has no newline.' - [ ---- -test: Folded combinations -todo: true -yaml: | - empty: > - - one paragraph: > - Line feeds are converted - to spaces, so this value - contains no line breaks - except for the final one. - - multiple paragraphs: >2 - - An empty line, either - at the start or in - the value: - - Is interpreted as a - line break. Thus this - value contains three - line breaks. - - indented text: > - This is a folded - paragraph followed - by a list: - * first entry - * second entry - Followed by another - folded paragraph, - another list: - - * first entry - - * second entry - - And a final folded - paragraph. - - above is equal to: | - This is a folded paragraph followed by a list: - * first entry - * second entry - Followed by another folded paragraph, another list: - - * first entry - - * second entry - - And a final folded paragraph. - - # Explicit comments may follow - # but must be less indented. -php: | - [ - 'empty' => '', - 'one paragraph' => 'Line feeds are converted to spaces, so this value'. - " contains no line breaks except for the final one.\n", - 'multiple paragraphs' => "\nAn empty line, either at the start or in the value:\n". - "Is interpreted as a line break. Thus this value contains three line breaks.\n", - 'indented text' => "This is a folded paragraph followed by a list:\n". - " * first entry\n * second entry\nFollowed by another folded paragraph, ". - "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n", - 'above is equal to' => "This is a folded paragraph followed by a list:\n". - " * first entry\n * second entry\nFollowed by another folded paragraph, ". - "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n" - ] ---- -test: Single quotes -todo: true -yaml: | - empty: '' - second: '! : \ etc. can be used freely.' - third: 'a single quote '' must be escaped.' - span: 'this contains - six spaces - - and one - line break' - is same as: "this contains six spaces\nand one line break" -php: | - [ - 'empty' => '', - 'second' => '! : \\ etc. can be used freely.', - 'third' => "a single quote ' must be escaped.", - 'span' => "this contains six spaces\nand one line break", - 'is same as' => "this contains six spaces\nand one line break" - ] ---- -test: Double quotes -todo: true -yaml: | - empty: "" - second: "! : etc. can be used freely." - third: "a \" or a \\ must be escaped." - fourth: "this value ends with an LF.\n" - span: "this contains - four \ - spaces" - is equal to: "this contains four spaces" -php: | - [ - 'empty' => '', - 'second' => '! : etc. can be used freely.', - 'third' => 'a " or a \\ must be escaped.', - 'fourth' => "this value ends with an LF.\n", - 'span' => "this contains four spaces", - 'is equal to' => "this contains four spaces" - ] ---- -test: Unquoted strings -todo: true -yaml: | - first: There is no unquoted empty string. - - second: 12 ## This is an integer. - - third: !!str 12 ## This is a string. - - span: this contains - six spaces - - and one - line break - - indicators: this has no comments. - #:foo and bar# are - both text. - - flow: [ can span - lines, # comment - like - this ] - - note: { one-line keys: but multi-line values } - -php: | - [ - 'first' => 'There is no unquoted empty string.', - 'second' => 12, - 'third' => '12', - 'span' => "this contains six spaces\nand one line break", - 'indicators' => "this has no comments. #:foo and bar# are both text.", - 'flow' => [ 'can span lines', 'like this' ], - 'note' => { 'one-line keys' => 'but multi-line values' } - ] ---- -test: Spanning sequences -todo: true -yaml: | - # The following are equal seqs - # with different identities. - flow: [ one, two ] - spanning: [ one, - two ] - block: - - one - - two -php: | - [ - 'flow' => [ 'one', 'two' ], - 'spanning' => [ 'one', 'two' ], - 'block' => [ 'one', 'two' ] - ] ---- -test: Flow mappings -yaml: | - # The following are equal maps - # with different identities. - flow: { one: 1, two: 2 } - block: - one: 1 - two: 2 -php: | - [ - 'flow' => [ 'one' => 1, 'two' => 2 ], - 'block' => [ 'one' => 1, 'two' => 2 ] - ] ---- -test: Representations of 12 -todo: true -yaml: | - - 12 # An integer - # The following scalars - # are loaded to the - # string value '1' '2'. - - !!str 12 - - '12' - - "12" - - "\ - 1\ - 2\ - " - # Strings containing paths and regexps can be unquoted: - - /foo/bar - - d:/foo/bar - - foo/bar - - /a.*b/ -php: | - [ 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' ] ---- -test: "Null" -todo: true -yaml: | - canonical: ~ - - english: null - - # This sequence has five - # entries, two with values. - sparse: - - ~ - - 2nd entry - - Null - - 4th entry - - - - four: This mapping has five keys, - only two with values. - -php: | - [ - 'canonical' => null, - 'english' => null, - 'sparse' => [ null, '2nd entry', null, '4th entry', null ]], - 'four' => 'This mapping has five keys, only two with values.' - ] ---- -test: Omap -todo: true -yaml: | - # Explicitly typed dictionary. - Bestiary: !omap - - aardvark: African pig-like ant eater. Ugly. - - anteater: South-American ant eater. Two species. - - anaconda: South-American constrictor snake. Scary. - # Etc. -ruby: | - { - 'Bestiary' => YAML::Omap[ - 'aardvark', 'African pig-like ant eater. Ugly.', - 'anteater', 'South-American ant eater. Two species.', - 'anaconda', 'South-American constrictor snake. Scary.' - ] - } - ---- -test: Pairs -todo: true -yaml: | - # Explicitly typed pairs. - tasks: !pairs - - meeting: with team. - - meeting: with boss. - - break: lunch. - - meeting: with client. -ruby: | - { - 'tasks' => YAML::Pairs[ - 'meeting', 'with team.', - 'meeting', 'with boss.', - 'break', 'lunch.', - 'meeting', 'with client.' - ] - } - ---- -test: Set -todo: true -yaml: | - # Explicitly typed set. - baseball players: !set - Mark McGwire: - Sammy Sosa: - Ken Griffey: -ruby: | - { - 'baseball players' => YAML::Set[ - 'Mark McGwire', nil, - 'Sammy Sosa', nil, - 'Ken Griffey', nil - ] - } - ---- -test: Integer -yaml: | - canonical: 12345 - octal: 014 - hexadecimal: 0xC -php: | - [ - 'canonical' => 12345, - 'octal' => 12, - 'hexadecimal' => 12 - ] ---- -test: Decimal -deprecated: true -yaml: | - decimal: +12,345 -php: | - [ - 'decimal' => 12345.0, - ] ---- -test: Fixed Float -deprecated: true -yaml: | - fixed: 1,230.15 -php: | - [ - 'fixed' => 1230.15, - ] ---- -test: Float -yaml: | - canonical: 1.23015e+3 - exponential: 12.3015e+02 - negative infinity: -.inf - not a number: .NaN -php: | - [ - 'canonical' => 1230.15, - 'exponential' => 1230.15, - 'negative infinity' => log(0), - 'not a number' => -log(0) - ] ---- -test: Timestamp -todo: true -yaml: | - canonical: 2001-12-15T02:59:43.1Z - valid iso8601: 2001-12-14t21:59:43.10-05:00 - space separated: 2001-12-14 21:59:43.10 -05:00 - date (noon UTC): 2002-12-14 -ruby: | - [ - 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ), - 'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'date (noon UTC)' => Date.new( 2002, 12, 14 ) - ] ---- -test: Binary -todo: true -yaml: | - canonical: !binary "\ - R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\ - OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\ - +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\ - AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=" - base64: !binary | - R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 - OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ - +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC - AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= - description: > - The binary value above is a tiny arrow - encoded as a gif image. -ruby-setup: | - arrow_gif = "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236iiiccc\243\243\243\204\204\204\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371!\376\016Made with GIMP\000,\000\000\000\000\f\000\f\000\000\005, \216\2010\236\343@\024\350i\020\304\321\212\010\034\317\200M$z\357\3770\205p\270\2601f\r\e\316\001\303\001\036\020' \202\n\001\000;" -ruby: | - { - 'canonical' => arrow_gif, - 'base64' => arrow_gif, - 'description' => "The binary value above is a tiny arrow encoded as a gif image.\n" - } - ---- -test: Merge key -todo: true -yaml: | - --- - - &CENTER { x: 1, y: 2 } - - &LEFT { x: 0, y: 2 } - - &BIG { r: 10 } - - &SMALL { r: 1 } - - # All the following maps are equal: - - - # Explicit keys - x: 1 - y: 2 - r: 10 - label: center/big - - - # Merge one map - << : *CENTER - r: 10 - label: center/big - - - # Merge multiple maps - << : [ *CENTER, *BIG ] - label: center/big - - - # Override - << : [ *BIG, *LEFT, *SMALL ] - x: 1 - label: center/big - -ruby-setup: | - center = { 'x' => 1, 'y' => 2 } - left = { 'x' => 0, 'y' => 2 } - big = { 'r' => 10 } - small = { 'r' => 1 } - node1 = { 'x' => 1, 'y' => 2, 'r' => 10, 'label' => 'center/big' } - node2 = center.dup - node2.update( { 'r' => 10, 'label' => 'center/big' } ) - node3 = big.dup - node3.update( center ) - node3.update( { 'label' => 'center/big' } ) - node4 = small.dup - node4.update( left ) - node4.update( big ) - node4.update( { 'x' => 1, 'label' => 'center/big' } ) - -ruby: | - [ - center, left, big, small, node1, node2, node3, node4 - ] - ---- -test: Default key -todo: true -yaml: | - --- # Old schema - link with: - - library1.dll - - library2.dll - --- # New schema - link with: - - = : library1.dll - version: 1.2 - - = : library2.dll - version: 2.3 -ruby: | - y = YAML::Stream.new - y.add( { 'link with' => [ 'library1.dll', 'library2.dll' ] } ) - obj_h = Hash[ 'version' => 1.2 ] - obj_h.default = 'library1.dll' - obj_h2 = Hash[ 'version' => 2.3 ] - obj_h2.default = 'library2.dll' - y.add( { 'link with' => [ obj_h, obj_h2 ] } ) -documents: 2 - ---- -test: Special keys -todo: true -yaml: | - "!": These three keys - "&": had to be quoted - "=": and are normal strings. - # NOTE: the following node should NOT be serialized this way. - encoded node : - !special '!' : '!type' - !special|canonical '&' : 12 - = : value - # The proper way to serialize the above node is as follows: - node : !!type &12 value -ruby: | - { '!' => 'These three keys', '&' => 'had to be quoted', - '=' => 'and are normal strings.', - 'encoded node' => YAML::PrivateType.new( 'type', 'value' ), - 'node' => YAML::PrivateType.new( 'type', 'value' ) } diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml deleted file mode 100644 index e96b5536..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml +++ /dev/null @@ -1,266 +0,0 @@ ---- %YAML:1.0 -test: Strings -brief: > - Any group of characters beginning with an - alphabetic or numeric character is a string, - unless it belongs to one of the groups below - (such as an Integer or Time). -yaml: | - String -php: | - 'String' ---- -test: String characters -brief: > - A string can contain any alphabetic or - numeric character, along with many - punctuation characters, including the - period, dash, space, quotes, exclamation, and - question mark. -yaml: | - - What's Yaml? - - It's for writing data structures in plain text. - - And? - - And what? That's not good enough for you? - - No, I mean, "And what about Yaml?" - - Oh, oh yeah. Uh.. Yaml for Ruby. -php: | - [ - "What's Yaml?", - "It's for writing data structures in plain text.", - "And?", - "And what? That's not good enough for you?", - "No, I mean, \"And what about Yaml?\"", - "Oh, oh yeah. Uh.. Yaml for Ruby." - ] ---- -test: Indicators in Strings -brief: > - Be careful using indicators in strings. In particular, - the comma, colon, and pound sign must be used carefully. -yaml: | - the colon followed by space is an indicator: but is a string:right here - same for the pound sign: here we have it#in a string - the comma can, honestly, be used in most cases: [ but not in, inline collections ] -php: | - [ - 'the colon followed by space is an indicator' => 'but is a string:right here', - 'same for the pound sign' => 'here we have it#in a string', - 'the comma can, honestly, be used in most cases' => ['but not in', 'inline collections'] - ] ---- -test: Forcing Strings -brief: > - Any YAML type can be forced into a string using the - explicit !!str method. -yaml: | - date string: !!str 2001-08-01 - number string: !!str 192 -php: | - [ - 'date string' => '2001-08-01', - 'number string' => '192' - ] ---- -test: Single-quoted Strings -brief: > - You can also enclose your strings within single quotes, - which allows use of slashes, colons, and other indicators - freely. Inside single quotes, you can represent a single - quote in your string by using two single quotes next to - each other. -yaml: | - all my favorite symbols: '#:!/%.)' - a few i hate: '&(*' - why do i hate them?: 'it''s very hard to explain' - entities: '£ me' -php: | - [ - 'all my favorite symbols' => '#:!/%.)', - 'a few i hate' => '&(*', - 'why do i hate them?' => 'it\'s very hard to explain', - 'entities' => '£ me' - ] ---- -test: Double-quoted Strings -brief: > - Enclosing strings in double quotes allows you - to use escapings to represent ASCII and - Unicode characters. -yaml: | - i know where i want my line breaks: "one here\nand another here\n" -php: | - [ - 'i know where i want my line breaks' => "one here\nand another here\n" - ] ---- -test: Multi-line Quoted Strings -todo: true -brief: > - Both single- and double-quoted strings may be - carried on to new lines in your YAML document. - They must be indented a step and indentation - is interpreted as a single space. -yaml: | - i want a long string: "so i'm going to - let it go on and on to other lines - until i end it with a quote." -php: | - ['i want a long string' => "so i'm going to ". - "let it go on and on to other lines ". - "until i end it with a quote." - ] - ---- -test: Plain scalars -todo: true -brief: > - Unquoted strings may also span multiple lines, if they - are free of YAML space indicators and indented. -yaml: | - - My little toe is broken in two places; - - I'm crazy to have skied this way; - - I'm not the craziest he's seen, since there was always the German guy - who skied for 3 hours on a broken shin bone (just below the kneecap); - - Nevertheless, second place is respectable, and he doesn't - recommend going for the record; - - He's going to put my foot in plaster for a month; - - This would impair my skiing ability somewhat for the - duration, as can be imagined. -php: | - [ - "My little toe is broken in two places;", - "I'm crazy to have skied this way;", - "I'm not the craziest he's seen, since there was always ". - "the German guy who skied for 3 hours on a broken shin ". - "bone (just below the kneecap);", - "Nevertheless, second place is respectable, and he doesn't ". - "recommend going for the record;", - "He's going to put my foot in plaster for a month;", - "This would impair my skiing ability somewhat for the duration, ". - "as can be imagined." - ] ---- -test: 'Null' -brief: > - You can use the tilde '~' character for a null value. -yaml: | - name: Mr. Show - hosted by: Bob and David - date of next season: ~ -php: | - [ - 'name' => 'Mr. Show', - 'hosted by' => 'Bob and David', - 'date of next season' => null - ] ---- -test: Boolean -brief: > - You can use 'true' and 'false' for Boolean values. -yaml: | - Is Gus a Liar?: true - Do I rely on Gus for Sustenance?: false -php: | - [ - 'Is Gus a Liar?' => true, - 'Do I rely on Gus for Sustenance?' => false - ] ---- -test: Integers -dump_skip: true -brief: > - An integer is a series of numbers, optionally - starting with a positive or negative sign. Integers - may also contain commas for readability. -yaml: | - zero: 0 - simple: 12 -php: | - [ - 'zero' => 0, - 'simple' => 12, - ] ---- -test: Positive Big Integer -deprecated: true -dump_skip: true -brief: > - An integer is a series of numbers, optionally - starting with a positive or negative sign. Integers - may also contain commas for readability. -yaml: | - one-thousand: 1,000 -php: | - [ - 'one-thousand' => 1000.0, - ] ---- -test: Negative Big Integer -deprecated: true -dump_skip: true -brief: > - An integer is a series of numbers, optionally - starting with a positive or negative sign. Integers - may also contain commas for readability. -yaml: | - negative one-thousand: -1,000 -php: | - [ - 'negative one-thousand' => -1000.0 - ] ---- -test: Floats -dump_skip: true -brief: > - Floats are represented by numbers with decimals, - allowing for scientific notation, as well as - positive and negative infinity and "not a number." -yaml: | - a simple float: 2.00 - scientific notation: 1.00009e+3 -php: | - [ - 'a simple float' => 2.0, - 'scientific notation' => 1000.09 - ] ---- -test: Larger Float -dump_skip: true -deprecated: true -brief: > - Floats are represented by numbers with decimals, - allowing for scientific notation, as well as - positive and negative infinity and "not a number." -yaml: | - larger float: 1,000.09 -php: | - [ - 'larger float' => 1000.09, - ] ---- -test: Time -todo: true -brief: > - You can represent timestamps by using - ISO8601 format, or a variation which - allows spaces between the date, time and - time zone. -yaml: | - iso8601: 2001-12-14t21:59:43.10-05:00 - space separated: 2001-12-14 21:59:43.10 -05:00 -php: | - [ - 'iso8601' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), - 'space separated' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ) - ] ---- -test: Date -todo: true -brief: > - A date can be represented by its year, - month and day in ISO8601 order. -yaml: | - 1976-07-31 -php: | - date( 1976, 7, 31 ) diff --git a/vendor/symfony/yaml/Tests/Fixtures/arrow.gif b/vendor/symfony/yaml/Tests/Fixtures/arrow.gif deleted file mode 100644 index 443aca42..00000000 Binary files a/vendor/symfony/yaml/Tests/Fixtures/arrow.gif and /dev/null differ diff --git a/vendor/symfony/yaml/Tests/Fixtures/booleanMappingKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/booleanMappingKeys.yml deleted file mode 100644 index 88287f1b..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/booleanMappingKeys.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- %YAML:1.0 -test: Miscellaneous -spec: 2.21 -yaml: | - true: true - false: false -php: | - [ - 'true' => true, - 'false' => false, - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml b/vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml deleted file mode 100644 index ec456ed0..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml +++ /dev/null @@ -1 +0,0 @@ -value: diff --git a/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml b/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml deleted file mode 100644 index 87d352db..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml +++ /dev/null @@ -1,155 +0,0 @@ -test: outside double quotes -yaml: | - \0 \ \a \b \n -php: | - "\\0 \\ \\a \\b \\n" ---- -test: 'null' -yaml: | - "\0" -php: | - "\x00" ---- -test: bell -yaml: | - "\a" -php: | - "\x07" ---- -test: backspace -yaml: | - "\b" -php: | - "\x08" ---- -test: horizontal tab (1) -yaml: | - "\t" -php: | - "\x09" ---- -test: horizontal tab (2) -yaml: | - "\ " -php: | - "\x09" ---- -test: line feed -yaml: | - "\n" -php: | - "\x0a" ---- -test: vertical tab -yaml: | - "\v" -php: | - "\x0b" ---- -test: form feed -yaml: | - "\f" -php: | - "\x0c" ---- -test: carriage return -yaml: | - "\r" -php: | - "\x0d" ---- -test: escape -yaml: | - "\e" -php: | - "\x1b" ---- -test: space -yaml: | - "\ " -php: | - "\x20" ---- -test: slash -yaml: | - "\/" -php: | - "\x2f" ---- -test: backslash -yaml: | - "\\" -php: | - "\\" ---- -test: Unicode next line -yaml: | - "\N" -php: | - "\xc2\x85" ---- -test: Unicode non-breaking space -yaml: | - "\_" -php: | - "\xc2\xa0" ---- -test: Unicode line separator -yaml: | - "\L" -php: | - "\xe2\x80\xa8" ---- -test: Unicode paragraph separator -yaml: | - "\P" -php: | - "\xe2\x80\xa9" ---- -test: Escaped 8-bit Unicode -yaml: | - "\x42" -php: | - "B" ---- -test: Escaped 16-bit Unicode -yaml: | - "\u20ac" -php: | - "\xe2\x82\xac" ---- -test: Escaped 32-bit Unicode -yaml: | - "\U00000043" -php: | - "C" ---- -test: Example 5.13 Escaped Characters -note: | - Currently throws an error parsing first line. Maybe Symfony Yaml doesn't support - continuation of string across multiple lines? Keeping test here but disabled. -todo: true -yaml: | - "Fun with \\ - \" \a \b \e \f \ - \n \r \t \v \0 \ - \ \_ \N \L \P \ - \x41 \u0041 \U00000041" -php: | - "Fun with \x5C\n\x22 \x07 \x08 \x1B \x0C\n\x0A \x0D \x09 \x0B \x00\n\x20 \xA0 \x85 \xe2\x80\xa8 \xe2\x80\xa9\nA A A" ---- -test: Double quotes with a line feed -yaml: | - { double: "some value\n \"some quoted string\" and 'some single quotes one'" } -php: | - [ - 'double' => "some value\n \"some quoted string\" and 'some single quotes one'" - ] ---- -test: Backslashes -yaml: | - { single: 'foo\Var', no-quotes: foo\Var, double: "foo\\Var" } -php: | - [ - 'single' => 'foo\Var', 'no-quotes' => 'foo\Var', 'double' => 'foo\Var' - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/index.yml b/vendor/symfony/yaml/Tests/Fixtures/index.yml deleted file mode 100644 index 3216a89e..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/index.yml +++ /dev/null @@ -1,18 +0,0 @@ -- escapedCharacters -- sfComments -- sfCompact -- sfTests -- sfObjects -- sfMergeKey -- sfQuotes -- YtsAnchorAlias -- YtsBasicTests -- YtsBlockMapping -- YtsDocumentSeparator -- YtsErrorTests -- YtsFlowCollections -- YtsFoldedScalars -- YtsNullsAndEmpties -- YtsSpecificationExamples -- YtsTypeTransfers -- unindentedCollections diff --git a/vendor/symfony/yaml/Tests/Fixtures/legacyBooleanMappingKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/legacyBooleanMappingKeys.yml deleted file mode 100644 index db950165..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/legacyBooleanMappingKeys.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- %YAML:1.0 -test: Miscellaneous -spec: 2.21 -yaml: | - true: true - false: false -php: | - [ - 1 => true, - 0 => false, - ] ---- -test: Boolean -yaml: | - false: used as key - logical: true - answer: false -php: | - [ - false => 'used as key', - 'logical' => true, - 'answer' => false - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/legacyNonStringKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/legacyNonStringKeys.yml deleted file mode 100644 index 4e282018..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/legacyNonStringKeys.yml +++ /dev/null @@ -1,2 +0,0 @@ -- legacyBooleanMappingKeys -- legacyNullMappingKey diff --git a/vendor/symfony/yaml/Tests/Fixtures/legacyNullMappingKey.yml b/vendor/symfony/yaml/Tests/Fixtures/legacyNullMappingKey.yml deleted file mode 100644 index 14f93c2d..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/legacyNullMappingKey.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- %YAML:1.0 -test: Miscellaneous -spec: 2.21 -yaml: | - null: ~ -php: | - [ - '' => null, - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml b/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml deleted file mode 100644 index 9d72f09b..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml +++ /dev/null @@ -1,14 +0,0 @@ -data: - single_line: 'foo bar baz' - multi_line: | - foo - line with trailing spaces: - - bar - integer like line: - 123456789 - empty line: - - baz - multi_line_with_carriage_return: "foo\nbar\r\nbaz" - nested_inlined_multi_line_string: { inlined_multi_line: "foo\nbar\r\nempty line:\n\nbaz" } diff --git a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_for_tagged_values.yml b/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_for_tagged_values.yml deleted file mode 100644 index f8c9112f..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_for_tagged_values.yml +++ /dev/null @@ -1,2 +0,0 @@ -data: - foo: !bar "foo\r\nline with trailing spaces:\n \nbar\ninteger like line:\n123456789\nempty line:\n\nbaz" diff --git a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml b/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml deleted file mode 100644 index 3f2dedd1..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml +++ /dev/null @@ -1,4 +0,0 @@ -data: - multi_line: |4 - the first line has leading spaces - The second line does not. diff --git a/vendor/symfony/yaml/Tests/Fixtures/nonStringKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/nonStringKeys.yml deleted file mode 100644 index 354b0791..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/nonStringKeys.yml +++ /dev/null @@ -1,3 +0,0 @@ -- booleanMappingKeys -- numericMappingKeys -- nullMappingKey diff --git a/vendor/symfony/yaml/Tests/Fixtures/not_readable.yml b/vendor/symfony/yaml/Tests/Fixtures/not_readable.yml deleted file mode 100644 index 3216a89e..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/not_readable.yml +++ /dev/null @@ -1,18 +0,0 @@ -- escapedCharacters -- sfComments -- sfCompact -- sfTests -- sfObjects -- sfMergeKey -- sfQuotes -- YtsAnchorAlias -- YtsBasicTests -- YtsBlockMapping -- YtsDocumentSeparator -- YtsErrorTests -- YtsFlowCollections -- YtsFoldedScalars -- YtsNullsAndEmpties -- YtsSpecificationExamples -- YtsTypeTransfers -- unindentedCollections diff --git a/vendor/symfony/yaml/Tests/Fixtures/nullMappingKey.yml b/vendor/symfony/yaml/Tests/Fixtures/nullMappingKey.yml deleted file mode 100644 index cd90f7b4..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/nullMappingKey.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- %YAML:1.0 -test: Miscellaneous -spec: 2.21 -yaml: | - null: ~ -php: | - [ - 'null' => null, - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/numericMappingKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/numericMappingKeys.yml deleted file mode 100644 index 246447e4..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/numericMappingKeys.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- %YAML:1.0 -test: A sequence with an unordered array -brief: > - A sequence with an unordered array -yaml: | - 1: foo - 0: bar -php: | - [1 => 'foo', 0 => 'bar'] ---- -test: Integers as Map Keys -brief: > - An integer can be used as dictionary key. -yaml: | - 1: one - 2: two - 3: three -php: | - [ - 1 => 'one', - 2 => 'two', - 3 => 'three' - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml b/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml deleted file mode 100644 index 4b0c91c9..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml +++ /dev/null @@ -1,90 +0,0 @@ ---- %YAML:1.0 -test: Comments at the end of a line -brief: > - Comments at the end of a line -yaml: | - ex1: "foo # bar" - ex2: "foo # bar" # comment - ex3: 'foo # bar' # comment - ex4: foo # comment - ex5: foo # comment with tab before - ex6: foo#foo # comment here - ex7: foo # ignore me # and me -php: | - ['ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo', 'ex5' => 'foo', 'ex6' => 'foo#foo', 'ex7' => 'foo'] ---- -test: Comments in the middle -brief: > - Comments in the middle -yaml: | - foo: - # some comment - # some comment - bar: foo - # some comment - # some comment -php: | - ['foo' => ['bar' => 'foo']] ---- -test: Comments on a hash line -brief: > - Comments on a hash line -yaml: | - foo: # a comment - foo: bar # a comment -php: | - ['foo' => ['foo' => 'bar']] ---- -test: 'Value starting with a #' -brief: > - 'Value starting with a #' -yaml: | - foo: '#bar' -php: | - ['foo' => '#bar'] ---- -test: Document starting with a comment and a separator -brief: > - Commenting before document start is allowed -yaml: | - # document comment - --- - foo: bar # a comment -php: | - ['foo' => 'bar'] ---- -test: Comment containing a colon on a hash line -brief: > - Comment containing a colon on a scalar line -yaml: 'foo # comment: this is also part of the comment' -php: | - 'foo' ---- -test: 'Hash key containing a #' -brief: > - 'Hash key containing a #' -yaml: 'foo#bar: baz' -php: | - ['foo#bar' => 'baz'] ---- -test: 'Hash key ending with a space and a #' -brief: > - 'Hash key ending with a space and a #' -yaml: | - 'foo #': baz -php: | - ['foo #' => 'baz'] ---- -test: Comment before first item in unindented collection -brief: > - Comment directly before unindented collection is allowed -yaml: | - collection1: - # comment - - a - - b - collection2: - - a - - b -php: | - ['collection1' => ['a', 'b'], 'collection2' => ['a', 'b']] diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml b/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml deleted file mode 100644 index 8cadae2c..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml +++ /dev/null @@ -1,159 +0,0 @@ ---- %YAML:1.0 -test: Compact notation -brief: | - Compact notation for sets of mappings with single element -yaml: | - --- - # products purchased - - item : Super Hoop - - item : Basketball - quantity: 1 - - item: - name: Big Shoes - nick: Biggies - quantity: 1 -php: | - [ - [ - 'item' => 'Super Hoop', - ], - [ - 'item' => 'Basketball', - 'quantity' => 1, - ], - [ - 'item' => [ - 'name' => 'Big Shoes', - 'nick' => 'Biggies' - ], - 'quantity' => 1 - ] - ] ---- -test: Compact notation combined with inline notation -brief: | - Combinations of compact and inline notation are allowed -yaml: | - --- - items: - - { item: Super Hoop, quantity: 1 } - - [ Basketball, Big Shoes ] -php: | - [ - 'items' => [ - [ - 'item' => 'Super Hoop', - 'quantity' => 1, - ], - [ - 'Basketball', - 'Big Shoes' - ] - ] - ] ---- %YAML:1.0 -test: Compact notation -brief: | - Compact notation for sets of mappings with single element -yaml: | - --- - # products purchased - - item : Super Hoop - - item : Basketball - quantity: 1 - - item: - name: Big Shoes - nick: Biggies - quantity: 1 -php: | - [ - [ - 'item' => 'Super Hoop', - ], - [ - 'item' => 'Basketball', - 'quantity' => 1, - ], - [ - 'item' => [ - 'name' => 'Big Shoes', - 'nick' => 'Biggies' - ], - 'quantity' => 1 - ] - ] ---- -test: Compact notation combined with inline notation -brief: | - Combinations of compact and inline notation are allowed -yaml: | - --- - items: - - { item: Super Hoop, quantity: 1 } - - [ Basketball, Big Shoes ] -php: | - [ - 'items' => [ - [ - 'item' => 'Super Hoop', - 'quantity' => 1, - ], - [ - 'Basketball', - 'Big Shoes' - ] - ] - ] ---- %YAML:1.0 -test: Compact notation -brief: | - Compact notation for sets of mappings with single element -yaml: | - --- - # products purchased - - item : Super Hoop - - item : Basketball - quantity: 1 - - item: - name: Big Shoes - nick: Biggies - quantity: 1 -php: | - [ - [ - 'item' => 'Super Hoop', - ], - [ - 'item' => 'Basketball', - 'quantity' => 1, - ], - [ - 'item' => [ - 'name' => 'Big Shoes', - 'nick' => 'Biggies' - ], - 'quantity' => 1 - ] - ] ---- -test: Compact notation combined with inline notation -brief: | - Combinations of compact and inline notation are allowed -yaml: | - --- - items: - - { item: Super Hoop, quantity: 1 } - - [ Basketball, Big Shoes ] -php: | - [ - 'items' => [ - [ - 'item' => 'Super Hoop', - 'quantity' => 1, - ], - [ - 'Basketball', - 'Big Shoes' - ] - ] - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml b/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml deleted file mode 100644 index af787ae4..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- %YAML:1.0 -test: Simple In Place Substitution -brief: > - If you want to reuse an entire alias, only overwriting what is different - you can use a << in place substitution. This is not part of the official - YAML spec, but a widely implemented extension. See the following URL for - details: http://yaml.org/type/merge.html -yaml: | - foo: &foo - a: Steve - b: Clark - c: Brian - e: notnull - bar: - a: before - d: other - e: ~ - <<: *foo - b: new - x: Oren - c: - foo: bar - bar: foo - bar_inline: {a: before, d: other, <<: *foo, b: new, x: Oren, c: { foo: bar, bar: foo}} - foo2: &foo2 - a: Ballmer - ding: &dong [ fi, fei, fo, fam] - check: - <<: - - *foo - - *dong - isit: tested - head: - <<: [ *foo , *dong , *foo2 ] - taz: &taz - a: Steve - w: - p: 1234 - nested: - <<: *taz - d: Doug - w: &nestedref - p: 12345 - z: - <<: *nestedref - head_inline: &head_inline { <<: [ *foo , *dong , *foo2 ] } - recursive_inline: { <<: *head_inline, c: { <<: *foo2 } } -php: | - [ - 'foo' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull'], - 'bar' => ['a' => 'before', 'd' => 'other', 'e' => null, 'b' => 'new', 'c' => ['foo' => 'bar', 'bar' => 'foo'], 'x' => 'Oren'], - 'bar_inline' => ['a' => 'before', 'd' => 'other', 'b' => 'new', 'c' => ['foo' => 'bar', 'bar' => 'foo'], 'e' => 'notnull', 'x' => 'Oren'], - 'foo2' => ['a' => 'Ballmer'], - 'ding' => ['fi', 'fei', 'fo', 'fam'], - 'check' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam', 'isit' => 'tested'], - 'head' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam'], - 'taz' => ['a' => 'Steve', 'w' => ['p' => 1234]], - 'nested' => ['a' => 'Steve', 'w' => ['p' => 12345], 'd' => 'Doug', 'z' => ['p' => 12345]], - 'head_inline' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam'], - 'recursive_inline' => ['a' => 'Steve', 'b' => 'Clark', 'c' => ['a' => 'Ballmer'], 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam'], - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml b/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml deleted file mode 100644 index 144615f2..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- %YAML:1.0 -test: Objects -brief: > - Comments at the end of a line -yaml: | - ex1: "foo # bar" - ex2: "foo # bar" # comment - ex3: 'foo # bar' # comment - ex4: foo # comment -php: | - ['ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo'] diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml b/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml deleted file mode 100644 index c8326fdb..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- %YAML:1.0 -test: Some characters at the beginning of a string must be escaped -brief: > - Some characters at the beginning of a string must be escaped -yaml: | - foo: '| bar' -php: | - ['foo' => '| bar'] ---- -test: A key can be a quoted string -brief: > - A key can be a quoted string -yaml: | - "foo1": bar - 'foo2': bar - "foo \" bar": bar - 'foo '' bar': bar - 'foo3: ': bar - "foo4: ": bar - foo5: { "foo \" bar: ": bar, 'foo '' bar: ': bar } -php: | - [ - 'foo1' => 'bar', - 'foo2' => 'bar', - 'foo " bar' => 'bar', - 'foo \' bar' => 'bar', - 'foo3: ' => 'bar', - 'foo4: ' => 'bar', - 'foo5' => [ - 'foo " bar: ' => 'bar', - 'foo \' bar: ' => 'bar', - ], - ] diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml b/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml deleted file mode 100644 index 2ea417a7..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml +++ /dev/null @@ -1,140 +0,0 @@ ---- %YAML:1.0 -test: Multiple quoted string on one line -brief: > - Multiple quoted string on one line -yaml: | - stripped_title: { name: "foo bar", help: "bar foo" } -php: | - ['stripped_title' => ['name' => 'foo bar', 'help' => 'bar foo']] ---- -test: Empty sequence -yaml: | - foo: [ ] -php: | - ['foo' => []] ---- -test: Empty value -yaml: | - foo: -php: | - ['foo' => null] ---- -test: Inline string parsing -brief: > - Inline string parsing -yaml: | - test: ['complex: string', 'another [string]'] -php: | - ['test' => ['complex: string', 'another [string]']] ---- -test: Boolean -brief: > - Boolean -yaml: | - - false - - true - - null - - ~ - - 'false' - - 'true' - - 'null' - - '~' -php: | - [ - false, - true, - null, - null, - 'false', - 'true', - 'null', - '~', - ] ---- -test: Empty lines in literal blocks -brief: > - Empty lines in literal blocks -yaml: | - foo: - bar: | - foo - - - - bar -php: | - ['foo' => ['bar' => "foo\n\n\n \nbar\n"]] ---- -test: Empty lines in folded blocks -brief: > - Empty lines in folded blocks -yaml: | - foo: - bar: > - - foo - - - bar -php: | - ['foo' => ['bar' => "\nfoo\n\nbar\n"]] ---- -test: IP addresses -brief: > - IP addresses -yaml: | - foo: 10.0.0.2 -php: | - ['foo' => '10.0.0.2'] ---- -test: A sequence with an embedded mapping -brief: > - A sequence with an embedded mapping -yaml: | - - foo - - bar: { bar: foo } -php: | - ['foo', ['bar' => ['bar' => 'foo']]] ---- -test: Octal -brief: as in spec example 2.19, octal value is converted -yaml: | - foo: 0123 -php: | - ['foo' => 83] ---- -test: Octal strings -brief: Octal notation in a string must remain a string -yaml: | - foo: "0123" -php: | - ['foo' => '0123'] ---- -test: Octal strings -brief: Octal notation in a string must remain a string -yaml: | - foo: '0123' -php: | - ['foo' => '0123'] ---- -test: Octal strings -brief: Octal notation in a string must remain a string -yaml: | - foo: | - 0123 -php: | - ['foo' => "0123\n"] ---- -test: Document as a simple hash -brief: Document as a simple hash -yaml: | - { foo: bar } -php: | - ['foo' => 'bar'] ---- -test: Document as a simple array -brief: Document as a simple array -yaml: | - [ foo, bar ] -php: | - ['foo', 'bar'] diff --git a/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml b/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml deleted file mode 100644 index c85952df..00000000 --- a/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml +++ /dev/null @@ -1,82 +0,0 @@ ---- %YAML:1.0 -test: Unindented collection -brief: > - Unindented collection -yaml: | - collection: - - item1 - - item2 - - item3 -php: | - ['collection' => ['item1', 'item2', 'item3']] ---- -test: Nested unindented collection (two levels) -brief: > - Nested unindented collection -yaml: | - collection: - key: - - a - - b - - c -php: | - ['collection' => ['key' => ['a', 'b', 'c']]] ---- -test: Nested unindented collection (three levels) -brief: > - Nested unindented collection -yaml: | - collection: - key: - subkey: - - one - - two - - three -php: | - ['collection' => ['key' => ['subkey' => ['one', 'two', 'three']]]] ---- -test: Key/value after unindented collection (1) -brief: > - Key/value after unindented collection (1) -yaml: | - collection: - key: - - a - - b - - c - foo: bar -php: | - ['collection' => ['key' => ['a', 'b', 'c']], 'foo' => 'bar'] ---- -test: Key/value after unindented collection (at the same level) -brief: > - Key/value after unindented collection -yaml: | - collection: - key: - - a - - b - - c - foo: bar -php: | - ['collection' => ['key' => ['a', 'b', 'c'], 'foo' => 'bar']] ---- -test: Shortcut Key after unindented collection -brief: > - Key/value after unindented collection -yaml: | - collection: - - key: foo - foo: bar -php: | - ['collection' => [['key' => 'foo', 'foo' => 'bar']]] ---- -test: Shortcut Key after unindented collection with custom spaces -brief: > - Key/value after unindented collection -yaml: | - collection: - - key: foo - foo: bar -php: | - ['collection' => [['key' => 'foo', 'foo' => 'bar']]] diff --git a/vendor/symfony/yaml/Tests/InlineTest.php b/vendor/symfony/yaml/Tests/InlineTest.php deleted file mode 100644 index f64cc682..00000000 --- a/vendor/symfony/yaml/Tests/InlineTest.php +++ /dev/null @@ -1,873 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Yaml\Exception\ParseException; -use Symfony\Component\Yaml\Inline; -use Symfony\Component\Yaml\Yaml; - -class InlineTest extends TestCase -{ - protected function setUp() - { - Inline::initialize(0, 0); - } - - /** - * @dataProvider getTestsForParse - */ - public function testParse($yaml, $value, $flags = 0) - { - $this->assertSame($value, Inline::parse($yaml, $flags), sprintf('::parse() converts an inline YAML to a PHP structure (%s)', $yaml)); - } - - /** - * @dataProvider getTestsForParseWithMapObjects - */ - public function testParseWithMapObjects($yaml, $value, $flags = Yaml::PARSE_OBJECT_FOR_MAP) - { - $actual = Inline::parse($yaml, $flags); - - $this->assertSame(serialize($value), serialize($actual)); - } - - /** - * @dataProvider getTestsForParsePhpConstants - */ - public function testParsePhpConstants($yaml, $value) - { - $actual = Inline::parse($yaml, Yaml::PARSE_CONSTANT); - - $this->assertSame($value, $actual); - } - - public function getTestsForParsePhpConstants() - { - return [ - ['!php/const Symfony\Component\Yaml\Yaml::PARSE_CONSTANT', Yaml::PARSE_CONSTANT], - ['!php/const PHP_INT_MAX', \PHP_INT_MAX], - ['[!php/const PHP_INT_MAX]', [\PHP_INT_MAX]], - ['{ foo: !php/const PHP_INT_MAX }', ['foo' => \PHP_INT_MAX]], - ['{ !php/const PHP_INT_MAX: foo }', [\PHP_INT_MAX => 'foo']], - ['!php/const NULL', null], - ]; - } - - public function testParsePhpConstantThrowsExceptionWhenUndefined() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('The constant "WRONG_CONSTANT" is not defined'); - Inline::parse('!php/const WRONG_CONSTANT', Yaml::PARSE_CONSTANT); - } - - public function testParsePhpConstantThrowsExceptionOnInvalidType() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessageMatches('#The string "!php/const PHP_INT_MAX" could not be parsed as a constant.*#'); - Inline::parse('!php/const PHP_INT_MAX', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE); - } - - /** - * @group legacy - * @expectedDeprecation The !php/const: tag to indicate dumped PHP constants is deprecated since Symfony 3.4 and will be removed in 4.0. Use the !php/const (without the colon) tag instead on line 1. - * @dataProvider getTestsForParseLegacyPhpConstants - */ - public function testDeprecatedConstantTag($yaml, $expectedValue) - { - $this->assertSame($expectedValue, Inline::parse($yaml, Yaml::PARSE_CONSTANT)); - } - - public function getTestsForParseLegacyPhpConstants() - { - return [ - ['!php/const:Symfony\Component\Yaml\Yaml::PARSE_CONSTANT', Yaml::PARSE_CONSTANT], - ['!php/const:PHP_INT_MAX', \PHP_INT_MAX], - ['[!php/const:PHP_INT_MAX]', [\PHP_INT_MAX]], - ['{ foo: !php/const:PHP_INT_MAX }', ['foo' => \PHP_INT_MAX]], - ['{ !php/const:PHP_INT_MAX: foo }', [\PHP_INT_MAX => 'foo']], - ['!php/const:NULL', null], - ]; - } - - /** - * @group legacy - * @dataProvider getTestsForParseWithMapObjects - */ - public function testParseWithMapObjectsPassingTrue($yaml, $value) - { - $actual = Inline::parse($yaml, false, false, true); - - $this->assertSame(serialize($value), serialize($actual)); - } - - /** - * @dataProvider getTestsForDump - */ - public function testDump($yaml, $value, $parseFlags = 0) - { - $this->assertEquals($yaml, Inline::dump($value), sprintf('::dump() converts a PHP structure to an inline YAML (%s)', $yaml)); - - $this->assertSame($value, Inline::parse(Inline::dump($value), $parseFlags), 'check consistency'); - } - - public function testDumpNumericValueWithLocale() - { - $locale = setlocale(\LC_NUMERIC, 0); - if (false === $locale) { - $this->markTestSkipped('Your platform does not support locales.'); - } - - try { - $requiredLocales = ['fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252']; - if (false === setlocale(\LC_NUMERIC, $requiredLocales)) { - $this->markTestSkipped('Could not set any of required locales: '.implode(', ', $requiredLocales)); - } - - $this->assertEquals('1.2', Inline::dump(1.2)); - $this->assertStringContainsStringIgnoringCase('fr', setlocale(\LC_NUMERIC, 0)); - } finally { - setlocale(\LC_NUMERIC, $locale); - } - } - - public function testHashStringsResemblingExponentialNumericsShouldNotBeChangedToINF() - { - $value = '686e444'; - - $this->assertSame($value, Inline::parse(Inline::dump($value))); - } - - public function testParseScalarWithNonEscapedBlackslashShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Found unknown escape character "\V".'); - Inline::parse('"Foo\Var"'); - } - - public function testParseScalarWithNonEscapedBlackslashAtTheEndShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - Inline::parse('"Foo\\"'); - } - - public function testParseScalarWithIncorrectlyQuotedStringShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $value = "'don't do somthin' like that'"; - Inline::parse($value); - } - - public function testParseScalarWithIncorrectlyDoubleQuotedStringShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $value = '"don"t do somthin" like that"'; - Inline::parse($value); - } - - public function testParseInvalidMappingKeyShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $value = '{ "foo " bar": "bar" }'; - Inline::parse($value); - } - - /** - * @group legacy - * @expectedDeprecation Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since Symfony 3.2 and will throw a ParseException in 4.0 on line 1. - * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0 - */ - public function testParseMappingKeyWithColonNotFollowedBySpace() - { - Inline::parse('{1:""}'); - } - - public function testParseInvalidMappingShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - Inline::parse('[foo] bar'); - } - - public function testParseInvalidSequenceShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - Inline::parse('{ foo: bar } bar'); - } - - public function testParseInvalidTaggedSequenceShouldThrowException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - Inline::parse('!foo { bar: baz } qux', Yaml::PARSE_CUSTOM_TAGS); - } - - public function testParseScalarWithCorrectlyQuotedStringShouldReturnString() - { - $value = "'don''t do somthin'' like that'"; - $expect = "don't do somthin' like that"; - - $this->assertSame($expect, Inline::parseScalar($value)); - } - - /** - * @dataProvider getDataForParseReferences - */ - public function testParseReferences($yaml, $expected) - { - $this->assertSame($expected, Inline::parse($yaml, 0, ['var' => 'var-value'])); - } - - /** - * @group legacy - * @dataProvider getDataForParseReferences - */ - public function testParseReferencesAsFifthArgument($yaml, $expected) - { - $this->assertSame($expected, Inline::parse($yaml, false, false, false, ['var' => 'var-value'])); - } - - public function getDataForParseReferences() - { - return [ - 'scalar' => ['*var', 'var-value'], - 'list' => ['[ *var ]', ['var-value']], - 'list-in-list' => ['[[ *var ]]', [['var-value']]], - 'map-in-list' => ['[ { key: *var } ]', [['key' => 'var-value']]], - 'embedded-mapping-in-list' => ['[ key: *var ]', [['key' => 'var-value']]], - 'map' => ['{ key: *var }', ['key' => 'var-value']], - 'list-in-map' => ['{ key: [*var] }', ['key' => ['var-value']]], - 'map-in-map' => ['{ foo: { bar: *var } }', ['foo' => ['bar' => 'var-value']]], - ]; - } - - public function testParseMapReferenceInSequence() - { - $foo = [ - 'a' => 'Steve', - 'b' => 'Clark', - 'c' => 'Brian', - ]; - $this->assertSame([$foo], Inline::parse('[*foo]', 0, ['foo' => $foo])); - } - - /** - * @group legacy - */ - public function testParseMapReferenceInSequenceAsFifthArgument() - { - $foo = [ - 'a' => 'Steve', - 'b' => 'Clark', - 'c' => 'Brian', - ]; - $this->assertSame([$foo], Inline::parse('[*foo]', false, false, false, ['foo' => $foo])); - } - - public function testParseUnquotedAsterisk() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('A reference must contain at least one character at line 1.'); - Inline::parse('{ foo: * }'); - } - - public function testParseUnquotedAsteriskFollowedByAComment() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('A reference must contain at least one character at line 1.'); - Inline::parse('{ foo: * #foo }'); - } - - /** - * @dataProvider getReservedIndicators - */ - public function testParseUnquotedScalarStartingWithReservedIndicator($indicator) - { - $this->expectException(ParseException::class); - $this->expectExceptionMessage(sprintf('cannot start a plain scalar; you need to quote the scalar at line 1 (near "%sfoo ").', $indicator)); - - Inline::parse(sprintf('{ foo: %sfoo }', $indicator)); - } - - public function getReservedIndicators() - { - return [['@'], ['`']]; - } - - /** - * @dataProvider getScalarIndicators - */ - public function testParseUnquotedScalarStartingWithScalarIndicator($indicator) - { - $this->expectException(ParseException::class); - $this->expectExceptionMessage(sprintf('cannot start a plain scalar; you need to quote the scalar at line 1 (near "%sfoo ").', $indicator)); - - Inline::parse(sprintf('{ foo: %sfoo }', $indicator)); - } - - public function getScalarIndicators() - { - return [['|'], ['>']]; - } - - /** - * @group legacy - * @expectedDeprecation Not quoting the scalar "%bar " starting with the "%" indicator character is deprecated since Symfony 3.1 and will throw a ParseException in 4.0 on line 1. - * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0 - */ - public function testParseUnquotedScalarStartingWithPercentCharacter() - { - Inline::parse('{ foo: %bar }'); - } - - /** - * @dataProvider getDataForIsHash - */ - public function testIsHash($array, $expected) - { - $this->assertSame($expected, Inline::isHash($array)); - } - - public function getDataForIsHash() - { - return [ - [[], false], - [[1, 2, 3], false], - [[2 => 1, 1 => 2, 0 => 3], true], - [['foo' => 1, 'bar' => 2], true], - ]; - } - - public function getTestsForParse() - { - return [ - ['', ''], - ['null', null], - ['false', false], - ['true', true], - ['12', 12], - ['-12', -12], - ['1_2', 12], - ['_12', '_12'], - ['12_', 12], - ['"quoted string"', 'quoted string'], - ["'quoted string'", 'quoted string'], - ['12.30e+02', 12.30e+02], - ['123.45_67', 123.4567], - ['0x4D2', 0x4D2], - ['0x_4_D_2_', 0x4D2], - ['02333', 02333], - ['0_2_3_3_3', 02333], - ['.Inf', -log(0)], - ['-.Inf', log(0)], - ["'686e444'", '686e444'], - ['686e444', 646e444], - ['123456789123456789123456789123456789', '123456789123456789123456789123456789'], - ['"foo\r\nbar"', "foo\r\nbar"], - ["'foo#bar'", 'foo#bar'], - ["'foo # bar'", 'foo # bar'], - ["'#cfcfcf'", '#cfcfcf'], - ['::form_base.html.twig', '::form_base.html.twig'], - - // Pre-YAML-1.2 booleans - ["'y'", 'y'], - ["'n'", 'n'], - ["'yes'", 'yes'], - ["'no'", 'no'], - ["'on'", 'on'], - ["'off'", 'off'], - - ['2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)], - ['2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)], - ['2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)], - ['1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)], - ['1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)], - - ['"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''], - ["'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''], - - // sequences - // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon - ['[foo, http://urls.are/no/mappings, false, null, 12]', ['foo', 'http://urls.are/no/mappings', false, null, 12]], - ['[ foo , bar , false , null , 12 ]', ['foo', 'bar', false, null, 12]], - ['[\'foo,bar\', \'foo bar\']', ['foo,bar', 'foo bar']], - - // mappings - ['{foo: bar,bar: foo,"false": false, "null": null,integer: 12}', ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12]], - ['{ foo : bar, bar : foo, "false" : false, "null" : null, integer : 12 }', ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12]], - ['{foo: \'bar\', bar: \'foo: bar\'}', ['foo' => 'bar', 'bar' => 'foo: bar']], - ['{\'foo\': \'bar\', "bar": \'foo: bar\'}', ['foo' => 'bar', 'bar' => 'foo: bar']], - ['{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', ['foo\'' => 'bar', 'bar"' => 'foo: bar']], - ['{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', ['foo: ' => 'bar', 'bar: ' => 'foo: bar']], - ['{"foo:bar": "baz"}', ['foo:bar' => 'baz']], - ['{"foo":"bar"}', ['foo' => 'bar']], - - // nested sequences and mappings - ['[foo, [bar, foo]]', ['foo', ['bar', 'foo']]], - ['[foo, {bar: foo}]', ['foo', ['bar' => 'foo']]], - ['{ foo: {bar: foo} }', ['foo' => ['bar' => 'foo']]], - ['{ foo: [bar, foo] }', ['foo' => ['bar', 'foo']]], - ['{ foo:{bar: foo} }', ['foo' => ['bar' => 'foo']]], - ['{ foo:[bar, foo] }', ['foo' => ['bar', 'foo']]], - - ['[ foo, [ bar, foo ] ]', ['foo', ['bar', 'foo']]], - - ['[{ foo: {bar: foo} }]', [['foo' => ['bar' => 'foo']]]], - - ['[foo, [bar, [foo, [bar, foo]], foo]]', ['foo', ['bar', ['foo', ['bar', 'foo']], 'foo']]], - - ['[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', ['foo', ['bar' => 'foo', 'foo' => ['foo', ['bar' => 'foo']]], ['foo', ['bar' => 'foo']]]], - - ['[foo, bar: { foo: bar }]', ['foo', '1' => ['bar' => ['foo' => 'bar']]]], - ['[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', ['foo', '@foo.baz', ['%foo%' => 'foo is %foo%', 'bar' => '%foo%'], true, '@service_container']], - ]; - } - - public function getTestsForParseWithMapObjects() - { - return [ - ['', ''], - ['null', null], - ['false', false], - ['true', true], - ['12', 12], - ['-12', -12], - ['"quoted string"', 'quoted string'], - ["'quoted string'", 'quoted string'], - ['12.30e+02', 12.30e+02], - ['0x4D2', 0x4D2], - ['02333', 02333], - ['.Inf', -log(0)], - ['-.Inf', log(0)], - ["'686e444'", '686e444'], - ['686e444', 646e444], - ['123456789123456789123456789123456789', '123456789123456789123456789123456789'], - ['"foo\r\nbar"', "foo\r\nbar"], - ["'foo#bar'", 'foo#bar'], - ["'foo # bar'", 'foo # bar'], - ["'#cfcfcf'", '#cfcfcf'], - ['::form_base.html.twig', '::form_base.html.twig'], - - ['2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)], - ['2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)], - ['2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)], - ['1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)], - ['1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)], - - ['"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''], - ["'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''], - - // sequences - // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon - ['[foo, http://urls.are/no/mappings, false, null, 12]', ['foo', 'http://urls.are/no/mappings', false, null, 12]], - ['[ foo , bar , false , null , 12 ]', ['foo', 'bar', false, null, 12]], - ['[\'foo,bar\', \'foo bar\']', ['foo,bar', 'foo bar']], - - // mappings - ['{foo: bar,bar: foo,"false": false,"null": null,integer: 12}', (object) ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12], Yaml::PARSE_OBJECT_FOR_MAP], - ['{ foo : bar, bar : foo, "false" : false, "null" : null, integer : 12 }', (object) ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12], Yaml::PARSE_OBJECT_FOR_MAP], - ['{foo: \'bar\', bar: \'foo: bar\'}', (object) ['foo' => 'bar', 'bar' => 'foo: bar']], - ['{\'foo\': \'bar\', "bar": \'foo: bar\'}', (object) ['foo' => 'bar', 'bar' => 'foo: bar']], - ['{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', (object) ['foo\'' => 'bar', 'bar"' => 'foo: bar']], - ['{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', (object) ['foo: ' => 'bar', 'bar: ' => 'foo: bar']], - ['{"foo:bar": "baz"}', (object) ['foo:bar' => 'baz']], - ['{"foo":"bar"}', (object) ['foo' => 'bar']], - - // nested sequences and mappings - ['[foo, [bar, foo]]', ['foo', ['bar', 'foo']]], - ['[foo, {bar: foo}]', ['foo', (object) ['bar' => 'foo']]], - ['{ foo: {bar: foo} }', (object) ['foo' => (object) ['bar' => 'foo']]], - ['{ foo: [bar, foo] }', (object) ['foo' => ['bar', 'foo']]], - - ['[ foo, [ bar, foo ] ]', ['foo', ['bar', 'foo']]], - - ['[{ foo: {bar: foo} }]', [(object) ['foo' => (object) ['bar' => 'foo']]]], - - ['[foo, [bar, [foo, [bar, foo]], foo]]', ['foo', ['bar', ['foo', ['bar', 'foo']], 'foo']]], - - ['[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', ['foo', (object) ['bar' => 'foo', 'foo' => ['foo', (object) ['bar' => 'foo']]], ['foo', (object) ['bar' => 'foo']]]], - - ['[foo, bar: { foo: bar }]', ['foo', '1' => (object) ['bar' => (object) ['foo' => 'bar']]]], - ['[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', ['foo', '@foo.baz', (object) ['%foo%' => 'foo is %foo%', 'bar' => '%foo%'], true, '@service_container']], - - ['{}', new \stdClass()], - ['{ foo : bar, bar : {} }', (object) ['foo' => 'bar', 'bar' => new \stdClass()]], - ['{ foo : [], bar : {} }', (object) ['foo' => [], 'bar' => new \stdClass()]], - ['{foo: \'bar\', bar: {} }', (object) ['foo' => 'bar', 'bar' => new \stdClass()]], - ['{\'foo\': \'bar\', "bar": {}}', (object) ['foo' => 'bar', 'bar' => new \stdClass()]], - ['{\'foo\': \'bar\', "bar": \'{}\'}', (object) ['foo' => 'bar', 'bar' => '{}']], - - ['[foo, [{}, {}]]', ['foo', [new \stdClass(), new \stdClass()]]], - ['[foo, [[], {}]]', ['foo', [[], new \stdClass()]]], - ['[foo, [[{}, {}], {}]]', ['foo', [[new \stdClass(), new \stdClass()], new \stdClass()]]], - ['[foo, {bar: {}}]', ['foo', '1' => (object) ['bar' => new \stdClass()]]], - ]; - } - - public function getTestsForDump() - { - return [ - ['null', null], - ['false', false], - ['true', true], - ['12', 12], - ["'1_2'", '1_2'], - ['_12', '_12'], - ["'12_'", '12_'], - ["'quoted string'", 'quoted string'], - ['!!float 1230', 12.30e+02], - ['1234', 0x4D2], - ['1243', 02333], - ["'0x_4_D_2_'", '0x_4_D_2_'], - ["'0_2_3_3_3'", '0_2_3_3_3'], - ['.Inf', -log(0)], - ['-.Inf', log(0)], - ["'686e444'", '686e444'], - ['"foo\r\nbar"', "foo\r\nbar"], - ["'foo#bar'", 'foo#bar'], - ["'foo # bar'", 'foo # bar'], - ["'#cfcfcf'", '#cfcfcf'], - - ["'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''], - - ["'-dash'", '-dash'], - ["'-'", '-'], - - // Pre-YAML-1.2 booleans - ["'y'", 'y'], - ["'n'", 'n'], - ["'yes'", 'yes'], - ["'no'", 'no'], - ["'on'", 'on'], - ["'off'", 'off'], - - // sequences - ['[foo, bar, false, null, 12]', ['foo', 'bar', false, null, 12]], - ['[\'foo,bar\', \'foo bar\']', ['foo,bar', 'foo bar']], - - // mappings - ['{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }', ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12]], - ['{ foo: bar, bar: \'foo: bar\' }', ['foo' => 'bar', 'bar' => 'foo: bar']], - - // nested sequences and mappings - ['[foo, [bar, foo]]', ['foo', ['bar', 'foo']]], - - ['[foo, [bar, [foo, [bar, foo]], foo]]', ['foo', ['bar', ['foo', ['bar', 'foo']], 'foo']]], - - ['{ foo: { bar: foo } }', ['foo' => ['bar' => 'foo']]], - - ['[foo, { bar: foo }]', ['foo', ['bar' => 'foo']]], - - ['[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]', ['foo', ['bar' => 'foo', 'foo' => ['foo', ['bar' => 'foo']]], ['foo', ['bar' => 'foo']]]], - - ['[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', ['foo', '@foo.baz', ['%foo%' => 'foo is %foo%', 'bar' => '%foo%'], true, '@service_container']], - - ['{ foo: { bar: { 1: 2, baz: 3 } } }', ['foo' => ['bar' => [1 => 2, 'baz' => 3]]]], - - // numeric strings with trailing whitespaces - ["'0123 '", '0123 '], - ['"0123\f"', "0123\f"], - ['"0123\n"', "0123\n"], - ['"0123\r"', "0123\r"], - ['"0123\t"', "0123\t"], - ['"0123\v"', "0123\v"], - ]; - } - - /** - * @dataProvider getTimestampTests - */ - public function testParseTimestampAsUnixTimestampByDefault($yaml, $year, $month, $day, $hour, $minute, $second) - { - $this->assertSame(gmmktime($hour, $minute, $second, $month, $day, $year), Inline::parse($yaml)); - } - - /** - * @dataProvider getTimestampTests - */ - public function testParseTimestampAsDateTimeObject($yaml, $year, $month, $day, $hour, $minute, $second, $timezone) - { - $expected = new \DateTime($yaml); - $expected->setTimeZone(new \DateTimeZone('UTC')); - $expected->setDate($year, $month, $day); - - if (\PHP_VERSION_ID >= 70100) { - $expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second)); - } else { - $expected->setTime($hour, $minute, $second); - } - - $date = Inline::parse($yaml, Yaml::PARSE_DATETIME); - $this->assertEquals($expected, $date); - $this->assertSame($timezone, $date->format('O')); - } - - public function getTimestampTests() - { - return [ - 'canonical' => ['2001-12-15T02:59:43.1Z', 2001, 12, 15, 2, 59, 43.1, '+0000'], - 'ISO-8601' => ['2001-12-15t21:59:43.10-05:00', 2001, 12, 16, 2, 59, 43.1, '-0500'], - 'spaced' => ['2001-12-15 21:59:43.10 -5', 2001, 12, 16, 2, 59, 43.1, '-0500'], - 'date' => ['2001-12-15', 2001, 12, 15, 0, 0, 0, '+0000'], - ]; - } - - /** - * @dataProvider getTimestampTests - */ - public function testParseNestedTimestampListAsDateTimeObject($yaml, $year, $month, $day, $hour, $minute, $second) - { - $expected = new \DateTime($yaml); - $expected->setTimeZone(new \DateTimeZone('UTC')); - $expected->setDate($year, $month, $day); - if (\PHP_VERSION_ID >= 70100) { - $expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second)); - } else { - $expected->setTime($hour, $minute, $second); - } - - $expectedNested = ['nested' => [$expected]]; - $yamlNested = "{nested: [$yaml]}"; - - $this->assertEquals($expectedNested, Inline::parse($yamlNested, Yaml::PARSE_DATETIME)); - } - - /** - * @dataProvider getDateTimeDumpTests - */ - public function testDumpDateTime($dateTime, $expected) - { - $this->assertSame($expected, Inline::dump($dateTime)); - } - - public function getDateTimeDumpTests() - { - $tests = []; - - $dateTime = new \DateTime('2001-12-15 21:59:43', new \DateTimeZone('UTC')); - $tests['date-time-utc'] = [$dateTime, '2001-12-15T21:59:43+00:00']; - - $dateTime = new \DateTimeImmutable('2001-07-15 21:59:43', new \DateTimeZone('Europe/Berlin')); - $tests['immutable-date-time-europe-berlin'] = [$dateTime, '2001-07-15T21:59:43+02:00']; - - return $tests; - } - - /** - * @dataProvider getBinaryData - */ - public function testParseBinaryData($data) - { - $this->assertSame('Hello world', Inline::parse($data)); - } - - public function getBinaryData() - { - return [ - 'enclosed with double quotes' => ['!!binary "SGVsbG8gd29ybGQ="'], - 'enclosed with single quotes' => ["!!binary 'SGVsbG8gd29ybGQ='"], - 'containing spaces' => ['!!binary "SGVs bG8gd 29ybGQ="'], - ]; - } - - /** - * @dataProvider getInvalidBinaryData - */ - public function testParseInvalidBinaryData($data, $expectedMessage) - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessageMatches($expectedMessage); - - Inline::parse($data); - } - - public function getInvalidBinaryData() - { - return [ - 'length not a multiple of four' => ['!!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'], - 'invalid characters' => ['!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'], - 'too many equals characters' => ['!!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'], - 'misplaced equals character' => ['!!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'], - ]; - } - - public function testNotSupportedMissingValue() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Malformed inline YAML string: "{this, is not, supported}" at line 1.'); - Inline::parse('{this, is not, supported}'); - } - - public function testVeryLongQuotedStrings() - { - $longStringWithQuotes = str_repeat("x\r\n\\\"x\"x", 1000); - - $yamlString = Inline::dump(['longStringWithQuotes' => $longStringWithQuotes]); - $arrayFromYaml = Inline::parse($yamlString); - - $this->assertEquals($longStringWithQuotes, $arrayFromYaml['longStringWithQuotes']); - } - - /** - * @group legacy - * @expectedDeprecation Omitting the key of a mapping is deprecated and will throw a ParseException in 4.0 on line 1. - */ - public function testOmittedMappingKeyIsParsedAsColon() - { - $this->assertSame([':' => 'foo'], Inline::parse('{: foo}')); - } - - /** - * @dataProvider getTestsForNullValues - */ - public function testParseMissingMappingValueAsNull($yaml, $expected) - { - $this->assertSame($expected, Inline::parse($yaml)); - } - - public function getTestsForNullValues() - { - return [ - 'null before closing curly brace' => ['{foo:}', ['foo' => null]], - 'null before comma' => ['{foo:, bar: baz}', ['foo' => null, 'bar' => 'baz']], - ]; - } - - public function testTheEmptyStringIsAValidMappingKey() - { - $this->assertSame(['' => 'foo'], Inline::parse('{ "": foo }')); - } - - /** - * @group legacy - * @expectedDeprecation Implicit casting of incompatible mapping keys to strings is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead on line 1. - * @dataProvider getNotPhpCompatibleMappingKeyData - */ - public function testImplicitStringCastingOfMappingKeysIsDeprecated($yaml, $expected) - { - $this->assertSame($expected, Inline::parse($yaml)); - } - - /** - * @group legacy - * @expectedDeprecation Using the Yaml::PARSE_KEYS_AS_STRINGS flag is deprecated since Symfony 3.4 as it will be removed in 4.0. Quote your keys when they are evaluable instead. - * @expectedDeprecation Implicit casting of incompatible mapping keys to strings is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead on line 1. - * @dataProvider getNotPhpCompatibleMappingKeyData - */ - public function testExplicitStringCastingOfMappingKeys($yaml, $expected) - { - $this->assertSame($expected, Yaml::parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS)); - } - - public function getNotPhpCompatibleMappingKeyData() - { - return [ - 'boolean-true' => ['{true: "foo"}', ['true' => 'foo']], - 'boolean-false' => ['{false: "foo"}', ['false' => 'foo']], - 'null' => ['{null: "foo"}', ['null' => 'foo']], - 'float' => ['{0.25: "foo"}', ['0.25' => 'foo']], - ]; - } - - /** - * @group legacy - * @expectedDeprecation Support for the !str tag is deprecated since Symfony 3.4. Use the !!str tag instead on line 1. - */ - public function testDeprecatedStrTag() - { - $this->assertSame(['foo' => 'bar'], Inline::parse('{ foo: !str bar }')); - } - - public function testUnfinishedInlineMap() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Unexpected end of line, expected one of ",}" at line 1 (near "{abc: \'def\'").'); - Inline::parse("{abc: 'def'"); - } - - /** - * @dataProvider getTestsForOctalNumbers - */ - public function testParseOctalNumbers($expected, $yaml) - { - self::assertSame($expected, Inline::parse($yaml)); - } - - public function getTestsForOctalNumbers() - { - return [ - 'positive octal number' => [28, '034'], - 'negative octal number' => [-28, '-034'], - ]; - } - - /** - * @dataProvider phpObjectTagWithEmptyValueProvider - */ - public function testPhpObjectWithEmptyValue($expected, $value) - { - $this->assertSame($expected, Inline::parse($value, Yaml::PARSE_OBJECT)); - } - - public function phpObjectTagWithEmptyValueProvider() - { - return [ - [false, '!php/object'], - [false, '!php/object '], - [false, '!php/object '], - [[false], '[!php/object]'], - [[false], '[!php/object ]'], - [[false, 'foo'], '[!php/object , foo]'], - ]; - } - - /** - * @dataProvider phpConstTagWithEmptyValueProvider - */ - public function testPhpConstTagWithEmptyValue($expected, $value) - { - $this->assertSame($expected, Inline::parse($value, Yaml::PARSE_CONSTANT)); - } - - public function phpConstTagWithEmptyValueProvider() - { - return [ - ['', '!php/const'], - ['', '!php/const '], - ['', '!php/const '], - [[''], '[!php/const]'], - [[''], '[!php/const ]'], - [['', 'foo'], '[!php/const , foo]'], - [['' => 'foo'], '{!php/const: foo}'], - [['' => 'foo'], '{!php/const : foo}'], - [['' => 'foo', 'bar' => 'ccc'], '{!php/const : foo, bar: ccc}'], - ]; - } - - public function testParsePositiveOctalNumberContainingInvalidDigits() - { - self::assertSame('0123456789', Inline::parse('0123456789')); - } - - public function testParseNegativeOctalNumberContainingInvalidDigits() - { - self::assertSame('-0123456789', Inline::parse('-0123456789')); - } - - public function testParseCommentNotPrefixedBySpaces() - { - self::assertSame('foo', Inline::parse('"foo"#comment')); - } - - public function testParseUnquotedStringContainingHashTagNotPrefixedBySpace() - { - self::assertSame('foo#nocomment', Inline::parse('foo#nocomment')); - } -} diff --git a/vendor/symfony/yaml/Tests/ParseExceptionTest.php b/vendor/symfony/yaml/Tests/ParseExceptionTest.php deleted file mode 100644 index 39579ede..00000000 --- a/vendor/symfony/yaml/Tests/ParseExceptionTest.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Yaml\Exception\ParseException; - -class ParseExceptionTest extends TestCase -{ - public function testGetMessage() - { - $exception = new ParseException('Error message', 42, 'foo: bar', '/var/www/app/config.yml'); - $message = 'Error message in "/var/www/app/config.yml" at line 42 (near "foo: bar")'; - - $this->assertEquals($message, $exception->getMessage()); - } - - public function testGetMessageWithUnicodeInFilename() - { - $exception = new ParseException('Error message', 42, 'foo: bar', 'äöü.yml'); - $message = 'Error message in "äöü.yml" at line 42 (near "foo: bar")'; - - $this->assertEquals($message, $exception->getMessage()); - } -} diff --git a/vendor/symfony/yaml/Tests/ParserTest.php b/vendor/symfony/yaml/Tests/ParserTest.php deleted file mode 100644 index 7fa6ed1a..00000000 --- a/vendor/symfony/yaml/Tests/ParserTest.php +++ /dev/null @@ -1,2401 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Yaml\Parser; -use Symfony\Component\Yaml\Tag\TaggedValue; -use Symfony\Component\Yaml\Yaml; - -class ParserTest extends TestCase -{ - /** @var Parser */ - protected $parser; - - protected function setUp() - { - $this->parser = new Parser(); - } - - protected function tearDown() - { - $this->parser = null; - - chmod(__DIR__.'/Fixtures/not_readable.yml', 0644); - } - - /** - * @dataProvider getDataFormSpecifications - */ - public function testSpecifications($expected, $yaml, $comment, $deprecated) - { - $deprecations = []; - - if ($deprecated) { - set_error_handler(function ($type, $msg) use (&$deprecations) { - if (\E_USER_DEPRECATED !== $type) { - restore_error_handler(); - - return \call_user_func_array('PHPUnit\Util\ErrorHandler::handleError', \func_get_args()); - } - - $deprecations[] = $msg; - - return null; - }); - } - - $this->assertEquals($expected, var_export($this->parser->parse($yaml), true), $comment); - - if ($deprecated) { - restore_error_handler(); - - $this->assertCount(1, $deprecations); - $this->assertStringContainsString(true !== $deprecated ? $deprecated : 'Using the comma as a group separator for floats is deprecated since Symfony 3.2 and will be removed in 4.0 on line 1.', $deprecations[0]); - } - } - - public function getDataFormSpecifications() - { - return $this->loadTestsFromFixtureFiles('index.yml'); - } - - /** - * @group legacy - * @expectedDeprecationMessage Using the Yaml::PARSE_KEYS_AS_STRINGS flag is deprecated since Symfony 3.4 as it will be removed in 4.0. Quote your keys when they are evaluable - * @dataProvider getNonStringMappingKeysData - */ - public function testNonStringMappingKeys($expected, $yaml, $comment) - { - $this->assertSame($expected, var_export($this->parser->parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS), true), $comment); - } - - public function getNonStringMappingKeysData() - { - return $this->loadTestsFromFixtureFiles('nonStringKeys.yml'); - } - - /** - * @group legacy - * @dataProvider getLegacyNonStringMappingKeysData - */ - public function testLegacyNonStringMappingKeys($expected, $yaml, $comment) - { - $this->assertSame($expected, var_export($this->parser->parse($yaml), true), $comment); - } - - public function getLegacyNonStringMappingKeysData() - { - return $this->loadTestsFromFixtureFiles('legacyNonStringKeys.yml'); - } - - public function testTabsInYaml() - { - // test tabs in YAML - $yamls = [ - "foo:\n bar", - "foo:\n bar", - "foo:\n bar", - "foo:\n bar", - ]; - - foreach ($yamls as $yaml) { - try { - $this->parser->parse($yaml); - - $this->fail('YAML files must not contain tabs'); - } catch (\Exception $e) { - $this->assertInstanceOf('\Exception', $e, 'YAML files must not contain tabs'); - $this->assertEquals('A YAML file cannot contain tabs as indentation at line 2 (near "'.strpbrk($yaml, "\t").'").', $e->getMessage(), 'YAML files must not contain tabs'); - } - } - } - - public function testEndOfTheDocumentMarker() - { - $yaml = <<<'EOF' ---- %YAML:1.0 -foo -... -EOF; - - $this->assertEquals('foo', $this->parser->parse($yaml)); - } - - public function getBlockChompingTests() - { - $tests = []; - - $yaml = <<<'EOF' -foo: |- - one - two -bar: |- - one - two - -EOF; - $expected = [ - 'foo' => "one\ntwo", - 'bar' => "one\ntwo", - ]; - $tests['Literal block chomping strip with single trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: |- - one - two - -bar: |- - one - two - - -EOF; - $expected = [ - 'foo' => "one\ntwo", - 'bar' => "one\ntwo", - ]; - $tests['Literal block chomping strip with multiple trailing newlines'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -{} - - -EOF; - $expected = []; - $tests['Literal block chomping strip with multiple trailing newlines after a 1-liner'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: |- - one - two -bar: |- - one - two -EOF; - $expected = [ - 'foo' => "one\ntwo", - 'bar' => "one\ntwo", - ]; - $tests['Literal block chomping strip without trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: | - one - two -bar: | - one - two - -EOF; - $expected = [ - 'foo' => "one\ntwo\n", - 'bar' => "one\ntwo\n", - ]; - $tests['Literal block chomping clip with single trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: | - one - two - -bar: | - one - two - - -EOF; - $expected = [ - 'foo' => "one\ntwo\n", - 'bar' => "one\ntwo\n", - ]; - $tests['Literal block chomping clip with multiple trailing newlines'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: -- bar: | - one - - two -EOF; - $expected = [ - 'foo' => [ - [ - 'bar' => "one\n\ntwo", - ], - ], - ]; - $tests['Literal block chomping clip with embedded blank line inside unindented collection'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: | - one - two -bar: | - one - two -EOF; - $expected = [ - 'foo' => "one\ntwo\n", - 'bar' => "one\ntwo", - ]; - $tests['Literal block chomping clip without trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: |+ - one - two -bar: |+ - one - two - -EOF; - $expected = [ - 'foo' => "one\ntwo\n", - 'bar' => "one\ntwo\n", - ]; - $tests['Literal block chomping keep with single trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: |+ - one - two - -bar: |+ - one - two - - -EOF; - $expected = [ - 'foo' => "one\ntwo\n\n", - 'bar' => "one\ntwo\n\n", - ]; - $tests['Literal block chomping keep with multiple trailing newlines'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: |+ - one - two -bar: |+ - one - two -EOF; - $expected = [ - 'foo' => "one\ntwo\n", - 'bar' => "one\ntwo", - ]; - $tests['Literal block chomping keep without trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: >- - one - two -bar: >- - one - two - -EOF; - $expected = [ - 'foo' => 'one two', - 'bar' => 'one two', - ]; - $tests['Folded block chomping strip with single trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: >- - one - two - -bar: >- - one - two - - -EOF; - $expected = [ - 'foo' => 'one two', - 'bar' => 'one two', - ]; - $tests['Folded block chomping strip with multiple trailing newlines'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: >- - one - two -bar: >- - one - two -EOF; - $expected = [ - 'foo' => 'one two', - 'bar' => 'one two', - ]; - $tests['Folded block chomping strip without trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: > - one - two -bar: > - one - two - -EOF; - $expected = [ - 'foo' => "one two\n", - 'bar' => "one two\n", - ]; - $tests['Folded block chomping clip with single trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: > - one - two - -bar: > - one - two - - -EOF; - $expected = [ - 'foo' => "one two\n", - 'bar' => "one two\n", - ]; - $tests['Folded block chomping clip with multiple trailing newlines'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: > - one - two -bar: > - one - two -EOF; - $expected = [ - 'foo' => "one two\n", - 'bar' => 'one two', - ]; - $tests['Folded block chomping clip without trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: >+ - one - two -bar: >+ - one - two - -EOF; - $expected = [ - 'foo' => "one two\n", - 'bar' => "one two\n", - ]; - $tests['Folded block chomping keep with single trailing newline'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: >+ - one - two - -bar: >+ - one - two - - -EOF; - $expected = [ - 'foo' => "one two\n\n", - 'bar' => "one two\n\n", - ]; - $tests['Folded block chomping keep with multiple trailing newlines'] = [$expected, $yaml]; - - $yaml = <<<'EOF' -foo: >+ - one - two -bar: >+ - one - two -EOF; - $expected = [ - 'foo' => "one two\n", - 'bar' => 'one two', - ]; - $tests['Folded block chomping keep without trailing newline'] = [$expected, $yaml]; - - return $tests; - } - - /** - * @dataProvider getBlockChompingTests - */ - public function testBlockChomping($expected, $yaml) - { - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - /** - * Regression test for issue #7989. - * - * @see https://github.com/symfony/symfony/issues/7989 - */ - public function testBlockLiteralWithLeadingNewlines() - { - $yaml = <<<'EOF' -foo: |- - - - bar - -EOF; - $expected = [ - 'foo' => "\n\nbar", - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testObjectSupportEnabled() - { - $input = <<<'EOF' -foo: !php/object O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";} -bar: 1 -EOF; - $this->assertEquals(['foo' => new B(), 'bar' => 1], $this->parser->parse($input, Yaml::PARSE_OBJECT), '->parse() is able to parse objects'); - } - - /** - * @group legacy - */ - public function testObjectSupportEnabledPassingTrue() - { - $input = <<<'EOF' -foo: !php/object:O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";} -bar: 1 -EOF; - $this->assertEquals(['foo' => new B(), 'bar' => 1], $this->parser->parse($input, false, true), '->parse() is able to parse objects'); - } - - /** - * @group legacy - * @dataProvider deprecatedObjectValueProvider - */ - public function testObjectSupportEnabledWithDeprecatedTag($yaml) - { - $this->assertEquals(['foo' => new B(), 'bar' => 1], $this->parser->parse($yaml, Yaml::PARSE_OBJECT), '->parse() is able to parse objects'); - } - - public function deprecatedObjectValueProvider() - { - return [ - [ - <<assertEquals(['foo' => null, 'bar' => 1], $this->parser->parse($input), '->parse() does not parse objects'); - } - - /** - * @dataProvider getObjectForMapTests - */ - public function testObjectForMap($yaml, $expected) - { - $flags = Yaml::PARSE_OBJECT_FOR_MAP; - - $this->assertEquals($expected, $this->parser->parse($yaml, $flags)); - } - - /** - * @group legacy - * @dataProvider getObjectForMapTests - */ - public function testObjectForMapEnabledWithMappingUsingBooleanToggles($yaml, $expected) - { - $this->assertEquals($expected, $this->parser->parse($yaml, false, false, true)); - } - - public function getObjectForMapTests() - { - $tests = []; - - $yaml = <<<'EOF' -foo: - fiz: [cat] -EOF; - $expected = new \stdClass(); - $expected->foo = new \stdClass(); - $expected->foo->fiz = ['cat']; - $tests['mapping'] = [$yaml, $expected]; - - $yaml = '{ "foo": "bar", "fiz": "cat" }'; - $expected = new \stdClass(); - $expected->foo = 'bar'; - $expected->fiz = 'cat'; - $tests['inline-mapping'] = [$yaml, $expected]; - - $yaml = "foo: bar\nbaz: foobar"; - $expected = new \stdClass(); - $expected->foo = 'bar'; - $expected->baz = 'foobar'; - $tests['object-for-map-is-applied-after-parsing'] = [$yaml, $expected]; - - $yaml = <<<'EOT' -array: - - key: one - - key: two -EOT; - $expected = new \stdClass(); - $expected->array = []; - $expected->array[0] = new \stdClass(); - $expected->array[0]->key = 'one'; - $expected->array[1] = new \stdClass(); - $expected->array[1]->key = 'two'; - $tests['nest-map-and-sequence'] = [$yaml, $expected]; - - $yaml = <<<'YAML' -map: - 1: one - 2: two -YAML; - $expected = new \stdClass(); - $expected->map = new \stdClass(); - $expected->map->{1} = 'one'; - $expected->map->{2} = 'two'; - $tests['numeric-keys'] = [$yaml, $expected]; - - $yaml = <<<'YAML' -map: - '0': one - '1': two -YAML; - $expected = new \stdClass(); - $expected->map = new \stdClass(); - $expected->map->{0} = 'one'; - $expected->map->{1} = 'two'; - $tests['zero-indexed-numeric-keys'] = [$yaml, $expected]; - - return $tests; - } - - /** - * @dataProvider invalidDumpedObjectProvider - */ - public function testObjectsSupportDisabledWithExceptions($yaml) - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->parser->parse($yaml, Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE); - } - - public function testCanParseContentWithTrailingSpaces() - { - $yaml = "items: \n foo: bar"; - - $expected = [ - 'items' => ['foo' => 'bar'], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - /** - * @group legacy - * @dataProvider invalidDumpedObjectProvider - */ - public function testObjectsSupportDisabledWithExceptionsUsingBooleanToggles($yaml) - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->parser->parse($yaml, true); - } - - public function invalidDumpedObjectProvider() - { - $yamlTag = <<<'EOF' -foo: !!php/object:O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";} -bar: 1 -EOF; - $localTag = <<<'EOF' -foo: !php/object:O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";} -bar: 1 -EOF; - - return [ - 'yaml-tag' => [$yamlTag], - 'local-tag' => [$localTag], - ]; - } - - /** - * @requires extension iconv - */ - public function testNonUtf8Exception() - { - $yamls = [ - iconv('UTF-8', 'ISO-8859-1', "foo: 'äöüß'"), - iconv('UTF-8', 'ISO-8859-15', "euro: '€'"), - iconv('UTF-8', 'CP1252', "cp1252: '©ÉÇáñ'"), - ]; - - foreach ($yamls as $yaml) { - try { - $this->parser->parse($yaml); - - $this->fail('charsets other than UTF-8 are rejected.'); - } catch (\Exception $e) { - $this->assertInstanceOf('Symfony\Component\Yaml\Exception\ParseException', $e, 'charsets other than UTF-8 are rejected.'); - } - } - } - - public function testUnindentedCollectionException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $yaml = <<<'EOF' - -collection: --item1 --item2 --item3 - -EOF; - - $this->parser->parse($yaml); - } - - public function testShortcutKeyUnindentedCollectionException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $yaml = <<<'EOF' - -collection: -- key: foo - foo: bar - -EOF; - - $this->parser->parse($yaml); - } - - public function testMultipleDocumentsNotSupportedException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessageMatches('/^Multiple documents are not supported.+/'); - Yaml::parse(<<<'EOL' -# Ranking of 1998 home runs ---- -- Mark McGwire -- Sammy Sosa -- Ken Griffey - -# Team ranking ---- -- Chicago Cubs -- St Louis Cardinals -EOL - ); - } - - public function testSequenceInAMapping() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - Yaml::parse(<<<'EOF' -yaml: - hash: me - - array stuff -EOF - ); - } - - public function testSequenceInMappingStartedBySingleDashLine() - { - $yaml = <<<'EOT' -a: -- - b: - - - bar: baz -- foo -d: e -EOT; - $expected = [ - 'a' => [ - [ - 'b' => [ - [ - 'bar' => 'baz', - ], - ], - ], - 'foo', - ], - 'd' => 'e', - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testSequenceFollowedByCommentEmbeddedInMapping() - { - $yaml = <<<'EOT' -a: - b: - - c -# comment - d: e -EOT; - $expected = [ - 'a' => [ - 'b' => ['c'], - 'd' => 'e', - ], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testNonStringFollowedByCommentEmbeddedInMapping() - { - $yaml = <<<'EOT' -a: - b: - {} -# comment - d: - 1.1 -# another comment -EOT; - $expected = [ - 'a' => [ - 'b' => [], - 'd' => 1.1, - ], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function getParseExceptionNotAffectedMultiLineStringLastResortParsing() - { - $tests = []; - - $yaml = <<<'EOT' -a - b: -EOT; - $tests['parse error on first line'] = [$yaml]; - - $yaml = <<<'EOT' -a - -b - c: -EOT; - $tests['parse error due to inconsistent indentation'] = [$yaml]; - - $yaml = <<<'EOT' - & * ! | > ' " % @ ` #, { asd a;sdasd }-@^qw3 -EOT; - $tests['symfony/symfony/issues/22967#issuecomment-322067742'] = [$yaml]; - - return $tests; - } - - /** - * @dataProvider getParseExceptionNotAffectedMultiLineStringLastResortParsing - */ - public function testParseExceptionNotAffectedByMultiLineStringLastResortParsing($yaml) - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->parser->parse($yaml); - } - - public function testMultiLineStringLastResortParsing() - { - $yaml = <<<'EOT' -test: - You can have things that don't look like strings here - true - yes you can -EOT; - $expected = [ - 'test' => 'You can have things that don\'t look like strings here true yes you can', - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - - $yaml = <<<'EOT' -a: - b - c -EOT; - $expected = [ - 'a' => 'b c', - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testMappingInASequence() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - Yaml::parse(<<<'EOF' -yaml: - - array stuff - hash: me -EOF - ); - } - - public function testScalarInSequence() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('missing colon'); - Yaml::parse(<<<'EOF' -foo: - - bar -"missing colon" - foo: bar -EOF - ); - } - - /** - * > It is an error for two equal keys to appear in the same mapping node. - * > In such a case the YAML processor may continue, ignoring the second - * > `key: value` pair and issuing an appropriate warning. This strategy - * > preserves a consistent information model for one-pass and random access - * > applications. - * - * @see http://yaml.org/spec/1.2/spec.html#id2759572 - * @see http://yaml.org/spec/1.1/#id932806 - * @group legacy - */ - public function testMappingDuplicateKeyBlock() - { - $input = <<<'EOD' -parent: - child: first - child: duplicate -parent: - child: duplicate - child: duplicate -EOD; - $expected = [ - 'parent' => [ - 'child' => 'first', - ], - ]; - $this->assertSame($expected, Yaml::parse($input)); - } - - /** - * @group legacy - */ - public function testMappingDuplicateKeyFlow() - { - $input = <<<'EOD' -parent: { child: first, child: duplicate } -parent: { child: duplicate, child: duplicate } -EOD; - $expected = [ - 'parent' => [ - 'child' => 'first', - ], - ]; - $this->assertSame($expected, Yaml::parse($input)); - } - - /** - * @group legacy - * @dataProvider getParseExceptionOnDuplicateData - * @expectedDeprecation Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated %s and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0 on line %d. - * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0 - */ - public function testParseExceptionOnDuplicate($input, $duplicateKey, $lineNumber) - { - Yaml::parse($input); - } - - public function getParseExceptionOnDuplicateData() - { - $tests = []; - - $yaml = <<assertEquals(['hash' => null], Yaml::parse($input)); - } - - public function testCommentAtTheRootIndent() - { - $this->assertEquals([ - 'services' => [ - 'app.foo_service' => [ - 'class' => 'Foo', - ], - 'app/bar_service' => [ - 'class' => 'Bar', - ], - ], - ], Yaml::parse(<<<'EOF' -# comment 1 -services: -# comment 2 - # comment 3 - app.foo_service: - class: Foo -# comment 4 - # comment 5 - app/bar_service: - class: Bar -EOF - )); - } - - public function testStringBlockWithComments() - { - $this->assertEquals(['content' => <<<'EOT' -# comment 1 -header - - # comment 2 - -

title

- - -footer # comment3 -EOT - ], Yaml::parse(<<<'EOF' -content: | - # comment 1 - header - - # comment 2 - -

title

- - - footer # comment3 -EOF - )); - } - - public function testFoldedStringBlockWithComments() - { - $this->assertEquals([['content' => <<<'EOT' -# comment 1 -header - - # comment 2 - -

title

- - -footer # comment3 -EOT - ]], Yaml::parse(<<<'EOF' -- - content: | - # comment 1 - header - - # comment 2 - -

title

- - - footer # comment3 -EOF - )); - } - - public function testNestedFoldedStringBlockWithComments() - { - $this->assertEquals([[ - 'title' => 'some title', - 'content' => <<<'EOT' -# comment 1 -header - - # comment 2 - -

title

- - -footer # comment3 -EOT - ]], Yaml::parse(<<<'EOF' -- - title: some title - content: | - # comment 1 - header - - # comment 2 - -

title

- - - footer # comment3 -EOF - )); - } - - public function testReferenceResolvingInInlineStrings() - { - $this->assertEquals([ - 'var' => 'var-value', - 'scalar' => 'var-value', - 'list' => ['var-value'], - 'list_in_list' => [['var-value']], - 'map_in_list' => [['key' => 'var-value']], - 'embedded_mapping' => [['key' => 'var-value']], - 'map' => ['key' => 'var-value'], - 'list_in_map' => ['key' => ['var-value']], - 'map_in_map' => ['foo' => ['bar' => 'var-value']], - ], Yaml::parse(<<<'EOF' -var: &var var-value -scalar: *var -list: [ *var ] -list_in_list: [[ *var ]] -map_in_list: [ { key: *var } ] -embedded_mapping: [ key: *var ] -map: { key: *var } -list_in_map: { key: [*var] } -map_in_map: { foo: { bar: *var } } -EOF - )); - } - - public function testYamlDirective() - { - $yaml = <<<'EOF' -%YAML 1.2 ---- -foo: 1 -bar: 2 -EOF; - $this->assertEquals(['foo' => 1, 'bar' => 2], $this->parser->parse($yaml)); - } - - /** - * @group legacy - * @expectedDeprecation Implicit casting of numeric key to string is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead on line 2. - */ - public function testFloatKeys() - { - $yaml = <<<'EOF' -foo: - 1.2: "bar" - 1.3: "baz" -EOF; - - $expected = [ - 'foo' => [ - '1.2' => 'bar', - '1.3' => 'baz', - ], - ]; - - $this->assertEquals($expected, $this->parser->parse($yaml)); - } - - /** - * @group legacy - * @expectedDeprecation Implicit casting of non-string key to string is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead on line 1. - */ - public function testBooleanKeys() - { - $yaml = <<<'EOF' -true: foo -false: bar -EOF; - - $expected = [ - 1 => 'foo', - 0 => 'bar', - ]; - - $this->assertEquals($expected, $this->parser->parse($yaml)); - } - - public function testExplicitStringCasting() - { - $yaml = <<<'EOF' -'1.2': "bar" -!!str 1.3: "baz" - -'true': foo -!!str false: bar - -!!str null: 'null' -'~': 'null' -EOF; - - $expected = [ - '1.2' => 'bar', - '1.3' => 'baz', - 'true' => 'foo', - 'false' => 'bar', - 'null' => 'null', - '~' => 'null', - ]; - - $this->assertEquals($expected, $this->parser->parse($yaml)); - } - - public function testColonInMappingValueException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('A colon cannot be used in an unquoted mapping value'); - $yaml = <<<'EOF' -foo: bar: baz -EOF; - - $this->parser->parse($yaml); - } - - public function testColonInMappingValueExceptionNotTriggeredByColonInComment() - { - $yaml = <<<'EOT' -foo: - bar: foobar # Note: a comment after a colon -EOT; - - $this->assertSame(['foo' => ['bar' => 'foobar']], $this->parser->parse($yaml)); - } - - /** - * @dataProvider getCommentLikeStringInScalarBlockData - */ - public function testCommentLikeStringsAreNotStrippedInBlockScalars($yaml, $expectedParserResult) - { - $this->assertSame($expectedParserResult, $this->parser->parse($yaml)); - } - - public function getCommentLikeStringInScalarBlockData() - { - $tests = []; - - $yaml = <<<'EOT' -pages: - - - title: some title - content: | - # comment 1 - header - - # comment 2 - -

title

- - - footer # comment3 -EOT; - $expected = [ - 'pages' => [ - [ - 'title' => 'some title', - 'content' => <<<'EOT' -# comment 1 -header - - # comment 2 - -

title

- - -footer # comment3 -EOT - , - ], - ], - ]; - $tests[] = [$yaml, $expected]; - - $yaml = <<<'EOT' -test: | - foo - # bar - baz -collection: - - one: | - foo - # bar - baz - - two: | - foo - # bar - baz -EOT; - $expected = [ - 'test' => <<<'EOT' -foo -# bar -baz - -EOT - , - 'collection' => [ - [ - 'one' => <<<'EOT' -foo -# bar -baz - -EOT - , - ], - [ - 'two' => <<<'EOT' -foo -# bar -baz -EOT - , - ], - ], - ]; - $tests[] = [$yaml, $expected]; - - $yaml = <<<'EOT' -foo: - bar: - scalar-block: > - line1 - line2> - baz: -# comment - foobar: ~ -EOT; - $expected = [ - 'foo' => [ - 'bar' => [ - 'scalar-block' => "line1 line2>\n", - ], - 'baz' => [ - 'foobar' => null, - ], - ], - ]; - $tests[] = [$yaml, $expected]; - - $yaml = <<<'EOT' -a: - b: hello -# c: | -# first row -# second row - d: hello -EOT; - $expected = [ - 'a' => [ - 'b' => 'hello', - 'd' => 'hello', - ], - ]; - $tests[] = [$yaml, $expected]; - - return $tests; - } - - public function testBlankLinesAreParsedAsNewLinesInFoldedBlocks() - { - $yaml = <<<'EOT' -test: > -

A heading

- -
    -
  • a list
  • -
  • may be a good example
  • -
-EOT; - - $this->assertSame( - [ - 'test' => <<<'EOT' -

A heading

-
  • a list
  • may be a good example
-EOT - , - ], - $this->parser->parse($yaml) - ); - } - - public function testAdditionallyIndentedLinesAreParsedAsNewLinesInFoldedBlocks() - { - $yaml = <<<'EOT' -test: > -

A heading

- -
    -
  • a list
  • -
  • may be a good example
  • -
-EOT; - - $this->assertSame( - [ - 'test' => <<<'EOT' -

A heading

-
    -
  • a list
  • -
  • may be a good example
  • -
-EOT - , - ], - $this->parser->parse($yaml) - ); - } - - /** - * @dataProvider getBinaryData - */ - public function testParseBinaryData($data) - { - $this->assertSame(['data' => 'Hello world'], $this->parser->parse($data)); - } - - public function getBinaryData() - { - return [ - 'enclosed with double quotes' => ['data: !!binary "SGVsbG8gd29ybGQ="'], - 'enclosed with single quotes' => ["data: !!binary 'SGVsbG8gd29ybGQ='"], - 'containing spaces' => ['data: !!binary "SGVs bG8gd 29ybGQ="'], - 'in block scalar' => [ - <<<'EOT' -data: !!binary | - SGVsbG8gd29ybGQ= -EOT - ], - 'containing spaces in block scalar' => [ - <<<'EOT' -data: !!binary | - SGVs bG8gd 29ybGQ= -EOT - ], - ]; - } - - /** - * @dataProvider getInvalidBinaryData - */ - public function testParseInvalidBinaryData($data, $expectedMessage) - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessageMatches($expectedMessage); - - $this->parser->parse($data); - } - - public function getInvalidBinaryData() - { - return [ - 'length not a multiple of four' => ['data: !!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'], - 'invalid characters' => ['!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'], - 'too many equals characters' => ['data: !!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'], - 'misplaced equals character' => ['data: !!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'], - 'length not a multiple of four in block scalar' => [ - <<<'EOT' -data: !!binary | - SGVsbG8d29ybGQ= -EOT - , - '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/', - ], - 'invalid characters in block scalar' => [ - <<<'EOT' -data: !!binary | - SGVsbG8#d29ybGQ= -EOT - , - '/The base64 encoded data \(.*\) contains invalid characters/', - ], - 'too many equals characters in block scalar' => [ - <<<'EOT' -data: !!binary | - SGVsbG8gd29yb=== -EOT - , - '/The base64 encoded data \(.*\) contains invalid characters/', - ], - 'misplaced equals character in block scalar' => [ - <<<'EOT' -data: !!binary | - SGVsbG8gd29ybG=Q -EOT - , - '/The base64 encoded data \(.*\) contains invalid characters/', - ], - ]; - } - - public function testParseDateAsMappingValue() - { - $yaml = <<<'EOT' -date: 2002-12-14 -EOT; - $expectedDate = new \DateTime(); - $expectedDate->setTimeZone(new \DateTimeZone('UTC')); - $expectedDate->setDate(2002, 12, 14); - $expectedDate->setTime(0, 0, 0); - - $this->assertEquals(['date' => $expectedDate], $this->parser->parse($yaml, Yaml::PARSE_DATETIME)); - } - - /** - * @param $lineNumber - * @param $yaml - * @dataProvider parserThrowsExceptionWithCorrectLineNumberProvider - */ - public function testParserThrowsExceptionWithCorrectLineNumber($lineNumber, $yaml) - { - $this->expectException('\Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage(sprintf('Unexpected characters near "," at line %d (near "bar: "123",").', $lineNumber)); - - $this->parser->parse($yaml); - } - - public function parserThrowsExceptionWithCorrectLineNumberProvider() - { - return [ - [ - 4, - <<<'YAML' -foo: - - - # bar - bar: "123", -YAML - ], - [ - 5, - <<<'YAML' -foo: - - - # bar - # bar - bar: "123", -YAML - ], - [ - 8, - <<<'YAML' -foo: - - - # foobar - baz: 123 -bar: - - - # bar - bar: "123", -YAML - ], - [ - 10, - <<<'YAML' -foo: - - - # foobar - # foobar - baz: 123 -bar: - - - # bar - # bar - bar: "123", -YAML - ], - ]; - } - - public function testParseMultiLineQuotedString() - { - $yaml = <<assertSame(['foo' => 'bar baz foobar foo', 'bar' => 'baz'], $this->parser->parse($yaml)); - } - - public function testMultiLineQuotedStringWithTrailingBackslash() - { - $yaml = <<assertSame(['foobar' => 'foobar'], $this->parser->parse($yaml)); - } - - public function testCommentCharactersInMultiLineQuotedStrings() - { - $yaml = << [ - 'foobar' => 'foo #bar', - 'bar' => 'baz', - ], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testBlankLinesInQuotedMultiLineString() - { - $yaml = << "foo\nbar", - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testEscapedQuoteInQuotedMultiLineString() - { - $yaml = << 'foo "bar" baz', - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testBackslashInQuotedMultiLineString() - { - $yaml = << 'foo bar\\', - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testParseMultiLineUnquotedString() - { - $yaml = <<assertSame(['foo' => 'bar baz foobar foo', 'bar' => 'baz'], $this->parser->parse($yaml)); - } - - public function testParseMultiLineString() - { - $this->assertEquals("foo bar\nbaz", $this->parser->parse("foo\nbar\n\nbaz")); - } - - /** - * @dataProvider multiLineDataProvider - */ - public function testParseMultiLineMappingValue($yaml, $expected, $parseError) - { - $this->assertEquals($expected, $this->parser->parse($yaml)); - } - - public function multiLineDataProvider() - { - $tests = []; - - $yaml = <<<'EOF' -foo: -- bar: - one - - two - three -EOF; - $expected = [ - 'foo' => [ - [ - 'bar' => "one\ntwo three", - ], - ], - ]; - - $tests[] = [$yaml, $expected, false]; - - $yaml = <<<'EOF' -bar -"foo" -EOF; - $expected = 'bar "foo"'; - - $tests[] = [$yaml, $expected, false]; - - $yaml = <<<'EOF' -bar -"foo -EOF; - $expected = 'bar "foo'; - - $tests[] = [$yaml, $expected, false]; - - $yaml = <<<'EOF' -bar - -'foo' -EOF; - $expected = "bar\n'foo'"; - - $tests[] = [$yaml, $expected, false]; - - $yaml = <<<'EOF' -bar - -foo' -EOF; - $expected = "bar\nfoo'"; - - $tests[] = [$yaml, $expected, false]; - - return $tests; - } - - public function testTaggedInlineMapping() - { - $this->assertEquals(new TaggedValue('foo', ['foo' => 'bar']), $this->parser->parse('!foo {foo: bar}', Yaml::PARSE_CUSTOM_TAGS)); - } - - /** - * @dataProvider taggedValuesProvider - */ - public function testCustomTagSupport($expected, $yaml) - { - $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_CUSTOM_TAGS)); - } - - public function taggedValuesProvider() - { - return [ - 'sequences' => [ - [new TaggedValue('foo', ['yaml']), new TaggedValue('quz', ['bar'])], - << [ - new TaggedValue('foo', ['foo' => new TaggedValue('quz', ['bar']), 'quz' => new TaggedValue('foo', ['quz' => 'bar'])]), - << [ - [new TaggedValue('foo', ['foo', 'bar']), new TaggedValue('quz', ['foo' => 'bar', 'quz' => new TaggedValue('bar', ['one' => 'bar'])])], - <<expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Tags support is not enabled. Enable the `Yaml::PARSE_CUSTOM_TAGS` flag to use "!iterator" at line 1 (near "!iterator [foo]").'); - $this->parser->parse('!iterator [foo]'); - } - - /** - * @group legacy - * @expectedDeprecation Using the unquoted scalar value "!iterator foo" is deprecated since Symfony 3.3 and will be considered as a tagged value in 4.0. You must quote it on line 1. - */ - public function testUnsupportedTagWithScalar() - { - $this->assertEquals('!iterator foo', $this->parser->parse('!iterator foo')); - } - - public function testExceptionWhenUsingUnsupportedBuiltInTags() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('The built-in tag "!!foo" is not implemented at line 1 (near "!!foo").'); - $this->parser->parse('!!foo'); - } - - /** - * @group legacy - * @expectedDeprecation Starting an unquoted string with a question mark followed by a space is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0 on line 1. - */ - public function testComplexMappingThrowsParseException() - { - $yaml = <<parser->parse($yaml); - } - - /** - * @group legacy - * @expectedDeprecation Starting an unquoted string with a question mark followed by a space is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0 on line 2. - */ - public function testComplexMappingNestedInMappingThrowsParseException() - { - $yaml = <<parser->parse($yaml); - } - - /** - * @group legacy - * @expectedDeprecation Starting an unquoted string with a question mark followed by a space is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0 on line 1. - */ - public function testComplexMappingNestedInSequenceThrowsParseException() - { - $yaml = <<parser->parse($yaml); - } - - public function testParsingIniThrowsException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Unable to parse at line 1 (near "[parameters]").'); - $ini = <<parser->parse($ini); - } - - private function loadTestsFromFixtureFiles($testsFile) - { - $parser = new Parser(); - - $tests = []; - $files = $parser->parseFile(__DIR__.'/Fixtures/'.$testsFile); - foreach ($files as $file) { - $yamls = file_get_contents(__DIR__.'/Fixtures/'.$file.'.yml'); - - // split YAMLs documents - foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) { - if (!$yaml) { - continue; - } - - $test = $parser->parse($yaml); - if (isset($test['todo']) && $test['todo']) { - // TODO - } else { - eval('$expected = '.trim($test['php']).';'); - - $tests[] = [var_export($expected, true), $test['yaml'], $test['test'], isset($test['deprecated']) ? $test['deprecated'] : false]; - } - } - } - - return $tests; - } - - public function testCanParseVeryLongValue() - { - $longStringWithSpaces = str_repeat('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ', 20000); - $trickyVal = ['x' => $longStringWithSpaces]; - - $yamlString = Yaml::dump($trickyVal); - $arrayFromYaml = $this->parser->parse($yamlString); - - $this->assertEquals($trickyVal, $arrayFromYaml); - } - - public function testParserCleansUpReferencesBetweenRuns() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Reference "foo" does not exist at line 2'); - $yaml = <<parser->parse($yaml); - - $yaml = <<parser->parse($yaml); - } - - public function testPhpConstantTagMappingKey() - { - $yaml = << [ - 'foo' => [ - 'from' => [ - 'bar', - ], - 'to' => 'baz', - ], - ], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml, Yaml::PARSE_CONSTANT)); - } - - /** - * @group legacy - * @expectedDeprecation The !php/const: tag to indicate dumped PHP constants is deprecated since Symfony 3.4 and will be removed in 4.0. Use the !php/const (without the colon) tag instead on line 2. - * @expectedDeprecation The !php/const: tag to indicate dumped PHP constants is deprecated since Symfony 3.4 and will be removed in 4.0. Use the !php/const (without the colon) tag instead on line 4. - * @expectedDeprecation The !php/const: tag to indicate dumped PHP constants is deprecated since Symfony 3.4 and will be removed in 4.0. Use the !php/const (without the colon) tag instead on line 5. - */ - public function testDeprecatedPhpConstantTagMappingKey() - { - $yaml = << [ - 'foo' => [ - 'from' => [ - 'bar', - ], - 'to' => 'baz', - ], - ], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml, Yaml::PARSE_CONSTANT)); - } - - /** - * @group legacy - * @expectedDeprecation Using the Yaml::PARSE_KEYS_AS_STRINGS flag is deprecated since Symfony 3.4 as it will be removed in 4.0. Quote your keys when they are evaluable instead. - */ - public function testPhpConstantTagMappingKeyWithKeysCastToStrings() - { - $yaml = << [ - 'foo' => [ - 'from' => [ - 'bar', - ], - 'to' => 'baz', - ], - ], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml, Yaml::PARSE_CONSTANT | Yaml::PARSE_KEYS_AS_STRINGS)); - } - - public function testPhpConstantTagMappingAsScalarKey() - { - $yaml = <<assertSame([ - 'map1' => [['foo' => 'value_0', 'bar' => 'value_1']], - 'map2' => [['foo' => 'value_0', 'bar' => 'value_1']], - ], $this->parser->parse($yaml, Yaml::PARSE_CONSTANT)); - } - - public function testTagMappingAsScalarKey() - { - $yaml = <<assertSame([ - 'map1' => [['0' => 'value_0', '1' => 'value_1']], - ], $this->parser->parse($yaml)); - } - - public function testMergeKeysWhenMappingsAreParsedAsObjects() - { - $yaml = << (object) [ - 'bar' => 1, - ], - 'bar' => (object) [ - 'baz' => 2, - 'bar' => 1, - ], - 'baz' => (object) [ - 'baz_foo' => 3, - 'baz_bar' => 4, - ], - 'foobar' => (object) [ - 'bar' => null, - 'baz' => 2, - ], - ]; - - $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP)); - } - - public function testFilenamesAreParsedAsStringsWithoutFlag() - { - $file = __DIR__.'/Fixtures/index.yml'; - - $this->assertSame($file, $this->parser->parse($file)); - } - - public function testParseFile() - { - $this->assertIsArray($this->parser->parseFile(__DIR__.'/Fixtures/index.yml')); - } - - public function testParsingNonExistentFilesThrowsException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessageMatches('#^File ".+/Fixtures/nonexistent.yml" does not exist\.$#'); - $this->parser->parseFile(__DIR__.'/Fixtures/nonexistent.yml'); - } - - public function testParsingNotReadableFilesThrowsException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessageMatches('#^File ".+/Fixtures/not_readable.yml" cannot be read\.$#'); - if ('\\' === \DIRECTORY_SEPARATOR) { - $this->markTestSkipped('chmod is not supported on Windows'); - } - - if (!getenv('USER') || 'root' === getenv('USER')) { - $this->markTestSkipped('This test will fail if run under superuser'); - } - - $file = __DIR__.'/Fixtures/not_readable.yml'; - chmod($file, 0200); - - $this->parser->parseFile($file); - } - - public function testParseReferencesOnMergeKeys() - { - $yaml = << [ - 'a' => 'foo', - 'b' => 'bar', - 'c' => 'baz', - ], - 'mergekeyderef' => [ - 'd' => 'quux', - 'b' => 'bar', - 'c' => 'baz', - ], - ]; - - $this->assertSame($expected, $this->parser->parse($yaml)); - } - - public function testParseReferencesOnMergeKeysWithMappingsParsedAsObjects() - { - $yaml = << (object) [ - 'a' => 'foo', - 'b' => 'bar', - 'c' => 'baz', - ], - 'mergekeyderef' => (object) [ - 'd' => 'quux', - 'b' => 'bar', - 'c' => 'baz', - ], - ]; - - $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP)); - } - - public function testEvalRefException() - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Reference "foo" does not exist'); - $yaml = <<parser->parse($yaml); - } - - /** - * @dataProvider circularReferenceProvider - */ - public function testDetectCircularReferences($yaml) - { - $this->expectException('Symfony\Component\Yaml\Exception\ParseException'); - $this->expectExceptionMessage('Circular reference [foo, bar, foo] detected'); - $this->parser->parse($yaml, Yaml::PARSE_CUSTOM_TAGS); - } - - public function circularReferenceProvider() - { - $tests = []; - - $yaml = <<assertSame($expected, $this->parser->parse($yaml)); - } - - public function indentedMappingData() - { - $tests = []; - - $yaml = << [ - [ - 'bar' => 'foobar', - 'baz' => 'foobaz', - ], - ], - ]; - $tests['comment line is first line in indented block'] = [$yaml, $expected]; - - $yaml = << [ - [ - 'bar' => [ - 'baz' => [1, 2, 3], - ], - ], - ], - ]; - $tests['mapping value on new line starting with a comment line'] = [$yaml, $expected]; - - $yaml = << [ - [ - 'bar' => 'foobar', - ], - ], - ]; - $tests['mapping in sequence starting on a new line'] = [$yaml, $expected]; - - $yaml = << [ - 'bar' => 'baz', - ], - ]; - $tests['blank line at the beginning of an indented mapping value'] = [$yaml, $expected]; - - return $tests; - } - - public function testMultiLineComment() - { - $yaml = <<assertSame(['parameters' => 'abc'], $this->parser->parse($yaml)); - } - - public function testParseValueWithModifiers() - { - $yaml = <<assertSame( - [ - 'parameters' => [ - 'abc' => implode("\n", ['one', 'two', 'three', 'four', 'five']), - ], - ], - $this->parser->parse($yaml) - ); - } - - public function testParseValueWithNegativeModifiers() - { - $yaml = <<assertSame( - [ - 'parameters' => [ - 'abc' => implode("\n", ['one', 'two', 'three', 'four', 'five']), - ], - ], - $this->parser->parse($yaml) - ); - } - - /** - * This is a regression test for a bug where a YAML block with a nested multiline string using | was parsed without - * a trailing \n when a shorter YAML document was parsed before. - * - * When a shorter document was parsed before, the nested string did not have a \n at the end of the string, because - * the Parser thought it was the end of the file, even though it is not. - */ - public function testParsingMultipleDocuments() - { - $shortDocument = 'foo: bar'; - $longDocument = <<parser->parse($shortDocument); - - // After the total number of lines has been reset the result will be the same as if a new parser was used - // (before, there was no \n after row2) - $this->assertSame(['a' => ['b' => "row\nrow2\n"], 'c' => 'd'], $this->parser->parse($longDocument)); - } -} - -class B -{ - public $b = 'foo'; - - const FOO = 'foo'; - const BAR = 'bar'; - const BAZ = 'baz'; -} diff --git a/vendor/symfony/yaml/Tests/YamlTest.php b/vendor/symfony/yaml/Tests/YamlTest.php deleted file mode 100644 index 7be12664..00000000 --- a/vendor/symfony/yaml/Tests/YamlTest.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Yaml\Yaml; - -class YamlTest extends TestCase -{ - public function testParseAndDump() - { - $data = ['lorem' => 'ipsum', 'dolor' => 'sit']; - $yml = Yaml::dump($data); - $parsed = Yaml::parse($yml); - $this->assertEquals($data, $parsed); - } - - public function testZeroIndentationThrowsException() - { - $this->expectException('InvalidArgumentException'); - $this->expectExceptionMessage('The indentation must be greater than zero'); - Yaml::dump(['lorem' => 'ipsum', 'dolor' => 'sit'], 2, 0); - } - - public function testNegativeIndentationThrowsException() - { - $this->expectException('InvalidArgumentException'); - $this->expectExceptionMessage('The indentation must be greater than zero'); - Yaml::dump(['lorem' => 'ipsum', 'dolor' => 'sit'], 2, -4); - } -} diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php index 6a12999d..6bdf216a 100644 --- a/vendor/symfony/yaml/Unescaper.php +++ b/vendor/symfony/yaml/Unescaper.php @@ -26,7 +26,7 @@ class Unescaper /** * Regex fragment that matches an escaped character in a double quoted string. */ - const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)'; + public const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)'; /** * Unescapes a single quoted string. @@ -35,7 +35,7 @@ class Unescaper * * @return string The unescaped string */ - public function unescapeSingleQuotedString($value) + public function unescapeSingleQuotedString(string $value): string { return str_replace('\'\'', '\'', $value); } @@ -47,7 +47,7 @@ public function unescapeSingleQuotedString($value) * * @return string The unescaped string */ - public function unescapeDoubleQuotedString($value) + public function unescapeDoubleQuotedString(string $value): string { $callback = function ($match) { return $this->unescapeCharacter($match[0]); @@ -64,7 +64,7 @@ public function unescapeDoubleQuotedString($value) * * @return string The unescaped character */ - private function unescapeCharacter($value) + private function unescapeCharacter(string $value): string { switch ($value[1]) { case '0': @@ -120,12 +120,8 @@ private function unescapeCharacter($value) /** * Get the UTF-8 character for the given code point. - * - * @param int $c The unicode code point - * - * @return string The corresponding UTF-8 character */ - private static function utf8chr($c) + private static function utf8chr(int $c): string { if (0x80 > $c %= 0x200000) { return \chr($c); diff --git a/vendor/symfony/yaml/Yaml.php b/vendor/symfony/yaml/Yaml.php index 87190833..4fea47f9 100644 --- a/vendor/symfony/yaml/Yaml.php +++ b/vendor/symfony/yaml/Yaml.php @@ -18,26 +18,22 @@ * * @author Fabien Potencier * - * @final since version 3.4 + * @final */ class Yaml { - const DUMP_OBJECT = 1; - const PARSE_EXCEPTION_ON_INVALID_TYPE = 2; - const PARSE_OBJECT = 4; - const PARSE_OBJECT_FOR_MAP = 8; - const DUMP_EXCEPTION_ON_INVALID_TYPE = 16; - const PARSE_DATETIME = 32; - const DUMP_OBJECT_AS_MAP = 64; - const DUMP_MULTI_LINE_LITERAL_BLOCK = 128; - const PARSE_CONSTANT = 256; - const PARSE_CUSTOM_TAGS = 512; - const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024; - - /** - * @deprecated since version 3.4, to be removed in 4.0. Quote your evaluable keys instead. - */ - const PARSE_KEYS_AS_STRINGS = 2048; + public const DUMP_OBJECT = 1; + public const PARSE_EXCEPTION_ON_INVALID_TYPE = 2; + public const PARSE_OBJECT = 4; + public const PARSE_OBJECT_FOR_MAP = 8; + public const DUMP_EXCEPTION_ON_INVALID_TYPE = 16; + public const PARSE_DATETIME = 32; + public const DUMP_OBJECT_AS_MAP = 64; + public const DUMP_MULTI_LINE_LITERAL_BLOCK = 128; + public const PARSE_CONSTANT = 256; + public const PARSE_CUSTOM_TAGS = 512; + public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024; + public const DUMP_NULL_AS_TILDE = 2048; /** * Parses a YAML file into a PHP value. @@ -54,7 +50,7 @@ class Yaml * * @throws ParseException If the file could not be read or the YAML is not valid */ - public static function parseFile($filename, $flags = 0) + public static function parseFile(string $filename, int $flags = 0) { $yaml = new Parser(); @@ -77,34 +73,8 @@ public static function parseFile($filename, $flags = 0) * * @throws ParseException If the YAML is not valid */ - public static function parse($input, $flags = 0) + public static function parse(string $input, int $flags = 0) { - if (\is_bool($flags)) { - @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since Symfony 3.1 and will be removed in 4.0. Use the PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', \E_USER_DEPRECATED); - - if ($flags) { - $flags = self::PARSE_EXCEPTION_ON_INVALID_TYPE; - } else { - $flags = 0; - } - } - - if (\func_num_args() >= 3) { - @trigger_error('Passing a boolean flag to toggle object support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the PARSE_OBJECT flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(2)) { - $flags |= self::PARSE_OBJECT; - } - } - - if (\func_num_args() >= 4) { - @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(3)) { - $flags |= self::PARSE_OBJECT_FOR_MAP; - } - } - $yaml = new Parser(); return $yaml->parse($input, $flags); @@ -123,26 +93,8 @@ public static function parse($input, $flags = 0) * * @return string A YAML string representing the original PHP value */ - public static function dump($input, $inline = 2, $indent = 4, $flags = 0) + public static function dump($input, int $inline = 2, int $indent = 4, int $flags = 0): string { - if (\is_bool($flags)) { - @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since Symfony 3.1 and will be removed in 4.0. Use the DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', \E_USER_DEPRECATED); - - if ($flags) { - $flags = self::DUMP_EXCEPTION_ON_INVALID_TYPE; - } else { - $flags = 0; - } - } - - if (\func_num_args() >= 5) { - @trigger_error('Passing a boolean flag to toggle object support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the DUMP_OBJECT flag instead.', \E_USER_DEPRECATED); - - if (func_get_arg(4)) { - $flags |= self::DUMP_OBJECT; - } - } - $yaml = new Dumper($indent); return $yaml->dump($input, $inline, 0, $flags); diff --git a/vendor/symfony/yaml/composer.json b/vendor/symfony/yaml/composer.json index b2f0286e..10120348 100644 --- a/vendor/symfony/yaml/composer.json +++ b/vendor/symfony/yaml/composer.json @@ -1,7 +1,7 @@ { "name": "symfony/yaml", "type": "library", - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "keywords": [], "homepage": "https://symfony.com", "license": "MIT", @@ -16,11 +16,11 @@ } ], "require": { - "php": "^5.5.9|>=7.0.8", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "require-dev": { - "symfony/console": "~3.4|~4.0" + "symfony/console": "^3.4|^4.0|^5.0" }, "conflict": { "symfony/console": "<3.4" diff --git a/vendor/symfony/yaml/phpunit.xml.dist b/vendor/symfony/yaml/phpunit.xml.dist deleted file mode 100644 index b5d4d914..00000000 --- a/vendor/symfony/yaml/phpunit.xml.dist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - ./Tests/ - - - - - - ./ - - ./Tests - ./vendor - - - - diff --git a/version.php b/version.php index 1e50864e..6d03ee49 100644 --- a/version.php +++ b/version.php @@ -28,7 +28,7 @@ $plugin->version = 2023122201; $plugin->release = 2023122201; $plugin->requires = 2022112800; // Our lowest supported Moodle (3.3.0). -$plugin->supported = [400, 401]; +$plugin->supported = [400, 402]; // TODO $plugin->incompatible = ; // Available as of Moodle 3.9.0 or later. $plugin->component = 'tool_dataflows'; $plugin->maturity = MATURITY_ALPHA;