From ee4ce43e91a87d04a7283f71d7a4cf4ca6732470 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Fri, 14 Sep 2018 13:24:16 +0200 Subject: [PATCH 1/3] fail reverse transforming invalid RFC 3339 dates --- .../DateTimeToRfc3339Transformer.php | 10 ++++++---- .../DateTimeToRfc3339TransformerTest.php | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php index f905fb8665..8d1a92af8b 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php @@ -69,6 +69,10 @@ class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer return; } + if (!preg_match('/^(\d{4})-(\d{2})-(\d{2})T\d{2}:\d{2}(?::\d{2})?(?:\.\d)?(?:Z|(?:(?:\+|-)\d{2}:\d{2}))$/', $rfc3339, $matches)) { + throw new TransformationFailedException(sprintf('The date "%s" is not a valid date.', $rfc3339)); + } + try { $dateTime = new \DateTime($rfc3339); } catch (\Exception $e) { @@ -79,10 +83,8 @@ class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer $dateTime->setTimezone(new \DateTimeZone($this->inputTimezone)); } - if (preg_match('/(\d{4})-(\d{2})-(\d{2})/', $rfc3339, $matches)) { - if (!checkdate($matches[2], $matches[3], $matches[1])) { - throw new TransformationFailedException(sprintf('The date "%s-%s-%s" is not a valid date.', $matches[1], $matches[2], $matches[3])); - } + if (!checkdate($matches[2], $matches[3], $matches[1])) { + throw new TransformationFailedException(sprintf('The date "%s-%s-%s" is not a valid date.', $matches[1], $matches[2], $matches[3])); } return $dateTime; 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 c02d3dd695..5f4043523e 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php @@ -134,12 +134,25 @@ class DateTimeToRfc3339TransformerTest extends TestCase } /** + * @dataProvider invalidDateStringProvider * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException */ - public function testReverseTransformExpectsValidDateString() + public function testReverseTransformExpectsValidDateString($date) { $transformer = new DateTimeToRfc3339Transformer('UTC', 'UTC'); - $transformer->reverseTransform('2010-2010-2010'); + $transformer->reverseTransform($date); + } + + public function invalidDateStringProvider() + { + return array( + 'invalid month' => array('2010-2010-01'), + 'invalid day' => array('2010-10-2010'), + 'no date' => array('x'), + 'cookie format' => array('Saturday, 01-May-2010 04:05:00 Z'), + 'RFC 822 format' => array('Sat, 01 May 10 04:05:00 +0000'), + 'RSS format' => array('Sat, 01 May 2010 04:05:00 +0000'), + ); } } From 4225f36b8646e2b503b2e9c00c17c0bdb08f413f Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Fri, 21 Sep 2018 15:59:15 +0200 Subject: [PATCH 2/3] parse numbers terminated with decimal separator --- src/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php | 2 +- .../Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php b/src/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php index e63e3c4349..ea1eb1b7a3 100644 --- a/src/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php +++ b/src/Symfony/Component/Intl/NumberFormatter/NumberFormatter.php @@ -516,7 +516,7 @@ class NumberFormatter $groupSep = $this->getAttribute(self::GROUPING_USED) ? ',' : ''; // Any string before the numeric value causes error in the parsing - if (preg_match("/^-?(?:\.\d++|([\d{$groupSep}]++)(?:\.\d++)?)/", $value, $matches)) { + if (preg_match("/^-?(?:\.\d++|([\d{$groupSep}]++)(?:\.\d*+)?)/", $value, $matches)) { $value = $matches[0]; $position = \strlen($value); if ($error = $groupSep && isset($matches[1]) && !preg_match('/^\d{1,3}+(?:(?:,\d{3})++|\d*+)$/', $matches[1])) { diff --git a/src/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php b/src/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php index 0e10f7d374..ece5ad5625 100644 --- a/src/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php +++ b/src/Symfony/Component/Intl/Tests/NumberFormatter/AbstractNumberFormatterTest.php @@ -654,6 +654,7 @@ abstract class AbstractNumberFormatterTest extends TestCase array('-123,4567', false, '->parse() does not parse when invalid grouping used.', 9), array('-123,,456', false, '->parse() does not parse when invalid grouping used.', 4), array('-123,,456', -123.0, '->parse() parses when grouping is disabled.', 4, false), + array('239.', 239.0, '->parse() parses when string ends with decimal separator.', 4, false), ); } From a67ff2a2d6ad9deb33a23ee8327632417adeac56 Mon Sep 17 00:00:00 2001 From: Roland Franssen Date: Fri, 21 Sep 2018 21:54:01 +0200 Subject: [PATCH 3/3] [Console] Fixed boxed table style with colspan --- .../Component/Console/Helper/Table.php | 4 +-- .../Console/Tests/Helper/TableTest.php | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Console/Helper/Table.php b/src/Symfony/Component/Console/Helper/Table.php index f3fc3b0b0a..b5c0e91a3c 100644 --- a/src/Symfony/Component/Console/Helper/Table.php +++ b/src/Symfony/Component/Console/Helper/Table.php @@ -570,7 +570,7 @@ class Table $lengths[] = $this->getCellWidth($row, $column); } - $this->columnWidths[$column] = max($lengths) + \strlen($this->style->getCellRowContentFormat()) - 2; + $this->columnWidths[$column] = max($lengths) + Helper::strlen($this->style->getCellRowContentFormat()) - 2; } } @@ -581,7 +581,7 @@ class Table */ private function getColumnSeparatorWidth() { - return \strlen(sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar())); + return Helper::strlen(sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar())); } /** diff --git a/src/Symfony/Component/Console/Tests/Helper/TableTest.php b/src/Symfony/Component/Console/Tests/Helper/TableTest.php index 58c620953e..1dadc27258 100644 --- a/src/Symfony/Component/Console/Tests/Helper/TableTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/TableTest.php @@ -745,6 +745,42 @@ TABLE; Table::getStyleDefinition('absent'); } + public function testBoxedStyleWithColspan() + { + $boxed = new TableStyle(); + $boxed + ->setHorizontalBorderChar('─') + ->setVerticalBorderChar('│') + ->setCrossingChar('┼') + ; + + $table = new Table($output = $this->getOutputStream()); + $table->setStyle($boxed); + $table + ->setHeaders(array('ISBN', 'Title', 'Author')) + ->setRows(array( + array('99921-58-10-7', 'Divine Comedy', 'Dante Alighieri'), + new TableSeparator(), + array(new TableCell('This value spans 3 columns.', array('colspan' => 3))), + )) + ; + $table->render(); + + $expected = + <<assertSame($expected, $this->getOutputContent($output)); + } + protected function getOutputStream($decorated = false) { return new StreamOutput($this->stream, StreamOutput::VERBOSITY_NORMAL, $decorated);