Skip to content

Commit

Permalink
Merge branch '3.4' into 4.3
Browse files Browse the repository at this point in the history
* 3.4:
  Fix typo
  Fix unitialized variable in DeprecationErrorHandler
  fix Danish translations
  Added the missing translations for the Slovak 'sk' locale.
  Fix negative DateInterval
  • Loading branch information
nicolas-grekas committed Aug 9, 2019
2 parents 69f798f + 299b8d9 commit 7fe2c48
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 7 deletions.
28 changes: 25 additions & 3 deletions Normalizer/DateIntervalNormalizer.php
Expand Up @@ -25,7 +25,7 @@ class DateIntervalNormalizer implements NormalizerInterface, DenormalizerInterfa
const FORMAT_KEY = 'dateinterval_format';

private $defaultContext = [
self::FORMAT_KEY => 'P%yY%mM%dDT%hH%iM%sS',
self::FORMAT_KEY => '%rP%yY%mM%dDT%hH%iM%sS',
];

/**
Expand Down Expand Up @@ -90,12 +90,34 @@ public function denormalize($data, $class, $format = null, array $context = [])

$dateIntervalFormat = $context[self::FORMAT_KEY] ?? $this->defaultContext[self::FORMAT_KEY];

$valuePattern = '/^'.preg_replace('/%([yYmMdDhHiIsSwW])(\w)/', '(?P<$1>\d+)$2', $dateIntervalFormat).'$/';
$signPattern = '';
switch (substr($dateIntervalFormat, 0, 2)) {
case '%R':
$signPattern = '[-+]';
$dateIntervalFormat = substr($dateIntervalFormat, 2);
break;
case '%r':
$signPattern = '-?';
$dateIntervalFormat = substr($dateIntervalFormat, 2);
break;
}
$valuePattern = '/^'.$signPattern.preg_replace('/%([yYmMdDhHiIsSwW])(\w)/', '(?P<$1>\d+)$2', $dateIntervalFormat).'$/';
if (!preg_match($valuePattern, $data)) {
throw new UnexpectedValueException(sprintf('Value "%s" contains intervals not accepted by format "%s".', $data, $dateIntervalFormat));
}

try {
if ('-' === $data[0]) {
$interval = new \DateInterval(substr($data, 1));
$interval->invert = 1;

return $interval;
}

if ('+' === $data[0]) {
return new \DateInterval(substr($data, 1));
}

return new \DateInterval($data);
} catch (\Exception $e) {
throw new UnexpectedValueException($e->getMessage(), $e->getCode(), $e);
Expand All @@ -112,6 +134,6 @@ public function supportsDenormalization($data, $type, $format = null)

private function isISO8601($string)
{
return preg_match('/^P(?=\w*(?:\d|%\w))(?:\d+Y|%[yY]Y)?(?:\d+M|%[mM]M)?(?:(?:\d+D|%[dD]D)|(?:\d+W|%[wW]W))?(?:T(?:\d+H|[hH]H)?(?:\d+M|[iI]M)?(?:\d+S|[sS]S)?)?$/', $string);
return preg_match('/^[\-+]?P(?=\w*(?:\d|%\w))(?:\d+Y|%[yY]Y)?(?:\d+M|%[mM]M)?(?:(?:\d+D|%[dD]D)|(?:\d+W|%[wW]W))?(?:T(?:\d+H|[hH]H)?(?:\d+M|[iI]M)?(?:\d+S|[sS]S)?)?$/', $string);
}
}
29 changes: 25 additions & 4 deletions Tests/Normalizer/DateIntervalNormalizerTest.php
Expand Up @@ -29,6 +29,11 @@ public function dataProviderISO()
['P%yY%mM%dDT%hH%iM', 'P10Y2M3DT16H5M', 'P10Y2M3DT16H5M'],
['P%yY%mM%dDT%hH', 'P10Y2M3DT16H', 'P10Y2M3DT16H'],
['P%yY%mM%dD', 'P10Y2M3D', 'P10Y2M3DT0H'],
['%RP%yY%mM%dD', '-P10Y2M3D', '-P10Y2M3DT0H'],
['%RP%yY%mM%dD', '+P10Y2M3D', '+P10Y2M3DT0H'],
['%RP%yY%mM%dD', '+P10Y2M3D', 'P10Y2M3DT0H'],
['%rP%yY%mM%dD', '-P10Y2M3D', '-P10Y2M3DT0H'],
['%rP%yY%mM%dD', 'P10Y2M3D', 'P10Y2M3DT0H'],
];

return $data;
Expand All @@ -50,7 +55,7 @@ public function testNormalize()
*/
public function testNormalizeUsingFormatPassedInContext($format, $output, $input)
{
$this->assertEquals($output, $this->normalizer->normalize(new \DateInterval($input), null, [DateIntervalNormalizer::FORMAT_KEY => $format]));
$this->assertEquals($output, $this->normalizer->normalize($this->getInterval($input), null, [DateIntervalNormalizer::FORMAT_KEY => $format]));
}

/**
Expand All @@ -72,7 +77,7 @@ public function testLegacyNormalizeUsingFormatPassedInConstructor($format, $outp
private function doTestNormalizeUsingFormatPassedInConstructor($format, $output, $input, bool $legacy = false)
{
$normalizer = $legacy ? new DateIntervalNormalizer($format) : new DateIntervalNormalizer([DateIntervalNormalizer::FORMAT_KEY => $format]);
$this->assertEquals($output, $normalizer->normalize(new \DateInterval($input)));
$this->assertEquals($output, $normalizer->normalize($this->getInterval($input)));
}

public function testNormalizeInvalidObjectThrowsException()
Expand All @@ -98,7 +103,7 @@ public function testDenormalize()
*/
public function testDenormalizeUsingFormatPassedInContext($format, $input, $output)
{
$this->assertDateIntervalEquals(new \DateInterval($output), $this->normalizer->denormalize($input, \DateInterval::class, null, [DateIntervalNormalizer::FORMAT_KEY => $format]));
$this->assertDateIntervalEquals($this->getInterval($output), $this->normalizer->denormalize($input, \DateInterval::class, null, [DateIntervalNormalizer::FORMAT_KEY => $format]));
}

/**
Expand All @@ -120,7 +125,7 @@ public function testLegacyDenormalizeUsingFormatPassedInConstructor($format, $in
private function doTestDenormalizeUsingFormatPassedInConstructor($format, $input, $output, bool $legacy = false)
{
$normalizer = $legacy ? new DateIntervalNormalizer($format) : new DateIntervalNormalizer([DateIntervalNormalizer::FORMAT_KEY => $format]);
$this->assertDateIntervalEquals(new \DateInterval($output), $normalizer->denormalize($input, \DateInterval::class));
$this->assertDateIntervalEquals($this->getInterval($output), $normalizer->denormalize($input, \DateInterval::class));
}

public function testDenormalizeExpectsString()
Expand Down Expand Up @@ -152,4 +157,20 @@ private function assertDateIntervalEquals(\DateInterval $expected, \DateInterval
{
$this->assertEquals($expected->format('%RP%yY%mM%dDT%hH%iM%sS'), $actual->format('%RP%yY%mM%dDT%hH%iM%sS'));
}

private function getInterval($data)
{
if ('-' === $data[0]) {
$interval = new \DateInterval(substr($data, 1));
$interval->invert = 1;

return $interval;
}

if ('+' === $data[0]) {
return new \DateInterval(substr($data, 1));
}

return new \DateInterval($data);
}
}

0 comments on commit 7fe2c48

Please sign in to comment.