From 30aa4e96c64293f5149286320e0b7c683301ae03 Mon Sep 17 00:00:00 2001 From: Diego Saint Esteben Date: Sun, 24 May 2015 22:52:55 -0300 Subject: [PATCH 1/4] Improved duplicated code in FileLocator --- src/Symfony/Component/Config/FileLocator.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Config/FileLocator.php b/src/Symfony/Component/Config/FileLocator.php index 71bb5ab0ba..c224833f26 100644 --- a/src/Symfony/Component/Config/FileLocator.php +++ b/src/Symfony/Component/Config/FileLocator.php @@ -47,15 +47,15 @@ class FileLocator implements FileLocatorInterface return $name; } - $filepaths = array(); - if (null !== $currentPath && file_exists($file = $currentPath.DIRECTORY_SEPARATOR.$name)) { - if (true === $first) { - return $file; - } - $filepaths[] = $file; + $paths = $this->paths; + + if (null !== $currentPath) { + array_unshift($paths, $currentPath); } - foreach ($this->paths as $path) { + $filepaths = array(); + + foreach ($paths as $path) { if (file_exists($file = $path.DIRECTORY_SEPARATOR.$name)) { if (true === $first) { return $file; @@ -65,7 +65,7 @@ class FileLocator implements FileLocatorInterface } if (!$filepaths) { - throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s%s).', $name, null !== $currentPath ? $currentPath.', ' : '', implode(', ', $this->paths))); + throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s).', $name, implode(', ', $paths))); } return array_values(array_unique($filepaths)); From 9f9b0f73aafa1a70c87ec2eab87d5e60ce15bfda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Sun, 24 May 2015 18:44:31 +0200 Subject: [PATCH 2/4] [HttpFoundation] Get response content as resource several times for PHP >= 5.6 --- .../Component/HttpFoundation/Request.php | 4 +-- .../HttpFoundation/Tests/RequestTest.php | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index f2ee1829e5..9e94407ec5 100644 --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php @@ -1459,8 +1459,8 @@ class Request */ public function getContent($asResource = false) { - if (false === $this->content || (true === $asResource && null !== $this->content)) { - throw new \LogicException('getContent() can only be called once when using the resource return type.'); + if (PHP_VERSION_ID < 50600 && (false === $this->content || (true === $asResource && null !== $this->content))) { + throw new \LogicException('getContent() can only be called once when using the resource return type and PHP below 5.6.'); } if (true === $asResource) { diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php index d13228e556..990d3a842d 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php @@ -929,11 +929,40 @@ class RequestTest extends \PHPUnit_Framework_TestCase */ public function testGetContentCantBeCalledTwiceWithResources($first, $second) { + if (PHP_VERSION_ID >= 50600) { + $this->markTestSkipped('PHP >= 5.6 allows to open php://input several times.'); + } + $req = new Request(); $req->getContent($first); $req->getContent($second); } + /** + * + * @dataProvider getContentCantBeCalledTwiceWithResourcesProvider + */ + public function testGetContentCanBeCalledTwiceWithResources($first, $second) + { + if (PHP_VERSION_ID < 50600) { + $this->markTestSkipped('PHP < 5.6 does not allow to open php://input several times.'); + } + + $req = new Request(); + $a = $req->getContent($first); + $b = $req->getContent($second); + + if ($first) { + $a = stream_get_contents($a); + } + + if ($second) { + $b = stream_get_contents($b); + } + + $this->assertEquals($a, $b); + } + public function getContentCantBeCalledTwiceWithResourcesProvider() { return array( From fa9da42c22a93b8b9d9e000022640f6bcc0ca075 Mon Sep 17 00:00:00 2001 From: Sergio Santoro Date: Sat, 6 Jun 2015 18:12:30 +0200 Subject: [PATCH 3/4] [Form] Fix call to removed method (BC broken in 2.3) ResolvedFormType#getTypeExtensions() was calling method AbstractType#getExtensions() which has been removed in commit b3081e85a062abb8fc8a22f20a2b3289db2ff501 | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | - | License | MIT | Doc PR | - --- src/Symfony/Component/Form/ResolvedFormType.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Symfony/Component/Form/ResolvedFormType.php b/src/Symfony/Component/Form/ResolvedFormType.php index b922e32561..218d0d999f 100644 --- a/src/Symfony/Component/Form/ResolvedFormType.php +++ b/src/Symfony/Component/Form/ResolvedFormType.php @@ -93,11 +93,6 @@ class ResolvedFormType implements ResolvedFormTypeInterface */ public function getTypeExtensions() { - // BC - if ($this->innerType instanceof AbstractType) { - return $this->innerType->getExtensions(); - } - return $this->typeExtensions; } From 17346c53dcf7c0183ef9b7f805aac0a70ef826cb Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Sat, 6 Jun 2015 17:05:57 +0200 Subject: [PATCH 4/4] [Form] Support DateTimeImmutable in transform() --- .../DateTimeToArrayTransformer.php | 13 ++++++---- .../DateTimeToLocalizedStringTransformer.php | 14 ++++------- .../DateTimeToRfc3339Transformer.php | 6 ++--- .../DateTimeToStringTransformer.php | 13 ++++++---- .../DateTimeToTimestampTransformer.php | 15 ++++-------- .../DateTimeToArrayTransformerTest.php | 24 +++++++++++++++++++ ...teTimeToLocalizedStringTransformerTest.php | 16 +++++++++++++ .../DateTimeToRfc3339TransformerTest.php | 14 +++++++++++ .../DateTimeToStringTransformerTest.php | 15 ++++++++++++ .../DateTimeToTimestampTransformerTest.php | 15 ++++++++++++ 10 files changed, 111 insertions(+), 34 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php index b3f4dbdd63..afbfc1041e 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php @@ -51,7 +51,7 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer /** * Transforms a normalized date into a localized date. * - * @param \DateTime $dateTime Normalized date. + * @param \DateTime|\DateTimeInterface $dateTime A DateTime object * * @return array Localized date. * @@ -72,14 +72,17 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer ), array_flip($this->fields)); } - if (!$dateTime instanceof \DateTime) { - throw new TransformationFailedException('Expected a \DateTime.'); + if (!$dateTime instanceof \DateTime && !$dateTime instanceof \DateTimeInterface) { + throw new TransformationFailedException('Expected a \DateTime or \DateTimeInterface.'); } - $dateTime = clone $dateTime; if ($this->inputTimezone !== $this->outputTimezone) { + if (!$dateTime instanceof \DateTimeImmutable) { + $dateTime = clone $dateTime; + } + try { - $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone)); + $dateTime = $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone)); } catch (\Exception $e) { throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e); } diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php index e7ebcabc7a..b38680a1bb 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php @@ -70,7 +70,7 @@ class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer /** * Transforms a normalized date into a localized date string/array. * - * @param \DateTime $dateTime Normalized date. + * @param \DateTime|\DateTimeInterface $dateTime A DateTime object * * @return string|array Localized date string/array. * @@ -84,17 +84,11 @@ class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer return ''; } - if (!$dateTime instanceof \DateTime) { - throw new TransformationFailedException('Expected a \DateTime.'); + if (!$dateTime instanceof \DateTime && !$dateTime instanceof \DateTimeInterface) { + throw new TransformationFailedException('Expected a \DateTime or \DateTimeInterface.'); } - // convert time to UTC before passing it to the formatter - $dateTime = clone $dateTime; - if ('UTC' !== $this->inputTimezone) { - $dateTime->setTimezone(new \DateTimeZone('UTC')); - } - - $value = $this->getIntlDateFormatter()->format((int) $dateTime->format('U')); + $value = $this->getIntlDateFormatter()->format($dateTime->getTimestamp()); if (intl_get_error_code() != 0) { throw new TransformationFailedException(intl_get_error_message()); diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php index e3297ffef3..c78d80401a 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php @@ -27,13 +27,13 @@ class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer return ''; } - if (!$dateTime instanceof \DateTime) { - throw new TransformationFailedException('Expected a \DateTime.'); + if (!$dateTime instanceof \DateTime && !$dateTime instanceof \DateTimeInterface) { + throw new TransformationFailedException('Expected a \DateTime or \DateTimeInterface.'); } if ($this->inputTimezone !== $this->outputTimezone) { $dateTime = clone $dateTime; - $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone)); + $dateTime = $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone)); } return preg_replace('/\+00:00$/', 'Z', $dateTime->format('c')); diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php index 8fa1622a36..fdcfeee8ec 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php @@ -90,7 +90,7 @@ class DateTimeToStringTransformer extends BaseDateTimeTransformer * Transforms a DateTime object into a date string with the configured format * and timezone. * - * @param \DateTime $value A DateTime object + * @param \DateTime|\DateTimeInterface $dateTime A DateTime object * * @return string A value as produced by PHP's date() function * @@ -104,13 +104,16 @@ class DateTimeToStringTransformer extends BaseDateTimeTransformer return ''; } - if (!$value instanceof \DateTime) { - throw new TransformationFailedException('Expected a \DateTime.'); + if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) { + throw new TransformationFailedException('Expected a \DateTime or \DateTimeInterface.'); + } + + if (!$value instanceof \DateTimeImmutable) { + $value = clone $value; } - $value = clone $value; try { - $value->setTimezone(new \DateTimeZone($this->outputTimezone)); + $value = $value->setTimezone(new \DateTimeZone($this->outputTimezone)); } catch (\Exception $e) { throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e); } diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php index bd51ea4195..b8f5f381a5 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php @@ -24,7 +24,7 @@ class DateTimeToTimestampTransformer extends BaseDateTimeTransformer /** * Transforms a DateTime object into a timestamp in the configured timezone. * - * @param \DateTime $value A \DateTime object + * @param \DateTime|\DateTimeInterface $dateTime A DateTime object * * @return int A timestamp * @@ -38,18 +38,11 @@ class DateTimeToTimestampTransformer extends BaseDateTimeTransformer return; } - if (!$value instanceof \DateTime) { - throw new TransformationFailedException('Expected a \DateTime.'); + if (!$value instanceof \DateTime && !$value instanceof \DateTimeInterface) { + throw new TransformationFailedException('Expected a \DateTime or \DateTimeInterface.'); } - $value = clone $value; - try { - $value->setTimezone(new \DateTimeZone($this->outputTimezone)); - } catch (\Exception $e) { - throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e); - } - - return (int) $value->format('U'); + return $value->getTimestamp(); } /** diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php index db5f2b1638..3042eea5a4 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php @@ -116,6 +116,30 @@ class DateTimeToArrayTransformerTest extends DateTimeTestCase $this->assertSame($output, $transformer->transform($input)); } + public function testTransformDateTimeImmutable() + { + if (PHP_VERSION_ID < 50500) { + $this->markTestSkipped('DateTimeImmutable was introduced in PHP 5.5.0'); + } + + $transformer = new DateTimeToArrayTransformer('America/New_York', 'Asia/Hong_Kong'); + + $input = new \DateTimeImmutable('2010-02-03 04:05:06 America/New_York'); + + $dateTime = new \DateTimeImmutable('2010-02-03 04:05:06 America/New_York'); + $dateTime = $dateTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong')); + $output = array( + 'year' => (string) (int) $dateTime->format('Y'), + 'month' => (string) (int) $dateTime->format('m'), + 'day' => (string) (int) $dateTime->format('d'), + 'hour' => (string) (int) $dateTime->format('H'), + 'minute' => (string) (int) $dateTime->format('i'), + 'second' => (string) (int) $dateTime->format('s'), + ); + + $this->assertSame($output, $transformer->transform($input)); + } + /** * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException */ diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php index cb50fc3669..d6964d395a 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php @@ -141,6 +141,22 @@ class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase $this->assertEquals('02*2010*03 04|05|06', $transformer->transform($this->dateTime)); } + public function testTransformDateTimeImmutableTimezones() + { + if (PHP_VERSION_ID < 50500) { + $this->markTestSkipped('DateTimeImmutable was introduced in PHP 5.5.0'); + } + + $transformer = new DateTimeToLocalizedStringTransformer('America/New_York', 'Asia/Hong_Kong'); + + $input = new \DateTimeImmutable('2010-02-03 04:05:06 America/New_York'); + + $dateTime = clone $input; + $dateTime = $dateTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong')); + + $this->assertEquals($dateTime->format('d.m.Y H:i'), $transformer->transform($input)); + } + /** * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException */ diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php index a39f53aa70..be3827cc74 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php @@ -79,6 +79,20 @@ class DateTimeToRfc3339TransformerTest extends DateTimeTestCase $this->assertSame($to, $transformer->transform(null !== $from ? new \DateTime($from) : null)); } + /** + * @dataProvider transformProvider + */ + public function testTransformDateTimeImmutable($fromTz, $toTz, $from, $to) + { + if (PHP_VERSION_ID < 50500) { + $this->markTestSkipped('DateTimeImmutable was introduced in PHP 5.5.0'); + } + + $transformer = new DateTimeToRfc3339Transformer($fromTz, $toTz); + + $this->assertSame($to, $transformer->transform(null !== $from ? new \DateTimeImmutable($from) : null)); + } + /** * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException */ diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php index a0aede7c85..e1099d9b35 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php @@ -97,6 +97,21 @@ class DateTimeToStringTransformerTest extends DateTimeTestCase $this->assertEquals($output, $transformer->transform($input)); } + public function testTransformDateTimeImmutable() + { + if (PHP_VERSION_ID < 50500) { + $this->markTestSkipped('DateTimeImmutable was introduced in PHP 5.5.0'); + } + + $transformer = new DateTimeToStringTransformer('Asia/Hong_Kong', 'America/New_York', 'Y-m-d H:i:s'); + + $input = new \DateTimeImmutable('2010-02-03 12:05:06 America/New_York'); + $output = $input->format('Y-m-d H:i:s'); + $input = $input->setTimezone(new \DateTimeZone('Asia/Hong_Kong')); + + $this->assertEquals($output, $transformer->transform($input)); + } + public function testTransformExpectsDateTime() { $transformer = new DateTimeToStringTransformer(); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php index b54f0c4c50..451451d09d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php @@ -56,6 +56,21 @@ class DateTimeToTimestampTransformerTest extends DateTimeTestCase $this->assertEquals($output, $transformer->transform($input)); } + public function testTransformDateTimeImmutable() + { + if (PHP_VERSION_ID < 50500) { + $this->markTestSkipped('DateTimeImmutable was introduced in PHP 5.5.0'); + } + + $transformer = new DateTimeToTimestampTransformer('Asia/Hong_Kong', 'America/New_York'); + + $input = new \DateTimeImmutable('2010-02-03 04:05:06 America/New_York'); + $output = $input->format('U'); + $input = $input->setTimezone(new \DateTimeZone('Asia/Hong_Kong')); + + $this->assertEquals($output, $transformer->transform($input)); + } + public function testTransformExpectsDateTime() { $transformer = new DateTimeToTimestampTransformer();