dropbox-sign 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +4 -4
  4. data/VERSION +1 -0
  5. data/bin/release +39 -0
  6. data/bin/ruby +1 -0
  7. data/docs/SignatureRequestApi.md +3 -3
  8. data/docs/SignatureRequestCreateEmbeddedRequest.md +1 -1
  9. data/docs/SignatureRequestSendRequest.md +1 -1
  10. data/docs/SubFormFieldsPerDocumentBase.md +1 -1
  11. data/docs/TemplateCreateEmbeddedDraftRequest.md +1 -1
  12. data/docs/UnclaimedDraftApi.md +2 -2
  13. data/docs/UnclaimedDraftCreateEmbeddedRequest.md +1 -1
  14. data/docs/UnclaimedDraftCreateRequest.md +1 -1
  15. data/examples/SignatureRequestCreateEmbedded.rb +1 -1
  16. data/examples/SignatureRequestSend.rb +2 -2
  17. data/examples/UnclaimedDraftCreate.rb +2 -2
  18. data/lib/dropbox-sign/models/signature_request_create_embedded_request.rb +1 -1
  19. data/lib/dropbox-sign/models/signature_request_send_request.rb +1 -1
  20. data/lib/dropbox-sign/models/sub_form_fields_per_document_base.rb +1 -1
  21. data/lib/dropbox-sign/models/template_create_embedded_draft_request.rb +1 -1
  22. data/lib/dropbox-sign/models/unclaimed_draft_create_embedded_request.rb +1 -1
  23. data/lib/dropbox-sign/models/unclaimed_draft_create_request.rb +1 -1
  24. data/lib/dropbox-sign/version.rb +1 -1
  25. data/openapi-config.yaml +4 -1
  26. data/openapi-sdk.yaml +6 -10
  27. data/templates/VERSION-root.mustache +1 -0
  28. metadata +14 -54
  29. data/vendor/autoload.php +0 -7
  30. data/vendor/bin/yaml-lint +0 -117
  31. data/vendor/composer/ClassLoader.php +0 -572
  32. data/vendor/composer/InstalledVersions.php +0 -350
  33. data/vendor/composer/LICENSE +0 -21
  34. data/vendor/composer/autoload_classmap.php +0 -10
  35. data/vendor/composer/autoload_files.php +0 -11
  36. data/vendor/composer/autoload_namespaces.php +0 -9
  37. data/vendor/composer/autoload_psr4.php +0 -11
  38. data/vendor/composer/autoload_real.php +0 -80
  39. data/vendor/composer/autoload_static.php +0 -46
  40. data/vendor/composer/installed.json +0 -239
  41. data/vendor/composer/installed.php +0 -50
  42. data/vendor/composer/platform_check.php +0 -26
  43. data/vendor/symfony/deprecation-contracts/.gitignore +0 -3
  44. data/vendor/symfony/deprecation-contracts/CHANGELOG.md +0 -5
  45. data/vendor/symfony/deprecation-contracts/LICENSE +0 -19
  46. data/vendor/symfony/deprecation-contracts/README.md +0 -26
  47. data/vendor/symfony/deprecation-contracts/composer.json +0 -35
  48. data/vendor/symfony/deprecation-contracts/function.php +0 -27
  49. data/vendor/symfony/polyfill-ctype/Ctype.php +0 -232
  50. data/vendor/symfony/polyfill-ctype/LICENSE +0 -19
  51. data/vendor/symfony/polyfill-ctype/README.md +0 -12
  52. data/vendor/symfony/polyfill-ctype/bootstrap.php +0 -50
  53. data/vendor/symfony/polyfill-ctype/bootstrap80.php +0 -46
  54. data/vendor/symfony/polyfill-ctype/composer.json +0 -41
  55. data/vendor/symfony/yaml/CHANGELOG.md +0 -237
  56. data/vendor/symfony/yaml/Command/LintCommand.php +0 -289
  57. data/vendor/symfony/yaml/Dumper.php +0 -140
  58. data/vendor/symfony/yaml/Escaper.php +0 -95
  59. data/vendor/symfony/yaml/Exception/DumpException.php +0 -21
  60. data/vendor/symfony/yaml/Exception/ExceptionInterface.php +0 -21
  61. data/vendor/symfony/yaml/Exception/ParseException.php +0 -132
  62. data/vendor/symfony/yaml/Exception/RuntimeException.php +0 -21
  63. data/vendor/symfony/yaml/Inline.php +0 -812
  64. data/vendor/symfony/yaml/LICENSE +0 -19
  65. data/vendor/symfony/yaml/Parser.php +0 -1305
  66. data/vendor/symfony/yaml/README.md +0 -13
  67. data/vendor/symfony/yaml/Resources/bin/yaml-lint +0 -45
  68. data/vendor/symfony/yaml/Tag/TaggedValue.php +0 -38
  69. data/vendor/symfony/yaml/Unescaper.php +0 -132
  70. data/vendor/symfony/yaml/Yaml.php +0 -100
  71. data/vendor/symfony/yaml/composer.json +0 -42
@@ -1,812 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Component\Yaml;
13
-
14
- use Symfony\Component\Yaml\Exception\DumpException;
15
- use Symfony\Component\Yaml\Exception\ParseException;
16
- use Symfony\Component\Yaml\Tag\TaggedValue;
17
-
18
- /**
19
- * Inline implements a YAML parser/dumper for the YAML inline syntax.
20
- *
21
- * @author Fabien Potencier <fabien@symfony.com>
22
- *
23
- * @internal
24
- */
25
- class Inline
26
- {
27
- public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')';
28
-
29
- public static $parsedLineNumber = -1;
30
- public static $parsedFilename;
31
-
32
- private static $exceptionOnInvalidType = false;
33
- private static $objectSupport = false;
34
- private static $objectForMap = false;
35
- private static $constantSupport = false;
36
-
37
- public static function initialize(int $flags, int $parsedLineNumber = null, string $parsedFilename = null)
38
- {
39
- self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags);
40
- self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);
41
- self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);
42
- self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);
43
- self::$parsedFilename = $parsedFilename;
44
-
45
- if (null !== $parsedLineNumber) {
46
- self::$parsedLineNumber = $parsedLineNumber;
47
- }
48
- }
49
-
50
- /**
51
- * Converts a YAML string to a PHP value.
52
- *
53
- * @param string $value A YAML string
54
- * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
55
- * @param array $references Mapping of variable names to values
56
- *
57
- * @return mixed
58
- *
59
- * @throws ParseException
60
- */
61
- public static function parse(string $value = null, int $flags = 0, array &$references = [])
62
- {
63
- self::initialize($flags);
64
-
65
- $value = trim($value);
66
-
67
- if ('' === $value) {
68
- return '';
69
- }
70
-
71
- if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
72
- $mbEncoding = mb_internal_encoding();
73
- mb_internal_encoding('ASCII');
74
- }
75
-
76
- try {
77
- $i = 0;
78
- $tag = self::parseTag($value, $i, $flags);
79
- switch ($value[$i]) {
80
- case '[':
81
- $result = self::parseSequence($value, $flags, $i, $references);
82
- ++$i;
83
- break;
84
- case '{':
85
- $result = self::parseMapping($value, $flags, $i, $references);
86
- ++$i;
87
- break;
88
- default:
89
- $result = self::parseScalar($value, $flags, null, $i, null === $tag, $references);
90
- }
91
-
92
- // some comments are allowed at the end
93
- if (preg_replace('/\s*#.*$/A', '', substr($value, $i))) {
94
- throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
95
- }
96
-
97
- if (null !== $tag && '' !== $tag) {
98
- return new TaggedValue($tag, $result);
99
- }
100
-
101
- return $result;
102
- } finally {
103
- if (isset($mbEncoding)) {
104
- mb_internal_encoding($mbEncoding);
105
- }
106
- }
107
- }
108
-
109
- /**
110
- * Dumps a given PHP variable to a YAML string.
111
- *
112
- * @param mixed $value The PHP variable to convert
113
- * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
114
- *
115
- * @throws DumpException When trying to dump PHP resource
116
- */
117
- public static function dump($value, int $flags = 0): string
118
- {
119
- switch (true) {
120
- case \is_resource($value):
121
- if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
122
- throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
123
- }
124
-
125
- return self::dumpNull($flags);
126
- case $value instanceof \DateTimeInterface:
127
- return $value->format('c');
128
- case $value instanceof \UnitEnum:
129
- return sprintf('!php/const %s::%s', \get_class($value), $value->name);
130
- case \is_object($value):
131
- if ($value instanceof TaggedValue) {
132
- return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags);
133
- }
134
-
135
- if (Yaml::DUMP_OBJECT & $flags) {
136
- return '!php/object '.self::dump(serialize($value));
137
- }
138
-
139
- if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) {
140
- $output = [];
141
-
142
- foreach ($value as $key => $val) {
143
- $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
144
- }
145
-
146
- return sprintf('{ %s }', implode(', ', $output));
147
- }
148
-
149
- if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
150
- throw new DumpException('Object support when dumping a YAML file has been disabled.');
151
- }
152
-
153
- return self::dumpNull($flags);
154
- case \is_array($value):
155
- return self::dumpArray($value, $flags);
156
- case null === $value:
157
- return self::dumpNull($flags);
158
- case true === $value:
159
- return 'true';
160
- case false === $value:
161
- return 'false';
162
- case \is_int($value):
163
- return $value;
164
- case is_numeric($value) && false === strpbrk($value, "\f\n\r\t\v"):
165
- $locale = setlocale(\LC_NUMERIC, 0);
166
- if (false !== $locale) {
167
- setlocale(\LC_NUMERIC, 'C');
168
- }
169
- if (\is_float($value)) {
170
- $repr = (string) $value;
171
- if (is_infinite($value)) {
172
- $repr = str_ireplace('INF', '.Inf', $repr);
173
- } elseif (floor($value) == $value && $repr == $value) {
174
- // Preserve float data type since storing a whole number will result in integer value.
175
- if (false === strpos($repr, 'E')) {
176
- $repr = $repr.'.0';
177
- }
178
- }
179
- } else {
180
- $repr = \is_string($value) ? "'$value'" : (string) $value;
181
- }
182
- if (false !== $locale) {
183
- setlocale(\LC_NUMERIC, $locale);
184
- }
185
-
186
- return $repr;
187
- case '' == $value:
188
- return "''";
189
- case self::isBinaryString($value):
190
- return '!!binary '.base64_encode($value);
191
- case Escaper::requiresDoubleQuoting($value):
192
- return Escaper::escapeWithDoubleQuotes($value);
193
- case Escaper::requiresSingleQuoting($value):
194
- case Parser::preg_match('{^[0-9]+[_0-9]*$}', $value):
195
- case Parser::preg_match(self::getHexRegex(), $value):
196
- case Parser::preg_match(self::getTimestampRegex(), $value):
197
- return Escaper::escapeWithSingleQuotes($value);
198
- default:
199
- return $value;
200
- }
201
- }
202
-
203
- /**
204
- * Check if given array is hash or just normal indexed array.
205
- *
206
- * @param array|\ArrayObject|\stdClass $value The PHP array or array-like object to check
207
- */
208
- public static function isHash($value): bool
209
- {
210
- if ($value instanceof \stdClass || $value instanceof \ArrayObject) {
211
- return true;
212
- }
213
-
214
- $expectedKey = 0;
215
-
216
- foreach ($value as $key => $val) {
217
- if ($key !== $expectedKey++) {
218
- return true;
219
- }
220
- }
221
-
222
- return false;
223
- }
224
-
225
- /**
226
- * Dumps a PHP array to a YAML string.
227
- *
228
- * @param array $value The PHP array to dump
229
- * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string
230
- */
231
- private static function dumpArray(array $value, int $flags): string
232
- {
233
- // array
234
- if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) {
235
- $output = [];
236
- foreach ($value as $val) {
237
- $output[] = self::dump($val, $flags);
238
- }
239
-
240
- return sprintf('[%s]', implode(', ', $output));
241
- }
242
-
243
- // hash
244
- $output = [];
245
- foreach ($value as $key => $val) {
246
- $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
247
- }
248
-
249
- return sprintf('{ %s }', implode(', ', $output));
250
- }
251
-
252
- private static function dumpNull(int $flags): string
253
- {
254
- if (Yaml::DUMP_NULL_AS_TILDE & $flags) {
255
- return '~';
256
- }
257
-
258
- return 'null';
259
- }
260
-
261
- /**
262
- * Parses a YAML scalar.
263
- *
264
- * @return mixed
265
- *
266
- * @throws ParseException When malformed inline YAML string is parsed
267
- */
268
- public static function parseScalar(string $scalar, int $flags = 0, array $delimiters = null, int &$i = 0, bool $evaluate = true, array &$references = [], bool &$isQuoted = null)
269
- {
270
- if (\in_array($scalar[$i], ['"', "'"], true)) {
271
- // quoted scalar
272
- $isQuoted = true;
273
- $output = self::parseQuotedScalar($scalar, $i);
274
-
275
- if (null !== $delimiters) {
276
- $tmp = ltrim(substr($scalar, $i), " \n");
277
- if ('' === $tmp) {
278
- throw new ParseException(sprintf('Unexpected end of line, expected one of "%s".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
279
- }
280
- if (!\in_array($tmp[0], $delimiters)) {
281
- throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
282
- }
283
- }
284
- } else {
285
- // "normal" string
286
- $isQuoted = false;
287
-
288
- if (!$delimiters) {
289
- $output = substr($scalar, $i);
290
- $i += \strlen($output);
291
-
292
- // remove comments
293
- if (Parser::preg_match('/[ \t]+#/', $output, $match, \PREG_OFFSET_CAPTURE)) {
294
- $output = substr($output, 0, $match[0][1]);
295
- }
296
- } elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
297
- $output = $match[1];
298
- $i += \strlen($output);
299
- $output = trim($output);
300
- } else {
301
- throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename);
302
- }
303
-
304
- // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >)
305
- if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) {
306
- 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);
307
- }
308
-
309
- if ($evaluate) {
310
- $output = self::evaluateScalar($output, $flags, $references, $isQuoted);
311
- }
312
- }
313
-
314
- return $output;
315
- }
316
-
317
- /**
318
- * Parses a YAML quoted scalar.
319
- *
320
- * @throws ParseException When malformed inline YAML string is parsed
321
- */
322
- private static function parseQuotedScalar(string $scalar, int &$i = 0): string
323
- {
324
- if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
325
- throw new ParseException(sprintf('Malformed inline YAML string: "%s".', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
326
- }
327
-
328
- $output = substr($match[0], 1, -1);
329
-
330
- $unescaper = new Unescaper();
331
- if ('"' == $scalar[$i]) {
332
- $output = $unescaper->unescapeDoubleQuotedString($output);
333
- } else {
334
- $output = $unescaper->unescapeSingleQuotedString($output);
335
- }
336
-
337
- $i += \strlen($match[0]);
338
-
339
- return $output;
340
- }
341
-
342
- /**
343
- * Parses a YAML sequence.
344
- *
345
- * @throws ParseException When malformed inline YAML string is parsed
346
- */
347
- private static function parseSequence(string $sequence, int $flags, int &$i = 0, array &$references = []): array
348
- {
349
- $output = [];
350
- $len = \strlen($sequence);
351
- ++$i;
352
-
353
- // [foo, bar, ...]
354
- while ($i < $len) {
355
- if (']' === $sequence[$i]) {
356
- return $output;
357
- }
358
- if (',' === $sequence[$i] || ' ' === $sequence[$i]) {
359
- ++$i;
360
-
361
- continue;
362
- }
363
-
364
- $tag = self::parseTag($sequence, $i, $flags);
365
- switch ($sequence[$i]) {
366
- case '[':
367
- // nested sequence
368
- $value = self::parseSequence($sequence, $flags, $i, $references);
369
- break;
370
- case '{':
371
- // nested mapping
372
- $value = self::parseMapping($sequence, $flags, $i, $references);
373
- break;
374
- default:
375
- $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted);
376
-
377
- // the value can be an array if a reference has been resolved to an array var
378
- if (\is_string($value) && !$isQuoted && false !== strpos($value, ': ')) {
379
- // embedded mapping?
380
- try {
381
- $pos = 0;
382
- $value = self::parseMapping('{'.$value.'}', $flags, $pos, $references);
383
- } catch (\InvalidArgumentException $e) {
384
- // no, it's not
385
- }
386
- }
387
-
388
- if (!$isQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
389
- $references[$matches['ref']] = $matches['value'];
390
- $value = $matches['value'];
391
- }
392
-
393
- --$i;
394
- }
395
-
396
- if (null !== $tag && '' !== $tag) {
397
- $value = new TaggedValue($tag, $value);
398
- }
399
-
400
- $output[] = $value;
401
-
402
- ++$i;
403
- }
404
-
405
- throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename);
406
- }
407
-
408
- /**
409
- * Parses a YAML mapping.
410
- *
411
- * @return array|\stdClass
412
- *
413
- * @throws ParseException When malformed inline YAML string is parsed
414
- */
415
- private static function parseMapping(string $mapping, int $flags, int &$i = 0, array &$references = [])
416
- {
417
- $output = [];
418
- $len = \strlen($mapping);
419
- ++$i;
420
- $allowOverwrite = false;
421
-
422
- // {foo: bar, bar:foo, ...}
423
- while ($i < $len) {
424
- switch ($mapping[$i]) {
425
- case ' ':
426
- case ',':
427
- case "\n":
428
- ++$i;
429
- continue 2;
430
- case '}':
431
- if (self::$objectForMap) {
432
- return (object) $output;
433
- }
434
-
435
- return $output;
436
- }
437
-
438
- // key
439
- $offsetBeforeKeyParsing = $i;
440
- $isKeyQuoted = \in_array($mapping[$i], ['"', "'"], true);
441
- $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false);
442
-
443
- if ($offsetBeforeKeyParsing === $i) {
444
- throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping);
445
- }
446
-
447
- if ('!php/const' === $key) {
448
- $key .= ' '.self::parseScalar($mapping, $flags, [':'], $i, false);
449
- $key = self::evaluateScalar($key, $flags);
450
- }
451
-
452
- if (false === $i = strpos($mapping, ':', $i)) {
453
- break;
454
- }
455
-
456
- if (!$isKeyQuoted) {
457
- $evaluatedKey = self::evaluateScalar($key, $flags, $references);
458
-
459
- if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) {
460
- throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping);
461
- }
462
- }
463
-
464
- if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', "\n"], true))) {
465
- throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping);
466
- }
467
-
468
- if ('<<' === $key) {
469
- $allowOverwrite = true;
470
- }
471
-
472
- while ($i < $len) {
473
- if (':' === $mapping[$i] || ' ' === $mapping[$i] || "\n" === $mapping[$i]) {
474
- ++$i;
475
-
476
- continue;
477
- }
478
-
479
- $tag = self::parseTag($mapping, $i, $flags);
480
- switch ($mapping[$i]) {
481
- case '[':
482
- // nested sequence
483
- $value = self::parseSequence($mapping, $flags, $i, $references);
484
- // Spec: Keys MUST be unique; first one wins.
485
- // Parser cannot abort this mapping earlier, since lines
486
- // are processed sequentially.
487
- // But overwriting is allowed when a merge node is used in current block.
488
- if ('<<' === $key) {
489
- foreach ($value as $parsedValue) {
490
- $output += $parsedValue;
491
- }
492
- } elseif ($allowOverwrite || !isset($output[$key])) {
493
- if (null !== $tag) {
494
- $output[$key] = new TaggedValue($tag, $value);
495
- } else {
496
- $output[$key] = $value;
497
- }
498
- } elseif (isset($output[$key])) {
499
- throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
500
- }
501
- break;
502
- case '{':
503
- // nested mapping
504
- $value = self::parseMapping($mapping, $flags, $i, $references);
505
- // Spec: Keys MUST be unique; first one wins.
506
- // Parser cannot abort this mapping earlier, since lines
507
- // are processed sequentially.
508
- // But overwriting is allowed when a merge node is used in current block.
509
- if ('<<' === $key) {
510
- $output += $value;
511
- } elseif ($allowOverwrite || !isset($output[$key])) {
512
- if (null !== $tag) {
513
- $output[$key] = new TaggedValue($tag, $value);
514
- } else {
515
- $output[$key] = $value;
516
- }
517
- } elseif (isset($output[$key])) {
518
- throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
519
- }
520
- break;
521
- default:
522
- $value = self::parseScalar($mapping, $flags, [',', '}', "\n"], $i, null === $tag, $references, $isValueQuoted);
523
- // Spec: Keys MUST be unique; first one wins.
524
- // Parser cannot abort this mapping earlier, since lines
525
- // are processed sequentially.
526
- // But overwriting is allowed when a merge node is used in current block.
527
- if ('<<' === $key) {
528
- $output += $value;
529
- } elseif ($allowOverwrite || !isset($output[$key])) {
530
- if (!$isValueQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) {
531
- $references[$matches['ref']] = $matches['value'];
532
- $value = $matches['value'];
533
- }
534
-
535
- if (null !== $tag) {
536
- $output[$key] = new TaggedValue($tag, $value);
537
- } else {
538
- $output[$key] = $value;
539
- }
540
- } elseif (isset($output[$key])) {
541
- throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
542
- }
543
- --$i;
544
- }
545
- ++$i;
546
-
547
- continue 2;
548
- }
549
- }
550
-
551
- throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename);
552
- }
553
-
554
- /**
555
- * Evaluates scalars and replaces magic values.
556
- *
557
- * @return mixed
558
- *
559
- * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
560
- */
561
- private static function evaluateScalar(string $scalar, int $flags, array &$references = [], bool &$isQuotedString = null)
562
- {
563
- $isQuotedString = false;
564
- $scalar = trim($scalar);
565
-
566
- if (0 === strpos($scalar, '*')) {
567
- if (false !== $pos = strpos($scalar, '#')) {
568
- $value = substr($scalar, 1, $pos - 2);
569
- } else {
570
- $value = substr($scalar, 1);
571
- }
572
-
573
- // an unquoted *
574
- if (false === $value || '' === $value) {
575
- throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
576
- }
577
-
578
- if (!\array_key_exists($value, $references)) {
579
- throw new ParseException(sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
580
- }
581
-
582
- return $references[$value];
583
- }
584
-
585
- $scalarLower = strtolower($scalar);
586
-
587
- switch (true) {
588
- case 'null' === $scalarLower:
589
- case '' === $scalar:
590
- case '~' === $scalar:
591
- return null;
592
- case 'true' === $scalarLower:
593
- return true;
594
- case 'false' === $scalarLower:
595
- return false;
596
- case '!' === $scalar[0]:
597
- switch (true) {
598
- case 0 === strpos($scalar, '!!str '):
599
- $s = (string) substr($scalar, 6);
600
-
601
- if (\in_array($s[0] ?? '', ['"', "'"], true)) {
602
- $isQuotedString = true;
603
- $s = self::parseQuotedScalar($s);
604
- }
605
-
606
- return $s;
607
- case 0 === strpos($scalar, '! '):
608
- return substr($scalar, 2);
609
- case 0 === strpos($scalar, '!php/object'):
610
- if (self::$objectSupport) {
611
- if (!isset($scalar[12])) {
612
- trigger_deprecation('symfony/yaml', '5.1', 'Using the !php/object tag without a value is deprecated.');
613
-
614
- return false;
615
- }
616
-
617
- return unserialize(self::parseScalar(substr($scalar, 12)));
618
- }
619
-
620
- if (self::$exceptionOnInvalidType) {
621
- throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
622
- }
623
-
624
- return null;
625
- case 0 === strpos($scalar, '!php/const'):
626
- if (self::$constantSupport) {
627
- if (!isset($scalar[11])) {
628
- trigger_deprecation('symfony/yaml', '5.1', 'Using the !php/const tag without a value is deprecated.');
629
-
630
- return '';
631
- }
632
-
633
- $i = 0;
634
- if (\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) {
635
- return \constant($const);
636
- }
637
-
638
- throw new ParseException(sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
639
- }
640
- if (self::$exceptionOnInvalidType) {
641
- 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);
642
- }
643
-
644
- return null;
645
- case 0 === strpos($scalar, '!!float '):
646
- return (float) substr($scalar, 8);
647
- case 0 === strpos($scalar, '!!binary '):
648
- return self::evaluateBinaryScalar(substr($scalar, 9));
649
- }
650
-
651
- 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);
652
- case preg_match('/^(?:\+|-)?0o(?P<value>[0-7_]++)$/', $scalar, $matches):
653
- $value = str_replace('_', '', $matches['value']);
654
-
655
- if ('-' === $scalar[0]) {
656
- return -octdec($value);
657
- }
658
-
659
- return octdec($value);
660
- // Optimize for returning strings.
661
- case \in_array($scalar[0], ['+', '-', '.'], true) || is_numeric($scalar[0]):
662
- if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) {
663
- $scalar = str_replace('_', '', $scalar);
664
- }
665
-
666
- switch (true) {
667
- case ctype_digit($scalar):
668
- if (preg_match('/^0[0-7]+$/', $scalar)) {
669
- trigger_deprecation('symfony/yaml', '5.1', 'Support for parsing numbers prefixed with 0 as octal numbers. They will be parsed as strings as of 6.0. Use "%s" to represent the octal number.', '0o'.substr($scalar, 1));
670
-
671
- return octdec($scalar);
672
- }
673
-
674
- $cast = (int) $scalar;
675
-
676
- return ($scalar === (string) $cast) ? $cast : $scalar;
677
- case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
678
- if (preg_match('/^-0[0-7]+$/', $scalar)) {
679
- trigger_deprecation('symfony/yaml', '5.1', 'Support for parsing numbers prefixed with 0 as octal numbers. They will be parsed as strings as of 6.0. Use "%s" to represent the octal number.', '-0o'.substr($scalar, 2));
680
-
681
- return -octdec(substr($scalar, 1));
682
- }
683
-
684
- $cast = (int) $scalar;
685
-
686
- return ($scalar === (string) $cast) ? $cast : $scalar;
687
- case is_numeric($scalar):
688
- case Parser::preg_match(self::getHexRegex(), $scalar):
689
- $scalar = str_replace('_', '', $scalar);
690
-
691
- return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
692
- case '.inf' === $scalarLower:
693
- case '.nan' === $scalarLower:
694
- return -log(0);
695
- case '-.inf' === $scalarLower:
696
- return log(0);
697
- case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar):
698
- return (float) str_replace('_', '', $scalar);
699
- case Parser::preg_match(self::getTimestampRegex(), $scalar):
700
- // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
701
- $time = new \DateTime($scalar, new \DateTimeZone('UTC'));
702
-
703
- if (Yaml::PARSE_DATETIME & $flags) {
704
- return $time;
705
- }
706
-
707
- try {
708
- if (false !== $scalar = $time->getTimestamp()) {
709
- return $scalar;
710
- }
711
- } catch (\ValueError $e) {
712
- // no-op
713
- }
714
-
715
- return $time->format('U');
716
- }
717
- }
718
-
719
- return (string) $scalar;
720
- }
721
-
722
- private static function parseTag(string $value, int &$i, int $flags): ?string
723
- {
724
- if ('!' !== $value[$i]) {
725
- return null;
726
- }
727
-
728
- $tagLength = strcspn($value, " \t\n[]{},", $i + 1);
729
- $tag = substr($value, $i + 1, $tagLength);
730
-
731
- $nextOffset = $i + $tagLength + 1;
732
- $nextOffset += strspn($value, ' ', $nextOffset);
733
-
734
- if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], true))) {
735
- throw new ParseException('Using the unquoted scalar value "!" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
736
- }
737
-
738
- // Is followed by a scalar and is a built-in tag
739
- if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || 'str' === $tag || 'php/const' === $tag || 'php/object' === $tag)) {
740
- // Manage in {@link self::evaluateScalar()}
741
- return null;
742
- }
743
-
744
- $i = $nextOffset;
745
-
746
- // Built-in tags
747
- if ('' !== $tag && '!' === $tag[0]) {
748
- throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
749
- }
750
-
751
- if ('' !== $tag && !isset($value[$i])) {
752
- throw new ParseException(sprintf('Missing value for tag "%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
753
- }
754
-
755
- if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) {
756
- return $tag;
757
- }
758
-
759
- 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);
760
- }
761
-
762
- public static function evaluateBinaryScalar(string $scalar): string
763
- {
764
- $parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar));
765
-
766
- if (0 !== (\strlen($parsedBinaryData) % 4)) {
767
- throw new ParseException(sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
768
- }
769
-
770
- if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) {
771
- throw new ParseException(sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
772
- }
773
-
774
- return base64_decode($parsedBinaryData, true);
775
- }
776
-
777
- private static function isBinaryString(string $value): bool
778
- {
779
- return !preg_match('//u', $value) || preg_match('/[^\x00\x07-\x0d\x1B\x20-\xff]/', $value);
780
- }
781
-
782
- /**
783
- * Gets a regex that matches a YAML date.
784
- *
785
- * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
786
- */
787
- private static function getTimestampRegex(): string
788
- {
789
- return <<<EOF
790
- ~^
791
- (?P<year>[0-9][0-9][0-9][0-9])
792
- -(?P<month>[0-9][0-9]?)
793
- -(?P<day>[0-9][0-9]?)
794
- (?:(?:[Tt]|[ \t]+)
795
- (?P<hour>[0-9][0-9]?)
796
- :(?P<minute>[0-9][0-9])
797
- :(?P<second>[0-9][0-9])
798
- (?:\.(?P<fraction>[0-9]*))?
799
- (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
800
- (?::(?P<tz_minute>[0-9][0-9]))?))?)?
801
- $~x
802
- EOF;
803
- }
804
-
805
- /**
806
- * Gets a regex that matches a YAML number in hexadecimal notation.
807
- */
808
- private static function getHexRegex(): string
809
- {
810
- return '~^0x[0-9a-f_]++$~i';
811
- }
812
- }